shithub: freetype+ttf2subf

Download patch

ref: 4b29d58761b6ad46eff097db54ab94d3925963ca
parent: a6f6ff56b5723102db3825de3e6656ccf430451f
author: David Turner <[email protected]>
date: Mon Mar 25 12:02:26 EST 2002

removing compiler warnings

git/fs: mount .git/fs: mount/attach disallowed
--- a/include/freetype/config/ftconfig.h
+++ b/include/freetype/config/ftconfig.h
@@ -215,7 +215,7 @@
 #define FT_LOCAL_DEF(x)  extern "C" x
 #else
 #define FT_LOCAL(x)      extern x
-#define FT_LOCAL_DEF(x)  extern x
+#define FT_LOCAL_DEF(x)  x
 #endif
 
 #endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
--- a/src/pcf/pcfdriver.c
+++ b/src/pcf/pcfdriver.c
@@ -299,7 +299,6 @@
     /* set-up charmap */
     {
       FT_String   *charset_registry, *charset_encoding;
-      FT_Face      root = FT_FACE(face);
       FT_Bool      unicode_charmap  = 0;
 
 
@@ -547,7 +546,7 @@
 #ifndef FT_CONFIG_OPTION_USE_CMAPS    
     (FT_CharMap_CharIndexFunc) PCF_Char_Get_Index,
 #else
-    (FT_CharMap_CharNextFunc)  0,
+    (FT_CharMap_CharIndexFunc)  0,
 #endif
 
     (FT_Face_GetKerningFunc)   0,
--- a/src/pcf/pcfread.c
+++ b/src/pcf/pcfread.c
@@ -1014,7 +1014,6 @@
       /* set-up charset */
       {
         PCF_Property  charset_registry = 0, charset_encoding = 0;
-        FT_Bool       unicode_charmap  = 0;
   
   
         charset_registry = pcf_find_property( face, "CHARSET_REGISTRY" );
--- a/src/psaux/t1cmap.c
+++ b/src/psaux/t1cmap.c
@@ -19,7 +19,7 @@
     PSNames_Service  psnames = face->psnames;
 
     cmap->num_glyphs    = face->type1.num_glyphs;
-    cmap->glyph_names   = face->type1.glyph_names;
+    cmap->glyph_names   = (const char* const*)face->type1.glyph_names;
     cmap->sid_to_string = psnames->adobe_std_strings;
     cmap->code_to_sid   = is_expert ? psnames->adobe_expert_encoding
                                     : psnames->adobe_std_encoding;
@@ -416,7 +416,7 @@
   }
 
 
-  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+  FT_LOCAL_DEF( const FT_CMap_ClassRec )
   t1_cmap_unicode_class_rec =
   {
     sizeof( T1_CMapUnicodeRec ),
@@ -427,7 +427,4 @@
   };
 
 
-
-  FT_LOCAL_DEF( const FT_CMap_Class )
-  t1_cmap_unicode_class = &t1_cmap_unicode_class_rec;
 
--- a/src/psaux/t1cmap.h
+++ b/src/psaux/t1cmap.h
@@ -32,9 +32,9 @@
   } T1_CMapStdRec;
 
 
-  FT_LOCAL( const FT_CMap_ClassRec )   t1_cmap_standard_class_rec;
+  FT_LOCAL( const FT_CMap_ClassRec )  t1_cmap_standard_class_rec;
   
-  FT_LOCAL( const FT_CMap_ClassRec )   t1_cmap_expert_class_rec;
+  FT_LOCAL( const FT_CMap_ClassRec )  t1_cmap_expert_class_rec;
   
  /***************************************************************************/
  /***************************************************************************/
--- a/src/truetype/ttinterp.c
+++ b/src/truetype/ttinterp.c
@@ -825,40 +825,7 @@
   }
 
 
- /* return length of given vector */
-#ifdef FT_CONFIG_OPTION_OLD_CALCS
 
