Title: [100036] trunk
Revision
100036
Author
[email protected]
Date
2011-11-11 15:40:57 -0800 (Fri, 11 Nov 2011)

Log Message

Repaint broken when children of filtered SVG elements are updated
https://bugs.webkit.org/show_bug.cgi?id=71733

Patch by Joel Webber <[email protected]> on 2011-11-11
Reviewed by Nikolas Zimmermann.

Source/WebCore:

Test: svg/repaint/filter-child-repaint.svg

* rendering/svg/RenderSVGContainer.cpp:
(WebCore::RenderSVGContainer::layout):
* rendering/svg/RenderSVGRoot.cpp:
(WebCore::RenderSVGRoot::layout):
* rendering/svg/SVGRenderSupport.cpp:
(WebCore::SVGRenderSupport::setNeedsLayoutForFilteredContainer):

LayoutTests:

* platform/chromium-linux/svg/repaint/filter-child-repaint-expected.png: Added.
* platform/chromium-linux/svg/repaint/filter-child-repaint-expected.txt: Added.
* svg/repaint/filter-child-repaint.svg: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (100035 => 100036)


--- trunk/LayoutTests/ChangeLog	2011-11-11 23:19:05 UTC (rev 100035)
+++ trunk/LayoutTests/ChangeLog	2011-11-11 23:40:57 UTC (rev 100036)
@@ -1,3 +1,14 @@
+2011-11-11  Joel Webber  <[email protected]>
+
+        Repaint broken when children of filtered SVG elements are updated
+        https://bugs.webkit.org/show_bug.cgi?id=71733
+
+        Reviewed by Nikolas Zimmermann.
+
+        * platform/chromium-linux/svg/repaint/filter-child-repaint-expected.png: Added.
+        * platform/chromium-linux/svg/repaint/filter-child-repaint-expected.txt: Added.
+        * svg/repaint/filter-child-repaint.svg: Added.
+
 2011-11-11  Ojan Vafai  <[email protected]>
 
         Unreviewed, rolling out r99953.

Added: trunk/LayoutTests/platform/chromium-linux/svg/repaint/filter-child-repaint-expected.png (0 => 100036)


--- trunk/LayoutTests/platform/chromium-linux/svg/repaint/filter-child-repaint-expected.png	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium-linux/svg/repaint/filter-child-repaint-expected.png	2011-11-11 23:40:57 UTC (rev 100036)
@@ -0,0 +1,5 @@
+\x89PNG
+
+
+IHDR X')tEXtchecksum48a3e1f1e258a09dfc418ac665856fa8ǂ\xC6\xD1IDATx\x9C\xED\xDC1N	\x87\xE1c{Dc$d\xA7\xA2\xA3\xE3QʽYr\x9Ep	\xB8\xC3\x80"R$\xBB\x82\x82\x95\x8D\x84\xBF\xFA\xABR\xECK\x9B\xE79\xC0\xFC\xE5+\x8F5\xE3\xF0u\xF8Ўߎ\xA7\x9E\xF0\xE6\xA7\xF0o\xEDv\xBB\xD9l\xB6X,\xA6iZ.\x97\xE38\x9Ez\xF0\xA7;\xFE:\xF5\x84\xE7\xF3?\x9F\xFE\xFC\xF9\xFC\xFC<\x9F\xCF\xCF\xCF\xCF\xCF\xCE\xCEN\xBD\xF8\xD3}\xF8\xC0\xEFLJ\x87\x87\xC3\xE1\xB0Z\xAD.//\xA7i:\xF5"\xE0O\xF7\xE1_\xDE\xDDݭ\xD7\xEBq\xAF\xAF\xAF\x87é\xE7|\xFC\xC0\xDAn\xB7\xC30<>>\xEE\xF7\xFB\xD7\xD7\xD7S\xCFf\xA7\xF0_#\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b\xE3\xF0\xF5\xD4޷\xE3\xB7\xE3\xA9'\xCC\xFC\xD4޻\xDDn7\x9B\xCD\x8B\xC54M\xCB\xE5r\xC7S/޻\xB3\xE1\xAFSOx\xDF>\xFF\xF3\xF9\xE7ϟ\xCF\xCF\xCF\xF3\xF9\xFC\xFC\xFC\xFC\xEC\xEC\xECԋ\x80\xF7N`\xFD\xC2x?><<\x87\xD5juyy9Mө\xEF\x9DW\x84\xBFpww\xB7^\xAF\xC7q\xBC\xBE\xBE>\xA7\x9E|\xEB\xB6\xDB\xED0\x8F\x8F\x8F\xFB\xFD\xFE\xF5\xF5\xF5\xD4s\x80\xC0gb &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b 6?~;\xEEv\xBB\xFB\xFB\xFB\xDB\xDBۻ\xBB\xBB\xEDv_\xF8?\xE0\x9D\x9B\xC30\x9Bͦi\xBA\xB8\xB8X\xAF\xD7\xF9\x81\xEDP\xC0\xFB6\x86a\xB9\n6\x9B\x9B\x9B\x9B\xE3\xF1\xF8\xF4\xF4\xD4\xF8>|o\xF0\xCE͇a\x98\xA6\xE9\xEA\xEA\xEA˗/\xD7\xD7\xD7\xFB\xFD\xBE=\xF0\xFDo\x81\xFCY\xE6\xC30,\x8B\xCDf\xB3Z\xAD^^^^__\xE3\xC7\xCFx\xE7\xE6\xC30\x8C\xE38M\xD34M\xA7\xF0_\xE03
+1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81X1\x81\x9B\xBF\xF5\x81\xE3\xB7\xE3n\xB7\xBB\xBF\xBF\xBF\xBD\xBD\xBD\xBB\xBB\xDBn\xB7o}\xE0\xB4\xDE<\xB0\x86a\x98\xCDf\xD34]\\\xAC\xD7\xEB\xDFp.\xB7^\xAF/..\xA6i\x9A\xCD\xFC\xE0\xFC\xDA\xEF\xAC\xE5r\xB9\xD9lnnn\x8E\xC7\xE3\xD3\xD3\xD3o\xB8\xD8Z\xADV777\x9B\xCDf\xB9\\x9Ez\xF0\x8C\xC7\xE3\xF1\xADo\x87\xEDv\xFB\xE3Ǐ\xDDn\xB7\xDF\xEF\xDF\xFA\n\x9A\xA6\xCDfsuu\xF5\xE9\xD3'\x8D\xFC\xD2\xEF\xAC\xE3\xF1x8\xF6\xFB\xFD\xCB\xCB\xCB\xEB\xEB\xEB[\x9F\xCB\xCDf\xB3\xC5b1M\xD3r\xB9\xC7\xF1\xD4s\x80\xF7\xEEw\xC0ſ\xB6b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b &\xB0b \xF6?\xEF\xF6\xB5\x9Am\x80;\xBBIEND\xAEB`\x82
\ No newline at end of file

