我有一個類似的問題,發現了這張文章( fontconfig文檔很難通過) 。 對mindaugasj的響應非常有用,但要注意調用 FcPatternPrint()的額外行,或者列印 FcNameUnparse()的結果。 此外,還需要向傳遞給 FcObjectSetBuild的參數列表中添加 FC_FILE 參數。 像這樣: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: %dn", fs->nfont);
for (int i=0; fs && i 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() 函數的一個字體"姓名"。 這裡代碼可以使用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
FcPattern* font = FcFontMatch(config, pat, NULL);
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);