]> gitweb.michael.orlitzky.com - libsvgtiny.git/blobdiff - src/svgtiny.c
Update README to cover dependancies and core buildsystem
[libsvgtiny.git] / src / svgtiny.c
index 13249b62cdeb45068dfe7deb5b6ba8572ad2c1c2..f02f3d6c09dffbc2460e1720aa3721cee1d56371 100644 (file)
@@ -407,6 +407,7 @@ svgtiny_code svgtiny_parse_path(dom_element *path,
        float last_x = 0, last_y = 0;
        float last_cubic_x = 0, last_cubic_y = 0;
        float last_quad_x = 0, last_quad_y = 0;
+       float subpath_first_x = 0, subpath_first_y = 0;
 
        svgtiny_setup_state_local(&state);
 
@@ -468,6 +469,10 @@ svgtiny_code svgtiny_parse_path(dom_element *path,
                                        x += last_x;
                                        y += last_y;
                                }
+                               if (plot_command == svgtiny_PATH_MOVE) {
+                                       subpath_first_x = x;
+                                       subpath_first_y = y;
+                               }
                                p[i++] = last_cubic_x = last_quad_x = last_x
                                                = x;
                                p[i++] = last_cubic_y = last_quad_y = last_y
@@ -481,6 +486,8 @@ svgtiny_code svgtiny_parse_path(dom_element *path,
                        /*LOG(("closepath"));*/
                        p[i++] = svgtiny_PATH_CLOSE;
                        s += n;
+                       last_cubic_x = last_quad_x = last_x = subpath_first_x;
+                       last_cubic_y = last_quad_y = last_y = subpath_first_y;
 
                /* horizontal lineto (H, h) (1 argument) */
                } else if (sscanf(s, " %1[Hh] %f %n", command, &x, &n) == 2) {
@@ -1392,8 +1399,6 @@ static void _svgtiny_parse_color(const char *s, svgtiny_colour *c,
                                *rparen = 0;
                        svgtiny_find_gradient(id, state);
                        free(id);
-                       fprintf(stderr, "linear_gradient_stop_count %i\n",
-                                       state->linear_gradient_stop_count);
                        if (state->linear_gradient_stop_count == 0)
                                *c = svgtiny_TRANSPARENT;
                        else if (state->linear_gradient_stop_count == 1)
@@ -1496,23 +1501,23 @@ void svgtiny_parse_transform(char *s, float *ma, float *mb,
                a = d = 1;
                b = c = 0;
                e = f = 0;
-               if (sscanf(s, "matrix (%f %f %f %f %f %f) %n",
-                                       &a, &b, &c, &d, &e, &f, &n) == 6)
+               if ((sscanf(s, " matrix (%f %f %f %f %f %f ) %n",
+                            &a, &b, &c, &d, &e, &f, &n) == 6) && (n > 0))
                        ;
-               else if (sscanf(s, "translate (%f %f) %n",
-                                       &e, &f, &n) == 2)
+               else if ((sscanf(s, " translate (%f %f ) %n",
+                                 &e, &f, &n) == 2) && (n > 0))
                        ;
-               else if (sscanf(s, "translate (%f) %n",
-                                       &e, &n) == 1)
+               else if ((sscanf(s, " translate (%f ) %n",
+                                 &e, &n) == 1) && (n > 0))
                        ;
-               else if (sscanf(s, "scale (%f %f) %n",
-                                       &a, &d, &n) == 2)
+               else if ((sscanf(s, " scale (%f %f ) %n",
+                                 &a, &d, &n) == 2) && (n > 0))
                        ;
-               else if (sscanf(s, "scale (%f) %n",
-                                       &a, &n) == 1)
+               else if ((sscanf(s, " scale (%f ) %n",
+                                 &a, &n) == 1) && (n > 0))
                        d = a;
-               else if (sscanf(s, "rotate (%f %f %f) %n",
-                                       &angle, &x, &y, &n) == 3) {
+               else if ((sscanf(s, " rotate (%f %f %f ) %n",
+                                 &angle, &x, &y, &n) == 3) && (n > 0)) {
                        angle = angle / 180 * M_PI;
                        a = cos(angle);
                        b = sin(angle);
@@ -1520,19 +1525,19 @@ void svgtiny_parse_transform(char *s, float *ma, float *mb,
                        d = cos(angle);
                        e = -x * cos(angle) + y * sin(angle) + x;
                        f = -x * sin(angle) - y * cos(angle) + y;
-               } else if (sscanf(s, "rotate (%f) %n",
-                                       &angle, &n) == 1) {
+               } else if ((sscanf(s, " rotate (%f ) %n",
+                                   &angle, &n) == 1) && (n > 0)) {
                        angle = angle / 180 * M_PI;
                        a = cos(angle);
                        b = sin(angle);
                        c = -sin(angle);
                        d = cos(angle);
-               } else if (sscanf(s, "skewX (%f) %n",
-                                       &angle, &n) == 1) {
+               } else if ((sscanf(s, " skewX (%f ) %n",
+                                   &angle, &n) == 1) && (n > 0)) {
                        angle = angle / 180 * M_PI;
                        c = tan(angle);
-               } else if (sscanf(s, "skewY (%f) %n",
-                                       &angle, &n) == 1) {
+               } else if ((sscanf(s, " skewY (%f ) %n",
+                                   &angle, &n) == 1) && (n > 0)) {
                        angle = angle / 180 * M_PI;
                        b = tan(angle);
                } else