10

Linux でフォントを取得するには、fontconfig が最適なオプションであると聞いています。残念ながら、私は彼らの開発者向けドキュメントを調べてきましたが、自分が何をしているのかまったくわかりません。システム フォントのリストを取得するための単純な関数はないようです。代わりにパターン検索を実行する必要があります...そうですか?

要するに、fontconfig を使用して True-Type フォント (フォントのファミリ、書体、およびディレクトリ) のリストを取得する最良の方法は何ですか? もちろん、fontconfig よりも優れたものがあれば、他の解決策も受け入れます。

4

2 に答える 2

15

同様の質問があり、この投稿を見つけました (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);
于 2013-01-31T19:55:07.383 に答える
7

これはまさにあなたが求めているものではありませんが、使用可能なフォントのリストが表示されます。

#include <fontconfig.h>

FcPattern *pat;
FcFontSet *fs;
FcObjectSet *os;
FcChar8 *s, *file;
FcConfig *config;
FcBool result;
int i;

result = FcInit();
config = FcConfigGetCurrent();
FcConfigSetRescanInterval(config, 0);

// show the fonts (debugging)
pat = FcPatternCreate();
os = FcObjectSetBuild (FC_FAMILY, FC_STYLE, FC_LANG, (char *) 0);
fs = FcFontList(config, pat, os);
printf("Total fonts: %d", fs->nfont);
for (i=0; fs && i < fs->nfont; i++) {
    FcPattern *font = fs->fonts[i];//FcFontSetFont(fs, i);
    FcPatternPrint(font);
    s = FcNameUnparse(font);
    if (FcPatternGetString(font, FC_FILE, 0, &file) == FcResultMatch) {
        printf("Filename: %s", file);
    }
    printf("Font: %s", s);
    free(s);
}
if (fs) FcFontSetDestroy(fs);
于 2012-10-16T07:36:38.493 に答える