X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fgfxpoly%2Fconvert.c;h=5615612c1a7f9f45a0e8ca0292235f2dc5270d93;hp=50282b93264dfd4d009007dde53d3ea04ea4098f;hb=c41f4433d3e721073c60d55cd923a087761e45f7;hpb=002f2ed7c404339e11d669aa86ec998d8dd473a5 diff --git a/lib/gfxpoly/convert.c b/lib/gfxpoly/convert.c index 50282b9..5615612 100644 --- a/lib/gfxpoly/convert.c +++ b/lib/gfxpoly/convert.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "../gfxdevice.h" #include "poly.h" @@ -15,7 +16,7 @@ static edge_t*edge_new(int x1, int y1, int x2, int y2) return s; } -static inline void gfxpoly_add_edge(edge_t**list, double _x1, double _y1, double _x2, double _y2) +static inline void gfxpoly_add_edge(gfxpoly_t*poly, double _x1, double _y1, double _x2, double _y2) { int x1 = ceil(_x1); int y1 = ceil(_y1); @@ -23,14 +24,14 @@ static inline void gfxpoly_add_edge(edge_t**list, double _x1, double _y1, double int y2 = ceil(_y2); if(x1!=x2 || y1!=y2) { edge_t*s = edge_new(x1, y1, x2, y2); - s->next = *list; - *list = s; + s->next = poly->edges; + poly->edges = s; } } gfxpoly_t* gfxpoly_fillToPoly(gfxline_t*line, double gridsize) { - edge_t*s = 0; + gfxpoly_t*p = gfxpoly_new(gridsize); /* factor that determines into how many line fragments a spline is converted */ double subfraction = 2.4;//0.3 @@ -44,7 +45,7 @@ gfxpoly_t* gfxpoly_fillToPoly(gfxline_t*line, double gridsize) double y = line->y*z; if(line->type == gfx_moveTo) { } else if(line->type == gfx_lineTo) { - gfxpoly_add_edge(&s, lastx, lasty, x, y); + gfxpoly_add_edge(p, lastx, lasty, x, y); } else if(line->type == gfx_splineTo) { int parts = (int)(sqrt(fabs(line->x-2*line->sx+lastx) + fabs(line->y-2*line->sy+lasty))*subfraction); @@ -55,11 +56,11 @@ gfxpoly_t* gfxpoly_fillToPoly(gfxline_t*line, double gridsize) double t = (double)i*stepsize; double sx = (line->x*t*t + 2*line->sx*t*(1-t) + x*(1-t)*(1-t))*z; double sy = (line->y*t*t + 2*line->sy*t*(1-t) + y*(1-t)*(1-t))*z; - gfxpoly_add_edge(&s, lastx, lasty, sx, sy); + gfxpoly_add_edge(p, lastx, lasty, sx, sy); lastx = sx; lasty = sy; } - gfxpoly_add_edge(&s, lastx, lasty, x, y); + gfxpoly_add_edge(p, lastx, lasty, x, y); } lastx = x; lasty = y; @@ -67,9 +68,67 @@ gfxpoly_t* gfxpoly_fillToPoly(gfxline_t*line, double gridsize) } gfxline_free(line); + return p; +} + +static char* readline(FILE*fi) +{ + char c; + while(1) { + int l = fread(&c, 1, 1, fi); + if(!l) + return 0; + if(c!=10 || c!=13) + break; + } + char line[256]; + int pos = 0; + while(1) { + line[pos++] = c; + line[pos] = 0; + int l = fread(&c, 1, 1, fi); + if(!l || c==10 || c==13) { + return strdup(line); + } + } +} +gfxpoly_t* gfxpoly_from_file(const char*filename, double gridsize) +{ gfxpoly_t*p = gfxpoly_new(gridsize); - p->edges = s; + + double z = 1.0 / gridsize; + + FILE*fi = fopen(filename, "rb"); + if(!fi) { + perror(filename); + return 0; + } + int count = 0; + double lastx=0,lasty=0; + while(1) { + char*line = readline(fi); + if(!line) + break; + double x,y; + char s[256]; + if(sscanf(line, "%lf %lf %s", &x, &y, &s) == 3) { + x*=z; + y*=z; + if(s && !strcmp(s,"moveto")) { + count++; + } else if(s && !strcmp(s,"lineto")) { + gfxpoly_add_edge(p, lastx, lasty, x, y); + count++; + } else { + printf("invalid command: %s\n", s); + } + lastx = x; + lasty = y; + } + free(line); + } + fclose(fi); + printf("loaded %d points from %s\n", count, filename); return p; } -