From a285e3942eb288b92a3ba77eaf564d55340b2f9d Mon Sep 17 00:00:00 2001 From: Paul Mecklenburg Date: Fri, 10 Oct 2014 23:13:02 +0100 Subject: [PATCH] Fix relative move commands following a path close. Both 'M' and 'm' are moves and therefore start a new (sub)path. In either case the location should be cached so that a later 'close path' (z or Z) knows the location it is returning to. The location is not written to 'p', since it is assumed that the client code remembers. If the next move is relative (lowercase), then it's important that last_x, last_y were correctly updated while processing Z/z. --- src/svgtiny.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/svgtiny.c b/src/svgtiny.c index 5be977f..413697c 100644 --- a/src/svgtiny.c +++ b/src/svgtiny.c @@ -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) { -- 2.43.2