[HarfBuzz] Font fallback strategies
Behdad Esfahbod
behdad at behdad.org
Thu Oct 25 17:20:47 PDT 2012
Ok, looks like what you want is very close to what Pango does... In short:
- Choose a language: Given the script, choose a language that makes sense for
the script. Pango does this using a few env vars, and tables. See
pango-language.c.
- Given the language, get a fontset from FcFontSort() and cache it. Use the
charsets from the pattern for fast cmap checking.
- You can cache many many other things to make things fast. Indeed, pangofc
does a lot of that. Check pangofc-fontmap.c.
behdad
On 12-10-25 04:22 PM, Grigori Goronzy wrote:
> On 10/25/2012 09:44 PM, Behdad Esfahbod wrote:
>> You need to tell us more about the context (system, etc) I think. You can use
>> Fontconfig.
>>
>
> It's realtime rendering subtitle rendering I'm doing, and the subtitles
> are possibly animated, so it must be fast.
>
> I'm using fontconfig, but I'm just doing greedy codepoint by codepoint
> font selection at the moment, i.e. text is processed in sequence from
> start to end, and every time a glyph isn't found in the current font's
> cmap, a new font is searched and selected.
>
> This kind of fallback selection doesn't cut it in some cases (run of
> same script/language text is split up irregularly when a codepoint is
> missing in current font) and fallback is expensive sometimes (needs to
> check a huge number of fonts for coverage). Before investing much time
> into testing various strategies, I thought it might be a good idea to
> ask here.
>
>> Note that fallback order should be per-language, not per-script.
>>
>
> What does that mean in practice? Scripts often support multiple
> languages, so how should I map the script of a codepoint to a language?
>
>> CSS recommends trying to choose fallback font for entire grapheme clusters at
>> a time, but I don't know any implementation that does that.
>>
>
> I tried wading through Firefox source code (Firefox seems to be doing a
> very good job at fallback), but never really found the crucial part of
> the code or what the underlying algorithm is. :) Mozilla's codebase is
> very big and complex.
>
> As far as I can see, there are a few maxims for choosing fallbacks: the
> number of fonts used for a run of text should be minimal, every
> appearance of a specific character (or grapheme cluster) should always
> be rendered by the same font, and sequences of characters using the same
> font should be as long as possible. It doesn't seem to be possible to
> fulfill all these in an efficient manner, so what compromises work well
> in practice? What are common fallback implementations doing?
>
> Best regards
> Grigori
>
>
More information about the HarfBuzz
mailing list