X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fgfxtools.c;h=aec892a781349f28c60ba8a3e9d34c3a77b55194;hb=a2bb73ec71c706910c4528e356a814d17411c65c;hp=e0750595bc52921c71cf813c931ceec06b349ba4;hpb=9d1556507170bc827fca8ebbaa27862c978c6c33;p=swftools.git diff --git a/lib/gfxtools.c b/lib/gfxtools.c index e075059..aec892a 100644 --- a/lib/gfxtools.c +++ b/lib/gfxtools.c @@ -37,6 +37,12 @@ static void linedraw_moveTo(gfxdrawer_t*d, gfxcoord_t x, gfxcoord_t y) linedraw_internal_t*i = (linedraw_internal_t*)d->internal; gfxline_t*l = rfx_alloc(sizeof(gfxline_t)); l->type = gfx_moveTo; + if((int)((d->x * 5120) == (int)(x * 5120)) && + (int)((d->y * 5120) == (int)(y * 5120))) { + /* never mind- we're already there */ + return; + + } d->x = l->x = x; d->y = l->y = y; l->next = 0; @@ -448,6 +454,16 @@ static int approximate3(const cspline_t*s, qspline_t*q, int size, double quality return num; } +void gfxdraw_conicTo(gfxdrawer_t*draw, double cx, double cy, double tox, double toy) +{ + double c1x = (draw->x + 2 * cx) / 3; + double c1y = (draw->y + 2 * cy) / 3; + double c2x = (2 * cx + tox) / 3; + double c2y = (2 * cy + toy) / 3; + gfxdraw_cubicTo(draw, c1x, c1y, c2x, c2y, tox, toy); +} + + void gfxdraw_cubicTo(gfxdrawer_t*draw, double c1x, double c1y, double c2x, double c2y, double x, double y) { qspline_t q[128]; @@ -467,8 +483,8 @@ void gfxdraw_cubicTo(gfxdrawer_t*draw, double c1x, double c1y, double c2x, doubl num = approximate3(&c, q, 128, maxerror*maxerror); for(t=0;tx; - y = line->x; + y = line->y; line = line->next; } return bbox; } -void gfxline_dump(gfxline_t*line, FILE*fi) +void gfxline_dump(gfxline_t*line, FILE*fi, char*prefix) { while(line) { if(line->type == gfx_moveTo) { - fprintf(fi, "moveTo %.2f %.2f\n", line->x, line->y); + fprintf(fi, "%smoveTo %.2f %.2f\n", prefix, line->x, line->y); } else if(line->type == gfx_lineTo) { - fprintf(fi, "lineTo %.2f %.2f\n", line->x, line->y); + fprintf(fi, "%slineTo %.2f %.2f\n", prefix, line->x, line->y); } else if(line->type == gfx_splineTo) { - fprintf(fi, "splineTo (%.2f %.2f) %.2f %.2f\n", line->sx, line->sy, line->x, line->y); + fprintf(fi, "%ssplineTo (%.2f %.2f) %.2f %.2f\n", prefix, line->sx, line->sy, line->x, line->y); } line = line->next; } } +void gfxline_append(gfxline_t*line1, gfxline_t*line2) +{ + while(line1) { + line1 = line1->next; + } + line1->next = line2; +}