[HarfBuzz] Units of members of hb_glyph_position_t

Behdad Esfahbod behdad at behdad.org
Tue May 28 18:46:45 UTC 2019

On Tue, May 28, 2019 at 11:44 AM Eli Zaretskii <eliz at gnu.org> wrote:

> > From: Behdad Esfahbod <behdad at behdad.org>
> > Date: Mon, 27 May 2019 21:21:10 -0400
> > Cc: "harfbuzz at lists.freedesktop.org" <harfbuzz at lists.freedesktop.org>
> >
> >  control those units (if they are under the client program's control).
> >
> > They are controlled mainly using hb_font_set_scale().
> >
> >  In particular, I get a huge value of x_advance for the letter U+05EA
> >  HEBREW LETTER TAV when it is followed by U+05BB HEBREW POINT QUBUTS.
> >  The value of x_advance I get is 1229, which is too large even after
> >  dividing by 64 (which, btw, I still am not sure is TRT in my case,
> >
> > FreeType works in 26.6 fixed-point, ie. 64 units per 1.0.  That's where
> the 64 value comes from.  And you
> > don't see it in your code because hb_ft_font_create* sets that on
> hb_font for you.
> >
> > In your Windows code, you should call hb_font_set_scale().  I believe
> right now you are *not* calling, and you
> > get values in the face's UPEM.  That's the default scale for fonts.  You
> can get the face UPEM using
> > hb_face_get_upem().
> OK, I figured out how to scale the units from UPEM to pixels for a
> given font size, and now I see reasonable results after such scaling.
> However, I think something is still amiss, because I still don't
> understand how to determine the values with which to call
> hb_font_set_scale.  Say I call it with an integer value N, what will
> that produce in terms of values of hb_glyph_position_t?  Will the
> values there be in the 0..N range, where N means the full height of
> the em box?  If so, how would I then convert those values to pixels --
> this conversion will need the font size as well, right?  And if so, I
> might well leave the values in UPEM units, and convert them to pixels
> by hand.  I feel that I'm still missing something, since you said "you
> should call hb_font_set_scale".  So presumably if I call that
> function, conversion to pixels will somehow become easier?

You pick what value you want to represent one pixel as.  Say, you choose
1024.  Then if you want to render at "16px" font size, you set scale to
16*1024.  That's all.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/harfbuzz/attachments/20190528/6656d580/attachment.html>

More information about the HarfBuzz mailing list