[Fontconfig] Matching font by unicode coverage

Behdad Esfahbod behdad at behdad.org
Mon Jan 19 15:59:31 PST 2015

Thanks David,

Comments below.

On 15-01-19 12:36 PM, David Lattimore wrote:
> Matching with an FC_CHARSET works for me. No idea if what I'm doing is right,
> but roughly what I do is:
> - Identify script for each character
> (using http://unicode.org/Public/UNIDATA/Scripts.txt)
> - Split runs based on script (so that no run has two different scripts)
> - Build an FC_CHARSET for the run.
> - Match and use the resulting font.

While this works, it will be extremely slow, and results in ransom-note
effects whereas eg adding a diacritic mark to a run will change the font for
the entire run.

What most clients of Fontconfig do instead is to call FcFontSort() for all
desired properties but NOT FC_CHARSET, and then walk down the returned list of
font and pick the first font that supports each desired character.

Does that make sense?


> So if a font didn't define all the characters in a script, I might still get
> some missing glyphs. But it seems to work reasonably well. If I wanted to make
> sure all characters had glyphs, I could probably so a second round of
> splitting where adjacent characters for which no glyphs was found were broken
> off into a separate text run and rematched. So far I haven't bothered.
> Hope that helps.
> On 19 January 2015 at 22:51, Sam Varshavchik <mrsam at courier-mta.com
> <mailto:mrsam at courier-mta.com>> wrote:
>     Akira TAGOH writes:
>         That way is what Pango do to figure out the glyph coverage in fonts.
>         they convert the result into their own structure so that it's not that
>         easy to find out a font that have the certain coverage in fontconfig only.
>     You mean match by FC_CHARSET? That was the first part of what I'm trying
>     to figure out, whether creating an FcCharset containing the unicode
>     characters in the text, and then trying to match a font using it, will work.
>         On Mon, Jan 19, 2015 at 12:51 PM, Sam Varshavchik
>         <<URL:mailto:mrsam at courier-__mta.com
>         <mailto:mrsam at courier-mta.com>>mrsam at courier-mta.com
>         <mailto:mrsam at courier-mta.com>> wrote:
>            I'm learning the fontconfig API, and I'm trying to figure out how to do
>            the following.
>            I have arbitrary Unicode text, and I would like to match a
>         reasonable font
>            to use for displaying it. It's possible that I might need more than one
>            font if, say, the text is a mixture of Latin characters and Asian
>            ideographs.
>            I see that FC_CHARSET is an option to FcPattern. Does this sound
>         like I'm
>            on the right track:
>            A) Construct an FcCharset and add all unicode characters in the text to
>            display
>            B) Add it as a FC_CHARSET value to an FcPattern.
>            C) Use FcFontList() to search for the matching font.
>            The developer reference contains the following statement:
>         "Fontconfig uses
>            some of these properties for font matching and font completion.
>         Others are
>            provided as a convenience for the application's rendering mechanism."
>            So, I guess I'm trying to clarify whether I can use the FC_CHARSET
>            property to search for fonts that have coverage for my unicode
>         text, or if
>            this a non-searchable property, only.
>     _______________________________________________
>     Fontconfig mailing list
>     Fontconfig at lists.freedesktop.org <mailto:Fontconfig at lists.freedesktop.org>
>     http://lists.freedesktop.org/mailman/listinfo/fontconfig
> _______________________________________________
> Fontconfig mailing list
> Fontconfig at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/fontconfig


More information about the Fontconfig mailing list