同様の質問があり、この投稿を見つけました (fontconfig のドキュメントを読むのは少し難しいです)。MindaugasJ の応答は役に立ちましたが、 のようなものを呼び出したりFcPatternPrint()
、結果を出力したりする余分な行に注意してFcNameUnparse()
ください。さらに、 にFC_FILE
渡される引数のリストに引数を追加する必要がありますFcObjectSetBuild
。このようなもの:
FcConfig* config = FcInitLoadConfigAndFonts();
FcPattern* pat = FcPatternCreate();
FcObjectSet* os = FcObjectSetBuild (FC_FAMILY, FC_STYLE, FC_LANG, FC_FILE, (char *) 0);
FcFontSet* fs = FcFontList(config, pat, os);
printf("Total matching fonts: %d\n", fs->nfont);
for (int i=0; fs && i < fs->nfont; ++i) {
FcPattern* font = fs->fonts[i];
FcChar8 *file, *style, *family;
if (FcPatternGetString(font, FC_FILE, 0, &file) == FcResultMatch &&
FcPatternGetString(font, FC_FAMILY, 0, &family) == FcResultMatch &&
FcPatternGetString(font, FC_STYLE, 0, &style) == FcResultMatch)
{
printf("Filename: %s (family %s, style %s)\n", file, family, style);
}
}
if (fs) FcFontSetDestroy(fs);
FC_New_Face()
フォントの「名前」を指定してfreetypeの関数に渡すフォントファイルを見つける必要があるという点で、解決すべき問題が少し異なりました。このコードは、fontconfig を使用して、名前に一致する最適なファイルを見つけることができます。
FcConfig* config = FcInitLoadConfigAndFonts();
// configure the search pattern,
// assume "name" is a std::string with the desired font name in it
FcPattern* pat = FcNameParse((const FcChar8*)(name.c_str()));
FcConfigSubstitute(config, pat, FcMatchPattern);
FcDefaultSubstitute(pat);
// find the font
FcResult res;
FcPattern* font = FcFontMatch(config, pat, &res);
if (font)
{
FcChar8* file = NULL;
if (FcPatternGetString(font, FC_FILE, 0, &file) == FcResultMatch)
{
// save the file to another std::string
fontFile = (char*)file;
}
FcPatternDestroy(font);
}
FcPatternDestroy(pat);