fprintf(stderr, "[%d]", s->nr);
s = s->right;
if(s) fprintf(stderr, " ");
- else fprintf(stderr, "\n");
+ else fprintf(stderr, " y=%d\n", y);
}
}
void actlist_verify(actlist_t*a, int32_t y)
/* 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
+ "long double" the FPU has in its register. This only happens
when compiler optimizations are turned on. */
assert((XPOS(s, y) - XPOS(l, y)) >= 0);
assert(XDIFF(s,l,y) >= 0);
char to_the_left = 0;
char fail = 0;
while(t) {
+ /* this check doesn't work out with cmp() because during horizontal
+ processing, both segments ending as well as segments starting will
+ be active in this scanline */
+ //double d = cmp(t, p1, p2);
double d = single_cmp(t, p1);
+ if(d>=0 && to_the_left) {
+ actlist_dump(a, p1.y);
+ segment_t*s = a->list;
+ while(s) {
+ fprintf(stderr, "[%d] %f/%f (%d,%d) -> (%d,%d)\n", s->nr,
+ single_cmp(s,p1), cmp(s,p1,p2),
+ s->a.x, s->a.y, s->b.x, s->b.y);
+ s = s->right;
+ }
+ }
assert(!(d>=0 && to_the_left));
if(d<0) to_the_left=1;
t = t->right;
}
#endif
+ /* this can be optimized for (is not needed in) normal mode (as opposed to horizontal postprocess mode) */
segment_t*out = last;
if(d<0 || (d==0 && LINE_EQ(p2,last)<0)) {
last = last->left;
if(a->root) {
move_to_root(a, left);
-
if(left) {
LINK(s,leftchild,a->root);
// steal right child from (previous) root
} else {
LINK(s,rightchild,a->root);
}
-
- /*if(cmp(a->root, s->a, s->b) < 0) {
- LINK(s,rightchild,a->root);
- // steal left child from (previous) root
- LINK(s,leftchild,a->root->leftchild);
- a->root->leftchild = 0;
- } else {
- LINK(s,leftchild,a->root);
- // steal right child from (previous) root
- LINK(s,rightchild,a->root->rightchild);
- a->root->rightchild = 0;
- }*/
}
a->root = s;
a->root->parent = 0;
segment_t* actlist_rightmost(actlist_t*a)
{
/* this is only used in checks, so it doesn't matter that it's slow */
+#ifndef CHECKS
+ fprintf(stderr, "Warning: actlist_rightmost should not be used\n");
+#endif
segment_t*s = a->list;
segment_t*last = 0;
while(s) {
actlist_insert_after(a, left, s);
}
-
-segment_t* actlist_left(actlist_t*a, segment_t*s)
-{
- return s->left;
-}
-
-segment_t* actlist_right(actlist_t*a, segment_t*s)
-{
- if(s) return s->right;
- else return a->list;
-}
-
void actlist_swap(actlist_t*a, segment_t*s1, segment_t*s2)
{
#ifdef SPLAY