Title: [236416] trunk
Revision
236416
Author
[email protected]
Date
2018-09-24 11:20:46 -0700 (Mon, 24 Sep 2018)

Log Message

feMorphology filter in CSS doesn't update when element moves
https://bugs.webkit.org/show_bug.cgi?id=189895

Reviewed by Dean Jackson.

Source/WebCore:

SourceAlpha needs to be invalidated from clearIntermediateResults(),
so get it from the SVGFilterBuilder (which always creates one) and store in
a member variable.

Test: css3/filters/invalidate-sourceAlpha.html

* rendering/CSSFilter.cpp:
(WebCore::CSSFilter::buildReferenceFilter):
(WebCore::CSSFilter::clearIntermediateResults):
* rendering/CSSFilter.h:
* svg/graphics/filters/SVGFilterBuilder.h:

LayoutTests:

Test that moves a box inside a filtered div. Masking is necessary to work
around bugs in feMorphology invalidation (webkit.org/b/189896).

* css3/filters/invalidate-sourceAlpha-expected.html: Added.
* css3/filters/invalidate-sourceAlpha.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (236415 => 236416)


--- trunk/LayoutTests/ChangeLog	2018-09-24 18:20:22 UTC (rev 236415)
+++ trunk/LayoutTests/ChangeLog	2018-09-24 18:20:46 UTC (rev 236416)
@@ -1,5 +1,18 @@
 2018-09-24  Simon Fraser  <[email protected]>
 
+        feMorphology filter in CSS doesn't update when element moves
+        https://bugs.webkit.org/show_bug.cgi?id=189895
+
+        Reviewed by Dean Jackson.
+        
+        Test that moves a box inside a filtered div. Masking is necessary to work
+        around bugs in feMorphology invalidation (webkit.org/b/189896).
+
+        * css3/filters/invalidate-sourceAlpha-expected.html: Added.
+        * css3/filters/invalidate-sourceAlpha.html: Added.
+
+2018-09-24  Simon Fraser  <[email protected]>
+
         CSS reference filter with feDisplacementMap shows buffer corruption on Retina displays
         https://bugs.webkit.org/show_bug.cgi?id=188486
         <rdar://problem/43189750>

Added: trunk/LayoutTests/css3/filters/invalidate-sourceAlpha-expected.html (0 => 236416)


--- trunk/LayoutTests/css3/filters/invalidate-sourceAlpha-expected.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/invalidate-sourceAlpha-expected.html	2018-09-24 18:20:46 UTC (rev 236416)
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <style>
+        .container {
+            width: 400px;
+            border: 20px solid blue;
+            background-color: rgba(0, 128, 0, 0.2);
+            filter: url(#filter);
+            -webkit-clip-path: inset(30px 320px 30px 30px); /* work around webkit.org/b/189896 */
+        }
+    
+        #box {
+            width: 100px;
+            height: 100px;
+            background-color: green;
+            margin-left: 300px;
+        }
+        </style>
+</head>
+<body>
+    <svg style="display: none">
+        <filter id="filter">
+            <femorphology operator="dilate" radius="10" in="SourceAlpha" result="morphology"></femorphology>
+            <femerge result="merge">
+                <femergenode in="morphology"></femergenode>
+                <femergenode in="SourceGraphic"></femergenode>
+            </femerge>
+        </filter>
+    </svg>
+
+    <div class="container">
+        <div id="box"></div>
+    </div>
+</body>
+</html>
+

Added: trunk/LayoutTests/css3/filters/invalidate-sourceAlpha.html (0 => 236416)


--- trunk/LayoutTests/css3/filters/invalidate-sourceAlpha.html	                        (rev 0)
+++ trunk/LayoutTests/css3/filters/invalidate-sourceAlpha.html	2018-09-24 18:20:46 UTC (rev 236416)
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <style>
+        .container {
+            width: 400px;
+            border: 20px solid blue;
+            background-color: rgba(0, 128, 0, 0.2);
+            filter: url(#filter);
+            -webkit-clip-path: inset(30px 320px 30px 30px); /* work around webkit.org/b/189896 */
+        }
+    
+        #box {
+            width: 100px;
+            height: 100px;
+            background-color: green;
+        }
+        
+        #box.moved {
+            margin-left: 300px;
+        }
+        </style>
+        <script>
+            if (window.testRunner)
+                testRunner.waitUntilDone();
+            
+            window.addEventListener('load', () => {
+                setTimeout(() => {
+                    document.getElementById('box').classList.toggle('moved');
+                    if (window.testRunner)
+                        testRunner.notifyDone();
+                }, 0)
+            }, false);
+        </script>
+</head>
+<body>
+    <svg style="display: none">
+        <filter id="filter">
+            <femorphology operator="dilate" radius="10" in="SourceAlpha" result="morphology"></femorphology>
+            <femerge result="merge">
+                <femergenode in="morphology"></femergenode>
+                <femergenode in="SourceGraphic"></femergenode>
+            </femerge>
+        </filter>
+    </svg>
+
+    <div class="container">
+        <div id="box">
+        </div>
+    </div>
+</body>
+</html>
+

