[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'.
This commit is contained in:
Werner Lemberg 2015-01-10 21:53:48 +01:00
parent fae0c81f69
commit 246814554f
2 changed files with 226 additions and 265 deletions

View File

@ -1,3 +1,21 @@
2015-01-10 Werner Lemberg <wl@gnu.org>
[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 <wl@gnu.org>
[truetype] More macro expansions.

View File

@ -82,83 +82,17 @@
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 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 )
#define fast_dualproj( v ) \
exc->func_dualproj( exc, (v)->x, (v)->y )
/*************************************************************************/
@ -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,37 +2758,39 @@
\
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 ) \
{ \
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 ); \
}
#define DO_SFVTPV \
GUESS_VECTOR( projVector ); \
exc->GS.freeVector = exc->GS.projVector; \
COMPUTE_Funcs();
Compute_Funcs( exc );
#define DO_SPVFS \
@ -2869,11 +2805,11 @@
S = (FT_Short)args[0]; \
X = (FT_Long)S; \
\
NORMalize( X, Y, &exc->GS.projVector ); \
Normalize( exc, X, Y, &exc->GS.projVector ); \
\
exc->GS.dualVector = exc->GS.projVector; \
GUESS_VECTOR( freeVector ); \
COMPUTE_Funcs(); \
Compute_Funcs( exc ); \
}
@ -2889,9 +2825,9 @@
S = (FT_Short)args[0]; \
X = S; \
\
NORMalize( X, Y, &exc->GS.freeVector ); \
Normalize( exc, X, Y, &exc->GS.freeVector ); \
GUESS_VECTOR( projVector ); \
COMPUTE_Funcs(); \
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;
@ -3034,7 +2970,7 @@
#define DO_MPPEM \
args[0] = CUR_Func_cur_ppem();
args[0] = exc->func_cur_ppem( exc );
/* Note: The pointSize should be irrelevant in a given font program; */
@ -3047,7 +2983,7 @@
#else
#define DO_MPS \
args[0] = CUR_Func_cur_ppem();
args[0] = exc->func_cur_ppem( exc );
#endif /* 0 */
@ -3157,11 +3093,11 @@
#define DO_ODD \
args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 );
args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 127 ) == 64 );
#define DO_EVEN \
args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 );
args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 127 ) == 0 );
#define DO_AND \
@ -3303,7 +3239,7 @@
args[0] = 0; \
} \
else \
args[0] = CUR_Func_read_cvt( I ); \
args[0] = exc->func_read_cvt( exc, I ); \
}
@ -3320,7 +3256,7 @@
} \
} \
else \
CUR_Func_write_cvt( I, args[1] ); \
exc->func_write_cvt( exc, I, args[1] ); \
}
@ -3346,13 +3282,15 @@
#define DO_ROUND \
args[0] = CUR_Func_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,21 +6125,21 @@
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:
#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,24 +6245,26 @@
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;
}
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,
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(
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,
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_;