Commit 7c0d20814a252c4c3fb000dca918428a99bc72b1

David Turner 2001-12-21T15:59:43

* src/cff/cffgload.c, src/psaux/t1decode.c, src/pshinter/pshrec.c, src/pshinter/ahalgo2.c, src/pshinter/pshglob.h: fixed a bug where the X and Y axis where inversed in the postscript hinter. this caused problem when displaying on non-square surfaces..

diff --git a/ChangeLog b/ChangeLog
index 699a553..2aca5fb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2001-12-21  David Turner  <david@freetype.org>
 
+        * src/cff/cffgload.c, src/psaux/t1decode.c, src/pshinter/pshrec.c,
+        src/pshinter/ahalgo2.c, src/pshinter/pshglob.h: fixed a bug where
+        the X and Y axis where inversed in the postscript hinter. this
+        caused problem when displaying on non-square surfaces..
+
         * include/freetype/cache/ftcmanag.h, include/freetype/cache/ftcimage.h,
         include/freetype/cache/ftcsbits.h: updating documentation to better
         explain the use of the "anode" output parameter in lookup functions
diff --git a/src/cff/cffgload.c b/src/cff/cffgload.c
index 2004b8a..9a1d45f 100644
--- a/src/cff/cffgload.c
+++ b/src/cff/cffgload.c
@@ -1080,7 +1080,7 @@
 
           if ( hinter )
             hinter->stems( hinter->hints,
-                           ( op == cff_op_vstem || op == cff_op_vstemhm ),
+                           ( op == cff_op_hstem || op == cff_op_hstemhm ),
                            num_args / 2,
                            args );
 
@@ -1097,7 +1097,7 @@
           {
             if ( hinter )
               hinter->stems( hinter->hints,
-                             1,
+                             0,
                              num_args / 2,
                              args );
             
diff --git a/src/psaux/t1decode.c b/src/psaux/t1decode.c
index 36c6054..7280781 100644
--- a/src/psaux/t1decode.c
+++ b/src/psaux/t1decode.c
@@ -1014,7 +1014,7 @@
           if ( hinter )
           {
             /* top[0] += builder->left_bearing.y; */
-            hinter->stem( hinter->hints, 0, top );
+            hinter->stem( hinter->hints, 1, top );
           }
 
           break;
@@ -1024,7 +1024,7 @@
 
           /* record horizontal counter-controlled hints */
           if ( hinter )
-            hinter->stem3( hinter->hints, 0, top );
+            hinter->stem3( hinter->hints, 1, top );
                            
           break;
 
@@ -1035,7 +1035,7 @@
           if ( hinter )
           {
             top[0] += orig_x;
-            hinter->stem( hinter->hints, 1, top );
+            hinter->stem( hinter->hints, 0, top );
           }
 
           break;
@@ -1051,7 +1051,7 @@
             top[0] += dx;
             top[2] += dx;
             top[4] += dx;
-            hinter->stem3( hinter->hints, 1, top );
+            hinter->stem3( hinter->hints, 0, top );
           }
           break;
 
diff --git a/src/pshinter/pshalgo2.c b/src/pshinter/pshalgo2.c
index 6b27ec6..a10da1b 100644
--- a/src/pshinter/pshalgo2.c
+++ b/src/pshinter/pshalgo2.c
@@ -330,7 +330,7 @@
   ps2_simple_scale( PSH2_Hint_Table  table,
                     FT_Fixed         scale,
                     FT_Fixed         delta,
-                    FT_Int           vertical )
+                    FT_Int           dimension )
   {
     PSH2_Hint  hint;
     FT_UInt    count;
@@ -344,7 +344,7 @@
       hint->cur_len = FT_MulFix( hint->org_len, scale );
 
       if ( ps2_debug_hint_func )
-        ps2_debug_hint_func( hint, vertical );
+        ps2_debug_hint_func( hint, dimension );
     }
   }
 #endif
@@ -353,9 +353,9 @@
   static void
   psh2_hint_align( PSH2_Hint    hint,
                    PSH_Globals  globals,
-                   FT_Int       vertical )
+                   FT_Int       dimension )
   {
-    PSH_Dimension  dim   = &globals->dimension[vertical];
+    PSH_Dimension  dim   = &globals->dimension[dimension];
     FT_Fixed       scale = dim->scale_mult;
     FT_Fixed       delta = dim->scale_delta;
 
@@ -388,7 +388,7 @@
       align.align = 0;
       align.align_bot = align.align_top = 0;
 
-      if ( !vertical )
+      if ( dimension == 1 )
         psh_blues_snap_stem( &globals->blues,
                              hint->org_pos + hint->org_len,
                              hint->org_pos,
@@ -425,7 +425,7 @@
 
             /* ensure that parent is already fitted */
             if ( !psh2_hint_is_fitted( parent ) )
-              psh2_hint_align( parent, globals, vertical );
+              psh2_hint_align( parent, globals, dimension );
 
             par_org_center = parent->org_pos + ( parent->org_len / 2);
             par_cur_center = parent->cur_pos + ( parent->cur_len / 2);
@@ -461,7 +461,7 @@
 
 #ifdef DEBUG_HINTER
       if ( ps2_debug_hint_func )
-        ps2_debug_hint_func( hint, vertical );
+        ps2_debug_hint_func( hint, dimension );
 #endif
     }
   }
