[HarfBuzz] Questions about interacting with HarfBuzz

Grigori Goronzy greg at chown.ath.cx
Tue Oct 9 08:58:20 PDT 2012


Hey Lorant,

let me give a try to answer your questions. I'm not an expert on
HarfBuzz or OpenType by any means, so YMMV.

On 10/02/2012 10:51 PM, Lóránt Pintér wrote:
>   * *How should I find out if a glyph returned by hb_shape() is a
>     ligature?* I found some static functions in hb-ot-layout-private.hh
>     like is_a_ligature(), but these are not C externs, so I cannot
>     access them from JavaScript. Is there some other way supported by
>     HarfBuzz, or shall I re-implement these functions in JS by
>     inspecting the glyph_info_t struct?
>

As far as I can see (in the OpenType specification) you should either
check the glyph class or the ligature caret coverage table.

The hb_ot_layout_get_ligature_carets() function does a check against the
coverage table. It should return 0 if a glyph is not a ligature, and a
value greater than zero otherwise.

>   * *How can I find internal x_advance positions inside a ligature?* The
>     GDEF table should contain information about this. Does HarfBuzz
>     expose it in any way?

A ligature is a single glyph. There is no such thing as an "internal"
advance.

>   * *How should I find out if a character was split into multiple
>     glyphs?* I guess the "cluster" field of a glyph_info_t is about
>     this, right? If I have a blown-up character, how can I find the
>     caret positions that I should use?

Yup, the "cluster" value basically specifies the index of the codepoint
in the shaped text the glyph belongs to. Well, more or less, as far as I
understand.

There's a function for determining caret positions,
hb_ot_layout_get_ligature_carets(). I haven't used it yet, but it looks
easy to use. Just pass the glyph index and a small array, and it will be
filled with caret positions.

>   * *Can HarfBuzz handle the Apple "kern," "morx" etc. tables?* If not,
>     is it safe to use FontForge to convert these fonts to use OpenType's
>     GPOS/GSUB etc.? This is not very
>     encouraging: http://fontforge.org/gposgsub.html

Both TrueType (fallback) and OpenType kerning are supported. The only
caveat is that you can't disable TrueType kerning (yet), it is always
enabled.

>   * *Which features are turned on by default?* I can see that ligatures
>     and kerning are turned on for my simple Latin text, and I can
>     successfully turn them off by supplying features "-kern" and
>     "-liga," but I'm still curious what the defaults are.

Well, "reasonable defaults" are used that work well with most scripts
and fonts. See hb-ot-shape.cc.

>   * *When kerning is applied, I get funny x_advances.* This might be an
>     error on my side, but currently when a pair of glyphs is kerned, the
>     first character get's an x_advance that seems to have something like
>     "42949017" subtracted from it. Because ligature substitution works
>     perfectly, I assume GSUB table parsing works fine, so I don't see
>     why GPOS would fail. Any pointers here?
>

No idea. I am using Freetype to implement the font callbacks, and
advances are fine, both for TrueType and OpenType kerning. Fallback
kerning calls into the font functions, I can imagine that it might break
things if the callbacks aren't implemented correctly.

Best regards
Grigori



More information about the HarfBuzz mailing list