font読み込み

cairo_select_font_faceだとシステムにインストールされたフォントしか使えないようなので、
ファイルからフォントを読み込む方法を調査。
freetypeからFT_Faceを渡してやれば任意のファイルからのフォントを扱えそうだ。


ただ、Windows向けに配布されているcairoのバイナリは
CAIRO_HAS_FT_FONTが有効になっていなかった。
cairoのフォントバックエンドは一種類決め打ちなんだろうか。
Windows上のcairoでfreetypeを使うには自前ビルドが必要なようだが、
vcですんなりビルドできるのかな。


とりあえず、freetypeの練習。

#include <ft2build.h>
#include FT_FREETYPE_H

#include <fstream>
#include <iostream>
#include <sstream>
#include <vector>
#include <iomanip>
#include <string>

void writePGM(const std::string &file, int width, int height, const char *data)
{
  std::ofstream io(file.c_str(), std::ios::binary);
  if(!io){
    std::cout << "fail to open: " << file << std::endl;
    return;
  }
  // header
  io
    << "P5\n"
    << width << ' ' << height << '\n'
    << "255\n"
    ;
  // data
  io.write(data, width*height);
}

void writeGlyph(const std::string &file
    , FT_Face &face, FT_GlyphSlot &slot
    , unsigned long unicode)
{
  FT_Load_Char(face, unicode, FT_LOAD_RENDER);
  FT_Bitmap bitmap = slot->bitmap;
  writePGM(file, bitmap.width, bitmap.rows, (const char*)bitmap.buffer);
}

int main(int argc, char **argv)
{
  FT_Library library;
  FT_Init_FreeType( &library );

  FT_Face    face;
  FT_New_Face( library, "mikachanfont-8.9/fonts/mikachan.ttf", 0, &face );

  FT_GlyphSlot slot;
  slot = face->glyph;

  FT_Set_Char_Size(face, 0, 16*64, 300, 300);

  writeGlyph("tmp.pgm", face, slot, 0x3042); // UTF-16 あ

  return 0;
}

このままだとフォントを囲む最小矩形のグレイスケール画像が得られるだけなので
なんとかする必要がある。

追記
マルチバイト文字が出るように変更した。
UNICODEを渡せばOKらしい。