@@ -470,26 +470,26 @@
   static void
   psh2_hint_table_align_hints( PSH2_Hint_Table  table,
                                PSH_Globals      globals,
-                               FT_Int           vertical )
+                               FT_Int           dimension )
   {
     PSH2_Hint      hint;
     FT_UInt        count;
 
 #ifdef DEBUG_HINTER
-    PSH_Dimension  dim   = &globals->dimension[vertical];
+    PSH_Dimension  dim   = &globals->dimension[dimension];
     FT_Fixed       scale = dim->scale_mult;
     FT_Fixed       delta = dim->scale_delta;
 
 
-    if ( ps_debug_no_vert_hints && vertical )
+    if ( ps_debug_no_vert_hints && dimension == 0 )
     {
-      ps2_simple_scale( table, scale, delta, vertical );
+      ps2_simple_scale( table, scale, delta, dimension );
       return;
     }
 
-    if ( ps_debug_no_horz_hints && !vertical )
+    if ( ps_debug_no_horz_hints && dimension == 1 )
     {
-      ps2_simple_scale( table, scale, delta, vertical );
+      ps2_simple_scale( table, scale, delta, dimension );
       return;
     }
 #endif
@@ -498,7 +498,7 @@
     count = table->max_hints;
 
     for ( ; count > 0; count--, hint++ )
-      psh2_hint_align( hint, globals, vertical );
+      psh2_hint_align( hint, globals, dimension );
   }
 
 
