diff options
author | Vladimir Vukicevic <vladimir@pobox.com> | 2007-06-18 16:26:14 -0700 |
---|---|---|
committer | Vladimir Vukicevic <vladimir@binky.(none)> | 2007-07-18 22:45:21 +0200 |
commit | 0048a26a4477d3acb5dd0231756cfaae92d240a9 (patch) | |
tree | 9115edb6d1a341924c846b3ce987f65a287ec7b4 /src/cairo-fixed.c | |
parent | 76c32f899af63649bf911533a2ed6b42e617da41 (diff) | |
download | cairo-0048a26a4477d3acb5dd0231756cfaae92d240a9.tar.gz |
[fixpt] Make fixed point methods static inline and generic
Move the fixed point methods to static inline versions in
cairo-fixed-private.h, and don't hardcode fixed to be 16.16.
Diffstat (limited to 'src/cairo-fixed.c')
-rw-r--r-- | src/cairo-fixed.c | 100 |
1 files changed, 1 insertions, 99 deletions
diff --git a/src/cairo-fixed.c b/src/cairo-fixed.c index fe6c2dc3e..2bb0dfe17 100644 --- a/src/cairo-fixed.c +++ b/src/cairo-fixed.c @@ -36,102 +36,4 @@ #include "cairoint.h" -cairo_fixed_t -_cairo_fixed_from_int (int i) -{ - return i << 16; -} - -/* This is the "magic number" approach to converting a double into fixed - * point as described here: - * - * http://www.stereopsis.com/sree/fpu2006.html (an overview) - * http://www.d6.com/users/checker/pdfs/gdmfp.pdf (in detail) - * - * The basic idea is to add a large enough number to the double that the - * literal floating point is moved up to the extent that it forces the - * double's value to be shifted down to the bottom of the mantissa (to make - * room for the large number being added in). Since the mantissa is, at a - * given moment in time, a fixed point integer itself, one can convert a - * float to various fixed point representations by moving around the point - * of a floating point number through arithmetic operations. This behavior - * is reliable on most modern platforms as it is mandated by the IEEE-754 - * standard for floating point arithmetic. - * - * For our purposes, a "magic number" must be carefully selected that is - * both large enough to produce the desired point-shifting effect, and also - * has no lower bits in its representation that would interfere with our - * value at the bottom of the mantissa. The magic number is calculated as - * follows: - * - * (2 ^ (MANTISSA_SIZE - FRACTIONAL_SIZE)) * 1.5 - * - * where in our case: - * - MANTISSA_SIZE for 64-bit doubles is 52 - * - FRACTIONAL_SIZE for 16.16 fixed point is 16 - * - * Although this approach provides a very large speedup of this function - * on a wide-array of systems, it does come with two caveats: - * - * 1) It uses banker's rounding as opposed to arithmetic rounding. - * 2) It doesn't function properly if the FPU is in single-precision - * mode. - */ -#define CAIRO_MAGIC_NUMBER_FIXED_16_16 (103079215104.0) -cairo_fixed_t -_cairo_fixed_from_double (double d) -{ - union { - double d; - int32_t i[2]; - } u; - - u.d = d + CAIRO_MAGIC_NUMBER_FIXED_16_16; -#ifdef FLOAT_WORDS_BIGENDIAN - return u.i[1]; -#else - return u.i[0]; -#endif -} - -cairo_fixed_t -_cairo_fixed_from_26_6 (uint32_t i) -{ - return i << 10; -} - -double -_cairo_fixed_to_double (cairo_fixed_t f) -{ - return ((double) f) / 65536.0; -} - -int -_cairo_fixed_is_integer (cairo_fixed_t f) -{ - return (f & 0xFFFF) == 0; -} - -int -_cairo_fixed_integer_part (cairo_fixed_t f) -{ - return f >> 16; -} - -int -_cairo_fixed_integer_floor (cairo_fixed_t f) -{ - if (f >= 0) - return f >> 16; - else - return -((-f - 1) >> 16) - 1; -} - -int -_cairo_fixed_integer_ceil (cairo_fixed_t f) -{ - if (f > 0) - return ((f - 1)>>16) + 1; - else - return - (-f >> 16); -} +#include "cairo-fixed-private.h" |