Modified: trunk/Source/WebCore/ChangeLog (236415 => 236416)


--- trunk/Source/WebCore/ChangeLog	2018-09-24 18:20:22 UTC (rev 236415)
+++ trunk/Source/WebCore/ChangeLog	2018-09-24 18:20:46 UTC (rev 236416)
@@ -1,5 +1,24 @@
 2018-09-24  Simon Fraser  <[email protected]>
 
+        feMorphology filter in CSS doesn't update when element moves
+        https://bugs.webkit.org/show_bug.cgi?id=189895
+
+        Reviewed by Dean Jackson.
+        
+        SourceAlpha needs to be invalidated from clearIntermediateResults(),
+        so get it from the SVGFilterBuilder (which always creates one) and store in
+        a member variable.
+
+        Test: css3/filters/invalidate-sourceAlpha.html
+
+        * rendering/CSSFilter.cpp:
+        (WebCore::CSSFilter::buildReferenceFilter):
+        (WebCore::CSSFilter::clearIntermediateResults):
+        * rendering/CSSFilter.h:
+        * svg/graphics/filters/SVGFilterBuilder.h:
+
+2018-09-24  Simon Fraser  <[email protected]>
+
         CSS reference filter with feDisplacementMap shows buffer corruption on Retina displays
         https://bugs.webkit.org/show_bug.cgi?id=188486
         <rdar://problem/43189750>

Modified: trunk/Source/WebCore/rendering/CSSFilter.cpp (236415 => 236416)


--- trunk/Source/WebCore/rendering/CSSFilter.cpp	2018-09-24 18:20:22 UTC (rev 236415)
+++ trunk/Source/WebCore/rendering/CSSFilter.cpp	2018-09-24 18:20:46 UTC (rev 236416)
@@ -40,6 +40,7 @@
 #include "SVGElement.h"
 #include "SVGFilterBuilder.h"
 #include "SVGFilterPrimitiveStandardAttributes.h"
+#include "SourceAlpha.h"
 #include "SourceGraphic.h"
 #include <algorithm>
 #include <wtf/MathExtras.h>
@@ -111,6 +112,7 @@
     RefPtr<FilterEffect> effect;
 
     auto builder = std::make_unique<SVGFilterBuilder>(&previousEffect);
+    m_sourceAlpha = builder->getEffectById(SourceAlpha::effectName());
 
     for (auto& effectElement : childrenOfType<SVGFilterPrimitiveStandardAttributes>(*filter)) {
         effect = effectElement.build(builder.get(), *this);
@@ -355,6 +357,8 @@
 void CSSFilter::clearIntermediateResults()
 {
     m_sourceGraphic->clearResult();
+    if (m_sourceAlpha)
+        m_sourceAlpha->clearResult();
     for (auto& effect : m_effects)
         effect->clearResult();
 }

Modified: trunk/Source/WebCore/rendering/CSSFilter.h (236415 => 236416)


--- trunk/Source/WebCore/rendering/CSSFilter.h	2018-09-24 18:20:22 UTC (rev 236415)
+++ trunk/Source/WebCore/rendering/CSSFilter.h	2018-09-24 18:20:46 UTC (rev 236416)
@@ -37,6 +37,7 @@
 class GraphicsContext;
 class ReferenceFilterOperation;
 class RenderElement;
+class SourceAlpha;
 class SourceGraphic;
 
 enum class FilterConsumer { FilterProperty, FilterFunction };
@@ -90,6 +91,7 @@
 
     Vector<Ref<FilterEffect>> m_effects;
     Ref<SourceGraphic> m_sourceGraphic;
+    RefPtr<FilterEffect> m_sourceAlpha;
 
     IntRectExtent m_outsets;
 

Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h (236415 => 236416)


--- trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h	2018-09-24 18:20:22 UTC (rev 236415)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h	2018-09-24 18:20:46 UTC (rev 236416)
@@ -46,7 +46,7 @@
 
     void add(const AtomicString& id, RefPtr<FilterEffect>);
 
-    RefPtr<FilterEffect> getEffectById(const AtomicString& id) const;
+    RefPtr<FilterEffect> getEffectById(const AtomicString&) const;
     FilterEffect* lastEffect() const { return m_lastEffect.get(); }
 
     void appendEffectToEffectReferences(RefPtr<FilterEffect>&&, RenderObject*);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to