automatically add a moveTo (0,0) to the start of a gfxline, if required
[swftools.git] / lib / gfxtools.c
index ec98609..60d3f30 100644 (file)
@@ -56,9 +56,17 @@ 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 = 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);
+    }
+
     l->type = gfx_lineTo;
     d->x = l->x = x;
     d->y = l->y = y;
+
     l->next = 0;
     if(i->next)
        i->next->next = l;
@@ -70,6 +78,13 @@ 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 = 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);
+    }
+
     l->type = gfx_splineTo;
     d->x = l->x = x; 
     d->y = l->y = y;
@@ -94,6 +109,8 @@ static void* linedraw_result(gfxdrawer_t*d)
 void gfxdrawer_target_gfxline(gfxdrawer_t*d)
 {
     linedraw_internal_t*i = (linedraw_internal_t*)rfx_calloc(sizeof(linedraw_internal_t));
+    d->x = 0x7fffffff;
+    d->y = 0x7fffffff;
     d->internal = i;
     d->moveTo = linedraw_moveTo;
     d->lineTo = linedraw_lineTo;
@@ -312,13 +329,13 @@ gfxline_t* gfxtool_dash_line(gfxline_t*line, float*dashes, float phase)
 void gfxline_show(gfxline_t*l, FILE*fi)
 {
     while(l) {
-       if(l->type == moveTo) {
+       if(l->type == gfx_moveTo) {
            fprintf(fi, "moveTo %.2f,%.2f\n", l->x, l->y);
        }
-       if(l->type == lineTo) {
+       if(l->type == gfx_lineTo) {
            fprintf(fi, "lineTo %.2f,%.2f\n", l->x, l->y);
        }
-       if(l->type == splineTo) {
+       if(l->type == gfx_splineTo) {
            fprintf(fi, "splineTo %.2f,%.2f %.2f,%.2f\n", l->sx, l->sy, l->x, l->y);
        }
        l = l->next;
@@ -478,21 +495,21 @@ 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)
+void gfxdraw_conicTo(gfxdrawer_t*draw, double cx, double cy, double tox, double toy, double quality)
 {
     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);
+    gfxdraw_cubicTo(draw, c1x, c1y, c2x, c2y, tox, toy, quality);
 }
 
 
-void gfxdraw_cubicTo(gfxdrawer_t*draw, double c1x, double c1y, double c2x, double c2y, double x, double y)
+void gfxdraw_cubicTo(gfxdrawer_t*draw, double c1x, double c1y, double c2x, double c2y, double x, double y, double quality)
 {
     qspline_t q[128];
     cspline_t c;
-    double maxerror = 0.01;
+    double maxerror = quality>0 ? quality : 1.0;
     int t,num;
 
     c.start.x = draw->x;