Changeset 286578 in webkit
- Timestamp:
- Dec 6, 2021, 4:36:58 PM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 1 added
- 14 edited
-
ChangeLog (modified) (1 diff)
-
Headers.cmake (modified) (1 diff)
-
WebCore.xcodeproj/project.pbxproj (modified) (4 diffs)
-
platform/graphics/filters/FEDisplacementMap.cpp (modified) (2 diffs)
-
platform/graphics/filters/FEDisplacementMap.h (modified) (1 diff)
-
platform/graphics/filters/Filter.cpp (modified) (1 diff)
-
platform/graphics/filters/Filter.h (modified) (1 diff)
-
platform/graphics/filters/FilterEffect.cpp (modified) (8 diffs)
-
platform/graphics/filters/FilterEffect.h (modified) (4 diffs)
-
platform/graphics/filters/FilterFunction.h (modified) (2 diffs)
-
svg/graphics/filters/SVGFilter.cpp (modified) (6 diffs)
-
svg/graphics/filters/SVGFilter.h (modified) (4 diffs)
-
svg/graphics/filters/SVGFilterBuilder.cpp (modified) (3 diffs)
-
svg/graphics/filters/SVGFilterBuilder.h (modified) (3 diffs)
-
svg/graphics/filters/SVGFilterExpression.h (added)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r286569 r286578 1 2021-12-06 Said Abou-Hallawa <said@apple.com> 2 3 [GPU Process] Make FilterEffect calculate the primitive subregion only when needed 4 https://bugs.webkit.org/show_bug.cgi?id=232705 5 rdar://85290142 6 7 Reviewed by Cameron McCormack. 8 9 In this patch: 10 11 1. resultColorSpace() will return colorSpace() from a FilterImageVector 12 instead of returning the resultColorSpace() of the FilterEffect. 13 14 2. Filter::clampFilterRegionIfNeeded() will clamp the filterRegion() 15 instead of clamping the maxEffectRect of the lastEffect() since all 16 the primitiveSubregions and the imageRects have to clipped to the 17 filterRegion(). 18 19 3. determineFilterPrimitiveSubregion() is replaced by calculatePrimitiveSubregion() 20 which will calculate the primitiveSubregion from a FilterImageVector 21 and an optional FilterEffectGeometry. 22 23 4. Many of FilterEffects are made protected instead of having them public. 24 25 5. SVGFilterExpression will be defined as a Vector of SVGFilterExpressionTerm 26 which is a struct of FilterEffect and optional FilterEffectGeometry. 27 28 6. SVGFilter will replace the members whose types are FilterEffectVector 29 and FilterEffectGeometryMap with a single member of type SVGFilterExpression. 30 31 * Headers.cmake: 32 * WebCore.xcodeproj/project.pbxproj: 33 * platform/graphics/filters/FEDisplacementMap.cpp: 34 (WebCore::FEDisplacementMap::resultColorSpace const): 35 * platform/graphics/filters/FEDisplacementMap.h: 36 * platform/graphics/filters/Filter.cpp: 37 (WebCore::Filter::clampFilterRegionIfNeeded): 38 * platform/graphics/filters/Filter.h: 39 (WebCore::Filter::effectGeometry const): Deleted. 40 * platform/graphics/filters/FilterEffect.cpp: 41 (WebCore::FilterEffect::calculatePrimitiveSubregion const): 42 (WebCore::FilterEffect::apply): 43 (WebCore::FilterEffect::externalRepresentation const): 44 (WebCore::FilterEffect::determineFilterPrimitiveSubregion): Deleted. 45 * platform/graphics/filters/FilterEffect.h: 46 (WebCore::FilterEffect::resultColorSpace const): 47 (WebCore::FilterEffect::filterPrimitiveSubregion const): Deleted. 48 (WebCore::FilterEffect::setFilterPrimitiveSubregion): Deleted. 49 * platform/graphics/filters/FilterFunction.h: 50 (WebCore::FilterFunction::apply): 51 * svg/graphics/filters/SVGFilter.cpp: 52 (WebCore::SVGFilter::create): 53 (WebCore::SVGFilter::supportsCoreImageRendering const): 54 (WebCore::SVGFilter::lastEffect const): 55 (WebCore::SVGFilter::apply): 56 (WebCore::SVGFilter::clearResult): 57 (WebCore::SVGFilter::effectGeometry const): Deleted. 58 * svg/graphics/filters/SVGFilter.h: 59 * svg/graphics/filters/SVGFilterBuilder.cpp: 60 (WebCore::SVGFilterBuilder::effectGeometry const): 61 (WebCore::SVGFilterBuilder::buildEffectExpression const): 62 (WebCore::SVGFilterBuilder::buildExpression const): 63 (WebCore::buildEffectExpression): Deleted. 64 * svg/graphics/filters/SVGFilterBuilder.h: 65 (WebCore::SVGFilterBuilder::takeEffectGeometryMap): Deleted. 66 * svg/graphics/filters/SVGFilterExpression.h: Added. 67 1 68 2021-12-06 Ryan Haddad <ryanhaddad@apple.com> 2 69 -
trunk/Source/WebCore/Headers.cmake
r286568 r286578 1911 1911 1912 1912 svg/graphics/filters/SVGFilter.h 1913 svg/graphics/filters/SVGFilterExpression.h 1913 1914 1914 1915 svg/properties/SVGList.h -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r286568 r286578 2319 2319 7299BC6823D6A53E00CC6883 /* RenderingMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 7299BC6623D686C600CC6883 /* RenderingMode.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2320 2320 729D05302531424300422098 /* RenderingResourceIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 729D052E25313E2600422098 /* RenderingResourceIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2321 72A5D192275E8FFE0065833E /* SVGFilterExpression.h in Headers */ = {isa = PBXBuildFile; fileRef = 726CDE25275B489700A445B2 /* SVGFilterExpression.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2321 2322 72A73BEF245A3F90001C9D03 /* AnimationFrameRate.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A815C238FD50500C00583 /* AnimationFrameRate.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2322 2323 72B8B0352753438600F752AA /* FilterFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 7262D756272A174100C56A09 /* FilterFunction.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 11201 11202 7266F029224312B100833975 /* SVGAnimationAdditiveListFunction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAnimationAdditiveListFunction.h; sourceTree = "<group>"; }; 11202 11203 7266F02A2243149B00833975 /* SVGAnimatedPropertyList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedPropertyList.h; sourceTree = "<group>"; }; 11204 726CDE25275B489700A445B2 /* SVGFilterExpression.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGFilterExpression.h; sourceTree = "<group>"; }; 11203 11205 726D56E1253AE0430002EF90 /* PlatformImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformImage.h; sourceTree = "<group>"; }; 11204 11206 727AFED11A2EA6A0000442E8 /* EXTsRGB.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EXTsRGB.cpp; sourceTree = "<group>"; }; … … 28448 28450 081EBF380FD34F4100DA7559 /* SVGFilterBuilder.cpp */, 28449 28451 081EBF390FD34F4100DA7559 /* SVGFilterBuilder.h */, 28452 726CDE25275B489700A445B2 /* SVGFilterExpression.h */, 28450 28453 ); 28451 28454 path = filters; … … 37150 37153 081EBF3B0FD34F4100DA7559 /* SVGFilterBuilder.h in Headers */, 37151 37154 B2227A0C0D00BF220071B782 /* SVGFilterElement.h in Headers */, 37155 72A5D192275E8FFE0065833E /* SVGFilterExpression.h in Headers */, 37152 37156 B2227A0F0D00BF220071B782 /* SVGFilterPrimitiveStandardAttributes.h in Headers */, 37153 37157 B2227A120D00BF220071B782 /* SVGFitToViewBox.h in Headers */, -
trunk/Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp
r286287 r286578 69 69 } 70 70 71 const DestinationColorSpace& FEDisplacementMap::resultColorSpace( ) const71 const DestinationColorSpace& FEDisplacementMap::resultColorSpace(const FilterImageVector& inputs) const 72 72 { 73 73 // Spec: The 'color-interpolation-filters' property only applies to the 'in2' source image … … 75 75 // current color space. 76 76 // The result is in that same color space because it is a displacement of the 'in' image. 77 return input Effect(0)->resultColorSpace();77 return inputs[0]->colorSpace(); 78 78 } 79 79 -
trunk/Source/WebCore/platform/graphics/filters/FEDisplacementMap.h
r286538 r286578 55 55 FEDisplacementMap(ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, float); 56 56 57 const DestinationColorSpace& resultColorSpace( ) const override;57 const DestinationColorSpace& resultColorSpace(const FilterImageVector&) const override; 58 58 void transformResultColorSpace(FilterEffect*, const int) override; 59 59 -
trunk/Source/WebCore/platform/graphics/filters/Filter.cpp
r286546 r286578 72 72 bool Filter::clampFilterRegionIfNeeded() 73 73 { 74 auto lastEffect = this->lastEffect(); 75 lastEffect->determineFilterPrimitiveSubregion(*this); 76 77 auto maxEffectRect = this->maxEffectRect(lastEffect->filterPrimitiveSubregion()); 78 auto scaledMaxEffectRect = scaledByFilterScale(maxEffectRect); 74 auto scaledFilterRegion = scaledByFilterScale(m_filterRegion); 79 75 80 76 FloatSize clampingScale(1, 1); 81 if (!ImageBuffer::sizeNeedsClamping(scaled MaxEffectRect.size(), clampingScale))77 if (!ImageBuffer::sizeNeedsClamping(scaledFilterRegion.size(), clampingScale)) 82 78 return false; 83 79 84 80 m_filterScale = m_filterScale * clampingScale; 85 86 // At least one FilterEffect has a too big image size,87 // recalculate the effect sizes with new scale factors.88 lastEffect->determineFilterPrimitiveSubregion(*this);89 81 return true; 90 82 } -
trunk/Source/WebCore/platform/graphics/filters/Filter.h
r286546 r286578 64 64 FloatRect scaledByFilterScale(const FloatRect&) const; 65 65 66 virtual std::optional<FilterEffectGeometry> effectGeometry(FilterEffect&) const { return std::nullopt; }67 68 66 FloatRect maxEffectRect(const FloatRect& primitiveSubregion) const; 69 67 FloatRect clipToMaxEffectRect(const FloatRect& imageRect, const FloatRect& primitiveSubregion) const; -
trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp
r286526 r286578 27 27 #include "Filter.h" 28 28 #include "FilterEffectApplier.h" 29 #include "FilterEffectGeometry.h" 29 30 #include "ImageBuffer.h" 30 31 #include "Logging.h" … … 41 42 } 42 43 43 FloatRect FilterEffect:: determineFilterPrimitiveSubregion(const Filter& filter)44 FloatRect FilterEffect::calculatePrimitiveSubregion(const Filter& filter, const FilterImageVector& inputs, const std::optional<FilterEffectGeometry>& geometry) const 44 45 { 45 46 // This function implements https://www.w3.org/TR/filter-effects-1/#FilterPrimitiveSubRegion. 46 47 FloatRect primitiveSubregion; 47 48 48 // If there is no input effects, take the effect boundaries as unite rect. 49 if (!m_inputEffects.isEmpty()) { 50 for (auto& effect : m_inputEffects) { 51 auto inputPrimitiveSubregion = effect->determineFilterPrimitiveSubregion(filter); 52 primitiveSubregion.unite(inputPrimitiveSubregion); 53 } 49 // If there is no input effects, take the effect boundaries as unite rect. Don't use the input's subregion for FETile. 50 if (!inputs.isEmpty() && filterType() != FilterEffect::Type::FETile) { 51 for (auto& input : inputs) 52 primitiveSubregion.unite(input->primitiveSubregion()); 54 53 } else 55 54 primitiveSubregion = filter.filterRegion(); 56 55 57 // Don't use the input's subregion for FETile.58 if (filterType() == FilterEffect::Type::FETile)59 primitiveSubregion = filter.filterRegion();60 61 56 // Clip the primitive subregion to the effect geometry. 62 if ( auto geometry = filter.effectGeometry(*this)) {57 if (geometry) { 63 58 if (auto x = geometry->x()) 64 59 primitiveSubregion.setX(*x); … … 71 66 } 72 67 73 setFilterPrimitiveSubregion(primitiveSubregion);74 68 return primitiveSubregion; 75 69 } … … 81 75 } 82 76 83 bool FilterEffect::apply(const Filter& filter )77 bool FilterEffect::apply(const Filter& filter, const std::optional<FilterEffectGeometry>& geometry) 84 78 { 85 79 if (hasResult()) … … 101 95 102 96 auto inputFilterImages = this->inputFilterImages(); 103 auto imageRect = calculateImageRect(filter, inputFilterImages, m_filterPrimitiveSubregion); 97 98 auto primitiveSubregion = calculatePrimitiveSubregion(filter, inputFilterImages, geometry); 99 auto imageRect = calculateImageRect(filter, inputFilterImages, primitiveSubregion); 104 100 auto absoluteImageRect = enclosingIntRect(filter.scaledByFilterScale(imageRect)); 105 101 … … 108 104 109 105 auto isAlphaImage = resultIsAlphaImage(inputFilterImages); 110 auto imageColorSpace = resultColorSpace( );106 auto imageColorSpace = resultColorSpace(inputFilterImages); 111 107 112 m_filterImage = FilterImage::create( m_filterPrimitiveSubregion, imageRect, absoluteImageRect, isAlphaImage, filter.renderingMode(), imageColorSpace);108 m_filterImage = FilterImage::create(primitiveSubregion, imageRect, absoluteImageRect, isAlphaImage, filter.renderingMode(), imageColorSpace); 113 109 if (!m_filterImage) 114 110 return false; … … 120 116 LOG_WITH_STREAM(Filters, stream 121 117 << "FilterEffect " << filterName() << " " << this << " apply():" 122 << "\n filterPrimitiveSubregion " << m_filterPrimitiveSubregion118 << "\n filterPrimitiveSubregion " << primitiveSubregion 123 119 << "\n absolutePaintRect " << absoluteImageRect 124 << "\n maxEffectRect " << filter. scaledByFilterScale(filter.maxEffectRect(m_filterPrimitiveSubregion))120 << "\n maxEffectRect " << filter.maxEffectRect(primitiveSubregion) 125 121 << "\n filter scale " << filter.filterScale()); 126 122 … … 174 170 TextStream::IndentScope indentScope(ts); 175 171 ts.dumpProperty("operating colorspace", operatingColorSpace()); 176 ts.dumpProperty("result colorspace", resultColorSpace());177 172 ts << "\n" << indent; 178 173 } -
trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h
r286526 r286578 38 38 class Filter; 39 39 class FilterEffectApplier; 40 class FilterEffectGeometry; 40 41 41 42 class FilterEffect : public FilterFunction { … … 46 47 47 48 FilterImage* filterImage() const { return m_filterImage.get(); } 48 FilterImageVector inputFilterImages() const;49 50 void correctPremultipliedResultIfNeeded();51 49 52 50 FilterEffectVector& inputEffects() { return m_inputEffects; } … … 54 52 unsigned numberOfEffectInputs() const { return m_inputEffects.size(); } 55 53 56 // Recurses on inputs. 57 FloatRect determineFilterPrimitiveSubregion(const Filter&); 54 void transformResultColorSpace(const DestinationColorSpace&); 58 55 59 bool apply(const Filter&) override; 56 bool apply(const Filter&, const std::optional<FilterEffectGeometry>& = std::nullopt) override; 57 58 const DestinationColorSpace& operatingColorSpace() const { return m_operatingColorSpace; } 59 virtual void setOperatingColorSpace(const DestinationColorSpace& colorSpace) { m_operatingColorSpace = colorSpace; } 60 61 enum class RepresentationType { TestOutput, Debugging }; 62 virtual WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType = RepresentationType::TestOutput) const; 63 64 protected: 65 using FilterFunction::FilterFunction; 66 67 virtual bool mayProduceInvalidPremultipliedPixels() const { return false; } 68 69 void correctPremultipliedResultIfNeeded(); 60 70 61 71 // Correct any invalid pixels, if necessary, in the result of a filter operation. … … 64 74 virtual void correctFilterResultIfNeeded() { } 65 75 66 enum class RepresentationType { TestOutput, Debugging }; 67 virtual WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType = RepresentationType::TestOutput) const; 76 virtual void transformResultColorSpace(FilterEffect* in, const int) { in->transformResultColorSpace(m_operatingColorSpace); } 68 77 69 FloatRect filterPrimitiveSubregion() const { return m_filterPrimitiveSubregion; } 70 void setFilterPrimitiveSubregion(const FloatRect& filterPrimitiveSubregion) { m_filterPrimitiveSubregion = filterPrimitiveSubregion; } 78 FilterImageVector inputFilterImages() const; 79 80 FloatRect calculatePrimitiveSubregion(const Filter&, const FilterImageVector&, const std::optional<FilterEffectGeometry>&) const; 71 81 72 82 virtual FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const; 73 83 74 const DestinationColorSpace& operatingColorSpace() const { return m_operatingColorSpace; }75 virtual void setOperatingColorSpace(const DestinationColorSpace& colorSpace) { m_operatingColorSpace = colorSpace; }76 77 84 // Solid black image with different alpha values. 78 85 virtual bool resultIsAlphaImage(const FilterImageVector&) const { return false; } 79 virtual const DestinationColorSpace& resultColorSpace( ) const { return m_operatingColorSpace; }86 virtual const DestinationColorSpace& resultColorSpace(const FilterImageVector&) const { return m_operatingColorSpace; } 80 87 81 virtual void transformResultColorSpace(FilterEffect* in, const int) { in->transformResultColorSpace(m_operatingColorSpace); }82 void transformResultColorSpace(const DestinationColorSpace&);83 84 protected:85 using FilterFunction::FilterFunction;86 87 virtual bool mayProduceInvalidPremultipliedPixels() const { return false; }88 89 88 virtual std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const = 0; 90 89 91 private:92 90 FilterEffectVector m_inputEffects; 93 91 94 92 RefPtr<FilterImage> m_filterImage; 95 96 // The subregion of a filter primitive according to the SVG Filter specification in local coordinates.97 // This is SVG specific and needs to move to RenderSVGResourceFilterPrimitive.98 FloatRect m_filterPrimitiveSubregion;99 93 100 94 DestinationColorSpace m_operatingColorSpace { DestinationColorSpace::SRGB() }; -
trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h
r286193 r286578 26 26 #pragma once 27 27 28 #include "FilterEffectGeometry.h" 28 29 #include "FloatRect.h" 29 30 #include "IntRectExtent.h" … … 89 90 #endif 90 91 91 virtual bool apply(const Filter& ) { return false; }92 virtual bool apply(const Filter&, const std::optional<FilterEffectGeometry>& = std::nullopt) { return false; } 92 93 virtual IntOutsets outsets() const { return { }; } 93 94 virtual void clearResult() { } -
trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp
r286546 r286578 55 55 return nullptr; 56 56 57 FilterEffectVectorexpression;57 SVGFilterExpression expression; 58 58 if (!builder.buildExpression(expression)) 59 59 return nullptr; … … 61 61 ASSERT(!expression.isEmpty()); 62 62 filter->setExpression(WTFMove(expression)); 63 64 filter->setEffectGeometryMap(builder.takeEffectGeometryMap());65 63 66 64 #if USE(CORE_IMAGE) … … 91 89 92 90 ASSERT(!m_expression.isEmpty()); 93 for (auto& effect: m_expression) {94 if (! effect->supportsCoreImageRendering())91 for (auto& term : m_expression) { 92 if (!term.effect->supportsCoreImageRendering()) 95 93 return false; 96 94 } … … 100 98 #endif 101 99 102 std::optional<FilterEffectGeometry> SVGFilter::effectGeometry(FilterEffect& effect) const100 RefPtr<FilterEffect> SVGFilter::lastEffect() const 103 101 { 104 auto it = m_effectGeometryMap.find(effect); 105 if (it != m_effectGeometryMap.end()) 106 return it->value; 107 return std::nullopt; 102 if (m_expression.isEmpty()) 103 return nullptr; 104 return m_expression.last().effect.ptr(); 108 105 } 109 106 110 bool SVGFilter::apply(const Filter& filter )107 bool SVGFilter::apply(const Filter& filter, const std::optional<FilterEffectGeometry>&) 111 108 { 112 109 setSourceImage({ filter.sourceImage() }); … … 117 114 { 118 115 ASSERT(!m_expression.isEmpty()); 119 for (auto& effect: m_expression) {120 if (! effect->apply(*this))116 for (auto& term : m_expression) { 117 if (!term.effect->apply(*this, term.geometry)) 121 118 return nullptr; 122 119 } … … 133 130 { 134 131 ASSERT(!m_expression.isEmpty()); 135 for (auto& effect: m_expression)136 effect->clearResult();132 for (auto& term : m_expression) 133 term.effect->clearResult(); 137 134 } 138 135 -
trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h
r286546 r286578 23 23 24 24 #include "Filter.h" 25 #include "FilterEffectVector.h"26 25 #include "FloatRect.h" 26 #include "SVGFilterExpression.h" 27 27 #include "SVGUnitTypes.h" 28 28 #include <wtf/Ref.h> … … 43 43 FloatRect targetBoundingBox() const { return m_targetBoundingBox; } 44 44 45 RefPtr<FilterEffect> lastEffect() const final { return !m_expression.isEmpty() ? m_expression.last() : nullptr; }45 RefPtr<FilterEffect> lastEffect() const final; 46 46 47 47 RefPtr<FilterImage> apply() final; … … 50 50 SVGFilter(RenderingMode, const FloatSize& filterScale, ClipOperation, const FloatRect& filterRegion, const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits); 51 51 52 // FIXME: Merge the effectBoundaries in the expression node. 53 void setExpression(FilterEffectVector&& expression) { m_expression = WTFMove(expression); } 54 void setEffectGeometryMap(FilterEffectGeometryMap&& effectGeometryMap) { m_effectGeometryMap = WTFMove(effectGeometryMap); } 52 void setExpression(SVGFilterExpression&& expression) { m_expression = WTFMove(expression); } 55 53 56 54 #if USE(CORE_IMAGE) 57 55 bool supportsCoreImageRendering() const final; 58 56 #endif 59 std::optional<FilterEffectGeometry> effectGeometry(FilterEffect&) const final;60 57 FloatSize resolvedSize(const FloatSize&) const final; 61 58 62 bool apply(const Filter& ) final;59 bool apply(const Filter&, const std::optional<FilterEffectGeometry>& = std::nullopt) final; 63 60 IntOutsets outsets() const final; 64 61 void clearResult() final; … … 67 64 SVGUnitTypes::SVGUnitType m_primitiveUnits; 68 65 69 // FIXME: Make m_expression a Vector of the FilterEffect and the effectBoundaries. 70 FilterEffectVector m_expression; 71 FilterEffectGeometryMap m_effectGeometryMap; 66 SVGFilterExpression m_expression; 72 67 }; 73 68 -
trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp
r286466 r286578 202 202 } 203 203 204 static bool buildEffectExpression(const RefPtr<FilterEffect>& effect, FilterEffectVector& stack, FilterEffectVector& expression) 204 std::optional<FilterEffectGeometry> SVGFilterBuilder::effectGeometry(FilterEffect& effect) const 205 { 206 auto it = m_effectGeometryMap.find(effect); 207 if (it != m_effectGeometryMap.end()) 208 return it->value; 209 return std::nullopt; 210 } 211 212 bool SVGFilterBuilder::buildEffectExpression(const RefPtr<FilterEffect>& effect, FilterEffectVector& stack, SVGFilterExpression& expression) const 205 213 { 206 214 // A cycle is detected. … … 210 218 stack.append(effect); 211 219 212 expression.append( effect);220 expression.append({ *effect, effectGeometry(*effect) }); 213 221 214 222 for (auto& inputEffect : effect->inputEffects()) { … … 224 232 } 225 233 226 bool SVGFilterBuilder::buildExpression( FilterEffectVector& expression) const234 bool SVGFilterBuilder::buildExpression(SVGFilterExpression& expression) const 227 235 { 228 236 if (!m_lastEffect) -
trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h
r286466 r286578 23 23 24 24 #include "FilterEffect.h" 25 #include "SVGFilterExpression.h" 25 26 #include "SVGUnitTypes.h" 26 27 #include <wtf/HashMap.h> … … 69 70 void setupBuiltinEffects(Ref<FilterEffect> sourceGraphic); 70 71 RefPtr<FilterEffect> buildFilterEffects(SVGFilterElement&); 71 bool buildExpression(FilterEffectVector& expression) const; 72 73 FilterEffectGeometryMap takeEffectGeometryMap() { return WTFMove(m_effectGeometryMap); } 72 bool buildExpression(SVGFilterExpression&) const; 74 73 75 74 private: … … 79 78 m_effectReferences.add(effect, FilterEffectSet()); 80 79 } 80 81 std::optional<FilterEffectGeometry> effectGeometry(FilterEffect&) const; 82 bool buildEffectExpression(const RefPtr<FilterEffect>&, FilterEffectVector& stack, SVGFilterExpression&) const; 81 83 82 84 HashMap<AtomString, RefPtr<FilterEffect>> m_builtinEffects;
Note:
See TracChangeset
for help on using the changeset viewer.