shithub: freetype+ttf2subf

Download patch

ref: be67c4ef33a610afc475e62fc2fd69b96cd4d845
parent: ff9d2415a7a192520ea198187dbdb6408625e210
author: Werner Lemberg <[email protected]>
date: Mon Nov 24 17:54:58 EST 2003

* src/truetype/ttinterp.c (CUR_Func_move_orig): New macro.
(Direct_Move_Orig, Direct_Move_Orig_X, Direct_Move_Orig_Y): New
functions.  Similar to Direct_Move, Direct_Move_X, and
Direct_Move_Y but without touching.
(Compute_Funcs): Use new functions.

(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
Round_Up_To_Grid, Round_To_Double_Grid, Round_Super,
Round_Super_45): Fix rounding of value zero.

(DO_DIV): Don't use TT_MULDIV.

(Ins_SHC): This instruction actually touches the points.
(Ins_MSIRP): Fix undocumented behaviour.

* src/truetype/ttinterp.h (TT_ExecContextRec): Updated.

* docs/VERSION.DLL: Updated.

* src/base/ftobjs.c (FT_Set_Char_Size): Make metrics->x_scale and
metrics->y_scale really precise.

(FT_Load_Glyph): Update computation of linearHoriAdvance and
linearVertAdvance.

* src/true/type/ttinterp.c (Update_Max): Use FT_REALLOC.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,41 @@
-2003-11-22  David Turner    <[email protected]>
+2003-11-22  Rogier van Dalen  <[email protected]>
 
-        * src/autofit/*: more updates
+	* src/truetype/ttinterp.c (CUR_Func_move_orig): New macro.
+	(Direct_Move_Orig, Direct_Move_Orig_X, Direct_Move_Orig_Y): New
+	functions.  Similar to Direct_Move, Direct_Move_X, and
+	Direct_Move_Y but without touching.
+	(Compute_Funcs): Use new functions.
+
+	(Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
+	Round_Up_To_Grid, Round_To_Double_Grid, Round_Super,
+	Round_Super_45): Fix rounding of value zero.
+
+	(DO_DIV): Don't use TT_MULDIV.
+
+	(Ins_SHC): This instruction actually touches the points.
+	(Ins_MSIRP): Fix undocumented behaviour.
+
+	* src/truetype/ttinterp.h (TT_ExecContextRec): Updated.
+
+2003-11-22  Werner Lemberg  <[email protected]>
+
+	* docs/VERSION.DLL: Updated.
+
+	* src/base/ftobjs.c (FT_Set_Char_Size): Make metrics->x_scale and
+	metrics->y_scale really precise.
+
+	(FT_Load_Glyph): Update computation of linearHoriAdvance and
+	linearVertAdvance.
+
+	* src/true/type/ttinterp.c (Update_Max): Use FT_REALLOC.
+
+2003-11-22  David Turner  <[email protected]>
+
+	* src/autofit/*: More updates.
+
+	* include/freetype/freetype.h (FREETYPE_PATCH): Set to 8.
+	* builds/unix/configure.ac (version_info): Set to 9:6:3.
+	* README: Updated.
 
 2003-11-13  John A. Boyd Jr.  <[email protected]>
 
--- a/docs/VERSION.DLL
+++ b/docs/VERSION.DLL
@@ -91,20 +91,19 @@
   old_CPPFLAGS="$CPPFLAGS"
   CPPFLAGS=`freetype-config --cflags`
   AC_TRY_CPP([
+
 #include <ft2build.h>
 #include FT_FREETYPE_H
 #if (FREETYPE_MAJOR*1000 + FREETYPE_MINOR)*1000 + FREETYPE_PATCH < 2000009
 #error Freetype version too low.
 #endif
-  ],[
-    AC_MSG_RESULT(yes)
-    FREETYPE_LIBS=`freetype-config --libs`
-    AC_SUBST(FREETYPE_LIBS)
-    AC_DEFINE(HAVE_FREETYPE,1,[Define if you have the FreeType2 library])
-    CPPFLAGS="$old_CPPFLAGS"
-  ],[
-    AC_MSG_ERROR([Need FreeType library version 2.0.9 or higher])
-  ])
+  ],
+  [AC_MSG_RESULT(yes)
+   FREETYPE_LIBS=`freetype-config --libs`
+   AC_SUBST(FREETYPE_LIBS)
+   AC_DEFINE(HAVE_FREETYPE,1,[Define if you have the FreeType2 library])
+   CPPFLAGS="$old_CPPFLAGS"],
+  [AC_MSG_ERROR([Need FreeType library version 2.0.9 or higher])])
 
 
 --- end of VERSION.DLL ---
--- a/src/base/ftobjs.c
+++ b/src/base/ftobjs.c
@@ -575,15 +575,14 @@
     if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0  &&
          ( face->face_flags & FT_FACE_FLAG_SCALABLE ) )
     {
-      FT_UInt           EM      = face->units_per_EM;
       FT_Size_Metrics*  metrics = &face->size->metrics;
 
 
       slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance,
-                                           (FT_Long)metrics->x_ppem << 16, EM );
+                                           metrics->x_scale, 64 );
 
       slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance,
-                                           (FT_Long)metrics->y_ppem << 16, EM );
+                                           metrics->y_scale, 64 );
     }
 
     if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 )
@@ -2042,11 +2041,11 @@
       char_height = 1 * 64;
 
     /* Compute pixel sizes in 26.6 units with rounding */
