more bugfixes in new polygon intersector
[swftools.git] / lib / gfxpoly / active.c
index 51e0796..02638f5 100644 (file)
@@ -1,4 +1,3 @@
-#include <assert.h>
 #include "../q.h"
 #include "active.h"
 
@@ -12,27 +11,44 @@ void actlist_destroy(actlist_t*a)
     free(a);
 }
 
-void actlist_verify_and_dump(actlist_t*a, int32_t y)
+void actlist_dump(actlist_t*a, int32_t y)
 {
     segment_t*s = a->list;
-    assert(!s || !s->left);
     double lastx;
+    char bad = 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) {
-                if(lastx>x) fprintf(stderr, "?%f<->%f? ", lastx, x);
+                if(lastx>x) 
+                    fprintf(stderr, "?%f<->%f? ", lastx, x);
             }
             lastx = x;
         }
-        assert(!s->left || s->left->right == s);
-        assert(!s->right || s->right->left == s);
         fprintf(stderr, "[%d]", s->nr);
         s = s->right;
         if(s) fprintf(stderr, " ");
         else fprintf(stderr, "\n");
     }
 }
+void actlist_verify(actlist_t*a, int32_t y)
+{
+    segment_t*s = a->list;
+    assert(!s || !s->left);
+    double lastx;
+    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);
+            }
+            lastx = x;
+        }
+        assert(!s->left || s->left->right == s);
+        assert(!s->right || s->right->left == s);
+        s = s->right;
+    }
+}
 
 segment_t* actlist_find(actlist_t*a, point_t p1, point_t p2)
 {
@@ -108,6 +124,18 @@ segment_t* actlist_leftmost(actlist_t*a)
     return a->list;
 }
 
+segment_t* actlist_rightmost(actlist_t*a)
+{
+    /* this is only used in checks, so it doesn't matter that it's slow */
+    segment_t*s = a->list;
+    segment_t*last = 0;
+    while(s) {
+        last = s;
+        s = s->right;
+    }
+    return last;
+}
+
 segment_t* actlist_left(actlist_t*a, segment_t*s)
 {
     return s->left;