shithub: freetype+ttf2subf

Download patch

ref: 246814554fb1ba4e8d7747e156572ad1481af13c
parent: fae0c81f6917a0f782129f085fadfe151469ba79
author: Werner Lemberg <[email protected]>
date: Sat Jan 10 16:53:48 EST 2015

[truetype] More macro expansions.

Based on a patch from Behdad.

* src/truetype/ttinterp.c (SKIP_Code, GET_ShortIns, NORMalize,
SET_SuperRound, ROUND_None, INS_Goto_CodeRange, CUR_Func_move,
CUR_Func_move_orig, CUR_Func_round, CUR_Func_cur_ppem,
CUR_Func_read_cvt, CUR_Func_write_cvt, CUR_Func_move_cvt,
CURRENT_Ratio, INS_SxVTL, COMPUTE_Funcs, COMPUTE_Round,
COMPUTE_Point_Displacement, MOVE_Zp2_Point): Remove by replacing
with expansion.

(Cur_Func_project, CUR_Func_dualproj, CUR_fast_project,
CUR_fast_dualproj): Replace with macros `project', `dualproj',
`fast_project', `fast_dualproj'.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,24 @@
 
 	[truetype] More macro expansions.
 
+	Based on a patch from Behdad.
+
+	* src/truetype/ttinterp.c (SKIP_Code, GET_ShortIns, NORMalize,
+	SET_SuperRound, ROUND_None, INS_Goto_CodeRange, CUR_Func_move,
+	CUR_Func_move_orig, CUR_Func_round, CUR_Func_cur_ppem,
+	CUR_Func_read_cvt, CUR_Func_write_cvt, CUR_Func_move_cvt,
+	CURRENT_Ratio, INS_SxVTL, COMPUTE_Funcs, COMPUTE_Round,
+	COMPUTE_Point_Displacement, MOVE_Zp2_Point): Remove by replacing
+	with expansion.
+
+	(Cur_Func_project, CUR_Func_dualproj, CUR_fast_project,
+	CUR_fast_dualproj): Replace with macros `project', `dualproj',
+	`fast_project', `fast_dualproj'.
+
+2015-01-10  Werner Lemberg  <[email protected]>
+
+	[truetype] More macro expansions.
+
 	* src/truetype/ttinterp.c (EXEC_OP_, EXEC_OP): Remove by replacing
 	with expansion.
 
--- a/src/truetype/ttinterp.c
+++ b/src/truetype/ttinterp.c
@@ -82,85 +82,19 @@
             TT_INTERPRETER_VERSION_38 )
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to        */
-  /* increase readability of the code.                                     */
-  /*                                                                       */
-  /*************************************************************************/
+#define project( v1, v2 )                                                \
+          exc->func_project( exc, (v1)->x - (v2)->x, (v1)->y - (v2)->y )
 
+#define dualproj( v1, v2 )                                                \
+          exc->func_dualproj( exc, (v1)->x - (v2)->x, (v1)->y - (v2)->y )
 
-#define SKIP_Code() \
-          SkipCode( EXEC_ARG )
+#define fast_project( v )                          \
+          exc->func_project( exc, (v)->x, (v)->y )
 
-#define GET_ShortIns() \
-          GetShortIns( EXEC_ARG )
+#define fast_dualproj( v )                          \
+          exc->func_dualproj( exc, (v)->x, (v)->y )
 
-#define NORMalize( x, y, v ) \
-          Normalize( EXEC_ARG_ x, y, v )
 
-#define SET_SuperRound( scale, flags ) \
-          SetSuperRound( EXEC_ARG_ scale, flags )
-
-#define ROUND_None( d, c ) \
-          Round_None( EXEC_ARG_ d, c )
-
-#define INS_Goto_CodeRange( range, ip ) \
-          Ins_Goto_CodeRange( EXEC_ARG_ range, ip )
-
-#define CUR_Func_move( z, p, d ) \
-          exc->func_move( EXEC_ARG_ z, p, d )
-
-#define CUR_Func_move_orig( z, p, d ) \
-          exc->func_move_orig( EXEC_ARG_ z, p, d )
-
-#define CUR_Func_round( d, c ) \
-          exc->func_round( EXEC_ARG_ d, c )
-
-#define CUR_Func_cur_ppem() \
-          exc->func_cur_ppem( EXEC_ARG )
-
-#define CUR_Func_read_cvt( index ) \
-          exc->func_read_cvt( EXEC_ARG_ index )
-
-#define CUR_Func_write_cvt( index, val ) \
-          exc->func_write_cvt( EXEC_ARG_ index, val )
-
-#define CUR_Func_move_cvt( index, val ) \
-          exc->func_move_cvt( EXEC_ARG_ index, val )
-
-#define CURRENT_Ratio() \
-          Current_Ratio( EXEC_ARG )
-
-#define INS_SxVTL( a, b, c, d ) \
-          Ins_SxVTL( EXEC_ARG_ a, b, c, d )
-
-#define COMPUTE_Funcs() \
-          Compute_Funcs( EXEC_ARG )
-
-#define COMPUTE_Round( a ) \
-          Compute_Round( EXEC_ARG_ a )
-
-#define COMPUTE_Point_Displacement( a, b, c, d ) \
-          Compute_Point_Displacement( EXEC_ARG_ a, b, c, d )
-
-#define MOVE_Zp2_Point( a, b, c, t ) \
-          Move_Zp2_Point( EXEC_ARG_ a, b, c, t )
-
-
-#define CUR_Func_project( v1, v2 )  \
-          exc->func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
-
-#define CUR_Func_dualproj( v1, v2 )  \
-          exc->func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
-
-#define CUR_fast_project( v ) \
-          exc->func_project( EXEC_ARG_ (v)->x, (v)->y )
-
-#define CUR_fast_dualproj( v ) \
-          exc->func_dualproj( EXEC_ARG_ (v)->x, (v)->y )
-
-
   /*************************************************************************/
   /*                                                                       */
   /* Instruction dispatch function, as used by the interpreter.            */
