Commit 793a9ff9f5de353e4e3f7cf0a99b3b1f9b617039

Alexei Podtelezhnikov 2018-09-22T14:38:00

* 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.

diff --git a/ChangeLog b/ChangeLog
index c39f08f..044c3c2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2018-09-20  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
+	* 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  <apodtele@gmail.com>
+
 	* src/base/ftobjs.c (ft_glyphslot_reset_bimap): Further tweak.
 
 2018-09-21  Ben Wagner  <bungeman@google.com>
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
index 874a3a1..ee865a8 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;