X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fgfxpoly%2Factive.c;fp=lib%2Fgfxpoly%2Factive.c;h=b0ef07ca08d8286c06554eb5833ac230bd6ba8f5;hb=ae7c92fe5721f97e786a8bbe9153eadbf292460d;hp=51e07969fb8b988a8d19df7146ce9f4f9be308c2;hpb=bf04757cd94e94c1f67fa3d2a4e3e59fa5bce0c0;p=swftools.git diff --git a/lib/gfxpoly/active.c b/lib/gfxpoly/active.c index 51e0796..b0ef07c 100644 --- a/lib/gfxpoly/active.c +++ b/lib/gfxpoly/active.c @@ -12,27 +12,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 +125,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;