@@ -1630,7 +1564,7 @@
   FT_CALLBACK_DEF( FT_Long )
   Current_Ppem_Stretched( TT_ExecContext  exc )
   {
-    return FT_MulFix( exc->tt_metrics.ppem, CURRENT_Ratio() );
+    return FT_MulFix( exc->tt_metrics.ppem, Current_Ratio( exc ) );
   }
 
 
@@ -1653,7 +1587,7 @@
   Read_CVT_Stretched( TT_ExecContext  exc,
                       FT_ULong        idx )
   {
-    return FT_MulFix( exc->cvt[idx], CURRENT_Ratio() );
+    return FT_MulFix( exc->cvt[idx], Current_Ratio( exc ) );
   }
 
 
@@ -1671,7 +1605,7 @@
                        FT_ULong        idx,
                        FT_F26Dot6      value )
   {
-    exc->cvt[idx] = FT_DivFix( value, CURRENT_Ratio() );
+    exc->cvt[idx] = FT_DivFix( value, Current_Ratio( exc ) );
   }
 
 
@@ -1689,7 +1623,7 @@
                       FT_ULong        idx,
                       FT_F26Dot6      value )
   {
-    exc->cvt[idx] += FT_DivFix( value, CURRENT_Ratio() );
+    exc->cvt[idx] += FT_DivFix( value, Current_Ratio( exc ) );
   }
 
 
@@ -2759,7 +2693,7 @@
       A = -C;
     }
 
-    NORMalize( A, B, Vec );
+    Normalize( exc, A, B, Vec );
 
     return SUCCESS;
   }
@@ -2787,7 +2721,7 @@
     exc->GS.projVector.y = B;                \
     exc->GS.dualVector.y = B;                \
                                              \
-    COMPUTE_Funcs();                         \
+    Compute_Funcs( exc );                    \
   }
 
 
@@ -2807,7 +2741,7 @@
                                              \
     GUESS_VECTOR( freeVector );              \
                                              \
-    COMPUTE_Funcs();                         \
+    Compute_Funcs( exc );                    \
   }
 
 
@@ -2824,12 +2758,13 @@
                                              \
     GUESS_VECTOR( projVector );              \
                                              \
-    COMPUTE_Funcs();                         \
+    Compute_Funcs( exc );                    \
   }
 
 
 #define DO_SPVTL                                       \
