[truetype] Clean up bytecode rounding.

Zero distance does not have to be treated specially if you follow
specifications and check the sign as the very last step of rounding.

* src/truetype/ttinterp.c (Round_None, Round_To_Grid,
Round_Down_To_Grid, Round_Up_To_Grid, Round_To_Double_Grid): Use
macros when available, do not check for non-zero distance.
(Round_To_Half_Grid, Round_Super, Round_Super_45): Ditto, return phase
if sign changed.
This commit is contained in:
Alexei Podtelezhnikov 2014-10-19 23:31:08 -04:00
parent fede19ec1c
commit 118e651b0b
2 changed files with 34 additions and 29 deletions

View File

@ -1,3 +1,16 @@
2014-10-19 Alexei Podtelezhnikov <apodtele@gmail.com>
[truetype] Clean up bytecode rounding.
Zero distance does not have to be treated specially if you follow
specifications and check the sign as the very last step of rounding.
* src/truetype/ttinterp.c (Round_None, Round_To_Grid,
Round_Down_To_Grid, Round_Up_To_Grid, Round_To_Double_Grid): Use
macros when available, do not check for non-zero distance.
(Round_To_Half_Grid, Round_Super, Round_Super_45): Ditto, return phase
if sign changed.
2014-10-18 Alexei Podtelezhnikov <apodtele@gmail.com>
[truetype] Unwrap engine compensation settings.

View File

@ -2051,7 +2051,7 @@
if ( distance >= 0 )
{
val = distance + compensation;
if ( distance && val < 0 )
if ( val < 0 )
val = 0;
}
else
@ -2091,10 +2091,8 @@
if ( distance >= 0 )
{
val = distance + compensation + 32;
if ( distance && val > 0 )
val &= ~63;
else
val = FT_PIX_ROUND( distance + compensation );
if ( val < 0 )
val = 0;
}
else
@ -2136,14 +2134,14 @@
if ( distance >= 0 )
{
val = FT_PIX_FLOOR( distance + compensation ) + 32;
if ( distance && val < 0 )
val = 0;
if ( val < 0 )
val = 32;
}
else
{
val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );
if ( val > 0 )
val = 0;
val = -32;
}
return val;
@ -2177,15 +2175,13 @@
if ( distance >= 0 )
{
val = distance + compensation;
if ( distance && val > 0 )
val &= ~63;
else
val = FT_PIX_FLOOR( distance + compensation );
if ( val < 0 )
val = 0;
}
else
{
val = -( ( compensation - distance ) & -64 );
val = -FT_PIX_FLOOR( compensation - distance );
if ( val > 0 )
val = 0;
}
@ -2221,10 +2217,8 @@
if ( distance >= 0 )
{
val = distance + compensation + 63;
if ( distance && val > 0 )
val &= ~63;
else
val = FT_PIX_CEIL( distance + compensation );
if ( val < 0 )
val = 0;
}
else
@ -2265,10 +2259,8 @@
if ( distance >= 0 )
{
val = distance + compensation + 16;
if ( distance && val > 0 )
val &= ~31;
else
val = FT_PAD_ROUND( distance + compensation, 32 );
if ( val < 0 )
val = 0;
}
else
@ -2315,17 +2307,17 @@
{
val = ( distance - CUR.phase + CUR.threshold + compensation ) &
-CUR.period;
if ( distance && val < 0 )
val = 0;
val += CUR.phase;
if ( val < 0 )
val = CUR.phase;
}
else
{
val = -( ( CUR.threshold - CUR.phase - distance + compensation ) &
-CUR.period );
if ( val > 0 )
val = 0;
val -= CUR.phase;
if ( val > 0 )
val = -CUR.phase;
}
return val;
@ -2363,17 +2355,17 @@
{
val = ( ( distance - CUR.phase + CUR.threshold + compensation ) /
CUR.period ) * CUR.period;
if ( distance && val < 0 )
val = 0;
val += CUR.phase;
if ( val < 0 )
val = CUR.phase;
}
else
{
val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) /
CUR.period ) * CUR.period );
if ( val > 0 )
val = 0;
val -= CUR.phase;
if ( val > 0 )
val = -CUR.phase;
}
return val;