gfxpoly_t* gfxpoly_save(gfxpoly_t*poly, const char*filename)
{
FILE*fi = fopen(filename, "wb");
gfxpoly_t* gfxpoly_save(gfxpoly_t*poly, const char*filename)
{
FILE*fi = fopen(filename, "wb");
void segment_dump(segment_t*s)
{
fprintf(stderr, "(%d,%d)->(%d,%d) ", s->a.x, s->a.y, s->b.x, s->b.y);
void segment_dump(segment_t*s)
{
fprintf(stderr, "(%d,%d)->(%d,%d) ", s->a.x, s->a.y, s->b.x, s->b.y);
- fprintf(stderr, " dx:%d dy:%d k:%f dx/dy=%f\n", s->delta.x, s->delta.y, s->k,
+ fprintf(stderr, " dx:%d dy:%d k:%f dx/dy=%f\n", s->delta.x, s->delta.y, s->k,
- fprintf(stderr, "[%d] receives next point (%d,%d)->(%d,%d) (drawing)\n", s->nr,
+ fprintf(stderr, "[%d] receives next point (%d,%d)->(%d,%d) (drawing)\n", s->nr,
s->pos.x, s->pos.y, p.x, p.y);
#endif
// omit horizontal lines
s->pos.x, s->pos.y, p.x, p.y);
#endif
// omit horizontal lines
#ifdef CHECK
/* this would mean that the segment left/right of the minimum/maximum
intersects the current segment exactly at the scanline, but somehow
#ifdef CHECK
/* this would mean that the segment left/right of the minimum/maximum
intersects the current segment exactly at the scanline, but somehow
for(t=0;t<status->xrow->num;t++) {
box_t box = box_new(status->xrow->x[t], y);
segment_t*seg = actlist_find(status->actlist, box.left2, box.left2);
for(t=0;t<status->xrow->num;t++) {
box_t box = box_new(status->xrow->x[t], y);
segment_t*seg = actlist_find(status->actlist, box.left2, box.left2);
for(t=status->xrow->num-1;t>=0;t--) {
box_t box = box_new(status->xrow->x[t], y);
segment_t*seg = actlist_find(status->actlist, box.right2, box.right2);
for(t=status->xrow->num-1;t>=0;t--) {
box_t box = box_new(status->xrow->x[t], y);
segment_t*seg = actlist_find(status->actlist, box.right2, box.right2);
if(status->xrow->num == 1) {
// shortcut
point_t p = {status->xrow->x[0], y};
if(status->xrow->num == 1) {
// shortcut
point_t p = {status->xrow->x[0], y};
}
/* in check mode, go through the whole interval so we can test
that all polygons where the fillstyle changed also have seg->changed=1 */
}
/* in check mode, go through the whole interval so we can test
that all polygons where the fillstyle changed also have seg->changed=1 */
fprintf(stderr, "[%d] %s/%d/%s/%s ", s->nr, s->dir==DIR_UP?"up":"down", s->wind.wind_nr, s->wind.is_filled?"fill":"nofill", s->fs_out?"draw":"omit");
#endif
}
fprintf(stderr, "[%d] %s/%d/%s/%s ", s->nr, s->dir==DIR_UP?"up":"down", s->wind.wind_nr, s->wind.is_filled?"fill":"nofill", s->fs_out?"draw":"omit");
#endif
}
- left = actlist_right(status->actlist, left);
- right = actlist_right(status->actlist, right);
+ if(!right) {
+ assert(!left);
+ return;
+ }
+
+ left = actlist_right(status->actlist, left); //first seg to the right of h->a
+ right = right->right; //first seg to the right of h->b
assert(s->delta.x > 0 && x <= s->b.x || s->delta.x <= 0 && x >= s->b.x);
xrow_add(status->xrow, x);
assert(s->delta.x > 0 && x <= s->b.x || s->delta.x <= 0 && x >= s->b.x);
xrow_add(status->xrow, x);
- actlist_insert(status->actlist, e->p, s);
+ assert(e->p.x == s->a.x && e->p.y == s->a.y);
+ actlist_insert(status->actlist, s->a, s->b, s);
segment_t*left = actlist_left(status->actlist, s);
segment_t*right = actlist_right(status->actlist, s);
if(left)
segment_t*left = actlist_left(status->actlist, s);
segment_t*right = actlist_right(status->actlist, s);
if(left)
- actlist_insert(actlist, e->p, s);
+ assert(e->p.x == s->a.x && e->p.y == s->a.y);
+ actlist_insert(actlist, s->a, s->b, s);