-    dim_x = ( ( char_width  * horz_resolution + (36+32*72) ) / 72 ) & -64;
-    dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & -64;
+    dim_x = ( char_width  * horz_resolution + 36 ) / 72;
+    dim_y = ( char_height * vert_resolution + 36 ) / 72;
 
-    metrics->x_ppem  = (FT_UShort)( dim_x >> 6 );
-    metrics->y_ppem  = (FT_UShort)( dim_y >> 6 );
+    metrics->x_ppem  = (FT_UShort)( ( dim_x + 32 ) >> 6 );
+    metrics->y_ppem  = (FT_UShort)( ( dim_y + 32 ) >> 6 );
 
     metrics->x_scale = 0x10000L;
     metrics->y_scale = 0x10000L;
--- a/src/pfr/pfrdrivr.c
+++ b/src/pfr/pfrdrivr.c
@@ -26,6 +26,7 @@
 
 #include "pfrerror.h"
 
+
   static FT_Error
   pfr_get_kerning( PFR_Face    face,
                    FT_UInt     left,
@@ -52,6 +53,7 @@
     return PFR_Err_Ok;
   }
 
+
  /*
   *  PFR METRICS SERVICE
   *
@@ -58,9 +60,9 @@
   */
 
   static FT_Error
-  pfr_get_advance( PFR_Face   face,
-                   FT_UInt    gindex,
-                   FT_Pos    *aadvance )
+  pfr_get_advance( PFR_Face  face,
+                   FT_UInt   gindex,
+                   FT_Pos   *aadvance )
   {
     FT_Error  error = PFR_Err_Bad_Argument;
 
@@ -68,12 +70,12 @@
     *aadvance = 0;
     if ( face )
     {
-      PFR_PhyFont  phys  = &face->phy_font;
+      PFR_PhyFont  phys = &face->phy_font;
 
 
       if ( gindex < phys->num_chars )
       {
-        *aadvance = phys->chars[ gindex ].advance;
+        *aadvance = phys->chars[gindex].advance;
         error = 0;
       }
     }
@@ -89,7 +91,7 @@
                    FT_Fixed  *ametrics_x_scale,
                    FT_Fixed  *ametrics_y_scale )
   {
-    PFR_PhyFont  phys  = &face->phy_font;
+    PFR_PhyFont  phys = &face->phy_font;
     FT_Fixed     x_scale, y_scale;
     FT_Size      size = face->root.size;
 
@@ -118,7 +120,7 @@
     if ( ametrics_y_scale )
       *ametrics_y_scale = y_scale;
 
-    return 0;
+    return PFR_Err_Ok;
   }
 
 
