Am 28.04.2015 um 18:14 schrieb Urs Liska:
Am 28.04.2015 um 17:53 schrieb Urs Liska:
I think I have found something.
After some experimenting with a copy of font-config-get-font-file and
trying different approaches I could guess from the documentations
available I found that replacing an item in the FcPatternGetString
call this function returns the font name and not the Postscript name
or the font file.
The following preliminary function (if added to
font-config-scheme.cc) returns either the Font Name (if the font
exists) or "Emmentaler-11" (on my system) if it doesn't exist. I
assume it would return other names on other systems:
LY_DEFINE (ly_font_config_font_exists, "ly:font-config-font-exists",
1, 0, 0,
...
Best
Urs
Wrapping this Scheme function around that:
fontExists =
#(define-scheme-function (parser location font-name)(string?)
(string=? font-name (ly:font-config-font-exists font-name)))
shows that my idea is right: The C++ function returns the family name
of either the given font or the (system-dependent) fallback font. Now
all there would be to it is moving the comparison of the latter Scheme
function to the C++ function .
Urs
Last one for this working session: The following function
ly:font-config-font-exists will return true or false depending on
whether the given font is available. The only drawback (yet) is that now
the comparison is case sensitive. But *that* should be easy now?
Urs
LY_DEFINE (ly_font_config_font_exists, "ly:font-config-font-exists", 1,
0, 0,
(SCM name),
"Determine if font @var{name} exists.")
{
LY_ASSERT_TYPE (scm_is_string, name, 1);
string in_name = ly_scm2string (name).c_str ();
FcPattern *pat = FcPatternCreate ();
FcValue val;
val.type = FcTypeString;
val.u.s = (const FcChar8 *)ly_scm2string (name).c_str (); //
FC_SLANT_ITALIC;
FcPatternAdd (pat, FC_FAMILY, val, FcFalse);
FcResult result;
SCM scm_result = SCM_BOOL_F;
FcConfigSubstitute (NULL, pat, FcMatchFont);
FcDefaultSubstitute (pat);
pat = FcFontMatch (NULL, pat, &result);
FcChar8 *str = 0;
if ((FcPatternGetString (pat, FC_FAMILY, 0, &str) == FcResultMatch) &&
(in_name.compare((char const *)str) == 0))
scm_result = SCM_BOOL_T;
FcPatternDestroy (pat);
return scm_result;
}
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user