From 793a9ff9f5de353e4e3f7cf0a99b3b1f9b617039 Mon Sep 17 00:00:00 2001 From: Alexei Podtelezhnikov Date: Sat, 22 Sep 2018 14:38:00 -0400 Subject: [PATCH] * src/base/ftobjs.c (ft_glyphslot_reset_bimap): Another tweak. This one should be clearer. When the rounded monochrome bbox collapses we add a pixel that covers most if not all original cbox. --- ChangeLog | 7 +++++++ src/base/ftobjs.c | 52 ++++++++++++++++++++--------------------------- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index c39f08fd2..044c3c27b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2018-09-20 Alexei Podtelezhnikov + + * src/base/ftobjs.c (ft_glyphslot_reset_bimap): Another tweak. + + This one should be clearer. When the rounded monochrome bbox collapses + we add a pixel that covers most if not all original cbox. + 2018-09-20 Alexei Podtelezhnikov * src/base/ftobjs.c (ft_glyphslot_reset_bimap): Further tweak. diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index 874a3a18c..ee865a8fb 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -393,47 +393,39 @@ #if 1 /* x */ - /* undocumented but confirmed: bbox values get rounded; */ - /* for narrow glyphs bbox is extended to one pixel first */ - switch ( pbox.xMax - pbox.xMin ) - { - case 1: - pbox.xMax -= 1; - cbox.xMax += 64; - /* fall through */ - case 0: - if ( cbox.xMax - cbox.xMin < 63 ) - { - cbox.xMin = ( cbox.xMin + cbox.xMax ) / 2 - 31; - cbox.xMax = cbox.xMin + 63; - } - } - - /* we do asymmetric rounding so that the center */ - /* of a pixel gets always included */ + /* undocumented but confirmed: bbox values get rounded; */ + /* we do asymmetric rounding so that the center of a pixel */ + /* gets always included */ pbox.xMin += ( cbox.xMin + 31 ) >> 6; pbox.xMax += ( cbox.xMax + 32 ) >> 6; - /* y */ + /* if the bbox collapsed, we add a pixel based on the total */ + /* rounding remainder to cover most of the original cbox */ - switch ( pbox.yMax - pbox.yMin ) + if ( pbox.xMin == pbox.xMax ) { - case 1: - pbox.yMax -= 1; - cbox.yMax += 64; - /* fall through */ - case 0: - if ( cbox.yMax - cbox.yMin < 63 ) - { - cbox.yMin = ( cbox.yMin + cbox.yMax ) / 2 - 31; - cbox.yMax = cbox.yMin + 63; - } + if ( ( ( cbox.xMin + 31 ) & 63 ) - 31 + + ( ( cbox.xMax + 32 ) & 63 ) - 32 < 0 ) + pbox.xMin -= 1; + else + pbox.xMax += 1; } + /* y */ + pbox.yMin += ( cbox.yMin + 31 ) >> 6; pbox.yMax += ( cbox.yMax + 32 ) >> 6; + if ( pbox.yMin == pbox.yMax ) + { + if ( ( ( cbox.yMin + 31 ) & 63 ) - 31 + + ( ( cbox.yMax + 32 ) & 63 ) - 32 < 0 ) + pbox.yMin -= 1; + else + pbox.yMax += 1; + } + break; #else goto Adjust;