-  static FT_F26Dot6
-  Norm( FT_F26Dot6  X,
-        FT_F26Dot6  Y )
-  {
-    TT_INT64  T1, T2;
-
-
-    MUL_64( X, X, T1 );
-    MUL_64( Y, Y, T2 );
-
-    ADD_64( T1, T2, T1 );
-
-    return (FT_F26Dot6)SQRT_64( T1 );
-  }
-
-#else  /* !FT_CONFIG_OPTION_OLD_CALCS */
-
-  static FT_F26Dot6
-  Norm( FT_F26Dot6  X,
-        FT_F26Dot6  Y )
-  {
-    FT_Vector  v;
-
-    v.x = X;
-    v.y = Y;
-    return FT_Vector_Length( &v );
-  }
-
-#endif /* FT_CONFIG_OPTION_OLD_CALCS */
-
-
   /*************************************************************************/
   /*                                                                       */
   /* Before an opcode is executed, the interpreter verifies that there are */
@@ -1201,6 +1168,153 @@
 #define NULL_Vector  (FT_Vector*)&Null_Vector
 
 
+ /* compute (a*b)/2^14 with maximal accuracy and rounding */
+  static FT_Int32
+  TT_MulFix14( FT_Int32  a, FT_Int  b )
+  {
+    FT_Int32   m, s, hi;
+    FT_UInt32  l, lo;
+    
+    /* compute ax*bx as 64-bit value */
+    l  = (FT_UInt32)( (a & 0xFFFF)*b );
+    m  = (a >> 16)*b;
+    
+    lo = l + (FT_UInt32)(m << 16);
+    hi = (m >> 16) + ((FT_Int32)l >> 31) + (lo < l);
+    
+    /* divide the result by 2^14 with rounding */
+    s   = (hi >> 31);
+    l   = lo + (FT_UInt32)s;
+    hi += s + (l < lo);
+    lo  = l;
+
+    l   = lo + 0x2000U;
+    hi += (l < lo);
+    
+    return ( (hi << 18) | (l >> 14) );
+  }
+
+
+ /* compute (ax*bx+ay*by)/2^14 with maximal accuracy and rounding */
+  static FT_Int32
+  TT_DotFix14( FT_Int32  ax, FT_Int32  ay, FT_Int  bx, FT_Int  by )
+  {
+    FT_Int32   m, s, hi1, hi2, hi;
+    FT_UInt32  l, lo1, lo2, lo;
+    
+    /* compute ax*bx as 64-bit value */
+    l = (FT_UInt32)( (ax & 0xFFFF)*bx );
+    m = (ax >> 16)*bx;
+    
+    lo1 = l + (FT_UInt32)(m << 16);
+    hi1 = (m >> 16) + ((FT_Int32)l >> 31) + (lo1 < l);
+    
+    /* compute ay*by as 64-bit value */
+    l = (FT_UInt32)( (ay & 0xFFFF)*by );
+    m = (ay >> 16)*by;
+    
+    lo2 = l + (FT_UInt32)(m << 16);
+    hi2 = (m >> 16) + ((FT_Int32)l >> 31) + (lo2 < l);
+    
+    /* add them */
+    lo = lo1 + lo2;
+    hi = hi1 + hi2 + (lo < lo1);
+    
+    /* divide the result by 2^14 with rounding */
+    s   = (hi >> 31);
+    l   = lo + (FT_UInt32)s;
+    hi += s + (l < lo);
+    lo  = l;
+
+    l   = lo + 0x2000U;
+    hi += (l < lo);
+    
+    return ( (hi << 18) | (l >> 14) );
+  }
+
+ /* return length of given vector */
+#if 0
+
+  static FT_Int32
+  TT_VecLen( FT_Int32  x, FT_Int32  y )
+  {
+    FT_Int32  m, hi1, hi2, hi;
+    FT_UInt32 l, lo1, lo2, lo;
+    
+    /* compute x*x as 64-bit value */
+    lo = (FT_UInt32)(x & 0xFFFF);
+    hi = (x >> 16);
+    
+    l  = lo*lo;
+    m  = hi*lo;
+    hi = hi*hi;
+    
+    lo1 = l + (FT_UInt32)(m << 17);
+    hi1 = hi + (m >> 15) + (lo1 < l);
+    
+    /* compute y*y as 64-bit value */
+    lo = (FT_UInt32)( y & 0xFFFF );
+    hi = (y >> 16);
+    
+    l  = lo*lo;
+    m  = hi*lo;
+    hi = hi*hi;
+    
+    lo2 = l + (FT_UInt32)(m << 17);
+    hi2 = hi + (m >> 15) + (lo2 < l);
+    
+    /* add them to get 'x*x+y*y' as 64-bit value */
+    lo = lo1 + lo2;
+    hi = hi1 + hi2 + (lo < lo1);
+    
+    /* compute the square root of this value */
+    {
+      FT_UInt32  root, rem, test_div;
+      FT_Int     count;
+
+
+      root = 0;
+
+      {
+        rem   = 0;
+        count = 32;
+        do
+        {
+          rem      = ( rem << 2 ) | ( (FT_UInt32)hi  >> 30 );
+          hi       = (  hi << 2 ) | ( lo >> 30 );
+          lo     <<= 2;
+          root   <<= 1;
+          test_div = ( root << 1 ) + 1;
+
+          if ( rem >= test_div )
+          {
+            rem  -= test_div;
+            root += 1;
+          }
+        } while ( --count );
+      }
+      
+      return (FT_Int32)root;
+    }
+  }
+#else
+ 
+ /* this version uses FT_Vector_Length which computes the same value */
+ /* much, much faster..                                              */
+ /*                                                                  */
+  static FT_F26Dot6
+  TT_VecLen( FT_F26Dot6  X,
+             FT_F26Dot6  Y )
+  {
+    FT_Vector  v;
+
+    v.x = X;
+    v.y = Y;
+    return FT_Vector_Length( &v );
+  }
+  
+#endif
+
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
@@ -1231,7 +1345,7 @@
 
       x = TT_MULDIV( CUR.GS.projVector.x, CUR.tt_metrics.x_ratio, 0x4000 );
       y = TT_MULDIV( CUR.GS.projVector.y, CUR.tt_metrics.y_ratio, 0x4000 );
-      CUR.tt_metrics.ratio = Norm( x, y );
+      CUR.tt_metrics.ratio = TT_VecLen( x, y );
     }
 
     return CUR.tt_metrics.ratio;
@@ -1982,8 +2096,10 @@
   Project( EXEC_OP_ FT_Vector*  v1,
                     FT_Vector*  v2 )
   {
-    return TT_MULDIV( v1->x - v2->x, CUR.GS.projVector.x, 0x4000 ) +
-           TT_MULDIV( v1->y - v2->y, CUR.GS.projVector.y, 0x4000 );
+    return TT_DotFix14( v1->x - v2->x,
+                        v1->y - v2->y,
+                        CUR.GS.projVector.x,
+                        CUR.GS.projVector.y );
   }
 
 
@@ -2007,8 +2123,10 @@
   Dual_Project( EXEC_OP_ FT_Vector*  v1,
                          FT_Vector*  v2 )
   {
-    return TT_MULDIV( v1->x - v2->x, CUR.GS.dualVector.x, 0x4000 ) +
-           TT_MULDIV( v1->y - v2->y, CUR.GS.dualVector.y, 0x4000 );
+    return TT_DotFix14( v1->x - v2->x,
+                        v1->y - v2->y,
+                        CUR.GS.dualVector.x,
+                        CUR.GS.dualVector.y );
   }
 
 
@@ -2032,8 +2150,10 @@
   Free_Project( EXEC_OP_ FT_Vector*  v1,
                          FT_Vector*  v2 )
   {
-    return TT_MULDIV( v1->x - v2->x, CUR.GS.freeVector.x, 0x4000 ) +
-           TT_MULDIV( v1->y - v2->y, CUR.GS.freeVector.y, 0x4000 );
+    return TT_DotFix14( v1->x - v2->x,
+                        v1->y - v2->y,
+                        CUR.GS.freeVector.x,
+                        CUR.GS.freeVector.y );
   }
 
 
@@ -2188,7 +2308,6 @@
   /*    R is undefined.                                                    */
   /*                                                                       */
 