-    if ( INS_SxVTL( (FT_UShort)args[1],                \
+    if ( Ins_SxVTL( exc,                               \
+                    (FT_UShort)args[1],                \
                     (FT_UShort)args[0],                \
                     exc->opcode,                       \
                     &exc->GS.projVector ) == SUCCESS ) \
@@ -2836,18 +2771,19 @@
     {                                                  \
       exc->GS.dualVector = exc->GS.projVector;         \
       GUESS_VECTOR( freeVector );                      \
-      COMPUTE_Funcs();                                 \
+      Compute_Funcs( exc );                            \
     }
 
 
 #define DO_SFVTL                                       \
-    if ( INS_SxVTL( (FT_UShort)args[1],                \
+    if ( Ins_SxVTL( exc,                               \
+                    (FT_UShort)args[1],                \
                     (FT_UShort)args[0],                \
                     exc->opcode,                       \
                     &exc->GS.freeVector ) == SUCCESS ) \
     {                                                  \
       GUESS_VECTOR( projVector );                      \
-      COMPUTE_Funcs();                                 \
+      Compute_Funcs( exc );                            \
     }
 
 
@@ -2854,44 +2790,44 @@
 #define DO_SFVTPV                            \
     GUESS_VECTOR( projVector );              \
     exc->GS.freeVector = exc->GS.projVector; \
-    COMPUTE_Funcs();
+    Compute_Funcs( exc );
 
 
-#define DO_SPVFS                                \
-  {                                             \
-    FT_Short  S;                                \
-    FT_Long   X, Y;                             \
-                                                \
-                                                \
-    /* Only use low 16bits, then sign extend */ \
-    S = (FT_Short)args[1];                      \
-    Y = (FT_Long)S;                             \
-    S = (FT_Short)args[0];                      \
-    X = (FT_Long)S;                             \
-                                                \
-    NORMalize( X, Y, &exc->GS.projVector );     \
-                                                \
-    exc->GS.dualVector = exc->GS.projVector;    \
-    GUESS_VECTOR( freeVector );                 \
-    COMPUTE_Funcs();                            \
+#define DO_SPVFS                                 \
+  {                                              \
+    FT_Short  S;                                 \
+    FT_Long   X, Y;                              \
+                                                 \
+                                                 \
+    /* Only use low 16bits, then sign extend */  \
+    S = (FT_Short)args[1];                       \
+    Y = (FT_Long)S;                              \
+    S = (FT_Short)args[0];                       \
+    X = (FT_Long)S;                              \
+                                                 \
+    Normalize( exc, X, Y, &exc->GS.projVector ); \
+                                                 \
+    exc->GS.dualVector = exc->GS.projVector;     \
+    GUESS_VECTOR( freeVector );                  \
+    Compute_Funcs( exc );                        \
   }
 
 
-#define DO_SFVFS                                \
-  {                                             \
-    FT_Short  S;                                \
-    FT_Long   X, Y;                             \
-                                                \
-                                                \
-    /* Only use low 16bits, then sign extend */ \
-    S = (FT_Short)args[1];                      \
-    Y = (FT_Long)S;                             \
-    S = (FT_Short)args[0];                      \
-    X = S;                                      \
-                                                \
-    NORMalize( X, Y, &exc->GS.freeVector );     \
-    GUESS_VECTOR( projVector );                 \
-    COMPUTE_Funcs();                            \
+#define DO_SFVFS                                 \
+  {                                              \
+    FT_Short  S;                                 \
+    FT_Long   X, Y;                              \
+                                                 \
+                                                 \
+    /* Only use low 16bits, then sign extend */  \
+    S = (FT_Short)args[1];                       \
+    Y = (FT_Long)S;                              \
+    S = (FT_Short)args[0];                       \
+    X = S;                                       \
+                                                 \
+    Normalize( exc, X, Y, &exc->GS.freeVector ); \
+    GUESS_VECTOR( projVector );                  \
+    Compute_Funcs( exc );                        \
   }
 
 
@@ -2976,13 +2912,13 @@
 
 
 #define DO_SROUND                                 \
-    SET_SuperRound( 0x4000, args[0] );            \
+    SetSuperRound( exc, 0x4000, args[0] );        \
     exc->GS.round_state = TT_Round_Super;         \
     exc->func_round = (TT_Round_Func)Round_Super;
 
 
 #define DO_S45ROUND                                  \
-    SET_SuperRound( 0x2D41, args[0] );               \
+    SetSuperRound( exc, 0x2D41, args[0] );           \
     exc->GS.round_state = TT_Round_Super_45;         \
     exc->func_round = (TT_Round_Func)Round_Super_45;
 
@@ -3033,8 +2969,8 @@
 #define DO_MD  /* nothing */
 
 
-#define DO_MPPEM                   \
-    args[0] = CUR_Func_cur_ppem();
+#define DO_MPPEM                         \
+    args[0] = exc->func_cur_ppem( exc );
 
 
   /* Note: The pointSize should be irrelevant in a given font program; */
@@ -3046,8 +2982,8 @@
 
 #else
 
-#define DO_MPS                     \
-    args[0] = CUR_Func_cur_ppem();
+#define DO_MPS                           \
+    args[0] = exc->func_cur_ppem( exc );
 
 #endif /* 0 */
 
@@ -3156,12 +3092,12 @@
     args[0] = ( args[0] != args[1] );
 
 
-#define DO_ODD                                                  \
-    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 );
+#define DO_ODD                                                        \
+    args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 127 ) == 64 );
 
 
-#define DO_EVEN                                                \
-    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 );
+#define DO_EVEN                                                      \
+    args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 127 ) == 0 );
 
 
 #define DO_AND                        \
@@ -3288,39 +3224,39 @@
    }
 
 
