[HarfBuzz] No kerning?

Behdad Esfahbod behdad.esfahbod at gmail.com
Mon Oct 5 13:24:02 PDT 2015


I'm not sure what's wrong.  Can you send me the font file?

Also, I'm interested to hear more about your caching and load-flags stuff.  I
like to upstream them to the extent that makes sense.

behdad

On 15-10-05 03:32 PM, Jamie Dale wrote:
> 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.
> Inline images 2
> 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.
> 
> 
> _______________________________________________
> HarfBuzz mailing list
> HarfBuzz at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/harfbuzz
> 


More information about the HarfBuzz mailing list