[HarfBuzz] No kerning?

Jamie Dale jamiedale88+harfbuzz at gmail.com
Mon Oct 5 12:32:55 PDT 2015


Hey all,

In our application we have two text shaping backends; a simple "kerning
only" implementation using our existing font rendering code (fast, but
can't handle complex languages), and a HarfBuzz based implementation for
when we need to support complex languages (although ideally the
HarfBuzz implementation should be able to produce mostly equivalent results
when compared to our existing font rendering when dealing with languages
like English).

If you've seen my previous email entitled "Using FreeType load flags", then
you'll know I'm using some custom font functions to try and ensure HarfBuzz
uses the correct FreeType hinting flags, as well as cache a lot of FreeType
calls, and use the correct scale.

So far this has worked out really well, however I've noticed that the
HarfBuzz implementation isn't applying kerning when shaping English text
(probably other languages too).

The images below are using the Roboto font, and show the output from each
implementation.
The top image is using our "kerning only" implementation, and the bottom
image is using HarfBuzz. Note that the "T" and "e" characters are further
apart in the bottom image.
[image: Inline images 2]
[image: Inline images 1]

Here's the (slightly cut down) code I'm using to create my HarfBuzz font:

hb_font_t* CreateHarfBuzzFont(FT_Face InFace, const uint32 InGlyphFlags,
const int32 InFontSize, const float InFontScale)
{
hb_font_t* HarfBuzzFont = nullptr;

// Set the character size to render at (needs to be in 1/64 of a "point")
FT_Set_Char_Size(InFace, 0, InFontSize * 64, 96, 96);

if (InFontScale != 1.0f)
{
FT_Matrix ScaleMatrix;
ScaleMatrix.xy = 0;
ScaleMatrix.xx = (FT_Fixed)(InFontScale * 65536);
ScaleMatrix.yy = (FT_Fixed)(InFontScale * 65536);
ScaleMatrix.yx = 0;
FT_Set_Transform(InFace, &ScaleMatrix, nullptr);
}
else
{
FT_Set_Transform(InFace, nullptr, nullptr);
}

{
// Create a sub-font from the default FreeType implementation so we can
override some font functions to provide low-level caching
hb_font_t* HarfBuzzFTFont = hb_ft_font_create(InFace, nullptr);
HarfBuzzFont = hb_font_create_sub_font(HarfBuzzFTFont);
hb_font_destroy(HarfBuzzFTFont);
}

hb_font_set_funcs(...); // Sets functions that use the user-data below,
implementations are mostly default, but with a caching layer, and usage of
FreeType hinting flags
hb_font_set_user_data(...); // Ensures we have access to InGlyphFlags and
the low-level caches
hb_font_set_scale(HarfBuzzFont, InFontScale, InFontScale);

return HarfBuzzFont;
}

Am I just missing something simple? I tried calling hb_font_set_ppem but
that didn't seem to make any difference.

Thanks,
Jamie.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/harfbuzz/attachments/20151005/e84fde09/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 2115 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/harfbuzz/attachments/20151005/e84fde09/attachment.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 2117 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/harfbuzz/attachments/20151005/e84fde09/attachment-0001.png>


More information about the HarfBuzz mailing list