sw_engine: overlaping stroke cap
authorMira Grudzinska <m.grudzinska@samsung.com>
Tue, 7 Sep 2021 11:12:08 +0000 (13:12 +0200)
committerJunsuChoi <jsuya.choi@samsung.com>
Wed, 8 Sep 2021 08:11:43 +0000 (17:11 +0900)
A square or a round cap was mistakenly added to the parts
of the dashed lines that should be continuous. Fixed

@Issues: https://github.com/Samsung/thorvg/issues/777

src/lib/sw_engine/tvgSwShape.cpp

index ecdaae1..08cd694 100644 (file)
@@ -21,6 +21,7 @@
  */
 #include "tvgSwCommon.h"
 #include "tvgBezier.h"
+#include <float.h>
 
 /************************************************************************/
 /* Internal Class Implementation                                        */
@@ -234,11 +235,14 @@ static void _dashCubicTo(SwDashStroke& dash, const Point* ctrl1, const Point* ct
             Bezier left, right;
             len -= dash.curLen;
             bezSplitAt(cur, dash.curLen, left, right);
-            dash.curIdx = (dash.curIdx + 1) % dash.cnt;
             if (!dash.curOpGap) {
-                _outlineMoveTo(*dash.outline, &left.start, transform);
+                // leftovers from a previous command don't require moveTo
+                if (dash.pattern[dash.curIdx] - dash.curLen < FLT_EPSILON) {
+                    _outlineMoveTo(*dash.outline, &left.start, transform);
+                }
                 _outlineCubicTo(*dash.outline, &left.ctrl1, &left.ctrl2, &left.end, transform);
             }
+            dash.curIdx = (dash.curIdx + 1) % dash.cnt;
             dash.curLen = dash.pattern[dash.curIdx];
             dash.curOpGap = !dash.curOpGap;
             cur = right;