X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=lib%2Fdrawer.c;h=cf19d983b45040365f77f2f4314640acb108d957;hb=dfd8a7513517382f581d82581152f66a3d6c1faa;hp=bcab2eb965d2bb338e4a491f4fed465d1bfbac1a;hpb=480e90b98a4744dfaad8be1f8f40024dbdba3b96;p=swftools.git diff --git a/lib/drawer.c b/lib/drawer.c index bcab2eb..cf19d98 100644 --- a/lib/drawer.c +++ b/lib/drawer.c @@ -31,11 +31,11 @@ static char* getToken(const char**p) { const char*start; char*result; - while(**p && strchr(" ,\t\n\r", **p)) { + while(**p && strchr(" ,()\t\n\r", **p)) { (*p)++; } start = *p; - while(**p && !strchr(" ,\t\n\r", **p)) { + while(**p && !strchr(" ,()\t\n\r", **p)) { (*p)++; } result = malloc((*p)-start+1); @@ -57,6 +57,32 @@ void draw_conicTo(drawer_t*draw, FPOINT* c, FPOINT* to) draw->pos = *to; } +/* convenience routine */ +static void draw_conicTo2(drawer_t*draw, double x1, double y1, double x2, double y2) +{ + FPOINT c1,c2; + c1.x = x1; + c1.y = y1; + c2.x = x2; + c2.y = y2; + draw_conicTo(draw, &c1, &c2); +} +/* convenience routine */ +static void draw_moveTo2(drawer_t*draw, double x, double y) +{ + FPOINT c; + c.x = x; c.y = y; + draw->moveTo(draw, &c); +} +/* convenience routine */ +static void draw_lineTo2(drawer_t*draw, double x, double y) +{ + FPOINT c; + c.x = x; c.y = y; + draw->lineTo(draw, &c); +} + + void draw_string(drawer_t*draw, const char*string) { const char*p = string; @@ -68,44 +94,68 @@ void draw_string(drawer_t*draw, const char*string) !strncmp(token, "M", 1) //svg ) { FPOINT to; - to.x = atoi(getToken(&p)); - to.y = atoi(getToken(&p)); + to.x = atof(getToken(&p)); + to.y = atof(getToken(&p)); draw->moveTo(draw, &to); } else if(!strncmp(token, "lineTo", 6) || !strncmp(token, "L", 1) //svg ) { FPOINT to; - to.x = atoi(getToken(&p)); - to.y = atoi(getToken(&p)); + to.x = atof(getToken(&p)); + to.y = atof(getToken(&p)); draw->lineTo(draw, &to); } else if(!strncmp(token, "curveTo", 7) || !strncmp(token, "splineTo", 8)) { FPOINT mid,to; - mid.x = atoi(getToken(&p)); - mid.y = atoi(getToken(&p)); - to.x = atoi(getToken(&p)); - to.y = atoi(getToken(&p)); + mid.x = atof(getToken(&p)); + mid.y = atof(getToken(&p)); + to.x = atof(getToken(&p)); + to.y = atof(getToken(&p)); draw->splineTo(draw, &mid, &to); } 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)); + mid.x = atof(getToken(&p)); + mid.y = atof(getToken(&p)); + to.x = atof(getToken(&p)); + to.y = atof(getToken(&p)); draw_conicTo(draw, &mid, &to); } + else if(!strncmp(token, "circle", 6)) { + int mx,my,r; + double r2 = 0.70710678118654757*r; + mx = atof(getToken(&p)); + my = atof(getToken(&p)); + r = atof(getToken(&p)); + draw_moveTo2(draw, mx, my-r); + draw_conicTo2(draw, mx+r2, my-r2, mx+r, my); + draw_conicTo2(draw, mx+r2, my+r2, mx, my+r); + draw_conicTo2(draw, mx-r2, my+r2, mx-r, my); + draw_conicTo2(draw, mx-r2, my-r2, mx, my-r); + } + else if(!strncmp(token, "box", 3)) { + int x1,y1,x2,y2; + x1 = atof(getToken(&p)); + y1 = atof(getToken(&p)); + x2 = atof(getToken(&p)); + y2 = atof(getToken(&p)); + draw_moveTo2(draw, x1, y1); + draw_lineTo2(draw, x1, y2); + draw_lineTo2(draw, x2, y2); + draw_lineTo2(draw, x2, y1); + draw_lineTo2(draw, x1, y1); + } 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)); - mid2.x = atoi(getToken(&p)); - mid2.y = atoi(getToken(&p)); - to.x = atoi(getToken(&p)); - to.y = atoi(getToken(&p)); + mid1.x = atof(getToken(&p)); + mid1.y = atof(getToken(&p)); + mid2.x = atof(getToken(&p)); + mid2.y = atof(getToken(&p)); + to.x = atof(getToken(&p)); + to.y = atof(getToken(&p)); draw_cubicTo(draw, &mid1, &mid2, &to); } else if(!strncmp(token, "z", 1) //svg @@ -280,8 +330,8 @@ void draw_cubicTo(drawer_t*draw, FPOINT* control1, FPOINT* control2, FPOINT* t { struct qspline q[128]; struct cspline c; - double quality = 80; - double maxerror = (500-(quality*5)>1?500-(quality*5):1)/20.0; + //double quality = 80; + double maxerror = 1;//(500-(quality*5)>1?500-(quality*5):1)/20.0; int t,num; c.start.x = draw->pos.x;