Added: trunk/LayoutTests/platform/chromium-linux/svg/repaint/filter-child-repaint-expected.txt (0 => 100036)


--- trunk/LayoutTests/platform/chromium-linux/svg/repaint/filter-child-repaint-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/chromium-linux/svg/repaint/filter-child-repaint-expected.txt	2011-11-11 23:40:57 UTC (rev 100036)
@@ -0,0 +1,12 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 128x128
+  RenderSVGRoot {svg} at (0,0) size 106x106
+    RenderSVGHiddenContainer {defs} at (0,0) size 0x0
+      RenderSVGResourceFilter {filter} [id="dropShadow"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse]
+        [feDropShadow stdDeviation="2.00, 2.00" dx="3.00" dy="3.00" flood-color="#000000" flood-opacity="1.00]
+          [SourceGraphic]
+    RenderSVGContainer {g} at (0,0) size 106x106
+      [filter="dropShadow"] RenderSVGResourceFilter {filter} at (-9.60,-9.60) size 115.20x115.20
+      RenderSVGPath {rect} at (0,0) size 64x64 [fill={[type=SOLID] [color=#008000]}] [x=0.00] [y=0.00] [width=64.00] [height=64.00]
+      RenderSVGPath {rect} at (32,32) size 64x64 [fill={[type=SOLID] [color=#008000]}] [x=32.00] [y=32.00] [width=64.00] [height=64.00]

Added: trunk/LayoutTests/svg/repaint/filter-child-repaint.svg (0 => 100036)


--- trunk/LayoutTests/svg/repaint/filter-child-repaint.svg	                        (rev 0)
+++ trunk/LayoutTests/svg/repaint/filter-child-repaint.svg	2011-11-11 23:40:57 UTC (rev 100036)
@@ -0,0 +1,35 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg width="128px" height="128px" version="1.1" xmlns="http://www.w3.org/2000/svg">
+  <defs>
+    <filter id="dropShadow">
+      <feDropShadow stdDeviation="2" dx="3" dy="3" flood-color="black"/>
+    </filter>
+  </defs>
+
+  <title>
+  Tests that dynamically updating the child of a &lt;g&gt; with a filter applied correctly repaints
+  affected parts of the group. Both squares should be green if repainting is working properly.
+  </title>
+
+  <g filter='url(#dropShadow)'>
+    <rect width="64" height="64" style="fill:green"/>
+    <rect id='poke' x='32' y='32' width="64" height="64" style="fill:red"/>
+  </g>
+
+  <script>
+  window.setTimeout(function() {
+    var poke = document.getElementById('poke');
+    poke.style.fill = 'green';
+
+    if (window.layoutTestController) {
+      layoutTestController.notifyDone();
+    }
+  }, 0);
+
+  if (window.layoutTestController) {
+    layoutTestController.waitUntilDone();
+  }
+  </script>
+</svg>
+

Modified: trunk/Source/WebCore/ChangeLog (100035 => 100036)


--- trunk/Source/WebCore/ChangeLog	2011-11-11 23:19:05 UTC (rev 100035)
+++ trunk/Source/WebCore/ChangeLog	2011-11-11 23:40:57 UTC (rev 100036)
@@ -1,3 +1,19 @@
+2011-11-11  Joel Webber  <[email protected]>
+
+        Repaint broken when children of filtered SVG elements are updated
+        https://bugs.webkit.org/show_bug.cgi?id=71733
+
+        Reviewed by Nikolas Zimmermann.
+
+        Test: svg/repaint/filter-child-repaint.svg
+
+        * rendering/svg/RenderSVGContainer.cpp:
+        (WebCore::RenderSVGContainer::layout):
+        * rendering/svg/RenderSVGRoot.cpp:
+        (WebCore::RenderSVGRoot::layout):
+        * rendering/svg/SVGRenderSupport.cpp:
+        (WebCore::SVGRenderSupport::setNeedsLayoutForFilteredContainer):
+
 2011-11-11  Timothy Hatcher  <[email protected]>
 
         Don't remove InspectorBackendStub.js in Release builds after it has been

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGContainer.cpp (100035 => 100036)


--- trunk/Source/WebCore/rendering/svg/RenderSVGContainer.cpp	2011-11-11 23:19:05 UTC (rev 100035)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGContainer.cpp	2011-11-11 23:40:57 UTC (rev 100036)
@@ -62,7 +62,7 @@
     // Allow RenderSVGTransformableContainer to update its transform.
     bool updatedTransform = calculateLocalTransform();
 
-    SVGRenderSupport::layoutChildren(this, selfNeedsLayout());
+    SVGRenderSupport::layoutChildren(this, selfNeedsLayout() || SVGRenderSupport::filtersForceContainerLayout(this));
 
     // Invalidate all resources of this client if our layout changed.
     if (m_everHadLayout && needsLayout())

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp (100035 => 100036)


--- trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp	2011-11-11 23:19:05 UTC (rev 100035)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp	2011-11-11 23:40:57 UTC (rev 100036)
@@ -254,7 +254,7 @@
     } else
         ASSERT(!m_needsSizeNegotiationWithHostDocument);
 
-    SVGRenderSupport::layoutChildren(this, needsLayout);
+    SVGRenderSupport::layoutChildren(this, needsLayout || SVGRenderSupport::filtersForceContainerLayout(this));
     m_isLayoutSizeChanged = false;
 
     // At this point LayoutRepainter already grabbed the old bounds,

Modified: trunk/Source/WebCore/rendering/svg/SVGRenderSupport.cpp (100035 => 100036)


--- trunk/Source/WebCore/rendering/svg/SVGRenderSupport.cpp	2011-11-11 23:19:05 UTC (rev 100035)
+++ trunk/Source/WebCore/rendering/svg/SVGRenderSupport.cpp	2011-11-11 23:40:57 UTC (rev 100036)
@@ -303,6 +303,20 @@
         shadow->adjustRectForShadow(repaintRect);
 }
 
+bool SVGRenderSupport::filtersForceContainerLayout(RenderObject* object)
+{
+    // If any of this container's children need to be laid out, and a filter is applied
+    // to the container, we need to repaint the entire container.
+    if (!object->normalChildNeedsLayout())
+        return false;
+
+    SVGResources* resources = SVGResourcesCache::cachedResourcesForRenderObject(object);
+    if (!resources || !resources->filter())
+        return false;
+
+    return true;
+}
+
 bool SVGRenderSupport::pointInClippingArea(RenderObject* object, const FloatPoint& point)
 {
     ASSERT(object);

Modified: trunk/Source/WebCore/rendering/svg/SVGRenderSupport.h (100035 => 100036)


--- trunk/Source/WebCore/rendering/svg/SVGRenderSupport.h	2011-11-11 23:19:05 UTC (rev 100035)
+++ trunk/Source/WebCore/rendering/svg/SVGRenderSupport.h	2011-11-11 23:40:57 UTC (rev 100036)
@@ -55,6 +55,9 @@
     // Calculates the repaintRect in combination with filter, clipper and masker in local coordinates.
     static void intersectRepaintRectWithResources(const RenderObject*, FloatRect&);
 
+    // Determines whether a container needs to be laid out because it's filtered and a child is being laid out.
+    static bool filtersForceContainerLayout(RenderObject*);
+
     // Determines whether the passed point lies in a clipping area
     static bool pointInClippingArea(RenderObject*, const FloatPoint&);
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to