[HarfBuzz] Helvetica.dfont & BitStream Vera Sans Mono problems

Behdad Esfahbod behdad at behdad.org
Mon Jul 11 21:16:15 PDT 2011

On 07/08/11 18:52, Sebastien Metrot wrote:
> Hi Behdad,

Hi Sebastien,

> - ucdata is a simple unicode API that has two main uses: it can provide you with many useful glyph infos (is a glyph printable? what is its class? etc.). It also provides methods to decompose and compose code points and I have added a simple method that can completely compose / decompose unicode strings. It also comes with a companion lib named ucpgba for Pretty Good Bidi Algorithm. It seems to work fine and I plan to use it in my code soon. Mainly, ucdata permits me not to rely on an existing system API to compose and decompse strings for me. There are probably more uses for ucdata that I don't know about.

Do you have a link?  Where is the canonical source repository?

> - How should I create the hb_unicode_funcs_t? Create an empty one and fill the struct by hand?

Create an empty one and populate using the _set functions, eg.

Note, I had to change the type names for the callbacks a last week.  I'll make
a 0.8 release with those changes soon.

> - Most importantly I think I have found the reason for the problem: my font code uses the freetype2 cache API (http://www.freetype.org/freetype2/docs/reference/ft2-cache_subsystem.html) while harbuzz glue calls directly into the regular API. This means that when I have more that one instance of the same face but with differing sizes, the shaper will only know about one. Once I display then text I use the correctly sized glyphs but they are layed out with the wrong metrics. There are two solutions for me. The first one is to stop using the cache but I'm afraid to slow my code too much at execution time. The second one is to create an new set of freetype/harfbuzz glue functions that use the cache too. I will probably try this second option (unless to see reasons not to ;-) ) and I'll report back with the code I end up using once it works.

Ok, glad you found it out.  I never digged the FTC API.  Taking a quick look,
I imagine some hb-ft API to take a explicit FT_Size may be what you need?


> Cheers!
> S.
> On Jul 8, 2011, at 6:13 AM, Behdad Esfahbod wrote:
>> Hi Sebastien,
>> Sorry for the late reply.  Comments inline.
>> On 07/04/11 06:05, Sebastien Metrot wrote:
>>> Hi,
>>> I'm seeing strange bugs in my toolkit after converting my font layout engine
>>> to harfbuzz-ng shaping. While most fonts work alright, some have wrong X axis
>>> density as you can see on this (rather big)
>>> screenshot: http://meeloo.net/~meeloo/nui_harfbuzz.png
>>> At least two fonts have problems: Helvetica.dfont (from Mac OSX Snow Leopard),
>>> Meiryo.ttf (from OSX too) and the the open source Vera Sans Mono from bitstream.
>>> As you can see on the screenshot, all sizes of Vera Sans Mono don't show the
>>> same problem, as the 8pt version looks alright.
>>> My toolkit uses harfbuzz + freetype2 with the harfbuzz provided freetype glue
>>> code. The unicode callbacks are implemented via a mix of custom code (for
>>> script detection) and ucdata (for code point features).
>> A general point: please don't use the hb_ namespace for your own code.  Ie,
>> hb_nui_get_unicode_funcs() would be better named nui_hb_get_unicode_funcs()...
>> Also, what's ucdata exactly?  I couldn't find a definitive answer.  Seems like
>> many projects include it.  Maybe we can provide glue for it in hb itself.
>> Also, please don't include hb-private.h.  That's not a public header.  You
>> should allocate your hb_unicode_funcs_t at runtime and cache it.
>>> You can have a look at the code
>>> here https://github.com/meeloo/nui3/tree/utf8/src/Font . I call harfbuzz only
>>> in one
>>> function: https://github.com/meeloo/nui3/blob/utf8/src/Font/nuiFontBase.cpp#L2114
>> BTW, since I changed the hb_font to include a reference to the face, you are
>> not using hb_face anymore, so you can remove that variable.
>>> Before using harfbuzz I was using a very naive algorithm (that is just using
>>> glyph advances) but I was not having these problems (but I couldn't handle
>>> complex scripts either ;-) ).
>>> I would like to know if this is a bug on my part (most likely) or a problem in
>>> the shaping algorithm.
>> I can't tell, from a quick look at the code.  My main guess is that you are
>> setting font size after shaping and before showing.  But that's a wild guess.
>> behdad
>>> Thank you very much if you've read this far.
>>> -- 
>>> Sébastien Métrot
>>> libnui author
>>> http://libnui.net
> _______________________________________________
> HarfBuzz mailing list
> HarfBuzz at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/harfbuzz

More information about the HarfBuzz mailing list