mirror of https://github.com/freetype/freetype
[base] Update the overflow protection bit.
The recent optimizations of CORDIC iterations drastically reduce the expansion factor. The vector components with MSB of 29 are now safe from overflow. * src/base/fttrigon.c (FT_TRIG_SAFE_MSB): New macro. (ft_trig_prenorm): Use it and remove dead code.
This commit is contained in:
parent
4412e74de7
commit
ad9d5c9726
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
2013-01-10 Alexei Podtelezhnikov <apodtele@gmail.com>
|
||||
|
||||
[base] Update the overflow protection bit.
|
||||
|
||||
The recent optimizations of CORDIC iterations drastically reduce
|
||||
the expansion factor. The vector components with MSB of 29 are now
|
||||
safe from overflow.
|
||||
|
||||
* src/base/fttrigon.c (FT_TRIG_SAFE_MSB): New macro.
|
||||
(ft_trig_prenorm): Use it and remove dead code.
|
||||
|
||||
2013-01-09 Alexei Podtelezhnikov <apodtele@gmail.com>
|
||||
|
||||
[base, pshinter] Use FT_ABS, FT_MIN, and FT_MAX for readability.
|
||||
|
|
|
@ -40,7 +40,11 @@
|
|||
|
||||
|
||||
/* the Cordic shrink factor 0.858785336480436 * 2^32 */
|
||||
#define FT_TRIG_SCALE 0xDBD95B16UL
|
||||
#define FT_TRIG_SCALE 0xDBD95B16UL
|
||||
|
||||
/* the highest bit in overflow-safe vectror components,
|
||||
MSB of 0.858785336480436 * sqrt(0.5) * 2^30 */
|
||||
#define FT_TRIG_SAFE_MSB 29
|
||||
|
||||
/* this table was generated for FT_PI = 180L << 16, i.e. degrees */
|
||||
#define FT_TRIG_MAX_ITERS 23
|
||||
|
@ -124,7 +128,6 @@
|
|||
z = FT_ABS( x ) | FT_ABS( y );
|
||||
shift = 0;
|
||||
|
||||
#if 1
|
||||
/* determine msb bit index in `shift' */
|
||||
if ( z >= ( 1L << 16 ) )
|
||||
{
|
||||
|
@ -152,47 +155,20 @@
|
|||
shift += 1;
|
||||
}
|
||||
|
||||
if ( shift <= 27 )
|
||||
if ( shift <= FT_TRIG_SAFE_MSB )
|
||||
{
|
||||
shift = 27 - shift;
|
||||
shift = FT_TRIG_SAFE_MSB - shift;
|
||||
vec->x = x << shift;
|
||||
vec->y = y << shift;
|
||||
}
|
||||
else
|
||||
{
|
||||
shift -= 27;
|
||||
shift -= FT_TRIG_SAFE_MSB;
|
||||
vec->x = x >> shift;
|
||||
vec->y = y >> shift;
|
||||
shift = -shift;
|
||||
}
|
||||
|
||||
#else /* 0 */
|
||||
|
||||
if ( z < ( 1L << 27 ) )
|
||||
{
|
||||
do
|
||||
{
|
||||
shift++;
|
||||
z <<= 1;
|
||||
} while ( z < ( 1L << 27 ) );
|
||||
vec->x = x << shift;
|
||||
vec->y = y << shift;
|
||||
}
|
||||
else if ( z > ( 1L << 28 ) )
|
||||
{
|
||||
do
|
||||
{
|
||||
shift++;
|
||||
z >>= 1;
|
||||
} while ( z > ( 1L << 28 ) );
|
||||
|
||||
vec->x = x >> shift;
|
||||
vec->y = y >> shift;
|
||||
shift = -shift;
|
||||
}
|
||||
|
||||
#endif /* 0 */
|
||||
|
||||
return shift;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue