From a8a2650b187181ff507303ff9cf181427445255a Mon Sep 17 00:00:00 2001 From: Matthias Kramm Date: Fri, 31 Jul 2009 20:22:39 +0200 Subject: [PATCH] fixed a nasty floating point bug --- lib/gfxpoly/convert.c | 9 +++++---- lib/gfxpoly/poly.c | 5 +++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/gfxpoly/convert.c b/lib/gfxpoly/convert.c index 9d8ecab..dae58b6 100644 --- a/lib/gfxpoly/convert.c +++ b/lib/gfxpoly/convert.c @@ -12,12 +12,13 @@ static inline int32_t convert_coord(double x, double z) { - /* we clamp to 31 bit instead of 32 bit because we use - a (x1-x2) shortcut when comparing coordinates + /* we clamp to 26 bit because: + a) we use a (x1-x2) shortcut when comparing coordinates + b) we need to be able to multiply two coordinates and store them in a double w/o loss of precision */ x *= z; - if(x < -0x40000000) x = -0x40000000; - if(x > 0x3fffffff) x = 0x3fffffff; + if(x < -0x2000000) x = -0x2000000; + if(x > 0x1ffffff) x = 0x1ffffff; return ceil(x); } diff --git a/lib/gfxpoly/poly.c b/lib/gfxpoly/poly.c index 9f7e8e8..2be5efb 100644 --- a/lib/gfxpoly/poly.c +++ b/lib/gfxpoly/poly.c @@ -305,6 +305,11 @@ static void segment_init(segment_t*s, int32_t x1, int32_t y1, int32_t x2, int32_ s->nr = segment_count++; #ifdef CHECKS + /* notice: on some systems (with some compilers), for the line + (1073741823,-1073741824)->(1073741823,1073741823) + we get LINE_EQ(s->a, s) == 1. + That's why we now clamp to 26 bit. + */ assert(LINE_EQ(s->a, s) == 0); assert(LINE_EQ(s->b, s) == 0); -- 1.7.10.4