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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/harfbuzz > _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/harfbuzz