X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fgfxtools.c;h=0862fd6372803b2b4d4c8939c309a921b67828c4;hb=be6d3cbb485c5f7e9dd6fe22bf54245c79b10b71;hp=3e565a107ab05062d2d27faae1e6e495a43ec28a;hpb=71b11cc925e384ecad5b0f48b511bcadc2867f9b;p=swftools.git diff --git a/lib/gfxtools.c b/lib/gfxtools.c index 3e565a1..0862fd6 100644 --- a/lib/gfxtools.c +++ b/lib/gfxtools.c @@ -33,6 +33,8 @@ typedef struct _linedraw_internal { gfxline_t*start; gfxline_t*next; + gfxcoord_t x0,y0; + char has_moveto; } linedraw_internal_t; static void linedraw_moveTo(gfxdrawer_t*d, gfxcoord_t x, gfxcoord_t y) @@ -40,12 +42,9 @@ 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 = (gfxline_t*)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; - - } + i->has_moveto = 1; + i->x0 = x; + i->y0 = y; l->sx = l->sy = 0; d->x = l->x = x; d->y = l->y = y; @@ -61,10 +60,11 @@ static void linedraw_lineTo(gfxdrawer_t*d, gfxcoord_t x, gfxcoord_t y) linedraw_internal_t*i = (linedraw_internal_t*)d->internal; gfxline_t*l = (gfxline_t*)rfx_alloc(sizeof(gfxline_t)); - if(!i->start) { - /* starts with a line, not with a moveto. That needs we first - need an explicit moveto to (0,0) */ - linedraw_moveTo(d, 0, 0); + if(!i->has_moveto) { + /* starts with a line, not with a moveto. As this is the first + entry in the list, this is probably *meant* to be a moveto */ + linedraw_moveTo(d, x, y); + return; } l->type = gfx_lineTo; @@ -83,10 +83,9 @@ static void linedraw_splineTo(gfxdrawer_t*d, gfxcoord_t sx, gfxcoord_t sy, gfxco linedraw_internal_t*i = (linedraw_internal_t*)d->internal; gfxline_t*l = (gfxline_t*)rfx_alloc(sizeof(gfxline_t)); - if(!i->start) { - /* starts with a line, not with a moveto. That needs we first - need an explicit moveto to (0,0) */ - linedraw_moveTo(d, 0, 0); + if(!i->has_moveto) { + linedraw_moveTo(d, x, y); + return; } l->type = gfx_splineTo; @@ -101,6 +100,16 @@ static void linedraw_splineTo(gfxdrawer_t*d, gfxcoord_t sx, gfxcoord_t sy, gfxco if(!i->start) i->start = l; } +static void linedraw_close(gfxdrawer_t*d) +{ + linedraw_internal_t*i = (linedraw_internal_t*)d->internal; + if(!i->has_moveto) + return; + linedraw_lineTo(d, i->x0, i->y0); + i->has_moveto = 0; + i->x0 = 0; + i->y0 = 0; +} static void* linedraw_result(gfxdrawer_t*d) { linedraw_internal_t*i = (linedraw_internal_t*)d->internal; @@ -119,6 +128,7 @@ void gfxdrawer_target_gfxline(gfxdrawer_t*d) d->moveTo = linedraw_moveTo; d->lineTo = linedraw_lineTo; d->splineTo = linedraw_splineTo; + d->close = linedraw_close; d->result = linedraw_result; }