Commit da86b73f034c077637b169c374808a966e00f399

Werner Lemberg 2016-03-15T07:55:05

* src/autofit/aflatin.c (af_latin_compute_stem_width): Optimize.

diff --git a/ChangeLog b/ChangeLog
index 3f94966..f963c83 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2016-03-15  Werner Lemberg  <wl@gnu.org>
+
+	* src/autofit/aflatin.c (af_latin_compute_stem_width): Optimize.
+
 2016-03-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
 	[smooth] Temporarily revert 6eb6158dd787 (#47114).
diff --git a/src/autofit/aflatin.c b/src/autofit/aflatin.c
index dddfada..f9b8507 100644
--- a/src/autofit/aflatin.c
+++ b/src/autofit/aflatin.c
@@ -2511,7 +2511,6 @@
     AF_LatinMetrics  metrics  = (AF_LatinMetrics)hints->metrics;
     AF_LatinAxis     axis     = &metrics->axis[dim];
     FT_Pos           dist     = width;
-    FT_Pos           bdelta   = 0;
     FT_Int           sign     = 0;
     FT_Int           vertical = ( dim == AF_DIMENSION_VERT );
 
@@ -2526,32 +2525,6 @@
       sign = 1;
     }
 
-    /* A stem's end position depends on two values: the start position    */
-    /* and the stem length.  The former gets usually rounded to the grid, */
-    /* while the latter gets rounded also if it exceeds a certain length  */
-    /* (see below in this function).  This `double rounding' can lead to  */
-    /* a great difference to the original, unhinted position; this        */
-    /* normally doesn't matter for large PPEM values, but for small sizes */
-    /* it can easily make outlines collide.  For this reason, we adjust   */
-    /* the stem length by a small amount depending on the PPEM value in   */
-    /* case the former and latter rounding both point into the same       */
-    /* direction.                                                         */
-
-    if ( ( ( width > 0 ) && ( base_delta > 0 ) ) ||
-         ( ( width < 0 ) && ( base_delta < 0 ) ) )
-    {
-      FT_UInt  ppem = metrics->root.scaler.face->size->metrics.x_ppem;
-
-
-      if ( ppem < 10 )
-        bdelta = base_delta;
-      else if ( ppem < 30 )
-        bdelta = ( base_delta * (FT_Pos)( 30 - ppem ) ) / 20;
-
-      if ( bdelta < 0 )
-        bdelta = -bdelta;
-    }
-
     if ( (  vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||
          ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) )
     {
@@ -2609,7 +2582,39 @@
             dist += delta;
         }
         else
+        {
+          /* A stem's end position depends on two values: the start        */
+          /* position and the stem length.  The former gets usually        */
+          /* rounded to the grid, while the latter gets rounded also if it */
+          /* exceeds a certain length (see below in this function).  This  */
+          /* `double rounding' can lead to a great difference to the       */
+          /* original, unhinted position; this normally doesn't matter for */
+          /* large PPEM values, but for small sizes it can easily make     */
+          /* outlines collide.  For this reason, we adjust the stem length */
+          /* by a small amount depending on the PPEM value in case the     */
+          /* former and latter rounding both point into the same           */
+          /* direction.                                                    */
+
+          FT_Pos  bdelta = 0;
+
+
+          if ( ( ( width > 0 ) && ( base_delta > 0 ) ) ||
+               ( ( width < 0 ) && ( base_delta < 0 ) ) )
+          {
+            FT_UInt  ppem = metrics->root.scaler.face->size->metrics.x_ppem;
+
+
+            if ( ppem < 10 )
+              bdelta = base_delta;
+            else if ( ppem < 30 )
+              bdelta = ( base_delta * (FT_Pos)( 30 - ppem ) ) / 20;
+
+            if ( bdelta < 0 )
+              bdelta = -bdelta;
+          }
+
           dist = ( dist - bdelta + 32 ) & ~63;
+        }
       }
     }
     else