実はこの話は、そんな初歩的な話ではないんですよ…。
フォントファイル名の件はわかりませんが、windowsフォントをfreetypeで使いたいというのであれば、FT_New_Face
でアクセスするのではなく、WindowsAPIのGDIを介してフォントデータを取ってくるほうが良さそうです。
cpp
1 FT_Face face;
2 BYTE *font_buff = NULL;
3#if 0
4 if (FT_New_Face(ft_lib, "/path/to/font.ttf", 0, &face) != 0) {
5 std::fprintf(stderr, "%s(%d): failed to load font.\n", __FILE__, __LINE__);
6 return 1;
7 }
8#else
9 {
10 LOGFONT lf;
11 ZeroMemory(&lf, sizeof(lf));
12 CHOOSEFONT cf;
13 ZeroMemory(&cf, sizeof(cf));
14 cf.lStructSize = sizeof(cf);
15 cf.Flags = 0;
16 cf.lpLogFont = &lf;
17 // とりあえず、適当なフォントを選ぶ。
18 if (!ChooseFont(&cf)) {
19 return 1;
20 }
21 HFONT font_h = CreateFontIndirect(&lf);
22 if (font_h == NULL) {
23 std::fprintf(stderr, "%s(%d): failed to load font.\n", __FILE__, __LINE__);
24 return 1;
25 }
26 HDC dc_h = GetDC(NULL);
27 HGDIOBJ old_font_h = SelectObject(dc_h, font_h);
28 DWORD cb = GetFontData(dc_h, 0x66637474, 0, NULL, 0);
29 if (cb != 0 && cb != GDI_ERROR) {
30 // これなら、TTC
31 font_buff = new BYTE[cb];
32 GetFontData(dc_h, 0x66637474, 0, font_buff, cb);
33 }
34 else {
35 // TTFとして読んでみる。
36 cb = GetFontData(dc_h, 0, 0, NULL, 0);
37 if (cb == 0 || cb == GDI_ERROR) {
38 std::fprintf(stderr, "%s(%d): failed to load font.\n", __FILE__, __LINE__);
39 return 1;
40 }
41 font_buff = new BYTE[cb];
42 GetFontData(dc_h, 0, 0, font_buff, cb);
43 }
44 if (FT_New_Memory_Face(ft_lib, font_buff, cb, 0, &face) != 0) {
45 std::fprintf(stderr, "%s(%d): failed to load font.\n", __FILE__, __LINE__);
46 return 1;
47 }
48
49 DeleteObject(SelectObject(dc_h, old_font_h));
50 ReleaseDC(NULL, dc_h);
51 }
52#endif
53
54 // ... 諸々の処理
55
56 FT_Done_Face(face);
57 // フォントデータは、Faceを使用している間は破棄してはいけない。
58 delete [] font_buff;
この辺りは、アドベンチャーゲームエンジンである吉里吉里でも使われているので、そちらも参考になるかもしれません。
(昔、吉里吉里の作者のサイト…だったと思うのだけど、そちらに詳しく書いてあって参考になったのだけど、現在は見れなくて残念)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/27 09:54