{
double x;
segment_dir_t dir;
- fillstyle_t*fs;
+ edgestyle_t*fs;
int polygon_nr;
} renderpoint_t;
renderline_t*lines;
} renderbuf_t;
-static inline void add_pixel(renderbuf_t*buf, double x, int y, segment_dir_t dir, fillstyle_t*fs, int polygon_nr)
+static inline void add_pixel(renderbuf_t*buf, double x, int y, segment_dir_t dir, edgestyle_t*fs, int polygon_nr)
{
renderpoint_t p;
p.x = x;
l->num++;
}
#define CUT 0.5
-static void add_line(renderbuf_t*buf, double x1, double y1, double x2, double y2, fillstyle_t*fs, int polygon_nr)
+static void add_line(renderbuf_t*buf, double x1, double y1, double x2, double y2, edgestyle_t*fs, segment_dir_t dir, int polygon_nr)
{
x1 *= buf->zoom;
y1 *= buf->zoom;
y2 *= buf->zoom;
double diffx, diffy;
double ny1, ny2, stepx;
- segment_dir_t dir = DIR_DOWN;
+
if(y2 < y1) {
- dir = DIR_UP;
+ dir ^= DIR_UP^DIR_DOWN;
double x,y;
x = x1;x1 = x2;x2=x;
y = y1;y1 = y2;y2=y;
}
+
diffx = x2 - x1;
diffy = y2 - y1;
ny1 = floor(y1)+CUT;
double posx=0;
double startx = x1;
+ //printf("line %d from %f to %f dir=%s\n", polygon_nr, y1, y2, dir==DIR_UP?"up":"down");
+
while(posy<=endy) {
double xx = startx + posx;
add_pixel(buf, xx, posy, dir, fs, polygon_nr);
for(t=0;t<stroke->num_points-1;t++) {
point_t a = stroke->points[t];
point_t b = stroke->points[t+1];
- add_line(buf, a.x, a.y, b.x, b.y, stroke->fs, polygon_nr);
+ add_line(buf, a.x, a.y, b.x, b.y, stroke->fs, stroke->dir, polygon_nr);
}
}
}
if(fill.is_filled && lastx!=buf->width) {
/* we're bleeding, fill over padding, too. */
- fprintf(stderr, "Polygon %08x is bleeding in line %d\n", (int)polygon, y);
+ fprintf(stderr, "Polygon %p is bleeding in line %d\n", polygon, y);
fill_bitwise(line, lastx, width8*8);
assert(line[width8-1]&0x01);
bleeding = 1;
+ exit(1);
+
}
}
}
b1 += width8;
}
- writePNG(filename, data, b->width*2, b->height*2);
+ png_write(filename, data, b->width*2, b->height*2);
free(data);
}