⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 286578 in webkit


Ignore:
Timestamp:
Dec 6, 2021, 4:36:58 PM (5 years ago)
Author:
Said Abou-Hallawa
Message:

[GPU Process] Make FilterEffect calculate the primitive subregion only when needed
https://bugs.webkit.org/show_bug.cgi?id=232705
rdar://85290142

Reviewed by Cameron McCormack.

In this patch:

  1. resultColorSpace() will return colorSpace() from a FilterImageVector instead of returning the resultColorSpace() of the FilterEffect.
  1. Filter::clampFilterRegionIfNeeded() will clamp the filterRegion() instead of clamping the maxEffectRect of the lastEffect() since all the primitiveSubregions and the imageRects have to clipped to the filterRegion().
  1. determineFilterPrimitiveSubregion() is replaced by calculatePrimitiveSubregion() which will calculate the primitiveSubregion from a FilterImageVector and an optional FilterEffectGeometry.
  1. Many of FilterEffects are made protected instead of having them public.
  1. SVGFilterExpression will be defined as a Vector of SVGFilterExpressionTerm which is a struct of FilterEffect and optional FilterEffectGeometry.
  1. SVGFilter will replace the members whose types are FilterEffectVector and FilterEffectGeometryMap with a single member of type SVGFilterExpression.
  • Headers.cmake:
  • WebCore.xcodeproj/project.pbxproj:
  • platform/graphics/filters/FEDisplacementMap.cpp:

(WebCore::FEDisplacementMap::resultColorSpace const):

  • platform/graphics/filters/FEDisplacementMap.h:
  • platform/graphics/filters/Filter.cpp:

(WebCore::Filter::clampFilterRegionIfNeeded):

  • platform/graphics/filters/Filter.h:

(WebCore::Filter::effectGeometry const): Deleted.

  • platform/graphics/filters/FilterEffect.cpp:

(WebCore::FilterEffect::calculatePrimitiveSubregion const):
(WebCore::FilterEffect::apply):
(WebCore::FilterEffect::externalRepresentation const):
(WebCore::FilterEffect::determineFilterPrimitiveSubregion): Deleted.

  • platform/graphics/filters/FilterEffect.h:

(WebCore::FilterEffect::resultColorSpace const):
(WebCore::FilterEffect::filterPrimitiveSubregion const): Deleted.
(WebCore::FilterEffect::setFilterPrimitiveSubregion): Deleted.

  • platform/graphics/filters/FilterFunction.h:

(WebCore::FilterFunction::apply):

  • svg/graphics/filters/SVGFilter.cpp:

(WebCore::SVGFilter::create):
(WebCore::SVGFilter::supportsCoreImageRendering const):
(WebCore::SVGFilter::lastEffect const):
(WebCore::SVGFilter::apply):
(WebCore::SVGFilter::clearResult):
(WebCore::SVGFilter::effectGeometry const): Deleted.

  • svg/graphics/filters/SVGFilter.h:
  • svg/graphics/filters/SVGFilterBuilder.cpp:

(WebCore::SVGFilterBuilder::effectGeometry const):
(WebCore::SVGFilterBuilder::buildEffectExpression const):
(WebCore::SVGFilterBuilder::buildExpression const):
(WebCore::buildEffectExpression): Deleted.

  • svg/graphics/filters/SVGFilterBuilder.h:

(WebCore::SVGFilterBuilder::takeEffectGeometryMap): Deleted.

  • svg/graphics/filters/SVGFilterExpression.h: Added.
