* src/base/ftcalc.c (FT_Vector_NormLen): Clarify.

This commit is contained in:
Alexei Podtelezhnikov 2015-07-28 23:14:30 -04:00
parent a50a045890
commit 2b07a5ae3d
2 changed files with 12 additions and 4 deletions

View File

@ -1,3 +1,7 @@
2015-07-28 Alexei Podtelezhnikov <apodtele@gmail.com>
* src/base/ftcalc.c (FT_Vector_NormLen): Clarify.
2015-07-27 Alexei Podtelezhnikov <apodtele@gmail.com>
* src/base/ftcalc.c (FT_Vector_NormLen): Explicate type conversions.

View File

@ -849,13 +849,15 @@
x_ = (FT_Int32)x;
y_ = (FT_Int32)y;
/* Newton's iterations */
/* Newton's iterations */
do
{
u = (FT_UInt32)( x_ + ( x_ * b >> 16 ) );
v = (FT_UInt32)( y_ + ( y_ * b >> 16 ) );
/* converting to signed gives difference with 2^32 */
/* Normalized squared length in the parentheses approaches 2^32. */
/* On two's complement systems, converting to signed gives the */
/* difference with 2^32 even if the expression wraps around. */
z = -(FT_Int32)( u * u + v * v ) / 0x200;
z = z * ( ( 0x10000 + b ) >> 8 ) / 0x10000;
@ -866,8 +868,10 @@
vector->x = sx < 0 ? -(FT_Pos)u : (FT_Pos)u;
vector->y = sy < 0 ? -(FT_Pos)v : (FT_Pos)v;
/* true length, again taking advantage of signed difference with 2^32 */
l = 0x10000 + (FT_Int32)( u * x + v * y ) / 0x10000;
/* Conversion to signed helps to recover from likely wrap around */
/* in calculating the prenormalized length, because it gives the */
/* correct difference with 2^32 on two's complement systems. */
l = (FT_UInt32)( 0x10000 + (FT_Int32)( u * x + v * y ) / 0x10000 );
if ( shift > 0 )
l = ( l + ( 1 << ( shift - 1 ) ) ) >> shift;
else