-#ifdef FT_CONFIG_OPTION_OLD_CALCS
 
   static FT_Bool
   Normalize( EXEC_OP_ FT_F26Dot6      Vx,
@@ -2206,7 +2325,7 @@
       Vx *= 0x100;
       Vy *= 0x100;
 
-      W = Norm( Vx, Vy );
+      W = TT_VecLen( Vx, Vy );
 
       if ( W == 0 )
       {
@@ -2221,7 +2340,7 @@
       return SUCCESS;
     }
 
-    W = Norm( Vx, Vy );
+    W = TT_VecLen( Vx, Vy );
 
     Vx = FT_MulDiv( Vx, 0x4000L, W );
     Vy = FT_MulDiv( Vy, 0x4000L, W );
@@ -2284,31 +2403,7 @@
     return SUCCESS;
   }
 
-#else
 
-  static FT_Bool
-  Normalize( EXEC_OP_ FT_F26Dot6      Vx,
-                      FT_F26Dot6      Vy,
-                      FT_UnitVector*  R )
-  {
-    FT_Vector  v;
-    FT_Angle   angle;
-
-    FT_UNUSED_EXEC;
-
-    angle = FT_Atan2( Vx, Vy );
-
-    FT_Vector_Unit( &v, angle );
-
-    R->x = (short)(v.x >> 2);
-    R->y = (short)(v.y >> 2);
-
-    return SUCCESS;
-  }
-
-#endif /* FT_CONFIG_OPTION_OLD_CALCS */
-
-
   /*************************************************************************/
   /*                                                                       */
   /* Here we start with the implementation of the various opcodes.         */
@@ -5016,8 +5111,8 @@
 
 #ifdef NO_APPLE_PATENT
 
-    *x = TT_MULDIV( d, CUR.GS.freeVector.x, 0x4000 );
-    *y = TT_MULDIV( d, CUR.GS.freeVector.y, 0x4000 );
+    *x = TT_MulFix14( d, CUR.GS.freeVector.x );
+    *y = TT_MulFix14( d, CUR.GS.freeVector.y );
 
 #else
 
@@ -5225,12 +5320,8 @@
       return;
     }
 
-    dx = TT_MULDIV( args[0],
-                    (FT_Long)CUR.GS.freeVector.x,
-                    0x4000 );
-    dy = TT_MULDIV( args[0],
-                    (FT_Long)CUR.GS.freeVector.y,
-                    0x4000 );
+    dx = TT_MulFix14( args[0], CUR.GS.freeVector.x );
+    dy = TT_MulFix14( args[0], CUR.GS.freeVector.y );
 
     while ( CUR.GS.loop > 0 )
     {
@@ -5393,11 +5484,9 @@
 
     if ( CUR.GS.gep0 == 0 )   /* If in twilight zone */
     {
-      CUR.zp0.org[point].x = TT_MULDIV( CUR.GS.freeVector.x,
-                                        distance, 0x4000 );
-      CUR.zp0.org[point].y = TT_MULDIV( CUR.GS.freeVector.y,
-                                        distance, 0x4000 );
-      CUR.zp0.cur[point] = CUR.zp0.org[point];
+      CUR.zp0.org[point].x = TT_MulFix14( distance, CUR.GS.freeVector.x );
+      CUR.zp0.org[point].y = TT_MulFix14( distance, CUR.GS.freeVector.y ),
+      CUR.zp0.cur[point]   = CUR.zp0.org[point];
     }
 
     org_dist = CUR_Func_project( CUR.zp0.cur + point, NULL_Vector );
@@ -5550,14 +5639,10 @@
     if ( CUR.GS.gep1 == 0 )
     {
       CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x +
-                             TT_MULDIV( cvt_dist,
-                                        CUR.GS.freeVector.x,
-                                        0x4000 );
+                             TT_MulFix14( cvt_dist, CUR.GS.freeVector.x );
 
       CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y +
-                             TT_MULDIV( cvt_dist,
-                                        CUR.GS.freeVector.y,
-                                        0x4000 );
+                             TT_MulFix14( cvt_dist, CUR.GS.freeVector.y );
 
       CUR.zp1.cur[point] = CUR.zp1.org[point];
     }