diff --git a/scour/scour.py b/scour/scour.py index 7d2e320..b4e848b 100644 --- a/scour/scour.py +++ b/scour/scour.py @@ -2622,16 +2622,7 @@ def scourUnitlessLength(length, needsRendererWorkaround=False): # length is of """ if not isinstance(length, Decimal): length = getcontext().create_decimal(str(length)) - - # remove trailing zeroes as we do not care for significance - intLength = length.to_integral_value() - if length == intLength: - length = Decimal(intLength) - else: - length = length.normalize() - - # Gather the initial non-scientific notation version of the coordinate (we want to compare with it later) - initial_value = '{0:f}'.format(length) + initial_length = length # reduce numeric precision # plus() corresponds to the unary prefix plus operator and applies context precision and rounding @@ -2645,7 +2636,10 @@ def scourUnitlessLength(length, needsRendererWorkaround=False): # length is of length = length.normalize() # Gather the non-scientific notation version of the coordinate. + # Re-quantize from the initial value to prevent unnecessary loss of precision + # (e.g. 123.4 should become 123, not 120 or even 100) nonsci = '{0:f}'.format(length) + nonsci = '{0:f}'.format(initial_length.quantize(Decimal(nonsci))) if not needsRendererWorkaround: if len(nonsci) > 2 and nonsci[:2] == '0.': nonsci = nonsci[1:] # remove the 0, leave the dot @@ -2666,11 +2660,7 @@ def scourUnitlessLength(length, needsRendererWorkaround=False): # length is of if len(sci) < len(nonsci): return_value = sci - # Return the shortest representation (if they are equal prefer the original as it still has the full precision) - if len(return_value) < len(initial_value): - return return_value - else: - return initial_value + return return_value def reducePrecision(element): diff --git a/testscour.py b/testscour.py index 879b7e8..43eeb03 100755 --- a/testscour.py +++ b/testscour.py @@ -968,6 +968,9 @@ class KeepPrecisionInPathDataIfSameLength(unittest.TestCase): self.assertEqual(paths[4].getAttribute('d'), "m-1-12-123-1e3 -1e4 -1e5", 'Precision not correctly reduced with "--set-precision=1" ' 'for path with ID ' + paths[4].getAttribute('id')) + self.assertEqual(paths[5].getAttribute('d'), "m123 101-123-101", + 'Precision not correctly reduced with "--set-precision=1" ' + 'for path with ID ' + paths[5].getAttribute('id')) doc = scourXmlFile('unittests/path-precision.svg', parse_args(['--set-precision=2'])) paths = doc.getElementsByTagNameNS(SVGNS, 'path') @@ -978,6 +981,9 @@ class KeepPrecisionInPathDataIfSameLength(unittest.TestCase): self.assertEqual(paths[4].getAttribute('d'), "m-1-12-123-1234-12345-1.2e5", 'Precision not correctly reduced with "--set-precision=2" ' 'for path with ID ' + paths[4].getAttribute('id')) + self.assertEqual(paths[5].getAttribute('d'), "m123 101-123-101", + 'Precision not correctly reduced with "--set-precision=2" ' + 'for path with ID ' + paths[5].getAttribute('id')) doc = scourXmlFile('unittests/path-precision.svg', parse_args(['--set-precision=3'])) paths = doc.getElementsByTagNameNS(SVGNS, 'path') @@ -988,6 +994,22 @@ class KeepPrecisionInPathDataIfSameLength(unittest.TestCase): self.assertEqual(paths[4].getAttribute('d'), "m-1-12-123-1234-12345-123456", 'Precision not correctly reduced with "--set-precision=3" ' 'for path with ID ' + paths[4].getAttribute('id')) + self.assertEqual(paths[5].getAttribute('d'), "m123 101-123-101", + 'Precision not correctly reduced with "--set-precision=3" ' + 'for path with ID ' + paths[5].getAttribute('id')) + + doc = scourXmlFile('unittests/path-precision.svg', parse_args(['--set-precision=4'])) + paths = doc.getElementsByTagNameNS(SVGNS, 'path') + for path in paths[1:3]: + self.assertEqual(path.getAttribute('d'), "m1 12 123 1234 12345 123456", + 'Precision not correctly reduced with "--set-precision=4" ' + 'for path with ID ' + path.getAttribute('id')) + self.assertEqual(paths[4].getAttribute('d'), "m-1-12-123-1234-12345-123456", + 'Precision not correctly reduced with "--set-precision=4" ' + 'for path with ID ' + paths[4].getAttribute('id')) + self.assertEqual(paths[5].getAttribute('d'), "m123.5 101-123.5-101", + 'Precision not correctly reduced with "--set-precision=4" ' + 'for path with ID ' + paths[5].getAttribute('id')) class RemoveEmptyLineSegmentsFromPath(unittest.TestCase): diff --git a/unittests/path-precision.svg b/unittests/path-precision.svg index 1d644e4..e075ec7 100644 --- a/unittests/path-precision.svg +++ b/unittests/path-precision.svg @@ -6,4 +6,6 @@ + +