summaryrefslogtreecommitdiff
path: root/src/cairo-fixed.c
diff options
context:
space:
mode:
authorVladimir Vukicevic <vladimir@pobox.com>2007-06-18 16:26:14 -0700
committerVladimir Vukicevic <vladimir@binky.(none)>2007-07-18 22:45:21 +0200
commit0048a26a4477d3acb5dd0231756cfaae92d240a9 (patch)
tree9115edb6d1a341924c846b3ce987f65a287ec7b4 /src/cairo-fixed.c
parent76c32f899af63649bf911533a2ed6b42e617da41 (diff)
downloadcairo-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.c100
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"