<div dir="ltr">Did you enable 'kern' feature? Something like that:<div><br></div><div><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">            </span><span style="color:rgb(128,128,0)">const</span><span style="color:rgb(192,192,192)"> </span>hb_feature_t<span style="color:rgb(192,192,192)"> </span>features<span style="color:rgb(0,0,0)">[</span><span style="color:rgb(0,0,128)">1</span><span style="color:rgb(0,0,0)">]</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">=</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">{</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">                </span><span style="color:rgb(0,0,0)">{</span><span style="color:rgb(192,192,192)"> </span>HB_TAG<span style="color:rgb(0,0,0)">(</span><span style="color:rgb(0,128,0)">'k'</span><span style="color:rgb(0,0,0)">,</span><span style="color:rgb(0,128,0)">'e'</span><span style="color:rgb(0,0,0)">,</span><span style="color:rgb(0,128,0)">'r'</span><span style="color:rgb(0,0,0)">,</span><span style="color:rgb(0,128,0)">'n'</span><span style="color:rgb(0,0,0)">),</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">!!</span>kerningEnabled<span style="color:rgb(0,0,0)">,</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,128)">0</span><span style="color:rgb(0,0,0)">,</span><span style="color:rgb(192,192,192)"> </span>uint<span style="color:rgb(0,0,0)">(-</span><span style="color:rgb(0,0,128)">1</span><span style="color:rgb(0,0,0)">)</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">}</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">            </span><span style="color:rgb(0,0,0)">};</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">            </span><span style="color:rgb(128,128,0)">const</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(128,128,0)">int</span><span style="color:rgb(192,192,192)"> </span>num_features<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">=</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,128)">1</span><span style="color:rgb(0,0,0)">;</span></pre>
<pre style="margin-top:0px;margin-bottom:0px"><br></pre>
<pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">            </span><span style="color:rgb(128,128,0)">bool</span><span style="color:rgb(192,192,192)"> </span>shapedOk<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,0)">=</span><span style="color:rgb(192,192,192)"> </span>hb_shape_full<span style="color:rgb(0,0,0)">(</span>hb_font<span style="color:rgb(0,0,0)">,</span><span style="color:rgb(192,192,192)"> </span>buffer<span style="color:rgb(0,0,0)">,</span><span style="color:rgb(192,192,192)"> </span>features<span style="color:rgb(0,0,0)">,</span><span style="color:rgb(192,192,192)"> </span>num_features<span style="color:rgb(0,0,0)">,</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,0,128)">0</span><span style="color:rgb(0,0,0)">);</span></pre><pre style="margin-top:0px;margin-bottom:0px"><br></pre></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature">Regards,<br>Konstantin</div></div>
<br><div class="gmail_quote">2015-10-05 23:32 GMT+04:00 Jamie Dale <span dir="ltr"><<a href="mailto:jamiedale88+harfbuzz@gmail.com" target="_blank">jamiedale88+harfbuzz@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hey all,<div><br></div><div>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).</div><div><br></div><div>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.</div><div><br></div><div>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).</div><div><br></div><div>The images below are using the Roboto font, and show the output from each implementation. </div><div>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.</div><div><img src="cid:ii_1503976db9e93b77" alt="Inline images 2" width="123" height="18"><br></div><div><img src="cid:ii_15039760affe5f37" alt="Inline images 1" width="124" height="19"><br></div><div><br></div><div>Here's the (slightly cut down) code I'm using to create my HarfBuzz font:</div><div><br></div><div><div><font face="monospace, monospace">hb_font_t* CreateHarfBuzzFont(FT_Face InFace, const uint32 InGlyphFlags, const int32 InFontSize, const float InFontScale)</font></div><div><font face="monospace, monospace">{</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">  </span>hb_font_t* HarfBuzzFont = nullptr;</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">        </span>// Set the character size to render at (needs to be in 1/64 of a "point")</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">       </span>FT_Set_Char_Size(InFace, 0, InFontSize * 64, 96, 96);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">     </span>if (InFontScale != 1.0f)</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">  </span>{</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">         </span>FT_Matrix ScaleMatrix;</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">            </span>ScaleMatrix.xy = 0;</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">               </span>ScaleMatrix.xx = (FT_Fixed)(InFontScale * 65536);</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">         </span>ScaleMatrix.yy = (FT_Fixed)(InFontScale * 65536);</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">         </span>ScaleMatrix.yx = 0;</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">               </span>FT_Set_Transform(InFace, &ScaleMatrix, nullptr);</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">      </span>}</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap"> </span>else</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">      </span>{</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">         </span>FT_Set_Transform(InFace, nullptr, nullptr);</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">       </span>}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap"> </span>{</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">         </span>// Create a sub-font from the default FreeType implementation so we can override some font functions to provide low-level caching</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">         </span>hb_font_t* HarfBuzzFTFont = hb_ft_font_create(InFace, nullptr);</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">           </span>HarfBuzzFont = hb_font_create_sub_font(HarfBuzzFTFont);</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">           </span>hb_font_destroy(HarfBuzzFTFont);</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">  </span>}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap"> </span>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</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap"> </span>hb_font_set_user_data(...); // Ensures we have access to InGlyphFlags and the low-level caches</font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">    </span>hb_font_set_scale(HarfBuzzFont, InFontScale, InFontScale);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><span style="white-space:pre-wrap">        </span>return HarfBuzzFont;</font></div><div><font face="monospace, monospace">}</font></div></div><div><br></div><div>Am I just missing something simple? I tried calling <font face="monospace, monospace">hb_font_set_ppem</font> but that didn't seem to make any difference.</div><div><br></div><div>Thanks,</div><div>Jamie.</div></div>
<br>_______________________________________________<br>
HarfBuzz mailing list<br>
<a href="mailto:HarfBuzz@lists.freedesktop.org">HarfBuzz@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/harfbuzz" rel="noreferrer" target="_blank">http://lists.freedesktop.org/mailman/listinfo/harfbuzz</a><br>
<br></blockquote></div><br></div></div>