@@ -130,6 +132,7 @@
     (FT_PFR_GetAdvanceFunc)pfr_get_advance
   };
 
+
  /*
   *  SERVICE LIST
   *
@@ -137,7 +140,7 @@
 
   static const FT_ServiceDescRec  pfr_services[] =
   {
-    { FT_SERVICE_ID_PFR_METRICS, & pfr_metrics_service_rec },
+    { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec },
     { FT_SERVICE_ID_XF86_NAME,   FT_XF86_FORMAT_PFR },
     { NULL, NULL }
   };
@@ -177,20 +180,20 @@
     sizeof( PFR_SizeRec ),
     sizeof( PFR_SlotRec ),
 
-    (FT_Face_InitFunc)        pfr_face_init,
-    (FT_Face_DoneFunc)        pfr_face_done,
-    (FT_Size_InitFunc)        NULL,
-    (FT_Size_DoneFunc)        NULL,
-    (FT_Slot_InitFunc)        pfr_slot_init,
-    (FT_Slot_DoneFunc)        pfr_slot_done,
+    (FT_Face_InitFunc)       pfr_face_init,
+    (FT_Face_DoneFunc)       pfr_face_done,
+    (FT_Size_InitFunc)       NULL,
+    (FT_Size_DoneFunc)       NULL,
+    (FT_Slot_InitFunc)       pfr_slot_init,
+    (FT_Slot_DoneFunc)       pfr_slot_done,
 
-    (FT_Size_ResetPointsFunc) NULL,
-    (FT_Size_ResetPixelsFunc) NULL,
-    (FT_Slot_LoadFunc)        pfr_slot_load,
+    (FT_Size_ResetPointsFunc)NULL,
+    (FT_Size_ResetPixelsFunc)NULL,
+    (FT_Slot_LoadFunc)       pfr_slot_load,
 
-    (FT_Face_GetKerningFunc)  pfr_get_kerning,
-    (FT_Face_AttachFunc)      0,
-    (FT_Face_GetAdvancesFunc) 0
+    (FT_Face_GetKerningFunc) pfr_get_kerning,
+    (FT_Face_AttachFunc)     0,
+    (FT_Face_GetAdvancesFunc)0
   };
 
 
--- a/src/truetype/ttinterp.c
+++ b/src/truetype/ttinterp.c
@@ -162,6 +162,9 @@
 #define CUR_Func_move( z, p, d ) \
           CUR.func_move( EXEC_ARG_ z, p, d )
 
+#define CUR_Func_move_orig( z, p, d ) \
+          CUR.func_move_orig( EXEC_ARG_ z, p, d )
+
 #define CUR_Func_dualproj( x, y ) \
           CUR.func_dualproj( EXEC_ARG_ x, y )
 
@@ -515,8 +518,7 @@
 
     if ( *size < new_max )
     {
-      FT_FREE( *buff );
-      if ( FT_ALLOC( *buff, new_max * multiplier ) )
+      if ( FT_REALLOC( *buff, *size, new_max * multiplier ) )
         return error;
       *size = new_max;
     }
@@ -1566,7 +1568,6 @@
 
     if ( v != 0 )
     {
-
       zone->cur[point].x += TT_MULDIV( distance,
                                        v * 0x10000L,
                                        CUR.F_dot_P );
@@ -1578,7 +1579,6 @@
 
     if ( v != 0 )
     {
-
       zone->cur[point].y += TT_MULDIV( distance,
                                        v * 0x10000L,
                                        CUR.F_dot_P );
@@ -1590,6 +1590,51 @@
 
   /*************************************************************************/
   /*                                                                       */
