X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fdrawer.c;h=bcab2eb965d2bb338e4a491f4fed465d1bfbac1a;hb=d6162e08c1dbc4066ece3612982de8f32f788531;hp=81e79910d3a58387506df6495d2e970a0710f17b;hpb=1b92dcdf739c6b827ac037ce74a9d9df0fc857a8;p=swftools.git diff --git a/lib/drawer.c b/lib/drawer.c index 81e7991..bcab2eb 100644 --- a/lib/drawer.c +++ b/lib/drawer.c @@ -22,6 +22,7 @@ #include #include +#include #include #include #include "drawer.h" @@ -63,13 +64,17 @@ void draw_string(drawer_t*draw, const char*string) char*token = getToken(&p); if(!token || !*token) break; - if(!strncmp(token, "moveTo", 6)) { + if(!strncmp(token, "moveTo", 6) || + !strncmp(token, "M", 1) //svg + ) { FPOINT to; to.x = atoi(getToken(&p)); to.y = atoi(getToken(&p)); draw->moveTo(draw, &to); } - else if(!strncmp(token, "lineTo", 6)) { + else if(!strncmp(token, "lineTo", 6) || + !strncmp(token, "L", 1) //svg + ) { FPOINT to; to.x = atoi(getToken(&p)); to.y = atoi(getToken(&p)); @@ -83,7 +88,17 @@ void draw_string(drawer_t*draw, const char*string) to.y = atoi(getToken(&p)); draw->splineTo(draw, &mid, &to); } - else if(!strncmp(token, "cubicTo", 5)) { + else if(!strncmp(token, "conicTo", 5)) { + FPOINT mid,to; + mid.x = atoi(getToken(&p)); + mid.y = atoi(getToken(&p)); + to.x = atoi(getToken(&p)); + to.y = atoi(getToken(&p)); + draw_conicTo(draw, &mid, &to); + } + else if(!strncmp(token, "cubicTo", 5) || + !strncmp(token, "C", 1) //svg + ) { FPOINT mid1,mid2,to; mid1.x = atoi(getToken(&p)); mid1.y = atoi(getToken(&p)); @@ -93,7 +108,12 @@ void draw_string(drawer_t*draw, const char*string) to.y = atoi(getToken(&p)); draw_cubicTo(draw, &mid1, &mid2, &to); } - else fprintf(stderr, "drawer: Warning: unknown primitive '%s'", token); + else if(!strncmp(token, "z", 1) //svg + ) { + // ignore + } + else + fprintf(stderr, "drawer: Warning: unknown primitive '%s'\n", token); free(token); } @@ -159,6 +179,7 @@ static int approximate3(const struct cspline*s, struct qspline*q, int size, doub char left = 0,recurse=0; int t; int probes = 15; + double dx,dy; /* create simple approximation: a qspline which run's through the qspline point at 0.5 */ @@ -193,8 +214,9 @@ static int approximate3(const struct cspline*s, struct qspline*q, int size, doub test.control.y += test.end.y; } +#define PROBES +#ifdef PROBES /* measure the spline's accurancy, by taking a number of probes */ - for(t=0;tend.x - s->control2.x*3 + s->control1.x*3 - s->start.x; + dy= s->end.y - s->control2.y*3 + s->control1.y*3 - s->start.y; + + /* use the integral over (f(x)-g(x))^2 between 0 and 1 + to measure the approximation quality. + (it boils down to const*d^2) + */ + recurse = (dx*dx + dy*dy > quality2); +#endif if(recurse && istep>1 && size-level > num) { istep >>= 1; @@ -244,9 +282,7 @@ void draw_cubicTo(drawer_t*draw, FPOINT* control1, FPOINT* control2, FPOINT* t struct cspline c; double quality = 80; double maxerror = (500-(quality*5)>1?500-(quality*5):1)/20.0; - - int num = approximate3(&c, q, 128, maxerror*maxerror); - int t; + int t,num; c.start.x = draw->pos.x; c.start.y = draw->pos.y; @@ -256,6 +292,8 @@ void draw_cubicTo(drawer_t*draw, FPOINT* control1, FPOINT* control2, FPOINT* t c.control2.y = control2->y; c.end.x = to->x; c.end.y = to->y; + + num = approximate3(&c, q, 128, maxerror*maxerror); for(t=0;t