double x;
segment_dir_t dir;
fillstyle_t*fs;
- edge_t*e; //only for debugging
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, edge_t*e)
+static inline void add_pixel(renderbuf_t*buf, double x, int y, segment_dir_t dir, fillstyle_t*fs, int polygon_nr)
{
renderpoint_t p;
p.x = x;
p.dir = dir;
p.fs = fs;
- p.e = e;
p.polygon_nr = polygon_nr;
if(y >= buf->bbox.ymax || y < buf->bbox.ymin)
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, edge_t*e)
+static void add_line(renderbuf_t*buf, double x1, double y1, double x2, double y2, fillstyle_t*fs, int polygon_nr)
{
x1 *= buf->zoom;
y1 *= buf->zoom;
while(posy<=endy) {
double xx = startx + posx;
- add_pixel(buf, xx, posy, dir, fs, polygon_nr, e);
+ add_pixel(buf, xx, posy, dir, fs, polygon_nr);
posx+=stepx;
posy++;
}
buf->lines[y].num = 0;
}
- edge_t*e;
int polygon_nr = 0;
- for(e=polygon->edges;e;e=e->next) {
- add_line(buf, e->a.x, e->a.y, e->b.x, e->b.y, e->style, polygon_nr, e);
+ int s,t;
+ gfxpolystroke_t*stroke = polygon->strokes;
+ for(;stroke;stroke=stroke->next) {
+ 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);
+ }
}
for(y=0;y<buf->height;y++) {
intbbox_t intbbox_from_polygon(gfxpoly_t*polygon, double zoom)
{
- int t;
intbbox_t b = {0,0,0,0};
- edge_t*e = polygon->edges;
double g = zoom*polygon->gridsize;
- if(e) {
- b.xmin = e->a.x*g;
- b.ymin = e->a.y*g;
- b.xmax = e->a.x*g;
- b.ymax = e->a.y*g;
+ if(polygon->strokes && polygon->strokes->num_points) {
+ b.xmin = polygon->strokes->points[0].x*g;
+ b.ymin = polygon->strokes->points[0].y*g;
+ b.xmax = polygon->strokes->points[0].x*g;
+ b.ymax = polygon->strokes->points[0].y*g;
}
- for(e=polygon->edges;e;e=e->next) {
- double x_min = min(e->a.x,e->b.x)*g;
- double y_min = min(e->a.y,e->b.y)*g;
- double x_max = max(e->a.x,e->b.x)*g;
- double y_max = max(e->a.y,e->b.y)*g;
- int x1 = floor(x_min);
- int y1 = floor(y_min);
- int x2 = ceil(x_max);
- int y2 = ceil(y_max);
- if(x1 < b.xmin) b.xmin = x1;
- if(y1 < b.ymin) b.ymin = y1;
- if(x2 > b.xmax) b.xmax = x2;
- if(y2 > b.ymax) b.ymax = y2;
+ int s,t;
+ gfxpolystroke_t*stroke = polygon->strokes;
+ for(;stroke;stroke=stroke->next) {
+ for(t=0;t<stroke->num_points;t++) {
+ point_t p = stroke->points[t];
+ int x1 = floor(p.x);
+ int y1 = floor(p.y);
+ int x2 = ceil(p.x);
+ int y2 = ceil(p.y);
+ if(x1 < b.xmin) b.xmin = x1;
+ if(y1 < b.ymin) b.ymin = y1;
+ if(x2 > b.xmax) b.xmax = x2;
+ if(y2 > b.ymax) b.ymax = y2;
+ }
}
if(b.xmax > (int)(MAX_WIDTH*zoom))