-#define DO_RCVT                          \
-   {                                     \
-     FT_ULong  I = (FT_ULong)args[0];    \
-                                         \
-                                         \
-     if ( BOUNDSL( I, exc->cvtSize ) )   \
-     {                                   \
-       if ( exc->pedantic_hinting )      \
-       {                                 \
-         ARRAY_BOUND_ERROR;              \
-       }                                 \
-       else                              \
-         args[0] = 0;                    \
-     }                                   \
-     else                                \
-       args[0] = CUR_Func_read_cvt( I ); \
+#define DO_RCVT                                \
+   {                                           \
+     FT_ULong  I = (FT_ULong)args[0];          \
+                                               \
+                                               \
+     if ( BOUNDSL( I, exc->cvtSize ) )         \
+     {                                         \
+       if ( exc->pedantic_hinting )            \
+       {                                       \
+         ARRAY_BOUND_ERROR;                    \
+       }                                       \
+       else                                    \
+         args[0] = 0;                          \
+     }                                         \
+     else                                      \
+       args[0] = exc->func_read_cvt( exc, I ); \
    }
 
 
-#define DO_WCVTP                         \
-   {                                     \
-     FT_ULong  I = (FT_ULong)args[0];    \
-                                         \
-                                         \
-     if ( BOUNDSL( I, exc->cvtSize ) )   \
-     {                                   \
-       if ( exc->pedantic_hinting )      \
-       {                                 \
-         ARRAY_BOUND_ERROR;              \
-       }                                 \
-     }                                   \
-     else                                \
-       CUR_Func_write_cvt( I, args[1] ); \
+#define DO_WCVTP                               \
+   {                                           \
+     FT_ULong  I = (FT_ULong)args[0];          \
+                                               \
+                                               \
+     if ( BOUNDSL( I, exc->cvtSize ) )         \
+     {                                         \
+       if ( exc->pedantic_hinting )            \
+       {                                       \
+         ARRAY_BOUND_ERROR;                    \
+       }                                       \
+     }                                         \
+     else                                      \
+       exc->func_write_cvt( exc, I, args[1] ); \
    }
 
 
@@ -3345,14 +3281,16 @@
     exc->error = FT_THROW( Debug_OpCode );
 
 
-#define DO_ROUND                                                    \
-    args[0] = CUR_Func_round(                                       \
-                args[0],                                            \
+#define DO_ROUND                                                     \
+    args[0] = exc->func_round(                                       \
+                exc,                                                 \
+                args[0],                                             \
                 exc->tt_metrics.compensations[exc->opcode - 0x68] );
 
 
 #define DO_NROUND                                                             \
-    args[0] = ROUND_None( args[0],                                            \
+    args[0] = Round_None( exc,                                                \
+                          args[0],                                            \
                           exc->tt_metrics.compensations[exc->opcode - 0x6C] );
 
 
@@ -4448,7 +4386,7 @@
 
     do
     {
-      if ( SKIP_Code() == FAILURE )
+      if ( SkipCode( exc ) == FAILURE )
         return;
 
       switch ( exc->opcode )
@@ -4488,7 +4426,7 @@
 
     do
     {
-      if ( SKIP_Code() == FAILURE )
+      if ( SkipCode( exc ) == FAILURE )
         return;
 
       switch ( exc->opcode )
@@ -4680,7 +4618,7 @@
     /* Now skip the whole function definition. */
     /* We don't allow nested IDEFS & FDEFs.    */
 
-    while ( SKIP_Code() == SUCCESS )
+    while ( SkipCode( exc ) == SUCCESS )
     {
 
 #ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
@@ -4848,8 +4786,7 @@
     }
     else
       /* Loop through the current function */
-      INS_Goto_CodeRange( pRec->Caller_Range,
-                          pRec->Caller_IP );
+      Ins_Goto_CodeRange( exc, pRec->Caller_Range, pRec->Caller_IP );
 
     /* Exit the current call frame.                      */
 
@@ -4938,8 +4875,7 @@
 
     exc->callTop++;
 
-    INS_Goto_CodeRange( def->range,
-                        def->start );
+    Ins_Goto_CodeRange( exc, def->range, def->start );
 
     exc->step_ins = FALSE;
 
@@ -5026,7 +4962,7 @@
 
       exc->callTop++;
 
-      INS_Goto_CodeRange( def->range, def->start );
+      Ins_Goto_CodeRange( exc, def->range, def->start );
 
       exc->step_ins = FALSE;
     }
@@ -5089,7 +5025,7 @@
     /* Now skip the whole function definition. */
     /* We don't allow nested IDEFs & FDEFs.    */
 
-    while ( SKIP_Code() == SUCCESS )
+    while ( SkipCode( exc ) == SUCCESS )
     {
       switch ( exc->opcode )
       {
@@ -5163,7 +5099,7 @@
     exc->IP += 2;
 
     for ( K = 0; K < L; K++ )
-      args[K] = GET_ShortIns();
+      args[K] = GetShortIns( exc );
 
     exc->step_ins = FALSE;
     exc->new_top += L;
@@ -5218,7 +5154,7 @@
     exc->IP++;
 
     for ( K = 0; K < L; K++ )
-      args[K] = GET_ShortIns();
+      args[K] = GetShortIns( exc );
 
     exc->step_ins = FALSE;
   }
@@ -5260,9 +5196,9 @@
     else
     {
       if ( exc->opcode & 1 )
-        R = CUR_fast_dualproj( &exc->zp2.org[L] );
+        R = fast_dualproj( &exc->zp2.org[L] );
       else
-        R = CUR_fast_project( &exc->zp2.cur[L] );
+        R = fast_project( &exc->zp2.cur[L] );
     }
 
     args[0] = R;
@@ -5295,9 +5231,9 @@
       return;
     }
 
-    K = CUR_fast_project( &exc->zp2.cur[L] );
+    K = fast_project( &exc->zp2.cur[L] );
 
-    CUR_Func_move( &exc->zp2, L, args[1] - K );
+    exc->func_move( exc, &exc->zp2, L, args[1] - K );
 
     /* UNDOCUMENTED!  The MS rasterizer does that with */
     /* twilight points (confirmed by Greg Hitchcock)   */
@@ -5341,7 +5277,7 @@
     else
     {
       if ( exc->opcode & 1 )
-        D = CUR_Func_project( exc->zp0.cur + L, exc->zp1.cur + K );
+        D = project( exc->zp0.cur + L, exc->zp1.cur + K );
       else
       {
         /* XXX: UNDOCUMENTED: twilight zone special case */
@@ -5352,7 +5288,7 @@
           FT_Vector*  vec2 = exc->zp1.org + K;
 
 
-          D = CUR_Func_dualproj( vec1, vec2 );
+          D = dualproj( vec1, vec2 );
         }
         else
         {
@@ -5363,7 +5299,7 @@
           if ( exc->metrics.x_scale == exc->metrics.y_scale )
           {
             /* this should be faster */
-            D = CUR_Func_dualproj( vec1, vec2 );
+            D = dualproj( vec1, vec2 );
             D = FT_MulFix( D, exc->metrics.x_scale );
           }
           else
@@ -5374,7 +5310,7 @@
             vec.x = FT_MulFix( vec1->x - vec2->x, exc->metrics.x_scale );
             vec.y = FT_MulFix( vec1->y - vec2->y, exc->metrics.y_scale );
 
-            D = CUR_fast_dualproj( &vec );
+            D = fast_dualproj( &vec );
           }
         }
       }
@@ -5443,7 +5379,7 @@
       A = -C;
     }
 
-    NORMalize( A, B, &exc->GS.dualVector );
+    Normalize( exc, A, B, &exc->GS.dualVector );
 
     {
       FT_Vector*  v1 = exc->zp1.cur + p2;
@@ -5467,11 +5403,11 @@
       A = -C;
     }
 
-    NORMalize( A, B, &exc->GS.projVector );
+    Normalize( exc, A, B, &exc->GS.projVector );
 
     GUESS_VECTOR( freeVector );
 
-    COMPUTE_Funcs();
+    Compute_Funcs( exc );
   }
 
 
@@ -5832,7 +5768,7 @@
     *zone = zp;
     *refp = p;
 
-    d = CUR_Func_project( zp.cur + p, zp.org + p );
+    d = project( zp.cur + p, zp.org + p );
 
 #ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
     if ( exc->face->unpatented_hinting )
@@ -5927,7 +5863,7 @@
       goto Fail;
     }
 
-    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+    if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) )
       return;
 
     while ( exc->GS.loop > 0 )
