4 #include "../gfxdevice.h"
7 static edge_t*edge_new(int x1, int y1, int x2, int y2)
9 edge_t*s = malloc(sizeof(edge_t));
18 static inline void gfxpoly_add_edge(edge_t**list, double _x1, double _y1, double _x2, double _y2)
24 if(x1!=x2 || y1!=y2) {
25 edge_t*s = edge_new(x1, y1, x2, y2);
31 gfxpoly_t* gfxpoly_fillToPoly(gfxline_t*line, double gridsize)
35 /* factor that determines into how many line fragments a spline is converted */
36 double subfraction = 2.4;//0.3
38 double z = 1.0 / gridsize;
40 double lastx=0, lasty=0;
41 assert(!line || line[0].type == gfx_moveTo);
45 if(line->type == gfx_moveTo) {
46 } else if(line->type == gfx_lineTo) {
47 gfxpoly_add_edge(&s, lastx, lasty, x, y);
48 } else if(line->type == gfx_splineTo) {
49 int parts = (int)(sqrt(fabs(line->x-2*line->sx+lastx) +
50 fabs(line->y-2*line->sy+lasty))*subfraction);
52 double stepsize = 1.0/parts;
54 for(i=0;i<parts;i++) {
55 double t = (double)i*stepsize;
56 double sx = (line->x*t*t + 2*line->sx*t*(1-t) + x*(1-t)*(1-t))*z;
57 double sy = (line->y*t*t + 2*line->sy*t*(1-t) + y*(1-t)*(1-t))*z;
58 gfxpoly_add_edge(&s, lastx, lasty, sx, sy);
62 gfxpoly_add_edge(&s, lastx, lasty, x, y);
71 gfxpoly_t*p = gfxpoly_new(gridsize);