applied SVG patch from Magnus Lundin
[swftools.git] / lib / drawer.c
index cf19d98..801ff38 100644 (file)
@@ -25,6 +25,7 @@
 #include <string.h>
 #include <memory.h>
 #include <math.h>
+#include <ctype.h>
 #include "drawer.h"
 
 static char* getToken(const char**p)
@@ -35,7 +36,18 @@ static char* getToken(const char**p)
        (*p)++;
     } 
     start = *p;
-    while(**p && !strchr(" ,()\t\n\r", **p)) {
+
+     /*
+        SVF pathdata can exclude whitespace after L and M commands.
+        Ref:  http://www.w3.org/TR/SVG11/paths.html#PathDataGeneralInformation
+        This allows us to use svg files output from gnuplot.
+        Also checks for relative MoveTo and LineTo (m and l).
+        051106 Magnus Lundin, lundin@mlu.mine.nu
+     */
+    if (strchr("LMlm", **p) && (isdigit(*(*p+1))||strchr("+-", *(*p+1)))) {
+       (*p)++;
+    }
+    else while(**p && !strchr(" ,()\t\n\r", **p)) {
        (*p)++;
     }
     result = malloc((*p)-start+1);
@@ -124,10 +136,11 @@ void draw_string(drawer_t*draw, const char*string)
        }
        else if(!strncmp(token, "circle", 6)) {
            int mx,my,r;
-           double r2 = 0.70710678118654757*r;
+           double r2;
            mx = atof(getToken(&p));
            my = atof(getToken(&p));
            r = atof(getToken(&p));
+           r2 = 0.70710678118654757*r;
            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);
@@ -297,12 +310,18 @@ static int approximate3(const struct cspline*s, struct qspline*q, int size, doub
 
        /* convert control point representation to 
           d*x^3 + c*x^2 + b*x + a */
-
-       /* FIXME: we need to do this for the subspline between [start,end],
-          not [0,1] */
        dx= s->end.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;
        
+       /* we need to do this for the subspline between [start,end], not [0,1] 
+          as a transformation of t->a*t+b does nothing to highest coefficient
+          of the spline except multiply it with a^3, we just need to modify
+          d here. */
+       {double m = end-start;
+        dx*=m*m*m;
+        dy*=m*m*m;
+       }
+       
        /* 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)