Diff
Modified: trunk/LayoutTests/ChangeLog (288182 => 288183)
--- trunk/LayoutTests/ChangeLog 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/LayoutTests/ChangeLog 2022-01-19 08:37:08 UTC (rev 288183)
@@ -1,3 +1,21 @@
+2022-01-19 Said Abou-Hallawa <[email protected]>
+
+ filterRegion and outsets of referenced SVG filter are calculated incorrectly
+ https://bugs.webkit.org/show_bug.cgi?id=235338
+
+ Reviewed by Darin Adler.
+
+ * css3/filters/reference-filter-outsets-expected.html: Added.
+ * css3/filters/reference-filter-outsets.html: Added.
+
+ * css3/filters/reference-filter-set-filter-regions-expected.html:
+ * css3/filters/reference-filter-set-filter-regions.html:
+ The original expected page is wrong. To test the referenced SVG filter
+ correctly, the <div> element needs to move such that all its outsets are
+ not truncated.
+
+ * platform/win/TestExpectations:
+
2022-01-18 Jon Lee <[email protected]>
Unreviewed gardening of GPU Process bot tests.
Added: trunk/LayoutTests/css3/filters/reference-filter-outsets-expected.html (0 => 288183)
--- trunk/LayoutTests/css3/filters/reference-filter-outsets-expected.html (rev 0)
+++ trunk/LayoutTests/css3/filters/reference-filter-outsets-expected.html 2022-01-19 08:37:08 UTC (rev 288183)
@@ -0,0 +1,35 @@
+<style>
+ .container {
+ width: 90px;
+ height: 90px;
+ display: inline-block;
+ background-color: black;
+ margin: 10px;
+ }
+ .box {
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ background-color: green;
+ }
+</style>
+<body>
+ <div>
+ <div class="container" style="transform: translate(-10px, -10px);">
+ <div class="box" style="transform: translate(10px, 10px);"></div>
+ </div>
+
+ <div class="container" style="transform: translate(30px, -10px);">
+ <div class="box" style="transform: translate(-20px, 10px);"></div>
+ </div>
+ </div>
+ <div>
+ <div class="container" style="transform: translate(-10px, 30px);">
+ <div class="box" style="transform: translate(10px, -20px);"></div>
+ </div>
+
+ <div class="container" style="transform: translate(30px, 30px);">
+ <div class="box" style="transform: translate(-20px, -20px);"></div>
+ </div>
+ </div>
+</body>
Added: trunk/LayoutTests/css3/filters/reference-filter-outsets.html (0 => 288183)
--- trunk/LayoutTests/css3/filters/reference-filter-outsets.html (rev 0)
+++ trunk/LayoutTests/css3/filters/reference-filter-outsets.html 2022-01-19 08:37:08 UTC (rev 288183)
@@ -0,0 +1,63 @@
+<style>
+ .box {
+ width: 100px;
+ height: 100px;
+ display: inline-block;
+ background-color: green;
+ margin: 10px;
+ }
+</style>
+<body>
+ <div>
+ <svg style="position: absolute; top: -999999px" xmlns="http://www.w3.org/2000/svg">
+ <filter id="svgDropShadow1">
+ <feOffset dx="-20" dy="-20" result="offsetSource"/>
+ <feFlood flood-color="black"/>
+ <feComposite in2="offsetSource" operator="in"/>
+ <feMerge>
+ <feMergeNode/>
+ <feMergeNode in="SourceGraphic"/>
+ </feMerge>
+ </filter>
+ </svg>
+ <div class="box" style="filter: url(#svgDropShadow1);"></div>
+ <svg style="position: absolute; top: -999999px" xmlns="http://www.w3.org/2000/svg">
+ <filter id="svgDropShadow2">
+ <feOffset dx="20" dy="-20" result="offsetSource"/>
+ <feFlood flood-color="black"/>
+ <feComposite in2="offsetSource" operator="in"/>
+ <feMerge>
+ <feMergeNode/>
+ <feMergeNode in="SourceGraphic"/>
+ </feMerge>
+ </filter>
+ </svg>
+ <div class="box" style="filter: url(#svgDropShadow2);"></div>
+ </div>
+ <div>
+ <svg style="position: absolute; top: -999999px" xmlns="http://www.w3.org/2000/svg">
+ <filter id="svgDropShadow3">
+ <feOffset dx="-20" dy="20" result="offsetSource"/>
+ <feFlood flood-color="black"/>
+ <feComposite in2="offsetSource" operator="in"/>
+ <feMerge>
+ <feMergeNode/>
+ <feMergeNode in="SourceGraphic"/>
+ </feMerge>
+ </filter>
+ </svg>
+ <div class="box" style="filter: url(#svgDropShadow3);"></div>
+ <svg style="position: absolute; top: -999999px" xmlns="http://www.w3.org/2000/svg">
+ <filter id="svgDropShadow4">
+ <feOffset dx="20" dy="20" result="offsetSource"/>
+ <feFlood flood-color="black"/>
+ <feComposite in2="offsetSource" operator="in"/>
+ <feMerge>
+ <feMergeNode/>
+ <feMergeNode in="SourceGraphic"/>
+ </feMerge>
+ </filter>
+ </svg>
+ <div class="box" style="filter: url(#svgDropShadow4);"></div>
+ </div>
+</body>
Modified: trunk/LayoutTests/css3/filters/reference-filter-set-filter-regions-expected.html (288182 => 288183)
--- trunk/LayoutTests/css3/filters/reference-filter-set-filter-regions-expected.html 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/LayoutTests/css3/filters/reference-filter-set-filter-regions-expected.html 2022-01-19 08:37:08 UTC (rev 288183)
@@ -1,8 +1,11 @@
<head>
<style>
.box {
- width: 200px;
- height: 200px;
+ position: absolute;
+ left: 20px;
+ top: 20px;
+ width: 240px;
+ height: 240px;
background-color: green;
}
</style>
Modified: trunk/LayoutTests/css3/filters/reference-filter-set-filter-regions.html (288182 => 288183)
--- trunk/LayoutTests/css3/filters/reference-filter-set-filter-regions.html 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/LayoutTests/css3/filters/reference-filter-set-filter-regions.html 2022-01-19 08:37:08 UTC (rev 288183)
@@ -1,6 +1,9 @@
<head>
<style>
.box {
+ position: absolute;
+ left: 40px;
+ top: 40px;
width: 200px;
height: 200px;
background-color: silver;
Modified: trunk/LayoutTests/platform/win/TestExpectations (288182 => 288183)
--- trunk/LayoutTests/platform/win/TestExpectations 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/LayoutTests/platform/win/TestExpectations 2022-01-19 08:37:08 UTC (rev 288183)
@@ -127,6 +127,7 @@
webkit.org/b/74716 css3/filters/filter-is-on-subpixel-position.html [ Skip ]
webkit.org/b/74716 css3/masking/clip-path-filter.html [ Skip ]
webkit.org/b/74716 css3/filters/backdrop [ Skip ]
+webkit.org/b/74716 css3/filters/reference-filter-set-filter-regions.html [ Skip ]
# platformLayerTreeAsText is only implemented for Cocoa ports.
fast/harness/platform-layer-tree-as-text.html [ Skip ]
Modified: trunk/Source/WebCore/ChangeLog (288182 => 288183)
--- trunk/Source/WebCore/ChangeLog 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/ChangeLog 2022-01-19 08:37:08 UTC (rev 288183)
@@ -1,3 +1,48 @@
+2022-01-19 Said Abou-Hallawa <[email protected]>
+
+ filterRegion and outsets of referenced SVG filter are calculated incorrectly
+ https://bugs.webkit.org/show_bug.cgi?id=235338
+
+ Reviewed by Darin Adler.
+
+ Calculate the filterRegion of the referenced SVGFilter by calling
+ SVGLengthContext::resolveRectangle() given the targetBoundingBox of the
+ CSSFilter.
+
+ There is no need to set the filterRegion of the referenced SVG filter
+ from CSSFilter::setFilterRegion() since its filterRegion is the union
+ of the filterRegions all its referenced SVGFilters.
+
+ Calculate the outsets of the SVGFilter by looping through its _expression_
+ of FilterEffects.
+
+ Test: css3/filters/reference-filter-outsets.html
+
+ * platform/graphics/filters/FEDropShadow.cpp:
+ (WebCore::FEDropShadow::outsets const):
+ * platform/graphics/filters/FEDropShadow.h:
+ * platform/graphics/filters/FEGaussianBlur.cpp:
+ (WebCore::FEGaussianBlur::outsets const):
+ * platform/graphics/filters/FEGaussianBlur.h:
+ * platform/graphics/filters/FEOffset.cpp:
+ (WebCore::FEOffset::outsets const):
+ * platform/graphics/filters/FEOffset.h:
+ * platform/graphics/filters/Filter.h:
+ * platform/graphics/filters/FilterFunction.h:
+ (WebCore::FilterFunction::outsets const):
+ * rendering/CSSFilter.cpp:
+ (WebCore::createSVGFilter):
+ (WebCore::CSSFilter::setFilterRegion):
+ (WebCore::CSSFilter::outsets const):
+ * rendering/CSSFilter.h:
+ * rendering/RenderLayerFilters.cpp:
+ (WebCore::RenderLayerFilters::beginFilterEffect):
+ * svg/graphics/filters/SVGFilter.cpp:
+ (WebCore::SVGFilter::create):
+ (WebCore::SVGFilter::outsets const):
+ (WebCore::SVGFilter::lastEffect const): Deleted.
+ * svg/graphics/filters/SVGFilter.h:
+
2022-01-18 Sam Weinig <[email protected]>
ColorTypes are no longer constexpr in debug builds due to std::isnan() in range assertion
Modified: trunk/Source/WebCore/platform/graphics/filters/FEDropShadow.cpp (288182 => 288183)
--- trunk/Source/WebCore/platform/graphics/filters/FEDropShadow.cpp 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/platform/graphics/filters/FEDropShadow.cpp 2022-01-19 08:37:08 UTC (rev 288183)
@@ -61,7 +61,7 @@
return filter.clipToMaxEffectRect(imageRect, primitiveSubregion);
}
-IntOutsets FEDropShadow::outsets() const
+IntOutsets FEDropShadow::outsets(const Filter&) const
{
IntSize outsetSize = FEGaussianBlur::calculateOutsetSize({ m_stdX, m_stdY });
return {
Modified: trunk/Source/WebCore/platform/graphics/filters/FEDropShadow.h (288182 => 288183)
--- trunk/Source/WebCore/platform/graphics/filters/FEDropShadow.h 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/platform/graphics/filters/FEDropShadow.h 2022-01-19 08:37:08 UTC (rev 288183)
@@ -55,7 +55,7 @@
FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override;
- IntOutsets outsets() const override;
+ IntOutsets outsets(const Filter&) const override;
std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override;
Modified: trunk/Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp (288182 => 288183)
--- trunk/Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp 2022-01-19 08:37:08 UTC (rev 288183)
@@ -120,9 +120,9 @@
return filter.clipToMaxEffectRect(imageRect, primitiveSubregion);
}
-IntOutsets FEGaussianBlur::outsets() const
+IntOutsets FEGaussianBlur::outsets(const Filter& filter) const
{
- IntSize outsetSize = calculateOutsetSize({ m_stdX, m_stdY });
+ IntSize outsetSize = calculateOutsetSize(filter.resolvedSize({ m_stdX, m_stdY }));
return { outsetSize.height(), outsetSize.width(), outsetSize.height(), outsetSize.width() };
}
Modified: trunk/Source/WebCore/platform/graphics/filters/FEGaussianBlur.h (288182 => 288183)
--- trunk/Source/WebCore/platform/graphics/filters/FEGaussianBlur.h 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/platform/graphics/filters/FEGaussianBlur.h 2022-01-19 08:37:08 UTC (rev 288183)
@@ -52,7 +52,7 @@
FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override;
- IntOutsets outsets() const override;
+ IntOutsets outsets(const Filter&) const override;
bool resultIsAlphaImage(const FilterImageVector& inputs) const override;
Modified: trunk/Source/WebCore/platform/graphics/filters/FEOffset.cpp (288182 => 288183)
--- trunk/Source/WebCore/platform/graphics/filters/FEOffset.cpp 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/platform/graphics/filters/FEOffset.cpp 2022-01-19 08:37:08 UTC (rev 288183)
@@ -60,6 +60,23 @@
return filter.clipToMaxEffectRect(imageRect, primitiveSubregion);
}
+IntOutsets FEOffset::outsets(const Filter& filter) const
+{
+ auto offset = expandedIntSize(filter.resolvedSize({ m_dx, m_dy }));
+
+ IntOutsets outsets;
+ if (offset.height() < 0)
+ outsets.setTop(-offset.height());
+ else
+ outsets.setBottom(offset.height());
+ if (offset.width() < 0)
+ outsets.setLeft(-offset.width());
+ else
+ outsets.setRight(offset.width());
+
+ return outsets;
+}
+
bool FEOffset::resultIsAlphaImage(const FilterImageVector& inputs) const
{
return inputs[0]->isAlphaImage();
Modified: trunk/Source/WebCore/platform/graphics/filters/FEOffset.h (288182 => 288183)
--- trunk/Source/WebCore/platform/graphics/filters/FEOffset.h 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/platform/graphics/filters/FEOffset.h 2022-01-19 08:37:08 UTC (rev 288183)
@@ -44,6 +44,8 @@
FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override;
+ IntOutsets outsets(const Filter&) const override;
+
bool resultIsAlphaImage(const FilterImageVector& inputs) const override;
std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override;
Modified: trunk/Source/WebCore/platform/graphics/filters/Filter.h (288182 => 288183)
--- trunk/Source/WebCore/platform/graphics/filters/Filter.h 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/platform/graphics/filters/Filter.h 2022-01-19 08:37:08 UTC (rev 288183)
@@ -36,6 +36,7 @@
class Filter : public FilterFunction {
using FilterFunction::apply;
+ using FilterFunction::outsets;
public:
enum class ClipOperation { Intersect, Unite };
@@ -65,6 +66,7 @@
bool clampFilterRegionIfNeeded();
+ virtual IntOutsets outsets() const = 0;
virtual RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) = 0;
WEBCORE_EXPORT RefPtr<FilterImage> apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, FilterResults&);
Modified: trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h (288182 => 288183)
--- trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h 2022-01-19 08:37:08 UTC (rev 288183)
@@ -98,7 +98,7 @@
#endif
virtual RefPtr<FilterImage> apply(const Filter&, FilterImage&, FilterResults&) { return nullptr; }
- virtual IntOutsets outsets() const { return { }; }
+ virtual IntOutsets outsets(const Filter&) const { return { }; }
virtual WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation = FilterRepresentation::TestOutput) const = 0;
Modified: trunk/Source/WebCore/rendering/CSSFilter.cpp (288182 => 288183)
--- trunk/Source/WebCore/rendering/CSSFilter.cpp 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/rendering/CSSFilter.cpp 2022-01-19 08:37:08 UTC (rev 288183)
@@ -32,8 +32,6 @@
#include "FEDropShadow.h"
#include "FEGaussianBlur.h"
#include "FilterOperations.h"
-#include "GraphicsContext.h"
-#include "LengthFunctions.h"
#include "Logging.h"
#include "ReferencedSVGResources.h"
#include "RenderElement.h"
@@ -235,8 +233,10 @@
return nullptr;
}
+ auto filterRegion = SVGLengthContext::resolveRectangle<SVGFilterElement>(filterElement, filterElement->filterUnits(), targetBoundingBox);
+
SVGFilterBuilder builder;
- return SVGFilter::create(*filterElement, builder, filter.renderingMode(), filter.filterScale(), filter.clipOperation(), targetBoundingBox, targetBoundingBox);
+ return SVGFilter::create(*filterElement, builder, filter.renderingMode(), filter.filterScale(), filter.clipOperation(), filterRegion, targetBoundingBox);
}
bool CSSFilter::buildFilterFunctions(RenderElement& renderer, const FilterOperations& operations, const FloatRect& targetBoundingBox)
@@ -371,12 +371,6 @@
void CSSFilter::setFilterRegion(const FloatRect& filterRegion)
{
Filter::setFilterRegion(filterRegion);
-
- for (auto& function : m_functions) {
- if (function->isSVGFilter())
- downcast<SVGFilter>(function.ptr())->setFilterRegion(filterRegion);
- }
-
clampFilterRegionIfNeeded();
}
@@ -389,7 +383,7 @@
return m_outsets;
for (auto& function : m_functions)
- m_outsets += function->outsets();
+ m_outsets += function->outsets(*this);
return m_outsets;
}
Modified: trunk/Source/WebCore/rendering/CSSFilter.h (288182 => 288183)
--- trunk/Source/WebCore/rendering/CSSFilter.h 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/rendering/CSSFilter.h 2022-01-19 08:37:08 UTC (rev 288183)
@@ -30,10 +30,7 @@
namespace WebCore {
-class FilterEffect;
class FilterOperations;
-class GraphicsContext;
-class ReferenceFilterOperation;
class RenderElement;
class SourceGraphic;
Modified: trunk/Source/WebCore/rendering/RenderLayerFilters.cpp (288182 => 288183)
--- trunk/Source/WebCore/rendering/RenderLayerFilters.cpp 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/rendering/RenderLayerFilters.cpp 2022-01-19 08:37:08 UTC (rev 288183)
@@ -164,10 +164,8 @@
// For CSSFilter, filterRegion = targetBoundingBox + filter->outsets()
auto filterRegion = targetBoundingBox;
- if (filter.hasFilterThatMovesPixels()) {
+ if (filter.hasFilterThatMovesPixels())
filterRegion += filter.outsets();
- filterRegion.intersect(filterBoxRect);
- }
if (filterRegion.isEmpty())
return nullptr;
Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp (288182 => 288183)
--- trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp 2022-01-19 08:37:08 UTC (rev 288183)
@@ -52,7 +52,6 @@
if (!filter->supportsCoreImageRendering())
filter->setRenderingMode(RenderingMode::Unaccelerated);
#endif
-
return filter;
}
@@ -97,13 +96,6 @@
}
#endif
-RefPtr<FilterEffect> SVGFilter::lastEffect() const
-{
- if (m_expression.isEmpty())
- return nullptr;
- return m_expression.last().effect.ptr();
-}
-
FilterEffectVector SVGFilter::effectsOfType(FilterFunction::Type filterType) const
{
HashSet<Ref<FilterEffect>> effects;
@@ -161,8 +153,10 @@
IntOutsets SVGFilter::outsets() const
{
- ASSERT(lastEffect());
- return lastEffect()->outsets();
+ IntOutsets outsets;
+ for (auto& term : m_expression)
+ outsets += term.effect->outsets(*this);
+ return outsets;
}
TextStream& SVGFilter::externalRepresentation(TextStream& ts, FilterRepresentation representation) const
Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h (288182 => 288183)
--- trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h 2022-01-19 07:51:32 UTC (rev 288182)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h 2022-01-19 08:37:08 UTC (rev 288183)
@@ -56,8 +56,6 @@
void setExpression(SVGFilterExpression&& _expression_) { m_expression = WTFMove(_expression_); }
- RefPtr<FilterEffect> lastEffect() const;
-
#if USE(CORE_IMAGE)
bool supportsCoreImageRendering() const final;
#endif
@@ -64,6 +62,8 @@
FloatSize resolvedSize(const FloatSize&) const final;
RefPtr<FilterImage> apply(const Filter&, FilterImage& sourceImage, FilterResults&) final;
+
+ IntOutsets outsets(const Filter&) const final { return outsets(); }
IntOutsets outsets() const final;
FloatRect m_targetBoundingBox;