- Revision
- 99782
- Author
- [email protected]
- Date
- 2011-11-09 16:39:21 -0800 (Wed, 09 Nov 2011)
Log Message
feImage referencing a primitive draws incorrectly
https://bugs.webkit.org/show_bug.cgi?id=71731
<rdar://problem/10408178>
Reviewed by Simon Fraser.
Don't attempt to resolve an <feImage>'s referenced element until it's used, as it
may not exist at the time the attribute is set on the <feImage>.
Don't attempt to render an <feImage> if the referenced element is of size 0x0.
Tests: svg/filters/feImage-reference-svg-primitive.svg
svg/filters/feImage-zero-size-crash.svg
* svg/SVGFEImageElement.cpp:
(WebCore::SVGFEImageElement::parseMappedAttribute):
(WebCore::SVGFEImageElement::build):
Add a test (feImage-reference-svg-primitive) that ensures that having
an <feImage> referencing an SVG primitive which is declared after it
successfully paints the referenced object.
Add a test (feImage-zero-size-crash) to see if we crash when <feImage>
references an object with 0x0 size.
* platform/mac/svg/filters/feImage-reference-svg-primitive-expected.png: Added.
* platform/mac/svg/filters/feImage-reference-svg-primitive-expected.txt: Added.
* svg/filters/feImage-reference-svg-primitive.svg: Added.
* svg/filters/feImage-zero-size-crash-expected.txt: Added.
* svg/filters/feImage-zero-size-crash.svg: Added.
Modified Paths
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (99781 => 99782)
--- trunk/LayoutTests/ChangeLog 2011-11-10 00:24:08 UTC (rev 99781)
+++ trunk/LayoutTests/ChangeLog 2011-11-10 00:39:21 UTC (rev 99782)
@@ -1,3 +1,24 @@
+2011-11-09 Tim Horton <[email protected]>
+
+ feImage referencing a primitive draws incorrectly
+ https://bugs.webkit.org/show_bug.cgi?id=71731
+ <rdar://problem/10408178>
+
+ Reviewed by Simon Fraser.
+
+ Add a test (feImage-reference-svg-primitive) that ensures that having
+ an <feImage> referencing an SVG primitive which is declared after it
+ successfully paints the referenced object.
+
+ Add a test (feImage-zero-size-crash) to see if we crash when <feImage>
+ references an object with 0x0 size.
+
+ * platform/mac/svg/filters/feImage-reference-svg-primitive-expected.png: Added.
+ * platform/mac/svg/filters/feImage-reference-svg-primitive-expected.txt: Added.
+ * svg/filters/feImage-reference-svg-primitive.svg: Added.
+ * svg/filters/feImage-zero-size-crash-expected.txt: Added.
+ * svg/filters/feImage-zero-size-crash.svg: Added.
+
2011-11-09 Kentaro Hara <[email protected]>
Use dumpAsText() to avoid an image result being generated
Added: trunk/LayoutTests/platform/mac/svg/filters/feImage-reference-svg-primitive-expected.png
(Binary files differ)
Property changes on: trunk/LayoutTests/platform/mac/svg/filters/feImage-reference-svg-primitive-expected.png
___________________________________________________________________
Added: svn:mime-type
Added: trunk/LayoutTests/platform/mac/svg/filters/feImage-reference-svg-primitive-expected.txt (0 => 99782)
--- trunk/LayoutTests/platform/mac/svg/filters/feImage-reference-svg-primitive-expected.txt (rev 0)
+++ trunk/LayoutTests/platform/mac/svg/filters/feImage-reference-svg-primitive-expected.txt 2011-11-10 00:39:21 UTC (rev 99782)
@@ -0,0 +1,14 @@
+layer at (0,0) size 800x600
+ RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+ RenderSVGRoot {svg} at (84,0) size 331x315
+ RenderSVGHiddenContainer {defs} at (0,0) size 0x0
+ RenderSVGResourceFilter {filter} [id="image"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
+ [feImage image-size="200x200"]
+ RenderSVGResourceFilter {filter} [id="flood"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
+ [feFlood flood-color="#008000" flood-opacity="1.00"]
+ RenderSVGPath {circle} at (0,0) size 250x150 [fill={[type=SOLID] [color=#0000FF]}] [cx=0.00] [cy=0.00] [r=100.00]
+ RenderSVGPath {rect} at (84,0) size 183x167 [fill={[type=SOLID] [color=#000000]}] [x=0.00] [y=0.00] [width=100.00] [height=100.00]
+ [filter="image"] RenderSVGResourceFilter {filter} at (-10,-10) size 120x120
+ RenderSVGPath {rect} at (234,135) size 181x180 [fill={[type=SOLID] [color=#000000]}] [x=100.00] [y=100.00] [width=100.00] [height=100.00]
+ [filter="flood"] RenderSVGResourceFilter {filter} at (90,90) size 120x120
Added: trunk/LayoutTests/svg/filters/feImage-reference-svg-primitive.svg (0 => 99782)
--- trunk/LayoutTests/svg/filters/feImage-reference-svg-primitive.svg (rev 0)
+++ trunk/LayoutTests/svg/filters/feImage-reference-svg-primitive.svg 2011-11-10 00:39:21 UTC (rev 99782)
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 400 400">
+ <title>There should be a single red quarter-circle and a single green square.</title>
+ <defs>
+ <filter id="image">
+ <feImage xlink:href="" />
+ </filter>
+ <filter id="flood">
+ <feFlood flood-color="green" />
+ </filter>
+ <circle id="circle" r="100" fill="blue" />
+ </defs>
+ <rect x="0" y="0" width="100" height="100" filter="url(#image)" />
+ <rect x="100" y="100" width="100" height="100" filter="url(#flood)" />
+</svg>
Added: trunk/LayoutTests/svg/filters/feImage-zero-size-crash-expected.txt (0 => 99782)
--- trunk/LayoutTests/svg/filters/feImage-zero-size-crash-expected.txt (rev 0)
+++ trunk/LayoutTests/svg/filters/feImage-zero-size-crash-expected.txt 2011-11-10 00:39:21 UTC (rev 99782)
@@ -0,0 +1,2 @@
+PASS
+
Added: trunk/LayoutTests/svg/filters/feImage-zero-size-crash.svg (0 => 99782)
--- trunk/LayoutTests/svg/filters/feImage-zero-size-crash.svg (rev 0)
+++ trunk/LayoutTests/svg/filters/feImage-zero-size-crash.svg 2011-11-10 00:39:21 UTC (rev 99782)
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 400 400">
+ <title>This test passes if it doesn't crash.</title>
+ <text id="log" />
+ <defs>
+ <circle id="circle" r="0" fill="red" />
+ <filter id="image">
+ <feImage xlink:href="" />
+ </filter>
+ </defs>
+ <rect x="0" y="0" width="100" height="100" filter="url(#image)" />
+ <rect x="100" y="100" width="100" height="100" fill="green" />
+ <script>
+ <![CDATA[
+ if (window.layoutTestController)
+ layoutTestController.dumpAsText();
+
+ var log = document.getElementById("log");
+ log.appendChild(document.createTextNode("PASS"));
+ ]]>
+ </script>
+</svg>
Modified: trunk/Source/WebCore/ChangeLog (99781 => 99782)
--- trunk/Source/WebCore/ChangeLog 2011-11-10 00:24:08 UTC (rev 99781)
+++ trunk/Source/WebCore/ChangeLog 2011-11-10 00:39:21 UTC (rev 99782)
@@ -1,3 +1,23 @@
+2011-11-09 Tim Horton <[email protected]>
+
+ feImage referencing a primitive draws incorrectly
+ https://bugs.webkit.org/show_bug.cgi?id=71731
+ <rdar://problem/10408178>
+
+ Reviewed by Simon Fraser.
+
+ Don't attempt to resolve an <feImage>'s referenced element until it's used, as it
+ may not exist at the time the attribute is set on the <feImage>.
+
+ Don't attempt to render an <feImage> if the referenced element is of size 0x0.
+
+ Tests: svg/filters/feImage-reference-svg-primitive.svg
+ svg/filters/feImage-zero-size-crash.svg
+
+ * svg/SVGFEImageElement.cpp:
+ (WebCore::SVGFEImageElement::parseMappedAttribute):
+ (WebCore::SVGFEImageElement::build):
+
2011-11-09 Dominic Cooney <[email protected]>
Remove WebGLContextEvent.initEvent method
Modified: trunk/Source/WebCore/svg/SVGFEImageElement.cpp (99781 => 99782)
--- trunk/Source/WebCore/svg/SVGFEImageElement.cpp 2011-11-10 00:24:08 UTC (rev 99781)
+++ trunk/Source/WebCore/svg/SVGFEImageElement.cpp 2011-11-10 00:39:21 UTC (rev 99782)
@@ -113,7 +113,8 @@
}
if (SVGURIReference::parseMappedAttribute(attr)) {
- requestImageResource();
+ m_cachedImage = 0;
+ m_targetImage.clear();
return;
}
@@ -162,6 +163,9 @@
PassRefPtr<FilterEffect> SVGFEImageElement::build(SVGFilterBuilder*, Filter* filter)
{
+ if (!m_cachedImage && !m_targetImage)
+ requestImageResource();
+
if (!m_cachedImage && !m_targetImage) {
Element* hrefElement = SVGURIReference::targetElementFromIRIString(href(), document());
if (!hrefElement || !hrefElement->isSVGElement())
@@ -172,6 +176,10 @@
return 0;
IntRect targetRect = enclosingIntRect(renderer->objectBoundingBox());
+
+ if (targetRect.isEmpty())
+ return 0;
+
m_targetImage = ImageBuffer::create(targetRect.size(), ColorSpaceLinearRGB);
AffineTransform contentTransformation;