Description
I noticed there's sometimes a tiny discrepancy in font metrics as computed by freetype.Context
and truetype.NewFace
.
As a reproducible example, using the Go Mono font of size 86.4 exactly, at 72.0 DPI, the advance width for the glyph 'H' differs by 1/64 (the smallest value a fixed.Int26_6
can represent).
See the complete program on the Go Playground. Its output:
advance width of 'H' via truetype: 51:55
advance width of 'H' via freetype: 51:54
I've tracked it down and found the root cause. When computing the scale factor, the float64 → fixed 26.6 conversion is done differently between those two packages. In truetype
, it rounds to the nearest 26.6 fixed point value:
scale: fixed.Int26_6(0.5 + (opts.size() * opts.dpi() * 64 / 72)),
But in freetype
, it uses the floor:
c.scale = fixed.Int26_6(c.fontSize * c.dpi * (64.0 / 72.0))
Between those two, it seems taking the nearest value is the better behavior, so I'll send a PR that adjusts freetype
to fix this discrepancy. CC @nigeltao.