Changeset 288183 in webkit
- Timestamp:
- Jan 19, 2022 12:37:08 AM (6 months ago)
- Location:
- trunk
- Files:
-
- 2 added
- 18 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/css3/filters/reference-filter-outsets-expected.html (added)
-
LayoutTests/css3/filters/reference-filter-outsets.html (added)
-
LayoutTests/css3/filters/reference-filter-set-filter-regions-expected.html (modified) (1 diff)
-
LayoutTests/css3/filters/reference-filter-set-filter-regions.html (modified) (1 diff)
-
LayoutTests/platform/win/TestExpectations (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/platform/graphics/filters/FEDropShadow.cpp (modified) (1 diff)
-
Source/WebCore/platform/graphics/filters/FEDropShadow.h (modified) (1 diff)
-
Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp (modified) (1 diff)
-
Source/WebCore/platform/graphics/filters/FEGaussianBlur.h (modified) (1 diff)
-
Source/WebCore/platform/graphics/filters/FEOffset.cpp (modified) (1 diff)
-
Source/WebCore/platform/graphics/filters/FEOffset.h (modified) (1 diff)
-
Source/WebCore/platform/graphics/filters/Filter.h (modified) (2 diffs)
-
Source/WebCore/platform/graphics/filters/FilterFunction.h (modified) (1 diff)
-
Source/WebCore/rendering/CSSFilter.cpp (modified) (4 diffs)
-
Source/WebCore/rendering/CSSFilter.h (modified) (1 diff)
-
Source/WebCore/rendering/RenderLayerFilters.cpp (modified) (1 diff)
-
Source/WebCore/svg/graphics/filters/SVGFilter.cpp (modified) (3 diffs)
-
Source/WebCore/svg/graphics/filters/SVGFilter.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r288182 r288183 1 2022-01-19 Said Abou-Hallawa <said@apple.com> 2 3 filterRegion and outsets of referenced SVG filter are calculated incorrectly 4 https://bugs.webkit.org/show_bug.cgi?id=235338 5 6 Reviewed by Darin Adler. 7 8 * css3/filters/reference-filter-outsets-expected.html: Added. 9 * css3/filters/reference-filter-outsets.html: Added. 10 11 * css3/filters/reference-filter-set-filter-regions-expected.html: 12 * css3/filters/reference-filter-set-filter-regions.html: 13 The original expected page is wrong. To test the referenced SVG filter 14 correctly, the <div> element needs to move such that all its outsets are 15 not truncated. 16 17 * platform/win/TestExpectations: 18 1 19 2022-01-18 Jon Lee <jonlee554@gmail.com> 2 20 -
trunk/LayoutTests/css3/filters/reference-filter-set-filter-regions-expected.html
r235644 r288183 2 2 <style> 3 3 .box { 4 width: 200px; 5 height: 200px; 4 position: absolute; 5 left: 20px; 6 top: 20px; 7 width: 240px; 8 height: 240px; 6 9 background-color: green; 7 10 } -
trunk/LayoutTests/css3/filters/reference-filter-set-filter-regions.html
r287982 r288183 2 2 <style> 3 3 .box { 4 position: absolute; 5 left: 40px; 6 top: 40px; 4 7 width: 200px; 5 8 height: 200px; -
trunk/LayoutTests/platform/win/TestExpectations
r288070 r288183 128 128 webkit.org/b/74716 css3/masking/clip-path-filter.html [ Skip ] 129 129 webkit.org/b/74716 css3/filters/backdrop [ Skip ] 130 webkit.org/b/74716 css3/filters/reference-filter-set-filter-regions.html [ Skip ] 130 131 131 132 # platformLayerTreeAsText is only implemented for Cocoa ports. -
trunk/Source/WebCore/ChangeLog
r288181 r288183 1 2022-01-19 Said Abou-Hallawa <said@apple.com> 2 3 filterRegion and outsets of referenced SVG filter are calculated incorrectly 4 https://bugs.webkit.org/show_bug.cgi?id=235338 5 6 Reviewed by Darin Adler. 7 8 Calculate the filterRegion of the referenced SVGFilter by calling 9 SVGLengthContext::resolveRectangle() given the targetBoundingBox of the 10 CSSFilter. 11 12 There is no need to set the filterRegion of the referenced SVG filter 13 from CSSFilter::setFilterRegion() since its filterRegion is the union 14 of the filterRegions all its referenced SVGFilters. 15 16 Calculate the outsets of the SVGFilter by looping through its expression 17 of FilterEffects. 18 19 Test: css3/filters/reference-filter-outsets.html 20 21 * platform/graphics/filters/FEDropShadow.cpp: 22 (WebCore::FEDropShadow::outsets const): 23 * platform/graphics/filters/FEDropShadow.h: 24 * platform/graphics/filters/FEGaussianBlur.cpp: 25 (WebCore::FEGaussianBlur::outsets const): 26 * platform/graphics/filters/FEGaussianBlur.h: 27 * platform/graphics/filters/FEOffset.cpp: 28 (WebCore::FEOffset::outsets const): 29 * platform/graphics/filters/FEOffset.h: 30 * platform/graphics/filters/Filter.h: 31 * platform/graphics/filters/FilterFunction.h: 32 (WebCore::FilterFunction::outsets const): 33 * rendering/CSSFilter.cpp: 34 (WebCore::createSVGFilter): 35 (WebCore::CSSFilter::setFilterRegion): 36 (WebCore::CSSFilter::outsets const): 37 * rendering/CSSFilter.h: 38 * rendering/RenderLayerFilters.cpp: 39 (WebCore::RenderLayerFilters::beginFilterEffect): 40 * svg/graphics/filters/SVGFilter.cpp: 41 (WebCore::SVGFilter::create): 42 (WebCore::SVGFilter::outsets const): 43 (WebCore::SVGFilter::lastEffect const): Deleted. 44 * svg/graphics/filters/SVGFilter.h: 45 1 46 2022-01-18 Sam Weinig <weinig@apple.com> 2 47 -
trunk/Source/WebCore/platform/graphics/filters/FEDropShadow.cpp
r286589 r288183 62 62 } 63 63 64 IntOutsets FEDropShadow::outsets( ) const64 IntOutsets FEDropShadow::outsets(const Filter&) const 65 65 { 66 66 IntSize outsetSize = FEGaussianBlur::calculateOutsetSize({ m_stdX, m_stdY }); -
trunk/Source/WebCore/platform/graphics/filters/FEDropShadow.h
r286589 r288183 56 56 FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; 57 57 58 IntOutsets outsets( ) const override;58 IntOutsets outsets(const Filter&) const override; 59 59 60 60 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; -
trunk/Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp
r286589 r288183 121 121 } 122 122 123 IntOutsets FEGaussianBlur::outsets( ) const123 IntOutsets FEGaussianBlur::outsets(const Filter& filter) const 124 124 { 125 IntSize outsetSize = calculateOutsetSize( { m_stdX, m_stdY });125 IntSize outsetSize = calculateOutsetSize(filter.resolvedSize({ m_stdX, m_stdY })); 126 126 return { outsetSize.height(), outsetSize.width(), outsetSize.height(), outsetSize.width() }; 127 127 } -
trunk/Source/WebCore/platform/graphics/filters/FEGaussianBlur.h
r286589 r288183 53 53 FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; 54 54 55 IntOutsets outsets( ) const override;55 IntOutsets outsets(const Filter&) const override; 56 56 57 57 bool resultIsAlphaImage(const FilterImageVector& inputs) const override; -
trunk/Source/WebCore/platform/graphics/filters/FEOffset.cpp
r286589 r288183 61 61 } 62 62 63 IntOutsets FEOffset::outsets(const Filter& filter) const 64 { 65 auto offset = expandedIntSize(filter.resolvedSize({ m_dx, m_dy })); 66 67 IntOutsets outsets; 68 if (offset.height() < 0) 69 outsets.setTop(-offset.height()); 70 else 71 outsets.setBottom(offset.height()); 72 if (offset.width() < 0) 73 outsets.setLeft(-offset.width()); 74 else 75 outsets.setRight(offset.width()); 76 77 return outsets; 78 } 79 63 80 bool FEOffset::resultIsAlphaImage(const FilterImageVector& inputs) const 64 81 { -
trunk/Source/WebCore/platform/graphics/filters/FEOffset.h
r286589 r288183 45 45 FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const override; 46 46 47 IntOutsets outsets(const Filter&) const override; 48 47 49 bool resultIsAlphaImage(const FilterImageVector& inputs) const override; 48 50 -
trunk/Source/WebCore/platform/graphics/filters/Filter.h
r287982 r288183 37 37 class Filter : public FilterFunction { 38 38 using FilterFunction::apply; 39 using FilterFunction::outsets; 39 40 40 41 public: … … 66 67 bool clampFilterRegionIfNeeded(); 67 68 69 virtual IntOutsets outsets() const = 0; 68 70 virtual RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) = 0; 69 71 WEBCORE_EXPORT RefPtr<FilterImage> apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, FilterResults&); -
trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h
r287782 r288183 99 99 100 100 virtual RefPtr<FilterImage> apply(const Filter&, FilterImage&, FilterResults&) { return nullptr; } 101 virtual IntOutsets outsets( ) const { return { }; }101 virtual IntOutsets outsets(const Filter&) const { return { }; } 102 102 103 103 virtual WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation = FilterRepresentation::TestOutput) const = 0; -
trunk/Source/WebCore/rendering/CSSFilter.cpp
r287982 r288183 33 33 #include "FEGaussianBlur.h" 34 34 #include "FilterOperations.h" 35 #include "GraphicsContext.h"36 #include "LengthFunctions.h"37 35 #include "Logging.h" 38 36 #include "ReferencedSVGResources.h" … … 236 234 } 237 235 236 auto filterRegion = SVGLengthContext::resolveRectangle<SVGFilterElement>(filterElement, filterElement->filterUnits(), targetBoundingBox); 237 238 238 SVGFilterBuilder builder; 239 return SVGFilter::create(*filterElement, builder, filter.renderingMode(), filter.filterScale(), filter.clipOperation(), targetBoundingBox, targetBoundingBox);239 return SVGFilter::create(*filterElement, builder, filter.renderingMode(), filter.filterScale(), filter.clipOperation(), filterRegion, targetBoundingBox); 240 240 } 241 241 … … 372 372 { 373 373 Filter::setFilterRegion(filterRegion); 374 375 for (auto& function : m_functions) {376 if (function->isSVGFilter())377 downcast<SVGFilter>(function.ptr())->setFilterRegion(filterRegion);378 }379 380 374 clampFilterRegionIfNeeded(); 381 375 } … … 390 384 391 385 for (auto& function : m_functions) 392 m_outsets += function->outsets( );386 m_outsets += function->outsets(*this); 393 387 return m_outsets; 394 388 } -
trunk/Source/WebCore/rendering/CSSFilter.h
r287982 r288183 31 31 namespace WebCore { 32 32 33 class FilterEffect;34 33 class FilterOperations; 35 class GraphicsContext;36 class ReferenceFilterOperation;37 34 class RenderElement; 38 35 class SourceGraphic; -
trunk/Source/WebCore/rendering/RenderLayerFilters.cpp
r287829 r288183 165 165 // For CSSFilter, filterRegion = targetBoundingBox + filter->outsets() 166 166 auto filterRegion = targetBoundingBox; 167 if (filter.hasFilterThatMovesPixels()) {167 if (filter.hasFilterThatMovesPixels()) 168 168 filterRegion += filter.outsets(); 169 filterRegion.intersect(filterBoxRect);170 }171 169 172 170 if (filterRegion.isEmpty()) -
trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp
r287892 r288183 53 53 filter->setRenderingMode(RenderingMode::Unaccelerated); 54 54 #endif 55 56 55 return filter; 57 56 } … … 97 96 } 98 97 #endif 99 100 RefPtr<FilterEffect> SVGFilter::lastEffect() const101 {102 if (m_expression.isEmpty())103 return nullptr;104 return m_expression.last().effect.ptr();105 }106 98 107 99 FilterEffectVector SVGFilter::effectsOfType(FilterFunction::Type filterType) const … … 162 154 IntOutsets SVGFilter::outsets() const 163 155 { 164 ASSERT(lastEffect()); 165 return lastEffect()->outsets(); 156 IntOutsets outsets; 157 for (auto& term : m_expression) 158 outsets += term.effect->outsets(*this); 159 return outsets; 166 160 } 167 161 -
trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h
r287982 r288183 57 57 void setExpression(SVGFilterExpression&& expression) { m_expression = WTFMove(expression); } 58 58 59 RefPtr<FilterEffect> lastEffect() const;60 61 59 #if USE(CORE_IMAGE) 62 60 bool supportsCoreImageRendering() const final; … … 65 63 66 64 RefPtr<FilterImage> apply(const Filter&, FilterImage& sourceImage, FilterResults&) final; 65 66 IntOutsets outsets(const Filter&) const final { return outsets(); } 67 67 IntOutsets outsets() const final; 68 68
Note: See TracChangeset
for help on using the changeset viewer.