Comparion of LogicalFontInstance::ImplGetGlyphBoundRect() between platforms

Chris Sherlock chris.sherlock79 at gmail.com
Fri Oct 21 14:42:25 UTC 2022


On 16 Oct 2022, at 9:03 am, Chris Sherlock <chris.sherlock79 at gmail.com> wrote:
> 
> 
> 
> On Sun, Oct 16, 2022 at 2:07 AM Caolán McNamara <caolanm at redhat.com <mailto:caolanm at redhat.com>> wrote:
> On Sat, 2022-10-15 at 22:13 +1100, Chris Sherlock wrote:
> > So an update… after I shifted to using Liberation Sans as the font
> > face and added gb_CppunitTest_use_more_fonts the only platform that
> > varies is MacOS.
> > 
> > Test name: VclLogicalFontInstanceTest::testglyphboundrect
> > equality assertion failed
> > - Expected: 7x9@(0,-8)
> > - Actual  : 7x10@(0,-8)
> 
> And what if you use a larger font size. say font size 110 instead of
> 11, maybe its a hinting related thing.
> 
> Just tried, looks like it is out by 1. 
> 
> Test name: VclLogicalFontInstanceTest::testglyphboundrect
> equality assertion failed
> - Expected: 51x82@(7,-80)
> - Actual  : 51x83@(7,-80)

I’ve had another look at the code, with some help from Khaled. The issue is the way in which we do our final rounding. 

On Freetype, it uses 26.6 fixed point, and thus needs it’s own special FreeType ceil and floor functions. CoreText appears to using floating point, but the std::ceil and std::floor functions give slight different results. 

I am confused why this might be… does anyone have any ideas?

FWIW, the reasoning for using 26.6 in Freetype can be found here: https://lists.nongnu.org/archive/html/freetype/2002-09/msg00076.html <https://lists.nongnu.org/archive/html/freetype/2002-09/msg00076.html>

The floor and ceiling functions used are defined here:

https://gitlab.com/freetype/freetype/-/blob/master/include/freetype/internal/ftobjs.h#L91 <https://gitlab.com/freetype/freetype/-/blob/master/include/freetype/internal/ftobjs.h#L91>

And the control box function that gets the bounding box is FT_Glyph_Get_CBox(), which can be found here:

https://gitlab.com/freetype/freetype/-/blob/master/src/base/ftglyph.c#L733 <https://gitlab.com/freetype/freetype/-/blob/master/src/base/ftglyph.c#L733>

We basically copied the ceil and floor used in Freetype in an attempt to get CoreText as close as possible to FreeType. It’s a pity it is off by 1 in many cases… would love it if something with more knowledge than me can see why this differs!

I’ve written a utility to get the bounding boxes of all the glyphs of a particular font, incidentally. It can be found here:

https://gerrit.libreoffice.org/c/core/+/141526 <https://gerrit.libreoffice.org/c/core/+/141526>

Chris

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/libreoffice/attachments/20221022/2a1e7a10/attachment.htm>


More information about the LibreOffice mailing list