@@ -5948,10 +5884,10 @@
       /* doesn't follow Cleartype spec but produces better result */
       if ( SUBPIXEL_HINTING   &&
            exc->ignore_x_mode )
-        MOVE_Zp2_Point( point, 0, dy, TRUE );
+        Move_Zp2_Point( exc, point, 0, dy, TRUE );
       else
 #endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
-        MOVE_Zp2_Point( point, dx, dy, TRUE );
+        Move_Zp2_Point( exc, point, dx, dy, TRUE );
 
       exc->GS.loop--;
     }
@@ -5993,7 +5929,7 @@
       return;
     }
 
-    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+    if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) )
       return;
 
     if ( contour == 0 )
@@ -6012,7 +5948,7 @@
     for ( i = start; i < limit; i++ )
     {
       if ( zp.cur != exc->zp2.cur || refp != i )
-        MOVE_Zp2_Point( i, dx, dy, TRUE );
+        Move_Zp2_Point( exc, i, dx, dy, TRUE );
     }
   }
 
@@ -6041,7 +5977,7 @@
       return;
     }
 
-    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+    if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) )
       return;
 
     /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points.     */
@@ -6059,7 +5995,7 @@
     for ( i = 0; i < limit; i++ )
     {
       if ( zp.cur != exc->zp2.cur || refp != i )
-        MOVE_Zp2_Point( i, dx, dy, FALSE );
+        Move_Zp2_Point( exc, i, dx, dy, FALSE );
     }
   }
 
@@ -6145,7 +6081,7 @@
           if ( !exc->face->sph_compatibility_mode &&
                exc->GS.freeVector.y != 0          )
           {
-            MOVE_Zp2_Point( point, dx, dy, TRUE );
+            Move_Zp2_Point( exc, point, dx, dy, TRUE );
 
             /* save new point */
             if ( exc->GS.freeVector.y != 0 )
@@ -6157,7 +6093,7 @@
                    ( B1 & 63 ) != 0                                           &&
                    ( B2 & 63 ) != 0                                           &&
                     B1 != B2                                                  )
-                MOVE_Zp2_Point( point, -dx, -dy, TRUE );
+                Move_Zp2_Point( exc, point, -dx, -dy, TRUE );
             }
           }
           else if ( exc->face->sph_compatibility_mode )
@@ -6178,7 +6114,7 @@
                   ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
                     ( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y )    ||
                     ( exc->sph_tweak_flags & SPH_TWEAK_DO_SHPIX )      )  )
-              MOVE_Zp2_Point( point, 0, dy, TRUE );
+              Move_Zp2_Point( exc, point, 0, dy, TRUE );
 
             /* save new point */
             if ( exc->GS.freeVector.y != 0 )
@@ -6189,14 +6125,14 @@
               if ( ( B1 & 63 ) == 0 &&
                    ( B2 & 63 ) != 0 &&
                    B1 != B2         )
-                MOVE_Zp2_Point( point, 0, -dy, TRUE );
+                Move_Zp2_Point( exc, point, 0, -dy, TRUE );
             }
           }
           else if ( exc->sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL )
-            MOVE_Zp2_Point( point, dx, dy, TRUE );
+            Move_Zp2_Point( exc, point, dx, dy, TRUE );
         }
         else
-          MOVE_Zp2_Point( point, dx, dy, TRUE );
+          Move_Zp2_Point( exc, point, dx, dy, TRUE );
       }
 
     Skip:
@@ -6203,7 +6139,7 @@
 
 #else /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
 
