[Fontconfig] fontconfig-2.8 Emmentaler-20 matching

Akira TAGOH akira at tagoh.org
Thu May 31 00:56:42 PDT 2012


On Thu, May 31, 2012 at 3:01 PM, Werner LEMBERG <wl at gnu.org> wrote:
>
> [I'm forwarding this mail to the fontconfig list (with omissions),
> since it is indeed a problem IMHO]
>
>> [...] [I] found that fontconfig 2.8 no longer selects Emmentaler-20.
>>
>> I found that escaping the dash helps fc-match, but cannot get
>> GnomeCanvas' text method to do the same.  I just dropped
>> emmentaler-20.otf in ~/.fonts and it's nicely in fc-list
>>
>> $ fc-scan ~/.fonts/emmentaler-20.otf
>> Pattern has 19 elts (size 32)
>>       family: "Emmentaler-20"(s)
>>       familylang: "en"(s)
>>       style: "20"(s)
>>       stylelang: "en"(s)
>>       fullname: "Emmentaler-20"(s)
>>       fullnamelang: "en"(s)
>>       slant: 0(i)(s)
>>       weight: 100(i)(s)
>>       width: 100(i)(s)
>>       foundry: "unknown"(s)
>>       file: "/home/janneke/.fonts/emmentaler-20.otf"(s)
>>       [...]
>
>> $ fc-match Emmentaler-20
>> DejaVuSans.ttf: "DejaVu Sans" "Book"
>
>> $ fc-match Emmentaler\-20
>> DejaVuSans.ttf: "DejaVu Sans" "Book"
>
>> $ fc-match Emmentaler\\-20
>> emmentaler-20.otf: "Emmentaler-20" "20"
>
>> $ fc-list | grep Emmentaler
>> Emmentaler\-20:style=20
>
> fontconfig's behaviour doesn't look right to me.  Why gets a `-'
> character replaced with `\-' in the font name?

This is because of the limitation of FcNameParse() since it uses "-"
as a separator to guess the parameters. see what happened with it:

$ FC_DEBUG=4 fc-match Emmentaler-20
...
FcConfigSubstitute Pattern has 2 elts (size 16)
        family: "Emmentaler"(s)
        size: 20(f)(s)
...

Although this issue usually won't happens on the applications who uses
fontconfig, because they do as the following:

#include <fontconfig/fontconfig.h>

int
main(void)
{
        FcPattern *pat, *match;
        FcResult result;

        FcInit();
        pat = FcPatternCreate();
        FcPatternAddString(pat, FC_FAMILY, "Emmentaler-20");
        FcConfigSubstitute(NULL, pat, FcMatchPattern);
        FcDefaultSubstitute(pat);
        match = FcFontMatch(NULL, pat, &result);
        FcPatternPrint(match);

        if (match)
                FcPatternDestroy(match);
        FcPatternDestroy(pat);

        FcFini();

        return 0;
}

$ ./a.out
Pattern has 29 elts (size 32)
        family: "Emmentaler-20"(s)
        familylang: "en"(s)
        style: "20"(s)
        stylelang: "en"(s)
        fullname: "Emmentaler-20"(s)
        fullnamelang: "en"(s)
...

  Additionally, there is
> a discrepancy between the output of fc-scan and fc-list, since the
> former doesn't show `\-'.

because the default format for fc-list uses FcNameUnparse(). if you
don't like it, you can specify the output format with -f for your
preference:

$ fc-list -f '%{?file{%{file}: }}%{-file{%{family}:style=%{style}}}\n'
...
/usr/share/fonts/lilypond/emmentaler-20.otf: Emmentaler-20:style=20
...

Hope that helps,

>
>
>    Werner
> _______________________________________________
> Fontconfig mailing list
> Fontconfig at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/fontconfig



-- 
Akira TAGOH


More information about the Fontconfig mailing list