Bump version.
[lilypond.git] / lily / font-config-scheme.cc
blob79f074cef8c3e090d10c5f67cfacbf9d6e2ffb27
1 /*
2 font-config-scheme.cc -- implement FontConfig bindings.
4 source file of the GNU LilyPond music typesetter
6 (c) 2005--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
8 */
10 #include "lily-guile.hh"
11 #include "string-convert.hh"
12 #include "warn.hh"
14 #include <fontconfig/fontconfig.h>
16 string
17 display_fontset (FcFontSet *fs)
19 string retval;
21 int j;
22 for (j = 0; j < fs->nfont; j++)
24 FcChar8 *font;
25 FcChar8 *str;
27 font = FcNameUnparse (fs->fonts[j]);
28 if (FcPatternGetString (fs->fonts[j], FC_FILE, 0, &str) == FcResultMatch)
29 retval += String_convert::form_string ("FILE %s\n", str);
30 if (FcPatternGetString (fs->fonts[j], FC_FAMILY, 0, &str) == FcResultMatch)
31 retval += String_convert::form_string ("family %s\n ", str);
32 if (FcPatternGetString (fs->fonts[j],
33 "designsize", 0, &str) == FcResultMatch)
34 retval += String_convert::form_string ("designsize %s\n ", str);
36 retval += String_convert::form_string ("%s\n", (const char*) font);
37 free (font);
40 return retval;
43 string
44 display_strlist (char const*what, FcStrList *slist)
46 string retval;
47 while (FcChar8 *dir = FcStrListNext (slist))
49 retval += String_convert::form_string ("%s: %s\n", what, dir);
51 return retval;
54 string
55 display_config (FcConfig *fcc)
57 string retval;
58 retval += display_strlist ("Config files", FcConfigGetConfigFiles (fcc));
59 retval += display_strlist ("Config dir", FcConfigGetConfigDirs (fcc));
60 retval += display_strlist ("Font dir", FcConfigGetFontDirs (fcc));
61 return retval;
64 string
65 display_list (FcConfig *fcc)
67 FcPattern*pat = FcPatternCreate ();
69 FcObjectSet *os = 0;
70 if (!os)
71 os = FcObjectSetBuild (FC_FAMILY, FC_STYLE, (char *) 0);
73 FcFontSet *fs = FcFontList (fcc, pat, os);
74 FcObjectSetDestroy (os);
75 if (pat)
76 FcPatternDestroy (pat);
78 string retval;
79 if (fs)
81 retval = display_fontset (fs);
82 FcFontSetDestroy (fs);
84 return retval;
88 LY_DEFINE (ly_font_config_get_font_file, "ly:font-config-get-font-file", 1, 0, 0,
89 (SCM name),
90 "Get the file for font @var{name}.")
92 LY_ASSERT_TYPE (scm_is_string, name, 1);
94 FcPattern*pat = FcPatternCreate ();
95 FcValue val;
97 val.type = FcTypeString;
98 val.u.s = (const FcChar8*)ly_scm2string (name).c_str (); // FC_SLANT_ITALIC;
99 FcPatternAdd (pat, FC_FAMILY, val, FcFalse);
101 FcResult result;
102 SCM scm_result = SCM_BOOL_F;
104 FcConfigSubstitute (NULL, pat, FcMatchFont);
105 FcDefaultSubstitute (pat);
107 pat = FcFontMatch (NULL, pat, &result);
108 FcChar8 *str = 0;
109 if (FcPatternGetString (pat, FC_FILE, 0, &str) == FcResultMatch)
110 scm_result = scm_from_locale_string ((char const*) str);
112 FcPatternDestroy (pat);
114 return scm_result;
117 LY_DEFINE (ly_font_config_display_fonts, "ly:font-config-display-fonts", 0, 0, 0,
119 "Dump a list of all fonts visible to FontConfig.")
121 string str = display_list (NULL);
122 str += display_config (NULL);
124 progress_indication (str);
126 return SCM_UNSPECIFIED;