-        MOVE_Zp2_Point( point, dx, dy, TRUE );
+      Move_Zp2_Point( exc, point, dx, dy, TRUE );
 
 #endif /* !TT_CONFIG_OPTION_SUBPIXEL_HINTING */
 
@@ -6259,12 +6195,11 @@
     if ( exc->GS.gep1 == 0 )
     {
       exc->zp1.org[point] = exc->zp0.org[exc->GS.rp0];
-      CUR_Func_move_orig( &exc->zp1, point, args[1] );
+      exc->func_move_orig( exc, &exc->zp1, point, args[1] );
       exc->zp1.cur[point] = exc->zp1.org[point];
     }
 
-    distance = CUR_Func_project( exc->zp1.cur + point,
-                                 exc->zp0.cur + exc->GS.rp0 );
+    distance = project( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 );
 
 #ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
     /* subpixel hinting - make MSIRP respect CVT cut-in; */
@@ -6275,7 +6210,7 @@
       distance = args[1];
 #endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
 
-    CUR_Func_move( &exc->zp1, point, args[1] - distance );
+    exc->func_move( exc, &exc->zp1, point, args[1] - distance );
 
     exc->GS.rp1 = exc->GS.rp0;
     exc->GS.rp2 = point;
@@ -6310,17 +6245,19 @@
 
     if ( ( exc->opcode & 1 ) != 0 )
     {
-      cur_dist = CUR_fast_project( &exc->zp0.cur[point] );
+      cur_dist = fast_project( &exc->zp0.cur[point] );
 #ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
       if ( SUBPIXEL_HINTING          &&
            exc->ignore_x_mode        &&
            exc->GS.freeVector.x != 0 )
-        distance = ROUND_None(
+        distance = Round_None(
+                     exc,
                      cur_dist,
                      exc->tt_metrics.compensations[0] ) - cur_dist;
       else
 #endif
-        distance = CUR_Func_round(
+        distance = exc->func_round(
+                     exc,
                      cur_dist,
                      exc->tt_metrics.compensations[0] ) - cur_dist;
     }
@@ -6327,7 +6264,7 @@
     else
       distance = 0;
 
-    CUR_Func_move( &exc->zp0, point, distance );
+    exc->func_move( exc, &exc->zp0, point, distance );
 
     exc->GS.rp0 = point;
     exc->GS.rp1 = point;
@@ -6391,7 +6328,7 @@
     /*                                                                    */
     /* Confirmed by Greg Hitchcock.                                       */
 
-    distance = CUR_Func_read_cvt( cvtEntry );
+    distance = exc->func_read_cvt( exc, cvtEntry );
 
     if ( exc->GS.gep0 == 0 )   /* If in twilight zone */
     {
@@ -6417,7 +6354,7 @@
       distance = 0;
 #endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
 
-    org_dist = CUR_fast_project( &exc->zp0.cur[point] );
+    org_dist = fast_project( &exc->zp0.cur[point] );
 
     if ( ( exc->opcode & 1 ) != 0 )   /* rounding and control cut-in flag */
     {
@@ -6428,15 +6365,17 @@
       if ( SUBPIXEL_HINTING          &&
            exc->ignore_x_mode        &&
            exc->GS.freeVector.x != 0 )
-        distance = ROUND_None( distance,
+        distance = Round_None( exc,
+                               distance,
                                exc->tt_metrics.compensations[0] );
       else
 #endif
-        distance = CUR_Func_round( distance,
-                                   exc->tt_metrics.compensations[0] );
+        distance = exc->func_round( exc,
+                                    distance,
+                                    exc->tt_metrics.compensations[0] );
     }
 
-    CUR_Func_move( &exc->zp0, point, distance - org_dist );
+    exc->func_move( exc, &exc->zp0, point, distance - org_dist );
 
   Fail:
     exc->GS.rp0 = point;
@@ -6488,7 +6427,7 @@
       FT_Vector*  vec2 = &exc->zp0.org[exc->GS.rp0];
 
 
-      org_dist = CUR_Func_dualproj( vec1, vec2 );
+      org_dist = dualproj( vec1, vec2 );
     }
     else
     {
@@ -6499,7 +6438,7 @@
       if ( exc->metrics.x_scale == exc->metrics.y_scale )
       {
         /* this should be faster */
-        org_dist = CUR_Func_dualproj( vec1, vec2 );
+        org_dist = dualproj( vec1, vec2 );
         org_dist = FT_MulFix( org_dist, exc->metrics.x_scale );
       }
       else
@@ -6510,7 +6449,7 @@
         vec.x = FT_MulFix( vec1->x - vec2->x, exc->metrics.x_scale );
         vec.y = FT_MulFix( vec1->y - vec2->y, exc->metrics.y_scale );
 
-        org_dist = CUR_fast_dualproj( &vec );
+        org_dist = fast_dualproj( &vec );
       }
     }
 
@@ -6533,17 +6472,20 @@
       if ( SUBPIXEL_HINTING          &&
            exc->ignore_x_mode        &&
            exc->GS.freeVector.x != 0 )
-        distance = ROUND_None(
+        distance = Round_None(
+                     exc,
                      org_dist,
                      exc->tt_metrics.compensations[exc->opcode & 3] );
       else
 #endif
-      distance = CUR_Func_round(
-                   org_dist,
-                   exc->tt_metrics.compensations[exc->opcode & 3] );
+        distance = exc->func_round(
+                     exc,
+                     org_dist,
+                     exc->tt_metrics.compensations[exc->opcode & 3] );
     }
     else
-      distance = ROUND_None(
+      distance = Round_None(
+                   exc,
                    org_dist,
                    exc->tt_metrics.compensations[exc->opcode & 3] );
 
@@ -6565,10 +6507,9 @@
 
     /* now move the point */
 
-    org_dist = CUR_Func_project( exc->zp1.cur + point,
-                                 exc->zp0.cur + exc->GS.rp0 );
+    org_dist = project( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 );
 
-    CUR_Func_move( &exc->zp1, point, distance - org_dist );
+    exc->func_move( exc, &exc->zp1, point, distance - org_dist );
 
   Fail:
     exc->GS.rp1 = exc->GS.rp0;
@@ -6631,7 +6572,7 @@
     if ( !cvtEntry )
       cvt_dist = 0;
     else
-      cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 );
+      cvt_dist = exc->func_read_cvt( exc, cvtEntry - 1 );
 
     /* single width test */
 
@@ -6657,10 +6598,8 @@
       exc->zp1.cur[point]   = exc->zp1.org[point];
     }
 
-    org_dist = CUR_Func_dualproj( &exc->zp1.org[point],
-                                  &exc->zp0.org[exc->GS.rp0] );
-    cur_dist = CUR_Func_project ( &exc->zp1.cur[point],
-                                  &exc->zp0.cur[exc->GS.rp0] );
+    org_dist = dualproj( &exc->zp1.org[point], &exc->zp0.org[exc->GS.rp0] );
+    cur_dist = project ( &exc->zp1.cur[point], &exc->zp0.cur[exc->GS.rp0] );
 
     /* auto-flip test */
 
@@ -6708,7 +6647,8 @@
           cvt_dist = org_dist;
       }
 
