diff --git a/toonz/sources/image/svg/tiio_svg.cpp b/toonz/sources/image/svg/tiio_svg.cpp index 55182be..d527385 100644 --- a/toonz/sources/image/svg/tiio_svg.cpp +++ b/toonz/sources/image/svg/tiio_svg.cpp @@ -1320,6 +1320,8 @@ void nsvg__parsePath(struct NSVGParser *p, const char **attr) { char closedFlag; int i; char item[64]; + float prev_m_cpx, prev_m_cpy; + bool prev_m_exists; for (i = 0; attr[i]; i += 2) { if (strcmp(attr[i], "d") == 0) { @@ -1330,6 +1332,7 @@ void nsvg__parsePath(struct NSVGParser *p, const char **attr) { cpy = 0; closedFlag = 0; nargs = 0; + prev_m_exists = false; while (*s) { s = nsvg__getNextPathItem(s, item); @@ -1340,7 +1343,19 @@ void nsvg__parsePath(struct NSVGParser *p, const char **attr) { switch (cmd) { case 'm': case 'M': + + // If moveto is relative it relative to previous moveto point + if (cmd == 'm' && prev_m_exists) { + cpx = prev_m_cpx; + cpy = prev_m_cpy; + } + nsvg__pathMoveTo(p, &cpx, &cpy, args, cmd == 'm' ? 1 : 0); + + prev_m_cpx = cpx; + prev_m_cpy = cpy; + prev_m_exists = true; + // Moveto can be followed by multiple coordinate pairs, // which should be treated as linetos. cmd = (cmd == 'm') ? 'l' : 'L'; @@ -2073,6 +2088,15 @@ TStroke *buildStroke(NSVGpath *path, float width) { s->setSelfLoop(path->closed); + std::vector tpoints; + s->getControlPoints(tpoints); + + for (int j = 0; j < tpoints.size(); j++) { + tpoints[j].thick = width; + } + + s->reshape(&tpoints[0], tpoints.size()); + return s; }