mapbox / node-fontnik

Fonts ⇢ protobuf-encoded SDF glyphs
BSD 3-Clause "New" or "Revised" License
222 stars 65 forks source link

Extract kerning and shaping tables from fonts? #85

Open mikemorris opened 9 years ago

mikemorris commented 9 years ago

tl;dr Can we use ICU or HarfBuzz to extract shaping and kerning tables from a font?

From discussion with @nickidlugash on adding kerning support:

FreeType only supports kerning via the (rather simple) ‘kern’ table. For the interpretation of kerning data in the (highly sophisticated) ‘GPOS’ table you need a higher-level library like ICU or HarfBuzz since it can be context dependent (this is, the kerning may vary depending on the position within a text string, for example). http://freetype.org/freetype2/docs/glyphs/glyphs-4.html

  • FreeType has limited support for reading kerning tables and running FT_Get_Kerning for all possible glyph pairs seems like a terrible idea.
  • We'll need to integrate HarfBuzz (and a JavaScript equivalent?) into our rendering engines at some point for complex text shaping, could we handle kerning at this point too?
  • Is it possible to use ICU or HarfBuzz to extract shaping and kerning tables from a font at upload time to be stashed on S3 and used later for rendering, rather than having to load the full font file into HarfBuzz/ICU?
springmeyer commented 9 years ago

Good questions, I'll add this tidbit:

FreeType can now use the HarfBuzz library to greatly improve the
      auto-hinting of  fonts that  use OpenType features:  Many glyphs
      that are part  of such features but don't have  cmap entries are
      now handled  properly, for  example small caps  or superscripts.
      Define the configuration  macro FT_CONFIG_OPTION_USE_HARFBUZZ to
      activate HarfBuzz support

http://sourceforge.net/projects/freetype/files/freetype2/2.5.3/

mattdesl commented 9 years ago

Opentype.js has also been working on basic GPOS parsing: https://github.com/nodebox/opentype.js/issues/19

mikemorris commented 9 years ago

Current thinking is to implement something like Harfbuzz's reference_table method to extract and dump the binary SFNT table data while node-fontnik has the font open in FreeType, and write a custom backend for HarfBuzz to read this data by itself rather than needing to open up a font file at shaping time. @lbud is digging into how this will work.

I started working on porting pomax/A-binary-parser-generator to Node.js with Browserify today to try extracting and parsing the shaping tables in JavaScript, but I think that approach will end up being slower, more difficult and result in less useful data (JavaScript objects instead of binary data HarfBuzz expects) than just doing this through FreeType.

felipesanches commented 9 years ago

I just posted a few comments here while I actually intended to post them to issue #95. I have just deleted them from here and posted them to the correct issue. Sorry.