@@ -688,13 +688,13 @@
   psh2_hint_table_tune_outline( PSH2_Hint_Table  table,
                                 FT_Outline*      outline,
                                 PSH_Globals      globals,
-                                FT_Int           vertical )
+                                FT_Int           dimension )
 
   {
     FT_UInt        count, first, last;
     PS_Mask_Table  hint_masks = table->hint_masks;
     PS_Mask        mask;
-    PSH_Dimension  dim        = &globals->dimension[vertical];
+    PSH_Dimension  dim        = &globals->dimension[dimension];
     FT_Fixed       scale      = dim->scale_mult;
     FT_Fixed       delta      = dim->scale_delta;
 
@@ -716,7 +716,7 @@
 
 
           psh2_hint_table_activate_mask( table, mask );
-          psh2_hint_table_optimize( table, globals, outline, vertical );
+          psh2_hint_table_optimize( table, globals, outline, dimension );
           psh2_hint_table_setup_zones( table, scale, delta );
           last = mask->end_point;
 
@@ -728,7 +728,7 @@
             FT_Pos  x, *px;
 
 
-            px  = vertical ? &vec->x : &vec->y;
+            px  = dimension ? &vec->y : &vec->x;
             x   = *px;
 
             *px = psh2_hint_table_tune_coord( table, (FT_Int)x );
@@ -746,7 +746,7 @@
       vec   = outline->points;
       count = outline->n_points;
 
-      if ( vertical )
+      if ( dimension == 0 )
       {
         for ( ; count > 0; count--, vec++ )
           vec->x = FT_MulFix( vec->x, scale ) + delta;
@@ -999,7 +999,7 @@
   /* load outline point coordinates into hinter glyph */
   static void
   psh2_glyph_load_points( PSH2_Glyph  glyph,
-                          FT_Int      vertical )
+                          FT_Int      dimension )
   {
     FT_Vector*  vec   = glyph->outline->points;
     PSH2_Point  point = glyph->points;
@@ -1010,7 +1010,7 @@
     {
       point->flags &= PSH2_POINT_OFF | PSH2_POINT_SMOOTH;
       point->hint   = 0;
-      if ( vertical )
+      if ( dimension == 0 )
         point->org_u = vec->x;
       else
         point->org_u = vec->y;
@@ -1026,7 +1026,7 @@
   /* save hinted point coordinates back to outline */
   static void
   psh2_glyph_save_points( PSH2_Glyph  glyph,
-                          FT_Int      vertical )
+                          FT_Int      dimension )
   {
     FT_UInt     n;
     PSH2_Point  point = glyph->points;
@@ -1036,16 +1036,16 @@
 
     for ( n = 0; n < glyph->num_points; n++ )
     {
-      if ( vertical )
+      if ( dimension == 0 )
         vec[n].x = point->cur_u;
       else
         vec[n].y = point->cur_u;
 
       if ( psh2_point_is_strong( point ) )
-        tags[n] |= vertical ? 32 : 64;
+        tags[n] |= (dimension == 0) ? 32 : 64;
 
 #ifdef DEBUG_HINTER
-      if ( vertical )
+      if ( dimension == 0 )
       {
         point->cur_x   = point->cur_u;
         point->flags_x = point->flags;
@@ -1115,16 +1115,16 @@
   /* find strong points in a glyph */
   static void
   psh2_glyph_find_strong_points( PSH2_Glyph  glyph,
-                                 FT_Int      vertical )
+                                 FT_Int      dimension )
   {
     /* a point is strong if it is located on a stem                   */
     /* edge and has an "in" or "out" tangent to the hint's direction  */
     {
-      PSH2_Hint_Table  table     = &glyph->hint_tables[vertical];
+      PSH2_Hint_Table  table     = &glyph->hint_tables[dimension];
       PS_Mask          mask      = table->hint_masks->masks;
       FT_UInt          num_masks = table->hint_masks->num_masks;
       FT_UInt          first     = 0;
-      FT_Int           major_dir = vertical ? PSH2_DIR_UP : PSH2_DIR_RIGHT;
+      FT_Int           major_dir = dimension == 0 ? PSH2_DIR_UP : PSH2_DIR_RIGHT;
 
 
       /* process secondary hints to "selected" points */
@@ -1186,9 +1186,9 @@
   /* interpolate strong points with the help of hinted coordinates */
   static void
   psh2_glyph_interpolate_strong_points( PSH2_Glyph  glyph,
-                                        FT_Int      vertical )
+                                        FT_Int      dimension )
   {
-    PSH_Dimension    dim   = &glyph->globals->dimension[vertical];
+    PSH_Dimension    dim   = &glyph->globals->dimension[dimension];
     FT_Fixed         scale = dim->scale_mult;
 
 
@@ -1231,10 +1231,10 @@
 
   static void
   psh2_glyph_interpolate_normal_points( PSH2_Glyph  glyph,
-                                        FT_Int      vertical )
+                                        FT_Int      dimension )
   {
 #if 1
-    PSH_Dimension    dim   = &glyph->globals->dimension[vertical];
+    PSH_Dimension    dim   = &glyph->globals->dimension[dimension];
     FT_Fixed         scale = dim->scale_mult;
 
 
@@ -1344,9 +1344,9 @@
   /* interpolate other points */
   static void
   psh2_glyph_interpolate_other_points( PSH2_Glyph  glyph,
-                                       FT_Int      vertical )
+                                       FT_Int      dimension )
   {
-    PSH_Dimension dim          = &glyph->globals->dimension[vertical];
+    PSH_Dimension dim          = &glyph->globals->dimension[dimension];
     FT_Fixed      scale        = dim->scale_mult;
     FT_Fixed      delta        = dim->scale_delta;
     PSH2_Contour  contour      = glyph->contours;
@@ -1520,7 +1520,7 @@
     if ( error )
       goto Exit;
 
-    for ( dimension = 1; dimension >= 0; dimension-- )
+    for ( dimension = 0; dimension < 2; dimension++ )
     {
       /* load outline coordinates into glyph */
       psh2_glyph_load_points( glyph, dimension );
diff --git a/src/pshinter/pshglob.h b/src/pshinter/pshglob.h
index 569e6e7..1058fb1 100644
--- a/src/pshinter/pshglob.h
+++ b/src/pshinter/pshglob.h
@@ -129,7 +129,9 @@ FT_BEGIN_HEADER
   } PSH_BluesRec, *PSH_Blues;
 
 
-  /* font globals */
+  /* font globals.                                         */
+  /* dimension 0 => X coordinates + vertical hints/stems   */
+  /* dimension 1 => Y coordinates + horizontal hints/stems */
   typedef struct  PSH_GlobalsRec_
   {
     FT_Memory         memory;
diff --git a/src/pshinter/pshrec.h b/src/pshinter/pshrec.h
index fb5309f..a939bea 100644
--- a/src/pshinter/pshrec.h
+++ b/src/pshinter/pshrec.h
@@ -129,7 +129,9 @@ FT_BEGIN_HEADER
 #define PS_HINTS_MAGIC  0x68696e74   /* "hint" */
 
 
-  /* glyph hints descriptor */
+  /* glyph hints descriptor                                */
+  /* dimension 0 => X coordinates + vertical hints/stems   */
+  /* dimension 1 => Y coordinates + horizontal hints/stems */
   typedef struct  PS_HintsRec_
   {
     FT_Memory        memory;