<div dir="ltr"><div dir="ltr">Hi Sylvain,<br><br><div class="gmail_quote"><div dir="ltr">On Mon, Nov 19, 2018 at 11:52 AM Sylvain Becker <<a href="mailto:sylvain.becker@gmail.com">sylvain.becker@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Hello,<br><br>I am using HarfBuzz and FreeType to render text in 70 languages and result is very good, even looking into details! <br>I wonder if I could get some explanation to deal with better positioning.</div></div></blockquote><div><br></div><div>Good to hear.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Both HB and FT provides datas: which ones to choose explicitly?<br></div></div></blockquote><div><br></div><div>You mostly want the HB numbers, except for rasterizing glyph bitmaps, which is FT's forte.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Format is fractional 26/6, but how and when to round?<br></div></div></blockquote><div><br></div><div>Depends on many factors.  This might help: <a href="http://goo.gl/yf3M7">http://goo.gl/yf3M7</a></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">I've sum up all positions datas (with owner prefixes).<br>This is about horizontal layout and LTR (but could also be RTL).<br><br>From FreeType (Face/glyph/metrics).<br>- FT_offset_x (horiBearingX),<br></div></div></blockquote><div><br></div><div>You don't need that per se.  When you render a bitmap using FreeType though, that bitmap has left/top positioning that you need to add to HarfBuzz glyph position.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">- FT_kerning_x<br></div></div></blockquote><div><br></div><div>You don't need this.  HarfBuzz does kerning and other positioning.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">- FT_rsb/lsb_deltas (hinting)<br></div></div></blockquote><div><br></div><div>Nice idea.  Used by no one.  ignore.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">- FT_advance_x<br></div></div></blockquote><div><br></div><div>Ignore.  HarfBuzz does positioning.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">>From HarfBuzz (hb_glyph_position_t)<br>- HB_x_advance<br>- HB_x_offset<br>- HB_y_offset<br></div></div></blockquote><div><br></div><div>Glyph "origin" for glyph number i in the shape result buffer is:</div><div><br></div><div>  x = sum(x_advance[j] for 0 <= j < i) + x_offset[i]<br></div><div>  y = y_offset[i]<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">In y axis:<br>- FT_offset_y (ascender or height - horiBearingY)<br></div></div></blockquote><div><br></div><div>Again, ignore.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">- HB_y_offset<br></div></div></blockquote><div><br></div><div>See above.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Rounding:<br>- FLOOR(X) (((X) & -64) / 64)<br>- CEIL(X)  FLOOR((X) + 63)<br>- ROUND(X) FLOOR((X) + 32)<br><br>- How to round and when?</div></div></blockquote><div><br></div><div>Depends on 1. whether you want linearly-scalable layout, or pixel-optimized layout, and your graphics system's capabilities for rendering subpixel-positioned glyphs and whether you want that (extra memory / CPU cost).</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">(Why does HB provide fractionnals if tutorials start by using floor()?).</div></div></blockquote><div><br></div><div>Some graphics systems only support pixel-aligned glyph rendering.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">- With hinting (auto hinted), should we use FT rsb/lsb_detlas?<br></div></div></blockquote><div><br></div><div>Again, nice idea, too cumbersome to use.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">- What about FT kerning ?<br></div></div></blockquote><div><br></div><div>Never.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Of course I've a start of a solution. Result looks 99% ok I guess.<br>Maybe I've some rounding (1px) between spacing or hinted glyph offset.<br><br>I've also seen:<br><a href="https://github.com/harfbuzz/harfbuzz-tutorial/blob/master/hello-harfbuzz-freetype.c" target="_blank">https://github.com/harfbuzz/harfbuzz-tutorial/blob/master/hello-harfbuzz-freetype.c</a><br><a href="https://cgit.freedesktop.org/cairo/tree/src/cairo-ft-font.c" target="_blank">https://cgit.freedesktop.org/cairo/tree/src/cairo-ft-font.c</a><br>But for instance:<br>- HB provides fractionals 26/6, but tutorial starts by using floor()?<br>- Cairo convert to double and don't use rsb/lsb_delta, not even kerning and is not aware of HB ?<br></div></div></blockquote><div><br></div><div>Cairo receives final glyph positions, so doesn't need to know about HB</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Thanks for you help,<br>Sylvain<br clear="all"></div></div></blockquote><div><br></div><div>Hope that helps. <br></div></div><br>-- <br><div dir="ltr" class="gmail_signature">behdad<br><a href="http://behdad.org/" target="_blank">http://behdad.org/</a></div></div></div>