From 1aa5722c6a3d31201acecfe9e21c4d73892ac17d Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Tue, 6 Sep 2016 01:43:36 +0200 Subject: [PATCH] =?UTF-8?q?Fix=20conversion=20of=20cubic=20B=C3=A9zier=20"?= =?UTF-8?q?curveto"=20commands=20into=20"shorthand/smooth=20curveto"=20com?= =?UTF-8?q?mands.=20(#110)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the preceeding path segment is a Bézier curve, too, the first control point of the shorthand defaults to the mirrored version of the second control point of this preceeding path segment. Scour always assumed (0,0) as the control point in this case which could result in modified path data (e.g. #91). --- scour/scour.py | 8 +++++++- testscour.py | 8 ++++++-- unittests/path-bez-optimize.svg | 4 +++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/scour/scour.py b/scour/scour.py index 754e5dd..fdae854 100644 --- a/scour/scour.py +++ b/scour/scour.py @@ -2193,7 +2193,13 @@ def cleanPath(element, options) : newPath.append( (cmd, lineTuples) ) # convert Bézier curve segments into s where possible elif cmd == 'c': - bez_ctl_pt = (0,0) + # set up the assumed bezier control point as the current point, i.e. (0,0) since we're using relative coords + bez_ctl_pt = (0, 0) + # however if the previous command was 's' the assumed control point is a reflection of the previous control point at the current point + if len(newPath): + (prevCmd, prevData) = newPath[-1] + if prevCmd == 's': + bez_ctl_pt = (prevData[-2]-prevData[-4], prevData[-1]-prevData[-3]) i = 0 curveTuples = [] while i < len(data): diff --git a/testscour.py b/testscour.py index 294cb7f..9d9f460 100755 --- a/testscour.py +++ b/testscour.py @@ -675,9 +675,13 @@ class ChangeLineToVerticalLineSegmentInPath(unittest.TestCase): class ChangeBezierToShorthandInPath(unittest.TestCase): def runTest(self): - path = scour.scourXmlFile('unittests/path-bez-optimize.svg').getElementsByTagNameNS(SVGNS, 'path')[0] - self.assertEqual(path.getAttribute('d'), 'm10 100c50-50 50 50 100 0s50 50 100 0', + doc = scour.scourXmlFile('unittests/path-bez-optimize.svg') + self.assertEqual(doc.getElementById('path1').getAttribute('d'), 'm10 100c50-50 50 50 100 0s50 50 100 0', 'Did not change bezier curves into shorthand curve segments in path') + self.assertEqual(doc.getElementById('path2a').getAttribute('d'), 'm200 200s200 100 200 0', + 'Did not change bezier curve into shorthand curve segment when first control point is the current point and previous command was not a bezier curve') + self.assertEqual(doc.getElementById('path2b').getAttribute('d'), 'm0 300s200-100 200 0c0 0 200 100 200 0', + 'Did change bezier curve into shorthand curve segment when first control point is the current point but previous command was a bezier curve with a different control point') class ChangeQuadToShorthandInPath(unittest.TestCase): def runTest(self): diff --git a/unittests/path-bez-optimize.svg b/unittests/path-bez-optimize.svg index 97bfdd1..30761f3 100644 --- a/unittests/path-bez-optimize.svg +++ b/unittests/path-bez-optimize.svg @@ -1,4 +1,6 @@ - + + +