diff options
author | Alexei Podtelezhnikov <apodtele@gmail.com> | 2013-01-10 22:29:07 -0500 |
---|---|---|
committer | Alexei Podtelezhnikov <apodtele@gmail.com> | 2013-01-10 22:29:07 -0500 |
commit | ad9d5c972662b4cb890b7859a245a815fa9e6027 (patch) | |
tree | 0b6b6bd12c90b2fd40ec470df0b36be3b7e60883 | |
parent | 4412e74de785d60484a3c79e620a9de635a5e40e (diff) | |
download | freetype2-ad9d5c972662b4cb890b7859a245a815fa9e6027.tar.gz |
[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.
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | src/base/fttrigon.c | 40 |
2 files changed, 19 insertions, 32 deletions
@@ -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. diff --git a/src/base/fttrigon.c b/src/base/fttrigon.c index a7ad02de7..ad6bc7281 100644 --- a/src/base/fttrigon.c +++ b/src/base/fttrigon.c @@ -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; - 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 ) ); - + shift -= FT_TRIG_SAFE_MSB; vec->x = x >> shift; vec->y = y >> shift; shift = -shift; } -#endif /* 0 */ - return shift; } |