+ FcPattern *pattern;
+ FcObjectSet *os;
+ FcFontSet *fs;
+ char *buf;
+ int bufsize = 0;
+ int i;
+
+ pattern = FcPatternCreate ();
+ if (family != Mnil)
+ {
+ FcPatternAddString (pattern, FC_FAMILY,
+ (FcChar8 *) (msymbol_name (family)));
+ plist = head;
+ os = FcObjectSetBuild (FC_FILE, FC_LANG, NULL);
+ }
+ else
+ {
+ plist = NULL;
+ os = FcObjectSetBuild (FC_FILE, FC_FAMILY, FC_LANG, NULL);
+ }
+ fs = FcFontList (fc_config, pattern, os);
+ for (i = 0; i < fs->nfont; i++)
+ {
+ char *filename;
+ FcLangSet *langset;
+
+ if (FcPatternGetString (fs->fonts[i], FC_FILE, 0,
+ (FcChar8 **) &filename) != FcResultMatch)
+ continue;
+ if (FcPatternGetLangSet (fs->fonts[i], FC_LANG, 0,
+ &langset) != FcResultMatch)
+ langset = NULL;
+ if (family == Mnil)
+ {
+ MSymbol fam;
+ char *fname;
+
+ if (FcPatternGetString (fs->fonts[i], FC_FAMILY, 0,
+ (FcChar8 **) &fname) == FcResultMatch)
+ {
+ STRDUP_LOWER (buf, bufsize, fname);
+ fam = msymbol (buf);
+ if (! plist || MPLIST_KEY (plist) != fam)
+ {
+ plist = mplist_find_by_key (ft_font_list, fam);
+ if (! plist)
+ plist = mplist_add (ft_font_list, fam, mplist ());
+ }
+ add_font_info (filename, fam, langset, MPLIST_PLIST (plist));
+ }
+ }
+ else
+ add_font_info (filename, family, langset, MPLIST_PLIST (plist));
+ }