- 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*);