-      distance = CUR_Func_round(
+      distance = exc->func_round(
+                   exc,
                    cvt_dist,
                    exc->tt_metrics.compensations[exc->opcode & 3] );
     }
@@ -6726,7 +6666,8 @@
       }
 #endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
 
-      distance = ROUND_None(
+      distance = Round_None(
+                   exc,
                    cvt_dist,
                    exc->tt_metrics.compensations[exc->opcode & 3] );
     }
@@ -6767,7 +6708,7 @@
     }
 #endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
 
-    CUR_Func_move( &exc->zp1, point, distance - cur_dist );
+    exc->func_move( exc, &exc->zp1, point, distance - cur_dist );
 
 #ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING
     if ( SUBPIXEL_HINTING )
@@ -6791,7 +6732,7 @@
       }
 
       if ( reverse_move )
-        CUR_Func_move( &exc->zp1, point, -( distance - cur_dist ) );
+        exc->func_move( exc, &exc->zp1, point, -( distance - cur_dist ) );
     }
 
 #endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
@@ -6856,10 +6797,10 @@
       }
       else
       {
-        distance = CUR_Func_project( exc->zp1.cur + point,
-                                     exc->zp0.cur + exc->GS.rp0 );
+        distance = project( exc->zp1.cur + point,
+                            exc->zp0.cur + exc->GS.rp0 );
 
-        CUR_Func_move( &exc->zp1, point, -distance );
+        exc->func_move( exc, &exc->zp1, point, -distance );
       }
 
       exc->GS.loop--;
@@ -6989,11 +6930,10 @@
       return;
     }
 
-    distance = CUR_Func_project( exc->zp0.cur + p2,
-                                 exc->zp1.cur + p1 ) / 2;
+    distance = project( exc->zp0.cur + p2, exc->zp1.cur + p1 ) / 2;
 
-    CUR_Func_move( &exc->zp1, p1, distance );
-    CUR_Func_move( &exc->zp0, p2, -distance );
+    exc->func_move( exc, &exc->zp1, p1, distance );
+    exc->func_move( exc, &exc->zp0, p2, -distance );
   }
 
 
@@ -7058,11 +6998,9 @@
     else
     {
       if ( twilight )
-        old_range = CUR_Func_dualproj( &exc->zp1.org[exc->GS.rp2],
-                                       orus_base );
+        old_range = dualproj( &exc->zp1.org[exc->GS.rp2], orus_base );
       else if ( exc->metrics.x_scale == exc->metrics.y_scale )
-        old_range = CUR_Func_dualproj( &exc->zp1.orus[exc->GS.rp2],
-                                       orus_base );
+        old_range = dualproj( &exc->zp1.orus[exc->GS.rp2], orus_base );
       else
       {
         FT_Vector  vec;
@@ -7073,10 +7011,10 @@
         vec.y = FT_MulFix( exc->zp1.orus[exc->GS.rp2].y - orus_base->y,
                            exc->metrics.y_scale );
 
-        old_range = CUR_fast_dualproj( &vec );
+        old_range = fast_dualproj( &vec );
       }
 
-      cur_range = CUR_Func_project ( &exc->zp1.cur[exc->GS.rp2], cur_base );
+      cur_range = project( &exc->zp1.cur[exc->GS.rp2], cur_base );
     }
 
     for ( ; exc->GS.loop > 0; --exc->GS.loop )
