2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 2005--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
6 LilyPond is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 LilyPond is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
20 #include "lily-guile.hh"
21 #include "international.hh"
23 #include "string-convert.hh"
26 #include <fontconfig/fontconfig.h>
29 display_fontset (FcFontSet
*fs
)
34 for (j
= 0; j
< fs
->nfont
; j
++)
39 font
= FcNameUnparse (fs
->fonts
[j
]);
40 if (FcPatternGetString (fs
->fonts
[j
], FC_FILE
, 0, &str
) == FcResultMatch
)
41 retval
+= String_convert::form_string ("FILE %s\n", str
);
42 if (FcPatternGetString (fs
->fonts
[j
], FC_INDEX
, 0, &str
) == FcResultMatch
)
43 retval
+= String_convert::form_string ("INDEX %s\n", str
);
44 if (FcPatternGetString (fs
->fonts
[j
], FC_FAMILY
, 0, &str
) == FcResultMatch
)
45 retval
+= String_convert::form_string ("family %s\n ", str
);
46 if (FcPatternGetString (fs
->fonts
[j
],
47 "designsize", 0, &str
) == FcResultMatch
)
48 retval
+= String_convert::form_string ("designsize %s\n ", str
);
50 retval
+= String_convert::form_string ("%s\n", (const char *)font
);
58 display_strlist (char const *what
, FcStrList
*slist
)
61 while (FcChar8
*dir
= FcStrListNext (slist
))
63 retval
+= String_convert::form_string ("%s: %s\n", what
, dir
);
69 display_config (FcConfig
*fcc
)
72 retval
+= display_strlist ("Config files", FcConfigGetConfigFiles (fcc
));
73 retval
+= display_strlist ("Config dir", FcConfigGetConfigDirs (fcc
));
74 retval
+= display_strlist ("Font dir", FcConfigGetFontDirs (fcc
));
79 display_list (FcConfig
*fcc
)
81 FcPattern
*pat
= FcPatternCreate ();
85 os
= FcObjectSetBuild (FC_FAMILY
, FC_STYLE
, (char *)0);
87 FcFontSet
*fs
= FcFontList (fcc
, pat
, os
);
88 FcObjectSetDestroy (os
);
90 FcPatternDestroy (pat
);
95 retval
= display_fontset (fs
);
96 FcFontSetDestroy (fs
);
102 LY_DEFINE (ly_font_config_get_font_file
, "ly:font-config-get-font-file", 1, 0, 0,
104 "Get the file for font @var{name}.")
106 LY_ASSERT_TYPE (scm_is_string
, name
, 1);
108 FcPattern
*pat
= FcPatternCreate ();
111 val
.type
= FcTypeString
;
112 val
.u
.s
= (const FcChar8
*)ly_scm2string (name
).c_str (); // FC_SLANT_ITALIC;
113 FcPatternAdd (pat
, FC_FAMILY
, val
, FcFalse
);
116 SCM scm_result
= SCM_BOOL_F
;
118 FcConfigSubstitute (NULL
, pat
, FcMatchFont
);
119 FcDefaultSubstitute (pat
);
121 pat
= FcFontMatch (NULL
, pat
, &result
);
123 if (FcPatternGetString (pat
, FC_FILE
, 0, &str
) == FcResultMatch
)
124 scm_result
= scm_from_locale_string ((char const *)str
);
126 FcPatternDestroy (pat
);
131 LY_DEFINE (ly_font_config_display_fonts
, "ly:font-config-display-fonts", 0, 0, 0,
133 "Dump a list of all fonts visible to FontConfig.")
135 string str
= display_list (NULL
);
136 str
+= display_config (NULL
);
138 progress_indication (str
);
140 return SCM_UNSPECIFIED
;
143 LY_DEFINE (ly_font_config_add_directory
, "ly:font-config-add-directory", 1, 0, 0,
145 "Add directory @var{dir} to FontConfig.")
147 LY_ASSERT_TYPE (scm_is_string
, dir
, 1);
149 string d
= ly_scm2string (dir
);
151 if (!FcConfigAppFontAddDir (0, (const FcChar8
*)d
.c_str ()))
152 error (_f ("failed adding font directory: %s", d
.c_str ()));
153 else if (be_verbose_global
)
154 message (_f ("adding font directory: %s", d
.c_str ()));
156 return SCM_UNSPECIFIED
;
159 LY_DEFINE (ly_font_config_add_font
, "ly:font-config-add-font", 1, 0, 0,
161 "Add font @var{font} to FontConfig.")
163 LY_ASSERT_TYPE (scm_is_string
, font
, 1);
165 string f
= ly_scm2string (font
);
167 if (!FcConfigAppFontAddFile (0, (const FcChar8
*)f
.c_str ()))
168 error (_f ("failed adding font file: %s", f
.c_str ()));
169 else if (be_verbose_global
)
170 message (_f ("adding font file: %s", f
.c_str ()));
172 return SCM_UNSPECIFIED
;