new polygon renderer: fixed numerical issues
[swftools.git] / lib / gfxpoly / active.c
index b0ef07c..aece368 100644 (file)
@@ -1,4 +1,3 @@
-#include <assert.h>
 #include "../q.h"
 #include "active.h"
 
@@ -36,14 +35,19 @@ void actlist_verify(actlist_t*a, int32_t y)
 {
     segment_t*s = a->list;
     assert(!s || !s->left);
-    double lastx;
+    segment_t*l = 0;
     while(s) {
         if(y) {
-            double x = ((double)s->delta.x*(y-s->a.y)/s->delta.y)+s->a.x;
-            if(s!=a->list) {
-                assert(lastx<=x);
+            if(l) {
+                /* we need to re-evaluate the x of the previous segment. if we
+                   try to store it, it might end up being converted to a double,
+                   which will make it non-equal to (and possibly larger than) the
+                   "long double" the FPU has in it's register. This only happens
+                   when compiler optimizations are turned on. */
+                assert((XPOS(s, y) - XPOS(l, y)) >= 0);
+                assert(XDIFF(s,l,y) >= 0);
             }
-            lastx = x;
+            l = s;
         }
         assert(!s->left || s->left->right == s);
         assert(!s->right || s->right->left == s);