@@ -7097,9 +7035,9 @@
       }
 
       if ( twilight )
-        org_dist = CUR_Func_dualproj( &exc->zp2.org[point], orus_base );
+        org_dist = dualproj( &exc->zp2.org[point], orus_base );
       else if ( exc->metrics.x_scale == exc->metrics.y_scale )
-        org_dist = CUR_Func_dualproj( &exc->zp2.orus[point], orus_base );
+        org_dist = dualproj( &exc->zp2.orus[point], orus_base );
       else
       {
         FT_Vector  vec;
@@ -7110,10 +7048,10 @@
         vec.y = FT_MulFix( exc->zp2.orus[point].y - orus_base->y,
                            exc->metrics.y_scale );
 
-        org_dist = CUR_fast_dualproj( &vec );
+        org_dist = fast_dualproj( &vec );
       }
 
-      cur_dist = CUR_Func_project( &exc->zp2.cur[point], cur_base );
+      cur_dist = project( &exc->zp2.cur[point], cur_base );
 
       if ( org_dist )
       {
@@ -7143,7 +7081,10 @@
       else
         new_dist = 0;
 
-      CUR_Func_move( &exc->zp2, (FT_UShort)point, new_dist - cur_dist );
+      exc->func_move( exc,
+                      &exc->zp2,
+                      (FT_UShort)point,
+                      new_dist - cur_dist );
     }
 
   Fail:
@@ -7470,7 +7411,7 @@
     }
 #endif
 
-    P = (FT_ULong)CUR_Func_cur_ppem();
+    P    = (FT_ULong)exc->func_cur_ppem( exc );
     nump = (FT_ULong)args[0];   /* some points theoretically may occur more
                                    than once, thus UShort isn't enough */
 
@@ -7537,7 +7478,7 @@
             if ( !exc->ignore_x_mode                                   ||
                  ( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) ||
                  ( exc->is_composite && exc->GS.freeVector.y != 0 )    )
-              CUR_Func_move( &exc->zp0, A, B );
+              exc->func_move( exc, &exc->zp0, A, B );
 
             /* Otherwise, apply subpixel hinting and compatibility mode */
             /* rules, always skipping deltas in subpixel direction.     */
@@ -7550,7 +7491,7 @@
               /* points.  This messes up DejaVu ...                    */
               if ( !exc->face->sph_compatibility_mode          &&
                    ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )
-                CUR_Func_move( &exc->zp0, A, B );
+                exc->func_move( exc, &exc->zp0, A, B );
 
               /* compatibility mode */
               else if ( exc->face->sph_compatibility_mode                        &&
@@ -7563,7 +7504,7 @@
                 /* IUP has not been called, and point is touched on Y. */
                 if ( !exc->iup_called                            &&
                      ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )
-                  CUR_Func_move( &exc->zp0, A, B );
+                  exc->func_move( exc, &exc->zp0, A, B );
               }
 
               B2 = (FT_UShort)exc->zp0.cur[A].y;
@@ -7577,13 +7518,13 @@
                          SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) &&
                        ( B1 & 63 ) != 0                           &&
                        ( B2 & 63 ) != 0                           ) ) )
-                CUR_Func_move( &exc->zp0, A, -B );
+                exc->func_move( exc, &exc->zp0, A, -B );
             }
           }
           else
 #endif /* TT_CONFIG_OPTION_SUBPIXEL_HINTING */
 
-            CUR_Func_move( &exc->zp0, A, B );
+            exc->func_move( exc, &exc->zp0, A, B );
         }
       }
       else
@@ -7630,7 +7571,7 @@
     }
 #endif
 
-    P    = (FT_ULong)CUR_Func_cur_ppem();
+    P    = (FT_ULong)exc->func_cur_ppem( exc );
     nump = (FT_ULong)args[0];
 
     for ( k = 1; k <= nump; k++ )
@@ -7683,7 +7624,7 @@
             B++;
           B *= 1L << ( 6 - exc->GS.delta_shift );
 
-          CUR_Func_move_cvt( A, B );
+          exc->func_move_cvt( exc, A, B );
         }
       }
     }
@@ -7850,7 +7791,7 @@
         call->Cur_Count    = 1;
         call->Def          = def;
 
-        INS_Goto_CodeRange( def->range, def->start );
+        Ins_Goto_CodeRange( exc, def->range, def->start );
 
         exc->step_ins = FALSE;
         return;
@@ -8224,8 +8165,8 @@
       exc->func_move_cvt  = Move_CVT;
     }
 
-    COMPUTE_Funcs();
-    COMPUTE_Round( (FT_Byte)exc->GS.round_state );
+    Compute_Funcs( exc );
+    Compute_Round( exc, (FT_Byte)exc->GS.round_state );
 
     do
     {
@@ -8361,7 +8302,7 @@
               GUESS_VECTOR( freeVector );
             }
 
-            COMPUTE_Funcs();
+            Compute_Funcs( exc );
           }
           break;
 
@@ -8904,7 +8845,9 @@
                 callrec->Cur_Count    = 1;
                 callrec->Def          = def;
 
-                if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE )
+                if ( Ins_Goto_CodeRange( exc,
+                                         def->range,
+                                         def->start ) == FAILURE )
                   goto LErrorLabel_;
 
                 goto LSuiteLabel_;