shithub: freetype+ttf2subf

Download patch

ref: 562731d487813c55046eb8d9f03e3ff7be25c3b5
parent: b280537b6d330a2e24307afc8058a79f5b3b8864
author: David Turner <[email protected]>
date: Fri Mar 14 02:31:35 EST 2003

trying to fix TrueType rendering glitches

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2003-03-14  David Turner  <[email protected]>
+
+    * src/truetype/ttdriver.c: fixing the small TrueType native rendering
+    glitches, they came from a small rounding error.
+
 2003-03-13  David Turner  <[email protected]>
 
     * src/base/ftdbgmem.c, docs/DEBUG.TXT: added new environment variables
--- a/src/truetype/ttdriver.c
+++ b/src/truetype/ttdriver.c
@@ -193,6 +193,7 @@
     FT_Size_Metrics*  metrics  = &size->root.metrics;
     FT_Size_Metrics*  metrics2 = &size->metrics;
     TT_Face           face     = (TT_Face)size->root.face;
+    FT_Long           dim_x, dim_y;
 
 
     *metrics2 = *metrics;
@@ -203,19 +204,25 @@
     /*                                                                */
     if ( ( face->header.Flags & 8 ) != 0 )
     {
-      FT_Long  dim_x, dim_y;
-
      /* we need to use rounding in the following computations. Otherwise,
       * the resulting hinted outlines will be very slightly distorted
       */
-      dim_x = ( char_width  * horz_resolution + 36 ) / 72;
-      dim_y = ( char_height * vert_resolution + 36 ) / 72;
-
-      metrics2->x_ppem  = (FT_UShort)( dim_x >> 6 );
-      metrics2->y_ppem  = (FT_UShort)( dim_y >> 6 );
-      metrics2->x_scale = FT_DivFix( dim_x, face->root.units_per_EM );
-      metrics2->y_scale = FT_DivFix( dim_y, face->root.units_per_EM );
+      dim_x = ( ( ( char_width  * horz_resolution ) / 72 ) + 32 ) & -64;
+      dim_y = ( ( ( char_height * vert_resolution ) / 72 ) + 32 ) & -64;
     }
+    else
+    {
+      dim_x = ( ( char_width  * horz_resolution + 36 ) / 72 );
+      dim_y = ( ( char_height * vert_resolution + 36 ) / 72 );
+    }
+
+    /* we only modify "metrics2", not "metrics", so these changes have */
+    /* no effect on the result of the auto-hinter when it is used      */
+    /*                                                                 */
+    metrics2->x_ppem  = (FT_UShort)( dim_x >> 6 );
+    metrics2->y_ppem  = (FT_UShort)( dim_y >> 6 );
+    metrics2->x_scale = FT_DivFix( dim_x, face->root.units_per_EM );
+    metrics2->y_scale = FT_DivFix( dim_y, face->root.units_per_EM );
 
     size->ttmetrics.valid = FALSE;
 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS