On 8/8/15 15:50, Simon Cozens wrote:
On 08/08/2015 15:25, Behdad Esfahbod wrote:
Ok, that makes sense. And yes, I was ignoring the advance for glyphs and 
instead using Freetype to return the glyph width. I think I stole that bit of 
code from xetex. :-)

Really?

It may not be totally true. I don't know if XeTeX ignores the advance
data - it probably doesn't

Yeah, I'd be really surprised if it did -- that would break kerning, for example. I think someone would probably have noticed by now. :)

- but I certainly stole the glyph bounds
measurement code from XeTeXFontInst::getGlyphBounds.

However, when I replace SILE's glyph width measurement code with
'glyph_pos[j].x_advance / 64.0' instead of getting the glyph advance out
of Freetype, I get slightly different output.

With Harfbuzz's x_advance, a Gentium letter "m" at 10pt measures as
8.03125pt wide; using the width information from Freetype, I get
8.0322265625pt. I can't account for the discrepancy and I don't know who
is right.

According to the hmtx table, at least in the version I happen to be looking at, "m" has a width of 1645 units. The font has 2048 units per em; so at 10pt, that works out to 10*1645/2048 = 8.03222656pt.

So FreeType seems to be telling you the truth; but that doesn't mean harfbuzz is wrong, necessarily. It sounds like you're using 26.6 fixed-point values in harfbuzz, in which case you can only expect 6 binary digits of fractional precision.

So I'd expect the value you'll be getting from glyph_pos[j].x_advance to be round(10*1645*64/2048) which comes to 512, and 512/64.0 is indeed 8.03125.

For higher precision, you might want to consider using 16.16 rather than 26.6 fixed-point arithmetic.

JK

_______________________________________________
HarfBuzz mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/harfbuzz

Reply via email to