removeDefaultAttributeValue: Special-case order attribute

Scour tried to handle "order" attribute as a SVGLength.  However, the
"order" attribute *can* consist of two integers according to the
[SVG 1.1 Specification] and SVGLength is not designed to handle that.

With this change, we now pretend that "order" is a string, which side
steps this issue.

[SVG 1.1 Specification]: https://www.w3.org/TR/SVG11/single-page.html#filters-feConvolveMatrixElementOrderAttribute

Closes: #189
Signed-off-by: Niels Thykier <niels@thykier.net>
This commit is contained in:
Niels Thykier 2018-04-17 19:05:52 +00:00
parent 8ddb7d8913
commit a459d629c1
3 changed files with 27 additions and 1 deletions

View file

@ -1848,7 +1848,12 @@ default_attributes = [
DefaultAttribute('offset', 0, elements=['feFuncA', 'feFuncB', 'feFuncG', 'feFuncR']), DefaultAttribute('offset', 0, elements=['feFuncA', 'feFuncB', 'feFuncG', 'feFuncR']),
DefaultAttribute('operator', 'over', elements=['feComposite']), DefaultAttribute('operator', 'over', elements=['feComposite']),
DefaultAttribute('operator', 'erode', elements=['feMorphology']), DefaultAttribute('operator', 'erode', elements=['feMorphology']),
DefaultAttribute('order', 3, elements=['feConvolveMatrix']), # We pretend order is a string (because handling it as an
# SVGLength will cause issues when order is two integers). Note
# that order must be exactly one or two integers (no units or
# fancy numbers), so working with it a string will generally just
# work.
DefaultAttribute('order', '3', elements=['feConvolveMatrix']),
DefaultAttribute('pointsAtX', 0, elements=['feSpotLight']), DefaultAttribute('pointsAtX', 0, elements=['feSpotLight']),
DefaultAttribute('pointsAtY', 0, elements=['feSpotLight']), DefaultAttribute('pointsAtY', 0, elements=['feSpotLight']),
DefaultAttribute('pointsAtZ', 0, elements=['feSpotLight']), DefaultAttribute('pointsAtZ', 0, elements=['feSpotLight']),

View file

@ -1570,6 +1570,16 @@ class RemoveDefaultGradFYValue(unittest.TestCase):
'fy matching cy not removed') 'fy matching cy not removed')
class RemoveDefaultAttributeOrderSVGLengthCrash(unittest.TestCase):
# Triggered a crash in v0.36
def runTest(self):
try:
scourXmlFile('unittests/remove-default-attr-order.svg')
except AttributeError:
self.fail("Processing the order attribute triggered an AttributeError ")
class CDATAInXml(unittest.TestCase): class CDATAInXml(unittest.TestCase):
def runTest(self): def runTest(self):

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink= "http://www.w3.org/1999/xlink">
<defs>
<filter id="filter" filterUnits="objectBoundingBox" x="0%" y="0%" width="100%" height="100%">
<feConvolveMatrix order="3 1" kernelMatrix="0.3333 0.3333 0.3333" edgeMode="none"/>
</filter>
</defs>
<!-- Use the filter (otherwise, scour discards it before it trips over it) -->
<image id="png" x="10" y="30" width="150" height="50" xlink:href="raster.png"
filter="url(#filter)"/>
</svg>

After

Width:  |  Height:  |  Size: 562 B