+  /* <Function>                                                            */
+  /*    Direct_Move_Orig                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Moves a point by a given distance along the freedom vector.  The   */
+  /*    point will not be `touched'.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    point    :: The index of the point to move.                        */
+  /*                                                                       */
+  /*    distance :: The distance to apply.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    zone     :: The affected glyph zone.                               */
+  /*                                                                       */
+  static void
+  Direct_Move_Orig( EXEC_OP_ TT_GlyphZone  zone,
+                             FT_UShort     point,
+                             FT_F26Dot6    distance )
+  {
+    FT_F26Dot6  v;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+    v = CUR.GS.freeVector.x;
+
+    if ( v != 0 )
+      zone->org[point].x += TT_MULDIV( distance,
+                                       v * 0x10000L,
+                                       CUR.F_dot_P );
+
+    v = CUR.GS.freeVector.y;
+
+    if ( v != 0 )
+      zone->org[point].y += TT_MULDIV( distance,
+                                       v * 0x10000L,
+                                       CUR.F_dot_P );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
   /* Special versions of Direct_Move()                                     */
   /*                                                                       */
   /*   The following versions are used whenever both vectors are both      */
@@ -1624,6 +1669,38 @@
 
   /*************************************************************************/
   /*                                                                       */
+  /* Special versions of Direct_Move_Orig()                                */
+  /*                                                                       */
+  /*   The following versions are used whenever both vectors are both      */
+  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static void
+  Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone  zone,
+                               FT_UShort     point,
+                               FT_F26Dot6    distance )
+  {
+    FT_UNUSED_EXEC;
+
+    zone->org[point].x += distance;
+  }
+
+
+  static void
+  Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone  zone,
+                               FT_UShort     point,
+                               FT_F26Dot6    distance )
+  {
+    FT_UNUSED_EXEC;
+
+    zone->org[point].y += distance;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
   /* <Function>                                                            */
   /*    Round_None                                                         */
   /*                                                                       */
@@ -1656,7 +1733,7 @@
     if ( distance >= 0 )
     {
       val = distance + compensation;
-      if ( val < 0 )
+      if ( distance && val < 0 )
         val = 0;
     }
     else {
@@ -1696,7 +1773,7 @@
     if ( distance >= 0 )
     {
       val = distance + compensation + 32;
-      if ( val > 0 )
+      if ( distance && val > 0 )
         val &= ~63;
       else
         val = 0;
@@ -1740,7 +1817,7 @@
     if ( distance >= 0 )
     {
       val = ( ( distance + compensation ) & -64 ) + 32;
-      if ( val < 0 )
+      if ( distance && val < 0 )
         val = 0;
     }
     else
@@ -1782,7 +1859,7 @@
     if ( distance >= 0 )
     {
       val = distance + compensation;
-      if ( val > 0 )
+      if ( distance && val > 0 )
         val &= ~63;
       else
         val = 0;
@@ -1826,7 +1903,7 @@
     if ( distance >= 0 )
     {
       val = distance + compensation + 63;
-      if ( val > 0 )
+      if ( distance && val > 0 )
         val &= ~63;
       else
         val = 0;
@@ -1870,7 +1947,7 @@
     if ( distance >= 0 )
     {
       val = distance + compensation + 16;
-      if ( val > 0 )
+      if ( distance && val > 0 )
         val &= ~31;
       else
         val = 0;
@@ -1919,7 +1996,7 @@
     {
       val = ( distance - CUR.phase + CUR.threshold + compensation ) &
               -CUR.period;
-      if ( val < 0 )
+      if ( distance && val < 0 )
         val = 0;
       val += CUR.phase;
     }
@@ -1967,7 +2044,7 @@
     {
       val = ( ( distance - CUR.phase + CUR.threshold + compensation ) /
                 CUR.period ) * CUR.period;
-      if ( val < 0 )
+      if ( distance && val < 0 )
         val = 0;
       val += CUR.phase;
     }
@@ -2243,13 +2320,15 @@
 
       if ( CUR.GS.both_x_axis )
       {
-        CUR.func_project  = Project_x;
-        CUR.func_move     = Direct_Move_X;
+        CUR.func_project   = Project_x;
+        CUR.func_move      = Direct_Move_X;
+        CUR.func_move_orig = Direct_Move_Orig_X;
       }
       else
       {
-        CUR.func_project  = Project_y;
-        CUR.func_move     = Direct_Move_Y;
+        CUR.func_project   = Project_y;
+        CUR.func_move      = Direct_Move_Y;
+        CUR.func_move_orig = Direct_Move_Orig_Y;
       }
 
       if ( CUR.GS.dualVector.x == 0x4000 )
@@ -2300,16 +2379,23 @@
         CUR.func_dualproj = (TT_Project_Func)Dual_Project;
     }
 
-    CUR.func_move = (TT_Move_Func)Direct_Move;
+    CUR.func_move      = (TT_Move_Func)Direct_Move;
+    CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig;
 
     if ( CUR.F_dot_P == 0x40000000L )
     {
       if ( CUR.GS.freeVector.x == 0x4000 )
-        CUR.func_move = (TT_Move_Func)Direct_Move_X;
+      {
+        CUR.func_move      = (TT_Move_Func)Direct_Move_X;
+        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
+      }
       else
       {
         if ( CUR.GS.freeVector.y == 0x4000 )
-          CUR.func_move = (TT_Move_Func)Direct_Move_Y;
+        {
+          CUR.func_move      = (TT_Move_Func)Direct_Move_Y;
+          CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
+        }
       }
     }
 
@@ -2891,7 +2977,8 @@
     if ( args[1] == 0 )                             \
       CUR.error = TT_Err_Divide_By_Zero;            \
     else                                            \
-      args[0] = TT_MULDIV( args[0], 64L, args[1] );
+/* Should args[0] be cast to FT_Int64 first? */     \
+      args[0] = ( args[0] * 64L ) / args[1];
 
 
 #define DO_MUL                                    \
@@ -5359,11 +5446,11 @@
         last_point = 0;
     }
 
-    /* XXX: UNDOCUMENTED! SHC doesn't touch the points */
+    /* XXX: UNDOCUMENTED! SHC does touch the points */
     for ( i = first_point; i <= last_point; i++ )
     {
       if ( zp.cur != CUR.zp2.cur || refp != i )
-        MOVE_Zp2_Point( i, dx, dy, FALSE );
+        MOVE_Zp2_Point( i, dx, dy, TRUE );
     }
   }
 
@@ -5498,9 +5585,11 @@
     }
 
     /* XXX: UNDOCUMENTED! behaviour */
-    if ( CUR.GS.gep0 == 0 )   /* if in twilight zone */
+    if ( CUR.GS.gep1 == 0 )   /* if the point that is to be moved */
+                              /* is in twilight zone              */
     {
       CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0];
+      CUR_Func_move_orig( &CUR.zp1, point, args[1] );
       CUR.zp1.cur[point] = CUR.zp1.org[point];
     }
 
--- a/src/truetype/ttinterp.h
+++ b/src/truetype/ttinterp.h
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType bytecode interpreter (specification).                       */
 /*                                                                         */
-/*  Copyright 1996-2001, 2002 by                                           */
+/*  Copyright 1996-2001, 2002, 2003 by                                     */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -210,6 +210,7 @@
                        func_freeProj;  /* current freedom proj. func  */
 
     TT_Move_Func       func_move;      /* current point move function */
+    TT_Move_Func       func_move_orig; /* move original position function */
 
     TT_Get_CVT_Func    func_read_cvt;  /* read a cvt entry              */
     TT_Set_CVT_Func    func_write_cvt; /* write a cvt entry (in pixels) */