kas-gui / kas-text

Rich text processing
Apache License 2.0
58 stars 2 forks source link

Optimisation: face selection for fallbacks #60

Open dhardy opened 2 years ago

dhardy commented 2 years ago

Related: #53
Importance: probably low since https://github.com/RazrFalcon/ttf-parser/pull/68

Run-splitting must discover the font face to be used for each character. For this we use FontLibrary::face_for_char which iterates through all applicable faces, using Face::glyph_index on each, returning the FaceId of the first matching face (but discarding the GlyphId which is rediscovered during shaping).

There are a few possible optimisations here (but 2 and 3 conflict):

  1. Batch look-ups. prepare_runs calls face_for_char_or_first for each char; it may be faster to iterate through chars for each subtable (see https://github.com/RazrFalcon/ttf-parser/issues/76). The same could be done in shape_simple.
  2. Add a Face::contains_glyph method to ttf-parser (using the glyph_index method as a starting point, this should not be hard, but requires additional testing).
  3. Cache both FaceId and GlyphId for use when shaping. This should be usable for shape_simple though probably not for Rustybuzz or Harfbuzz backends, so not particularly useful.