Location:
trunk/Source/WebCore
Files:
1 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r286569 r286578  
     12021-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
    1682021-12-06  Ryan Haddad  <ryanhaddad@apple.com>
    269
  • trunk/Source/WebCore/Headers.cmake

    r286568 r286578  
    19111911
    19121912    svg/graphics/filters/SVGFilter.h
     1913    svg/graphics/filters/SVGFilterExpression.h
    19131914
    19141915    svg/properties/SVGList.h
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r286568 r286578  
    23192319                7299BC6823D6A53E00CC6883 /* RenderingMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 7299BC6623D686C600CC6883 /* RenderingMode.h */; settings = {ATTRIBUTES = (Private, ); }; };
    23202320                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, ); }; };
    23212322                72A73BEF245A3F90001C9D03 /* AnimationFrameRate.h in Headers */ = {isa = PBXBuildFile; fileRef = 722A815C238FD50500C00583 /* AnimationFrameRate.h */; settings = {ATTRIBUTES = (Private, ); }; };
    23222323                72B8B0352753438600F752AA /* FilterFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 7262D756272A174100C56A09 /* FilterFunction.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1120111202                7266F029224312B100833975 /* SVGAnimationAdditiveListFunction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAnimationAdditiveListFunction.h; sourceTree = "<group>"; };
    1120211203                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>"; };
    1120311205                726D56E1253AE0430002EF90 /* PlatformImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformImage.h; sourceTree = "<group>"; };
    1120411206                727AFED11A2EA6A0000442E8 /* EXTsRGB.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EXTsRGB.cpp; sourceTree = "<group>"; };
     
    2844828450                                081EBF380FD34F4100DA7559 /* SVGFilterBuilder.cpp */,
    2844928451                                081EBF390FD34F4100DA7559 /* SVGFilterBuilder.h */,
     28452                                726CDE25275B489700A445B2 /* SVGFilterExpression.h */,
    2845028453                        );
    2845128454                        path = filters;
     
    3715037153                                081EBF3B0FD34F4100DA7559 /* SVGFilterBuilder.h in Headers */,
    3715137154                                B2227A0C0D00BF220071B782 /* SVGFilterElement.h in Headers */,
     37155                                72A5D192275E8FFE0065833E /* SVGFilterExpression.h in Headers */,
    3715237156                                B2227A0F0D00BF220071B782 /* SVGFilterPrimitiveStandardAttributes.h in Headers */,
    3715337157                                B2227A120D00BF220071B782 /* SVGFitToViewBox.h in Headers */,
  • trunk/Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp

    r286287 r286578  
    6969}
    7070
    71 const DestinationColorSpace& FEDisplacementMap::resultColorSpace() const
     71const DestinationColorSpace& FEDisplacementMap::resultColorSpace(const FilterImageVector& inputs) const
    7272{
    7373    // Spec: The 'color-interpolation-filters' property only applies to the 'in2' source image
     
    7575    // current color space.
    7676    // The result is in that same color space because it is a displacement of the 'in' image.
    77     return inputEffect(0)->resultColorSpace();
     77    return inputs[0]->colorSpace();
    7878}
    7979
  • trunk/Source/WebCore/platform/graphics/filters/FEDisplacementMap.h

    r286538 r286578  
    5555    FEDisplacementMap(ChannelSelectorType xChannelSelector, ChannelSelectorType yChannelSelector, float);
    5656
    57     const DestinationColorSpace& resultColorSpace() const override;
     57    const DestinationColorSpace& resultColorSpace(const FilterImageVector&) const override;
    5858    void transformResultColorSpace(FilterEffect*, const int) override;
    5959
  • trunk/Source/WebCore/platform/graphics/filters/Filter.cpp

    r286546 r286578  
    7272bool Filter::clampFilterRegionIfNeeded()
    7373{
    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);
    7975
    8076    FloatSize clampingScale(1, 1);
    81     if (!ImageBuffer::sizeNeedsClamping(scaledMaxEffectRect.size(), clampingScale))
     77    if (!ImageBuffer::sizeNeedsClamping(scaledFilterRegion.size(), clampingScale))
    8278        return false;
    8379
    8480    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);
    8981    return true;
    9082}
  • trunk/Source/WebCore/platform/graphics/filters/Filter.h

    r286546 r286578  
    6464    FloatRect scaledByFilterScale(const FloatRect&) const;
    6565
    66     virtual std::optional<FilterEffectGeometry> effectGeometry(FilterEffect&) const { return std::nullopt; }
    67 
    6866    FloatRect maxEffectRect(const FloatRect& primitiveSubregion) const;
    6967    FloatRect clipToMaxEffectRect(const FloatRect& imageRect, const FloatRect& primitiveSubregion) const;
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp

    r286526 r286578  
    2727#include "Filter.h"
    2828#include "FilterEffectApplier.h"
     29#include "FilterEffectGeometry.h"
    2930#include "ImageBuffer.h"
    3031#include "Logging.h"
     
    4142}
    4243
    43 FloatRect FilterEffect::determineFilterPrimitiveSubregion(const Filter& filter)
     44FloatRect FilterEffect::calculatePrimitiveSubregion(const Filter& filter, const FilterImageVector& inputs, const std::optional<FilterEffectGeometry>& geometry) const
    4445{
    4546    // This function implements https://www.w3.org/TR/filter-effects-1/#FilterPrimitiveSubRegion.
    4647    FloatRect primitiveSubregion;
    4748
    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());
    5453    } else
    5554        primitiveSubregion = filter.filterRegion();
    5655
    57     // Don't use the input's subregion for FETile.
    58     if (filterType() == FilterEffect::Type::FETile)
    59         primitiveSubregion = filter.filterRegion();
    60    
    6156    // Clip the primitive subregion to the effect geometry.
    62     if (auto geometry = filter.effectGeometry(*this)) {
     57    if (geometry) {
    6358        if (auto x = geometry->x())
    6459            primitiveSubregion.setX(*x);
     
    7166    }
    7267
    73     setFilterPrimitiveSubregion(primitiveSubregion);
    7468    return primitiveSubregion;
    7569}
     
    8175}
    8276
    83 bool FilterEffect::apply(const Filter& filter)
     77bool FilterEffect::apply(const Filter& filter, const std::optional<FilterEffectGeometry>& geometry)
    8478{
    8579    if (hasResult())
     
    10195
    10296    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);
    104100    auto absoluteImageRect = enclosingIntRect(filter.scaledByFilterScale(imageRect));
    105101
     
    108104   
    109105    auto isAlphaImage = resultIsAlphaImage(inputFilterImages);
    110     auto imageColorSpace = resultColorSpace();
     106    auto imageColorSpace = resultColorSpace(inputFilterImages);
    111107
    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);
    113109    if (!m_filterImage)
    114110        return false;
     
    120116    LOG_WITH_STREAM(Filters, stream
    121117        << "FilterEffect " << filterName() << " " << this << " apply():"
    122         << "\n  filterPrimitiveSubregion " << m_filterPrimitiveSubregion
     118        << "\n  filterPrimitiveSubregion " << primitiveSubregion
    123119        << "\n  absolutePaintRect " << absoluteImageRect
    124         << "\n  maxEffectRect " << filter.scaledByFilterScale(filter.maxEffectRect(m_filterPrimitiveSubregion))
     120        << "\n  maxEffectRect " << filter.maxEffectRect(primitiveSubregion)
    125121        << "\n  filter scale " << filter.filterScale());
    126122
     
    174170        TextStream::IndentScope indentScope(ts);
    175171        ts.dumpProperty("operating colorspace", operatingColorSpace());
    176         ts.dumpProperty("result colorspace", resultColorSpace());
    177172        ts << "\n" << indent;
    178173    }
  • trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h

    r286526 r286578  
    3838class Filter;
    3939class FilterEffectApplier;
     40class FilterEffectGeometry;
    4041
    4142class FilterEffect : public FilterFunction {
     
    4647
    4748    FilterImage* filterImage() const { return m_filterImage.get(); }
    48     FilterImageVector inputFilterImages() const;
    49 
    50     void correctPremultipliedResultIfNeeded();
    5149
    5250    FilterEffectVector& inputEffects() { return m_inputEffects; }
     
    5452    unsigned numberOfEffectInputs() const { return m_inputEffects.size(); }
    5553
    56     // Recurses on inputs.
    57     FloatRect determineFilterPrimitiveSubregion(const Filter&);
     54    void transformResultColorSpace(const DestinationColorSpace&);
    5855
    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
     64protected:
     65    using FilterFunction::FilterFunction;
     66
     67    virtual bool mayProduceInvalidPremultipliedPixels() const { return false; }
     68
     69    void correctPremultipliedResultIfNeeded();
    6070
    6171    // Correct any invalid pixels, if necessary, in the result of a filter operation.
     
    6474    virtual void correctFilterResultIfNeeded() { }
    6575
    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); }
    6877
    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;
    7181
    7282    virtual FloatRect calculateImageRect(const Filter&, const FilterImageVector& inputs, const FloatRect& primitiveSubregion) const;
    7383
    74     const DestinationColorSpace& operatingColorSpace() const { return m_operatingColorSpace; }
    75     virtual void setOperatingColorSpace(const DestinationColorSpace& colorSpace) { m_operatingColorSpace = colorSpace; }
    76 
    7784    // Solid black image with different alpha values.
    7885    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; }
    8087
    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    
    8988    virtual std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const = 0;
    9089
    91 private:
    9290    FilterEffectVector m_inputEffects;
    9391
    9492    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;
    9993
    10094    DestinationColorSpace m_operatingColorSpace { DestinationColorSpace::SRGB() };
  • trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h

    r286193 r286578  
    2626#pragma once
    2727
     28#include "FilterEffectGeometry.h"
    2829#include "FloatRect.h"
    2930#include "IntRectExtent.h"
     
    8990#endif
    9091
    91     virtual bool apply(const Filter&) { return false; }
     92    virtual bool apply(const Filter&, const std::optional<FilterEffectGeometry>& = std::nullopt) { return false; }
    9293    virtual IntOutsets outsets() const { return { }; }
    9394    virtual void clearResult() { }
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp

    r286546 r286578  
    5555        return nullptr;
    5656
    57     FilterEffectVector expression;
     57    SVGFilterExpression expression;
    5858    if (!builder.buildExpression(expression))
    5959        return nullptr;
     
    6161    ASSERT(!expression.isEmpty());
    6262    filter->setExpression(WTFMove(expression));
    63 
    64     filter->setEffectGeometryMap(builder.takeEffectGeometryMap());
    6563
    6664#if USE(CORE_IMAGE)
     
    9189
    9290    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())
    9593            return false;
    9694    }
     
    10098#endif
    10199
    102 std::optional<FilterEffectGeometry> SVGFilter::effectGeometry(FilterEffect& effect) const
     100RefPtr<FilterEffect> SVGFilter::lastEffect() const
    103101{
    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();
    108105}
    109106
    110 bool SVGFilter::apply(const Filter& filter)
     107bool SVGFilter::apply(const Filter& filter, const std::optional<FilterEffectGeometry>&)
    111108{
    112109    setSourceImage({ filter.sourceImage() });
     
    117114{
    118115    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))
    121118            return nullptr;
    122119    }
     
    133130{
    134131    ASSERT(!m_expression.isEmpty());
    135     for (auto& effect : m_expression)
    136         effect->clearResult();
     132    for (auto& term : m_expression)
     133        term.effect->clearResult();
    137134}
    138135
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h

    r286546 r286578  
    2323
    2424#include "Filter.h"
    25 #include "FilterEffectVector.h"
    2625#include "FloatRect.h"
     26#include "SVGFilterExpression.h"
    2727#include "SVGUnitTypes.h"
    2828#include <wtf/Ref.h>
     
    4343    FloatRect targetBoundingBox() const { return m_targetBoundingBox; }
    4444
    45     RefPtr<FilterEffect> lastEffect() const final { return !m_expression.isEmpty() ? m_expression.last() : nullptr; }
     45    RefPtr<FilterEffect> lastEffect() const final;
    4646
    4747    RefPtr<FilterImage> apply() final;
     
    5050    SVGFilter(RenderingMode, const FloatSize& filterScale, ClipOperation, const FloatRect& filterRegion, const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits);
    5151
    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); }
    5553
    5654#if USE(CORE_IMAGE)
    5755    bool supportsCoreImageRendering() const final;
    5856#endif
    59     std::optional<FilterEffectGeometry> effectGeometry(FilterEffect&) const final;
    6057    FloatSize resolvedSize(const FloatSize&) const final;
    6158
    62     bool apply(const Filter&) final;
     59    bool apply(const Filter&, const std::optional<FilterEffectGeometry>& = std::nullopt) final;
    6360    IntOutsets outsets() const final;
    6461    void clearResult() final;
     
    6764    SVGUnitTypes::SVGUnitType m_primitiveUnits;
    6865
    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;
    7267};
    7368
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp

    r286466 r286578  
    202202}
    203203
    204 static bool buildEffectExpression(const RefPtr<FilterEffect>& effect, FilterEffectVector& stack, FilterEffectVector& expression)
     204std::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
     212bool SVGFilterBuilder::buildEffectExpression(const RefPtr<FilterEffect>& effect, FilterEffectVector& stack, SVGFilterExpression& expression) const
    205213{
    206214    // A cycle is detected.
     
    210218    stack.append(effect);
    211219   
    212     expression.append(effect);
     220    expression.append({ *effect, effectGeometry(*effect) });
    213221
    214222    for (auto& inputEffect : effect->inputEffects()) {
     
    224232}
    225233
    226 bool SVGFilterBuilder::buildExpression(FilterEffectVector& expression) const
     234bool SVGFilterBuilder::buildExpression(SVGFilterExpression& expression) const
    227235{
    228236    if (!m_lastEffect)
  • trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h

    r286466 r286578  
    2323
    2424#include "FilterEffect.h"
     25#include "SVGFilterExpression.h"
    2526#include "SVGUnitTypes.h"
    2627#include <wtf/HashMap.h>
     
    6970    void setupBuiltinEffects(Ref<FilterEffect> sourceGraphic);
    7071    RefPtr<FilterEffect> buildFilterEffects(SVGFilterElement&);
    71     bool buildExpression(FilterEffectVector& expression) const;
    72 
    73     FilterEffectGeometryMap takeEffectGeometryMap() { return WTFMove(m_effectGeometryMap); }
     72    bool buildExpression(SVGFilterExpression&) const;
    7473
    7574private:
     
    7978            m_effectReferences.add(effect, FilterEffectSet());
    8079    }
     80
     81    std::optional<FilterEffectGeometry> effectGeometry(FilterEffect&) const;
     82    bool buildEffectExpression(const RefPtr<FilterEffect>&, FilterEffectVector& stack, SVGFilterExpression&) const;
    8183
    8284    HashMap<AtomString, RefPtr<FilterEffect>> m_builtinEffects;
Note: See TracChangeset for help on using the changeset viewer.