[truetype] Microoptimizations in bytecode interpreter.

* src/truetype/ttinterp.c (TT_DivFix14): New macro.
(Normalize): Use it here.
(Current_Ratio): Use TT_MulFix14 instead of FT_MulDiv.
(Ins_SHPIX): Cancel out two TT_MulFix14 calls.
This commit is contained in:
Alexei Podtelezhnikov 2012-12-06 00:27:20 -05:00
parent b50088bd9c
commit 5ad05f97b6
2 changed files with 29 additions and 12 deletions

View File

@ -1,3 +1,12 @@
2012-12-06 Alexei Podtelezhnikov <apodtele@gmail.com>
[truetype] Microoptimizations in bytecode interpreter.
* src/truetype/ttinterp.c (TT_DivFix14): New macro.
(Normalize): Use it here.
(Current_Ratio): Use TT_MulFix14 instead of FT_MulDiv.
(Ins_SHPIX): Cancel out two TT_MulFix14 calls.
2012-12-05 Alexei Podtelezhnikov <apodtele@gmail.com> 2012-12-05 Alexei Podtelezhnikov <apodtele@gmail.com>
[truetype] Cosmetic improvement in bytecode interpreter. [truetype] Cosmetic improvement in bytecode interpreter.
@ -750,7 +759,7 @@
(ALWAYS_SKIP_DELTAP_Rules): Add Russian char 0x438. (ALWAYS_SKIP_DELTAP_Rules): Add Russian char 0x438.
(COMPATIBLE_WIDTHS_Rules): Rearrange some rules. (COMPATIBLE_WIDTHS_Rules): Rearrange some rules.
(X_SCALING_Rules): Adjust Verdana `a' at 12 and 13 ppem. (X_SCALING_Rules): Adjust Verdana `a' at 12 and 13 ppem.
* src/truetype/ttsubpix.c: Updated. * src/truetype/ttsubpix.c: Updated.
(sph_set_tweaks): Re-execute fpgm always. (sph_set_tweaks): Re-execute fpgm always.

View File

@ -231,6 +231,14 @@
#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) ) #define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) )
#define BOUNDSL( x, n ) ( (FT_ULong)(x) >= (FT_ULong)(n) ) #define BOUNDSL( x, n ) ( (FT_ULong)(x) >= (FT_ULong)(n) )
/*************************************************************************/
/* */
/* This macro computes (a*2^14)/b and compliments TT_MulFix14. */
/* */
#define TT_DivFix14( a, b ) \
FT_DivFix( a, (b) << 2 )
#undef SUCCESS #undef SUCCESS
#define SUCCESS 0 #define SUCCESS 0
@ -1660,13 +1668,13 @@
else else
{ {
FT_Long x, y; FT_F26Dot6 x, y;
x = FT_MulDiv( CUR.GS.projVector.x, x = TT_MulFix14( CUR.GS.projVector.x,
CUR.tt_metrics.x_ratio, 0x4000 ); CUR.tt_metrics.x_ratio );
y = FT_MulDiv( CUR.GS.projVector.y, y = TT_MulFix14( CUR.GS.projVector.y,
CUR.tt_metrics.y_ratio, 0x4000 ); CUR.tt_metrics.y_ratio );
CUR.tt_metrics.ratio = TT_VecLen( x, y ); CUR.tt_metrics.ratio = TT_VecLen( x, y );
} }
} }
@ -2751,16 +2759,16 @@
return SUCCESS; return SUCCESS;
} }
R->x = (FT_F2Dot14)FT_MulDiv( Vx, 0x4000L, W ); R->x = (FT_F2Dot14)TT_DivFix14( Vx, W );
R->y = (FT_F2Dot14)FT_MulDiv( Vy, 0x4000L, W ); R->y = (FT_F2Dot14)TT_DivFix14( Vy, W );
return SUCCESS; return SUCCESS;
} }
W = TT_VecLen( Vx, Vy ); W = TT_VecLen( Vx, Vy );
Vx = FT_MulDiv( Vx, 0x4000L, W ); Vx = TT_DivFix14( Vx, W );
Vy = FT_MulDiv( Vy, 0x4000L, W ); Vy = TT_DivFix14( Vy, W );
W = Vx * Vx + Vy * Vy; W = Vx * Vx + Vy * Vy;
@ -6076,13 +6084,13 @@
{ {
if ( CUR.GS.both_x_axis ) if ( CUR.GS.both_x_axis )
{ {
dx = TT_MulFix14( (FT_UInt32)args[0], 0x4000 ); dx = (FT_UInt32)args[0];
dy = 0; dy = 0;
} }
else else
{ {
dx = 0; dx = 0;
dy = TT_MulFix14( (FT_UInt32)args[0], 0x4000 ); dy = (FT_UInt32)args[0];
} }
} }
else else