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らしい。