* src/base/ftcalc.c (FT_Vector_NormLen): Clarify.
This commit is contained in:
parent
a50a045890
commit
2b07a5ae3d
|
@ -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>
|
2015-07-27 Alexei Podtelezhnikov <apodtele@gmail.com>
|
||||||
|
|
||||||
* src/base/ftcalc.c (FT_Vector_NormLen): Explicate type conversions.
|
* src/base/ftcalc.c (FT_Vector_NormLen): Explicate type conversions.
|
||||||
|
|
|
@ -849,13 +849,15 @@
|
||||||
x_ = (FT_Int32)x;
|
x_ = (FT_Int32)x;
|
||||||
y_ = (FT_Int32)y;
|
y_ = (FT_Int32)y;
|
||||||
|
|
||||||
/* Newton's iterations */
|
/* Newton's iterations */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
u = (FT_UInt32)( x_ + ( x_ * b >> 16 ) );
|
u = (FT_UInt32)( x_ + ( x_ * b >> 16 ) );
|
||||||
v = (FT_UInt32)( y_ + ( y_ * 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 = -(FT_Int32)( u * u + v * v ) / 0x200;
|
||||||
z = z * ( ( 0x10000 + b ) >> 8 ) / 0x10000;
|
z = z * ( ( 0x10000 + b ) >> 8 ) / 0x10000;
|
||||||
|
|
||||||
|
@ -866,8 +868,10 @@
|
||||||
vector->x = sx < 0 ? -(FT_Pos)u : (FT_Pos)u;
|
vector->x = sx < 0 ? -(FT_Pos)u : (FT_Pos)u;
|
||||||
vector->y = sy < 0 ? -(FT_Pos)v : (FT_Pos)v;
|
vector->y = sy < 0 ? -(FT_Pos)v : (FT_Pos)v;
|
||||||
|
|
||||||
/* true length, again taking advantage of signed difference with 2^32 */
|
/* Conversion to signed helps to recover from likely wrap around */
|
||||||
l = 0x10000 + (FT_Int32)( u * x + v * y ) / 0x10000;
|
/* 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 )
|
if ( shift > 0 )
|
||||||
l = ( l + ( 1 << ( shift - 1 ) ) ) >> shift;
|
l = ( l + ( 1 << ( shift - 1 ) ) ) >> shift;
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue