Diff
Modified: trunk/Source/WebCore/ChangeLog (287781 => 287782)
--- trunk/Source/WebCore/ChangeLog 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/ChangeLog 2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,3 +1,86 @@
+2022-01-07 Said Abou-Hallawa <[email protected]>
+
+ [GPU Process] Remove the result FilterImage from FilterEffect
+ https://bugs.webkit.org/show_bug.cgi?id=232840
+ rdar://85425842
+
+ Reviewed by Darin Adler.
+
+ Removing the result FilterImage from FilterEffect will allow reusing the
+ same FilterEffect for all the renderers that reference it. The results
+ will now be stored in the new class 'FilterResults'.
+
+ -- FilterData still keeps the results of applying the Filter to its
+ renderer in a new member of type FilterResults.
+
+ -- RenderLayerFilters will not need to clear its CSSFilter intermediate
+ results because this will happen once the temporary FilterResults goes
+ out of scope.
+
+ FilterResults will have two maps:
+
+ 1. FilterEffect -> FilterImage: The value is the result FilterImage of
+ applying the FilterEffect.
+ 2. FilterImage -> FilterEffectSet: The value is a list of FilterEffects,
+ whose FilterImages depend on the key FilterImage.
+
+ * Headers.cmake:
+ * WebCore.xcodeproj/project.pbxproj:
+ * platform/graphics/ConcreteImageBuffer.h:
+ * platform/graphics/GraphicsContext.cpp:
+ (WebCore::GraphicsContext::drawFilteredImageBuffer):
+ * platform/graphics/GraphicsContext.h:
+ * platform/graphics/displaylists/DisplayListItems.cpp:
+ (WebCore::DisplayList::DrawFilteredImageBuffer::apply):
+ * platform/graphics/displaylists/DisplayListItems.h:
+ * platform/graphics/displaylists/DisplayListRecorder.cpp:
+ (WebCore::DisplayList::Recorder::drawFilteredImageBuffer):
+ * platform/graphics/displaylists/DisplayListRecorder.h:
+ * platform/graphics/filters/Filter.cpp:
+ (WebCore::Filter::apply):
+ * platform/graphics/filters/Filter.h:
+ * platform/graphics/filters/FilterEffect.cpp:
+ (WebCore::FilterEffect::apply):
+ (WebCore::FilterEffect::clearResult): Deleted.
+ (WebCore::FilterEffect::clearResultsRecursive): Deleted.
+ * platform/graphics/filters/FilterEffect.h:
+ (WebCore::FilterEffect::hasResult const): Deleted.
+ (WebCore::FilterEffect::filterImage const): Deleted.
+ * platform/graphics/filters/FilterFunction.h:
+ (WebCore::FilterFunction::apply):
+ (WebCore::FilterFunction::outsets const):
+ (WebCore::FilterFunction::clearResult): Deleted.
+ * platform/graphics/filters/FilterResults.h: Added.
+ (WebCore::FilterResults::effectResult const):
+ (WebCore::FilterResults::setEffectResult):
+ (WebCore::FilterResults::clearEffectResult):
+ * platform/network/SynchronousLoaderClient.cpp:
+ * rendering/CSSFilter.cpp:
+ (WebCore::CSSFilter::apply):
+ (WebCore::CSSFilter::clearIntermediateResults): Deleted.
+ * rendering/CSSFilter.h:
+ * rendering/RenderLayerFilters.cpp:
+ (WebCore::RenderLayerFilters::applyFilterEffect):
+ * rendering/svg/RenderSVGResourceFilter.cpp:
+ (WebCore::RenderSVGResourceFilter::postApplyResource):
+ (WebCore::RenderSVGResourceFilter::primitiveAttributeChanged):
+ * rendering/svg/RenderSVGResourceFilter.h:
+ * svg/graphics/filters/SVGFilter.cpp:
+ (WebCore::SVGFilter::apply):
+ (WebCore::SVGFilter::clearResult): Deleted.
+ * svg/graphics/filters/SVGFilter.h:
+ * svg/graphics/filters/SVGFilterBuilder.cpp:
+ (WebCore::SVGFilterBuilder::setupBuiltinEffects):
+ (WebCore::SVGFilterBuilder::buildFilterEffects):
+ (WebCore::SVGFilterBuilder::appendEffectToEffectRenderer):
+ (WebCore::SVGFilterBuilder::appendEffectToEffectReferences): Deleted.
+ (WebCore::SVGFilterBuilder::clearEffects): Deleted.
+ (WebCore::SVGFilterBuilder::clearResultsRecursive): Deleted.
+ * svg/graphics/filters/SVGFilterBuilder.h:
+ (WebCore::SVGFilterBuilder::lastEffect const): Deleted.
+ (WebCore::SVGFilterBuilder::effectReferences): Deleted.
+ (WebCore::SVGFilterBuilder::addBuiltinEffects): Deleted.
+
2022-01-07 Patrick Angle <[email protected]>
[Cocoa] Web Driver: WebSocket over TLS failing over WebDriver with acceptInsecureCerts on Big Sur
Modified: trunk/Source/WebCore/Headers.cmake (287781 => 287782)
--- trunk/Source/WebCore/Headers.cmake 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/Headers.cmake 2022-01-07 22:21:03 UTC (rev 287782)
@@ -1613,6 +1613,7 @@
platform/graphics/filters/FilterImageVector.h
platform/graphics/filters/FilterOperation.h
platform/graphics/filters/FilterOperations.h
+ platform/graphics/filters/FilterResults.h
platform/graphics/filters/LightSource.h
platform/graphics/filters/PointLightSource.h
platform/graphics/filters/SourceAlpha.h
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (287781 => 287782)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2022-01-07 22:21:03 UTC (rev 287782)
@@ -2335,6 +2335,7 @@
72B8B0352753438600F752AA /* FilterFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = 7262D756272A174100C56A09 /* FilterFunction.h */; settings = {ATTRIBUTES = (Private, ); }; };
72B8B0362753441400F752AA /* FilterImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 72435EF4273D07670005E7EE /* FilterImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
72BAC3AE23E1F0B0008D741C /* ImageBufferBackend.h in Headers */ = {isa = PBXBuildFile; fileRef = 72BAC3A523E17328008D741C /* ImageBufferBackend.h */; settings = {ATTRIBUTES = (Private, ); }; };
+ 72D73644278461A000398663 /* FilterResults.h in Headers */ = {isa = PBXBuildFile; fileRef = 7211B5D6276536820076FEF8 /* FilterResults.h */; settings = {ATTRIBUTES = (Private, ); }; };
72F667E1260C26AC00EE36AD /* DiagnosticLoggingDomain.h in Headers */ = {isa = PBXBuildFile; fileRef = 72F667DF260C264400EE36AD /* DiagnosticLoggingDomain.h */; settings = {ATTRIBUTES = (Private, ); }; };
7553CFE8108F473F00EA281E /* TimelineRecordFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 7553CFE6108F473F00EA281E /* TimelineRecordFactory.h */; };
75793E840D0CE0B3007FC0AC /* MessageEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 75793E810D0CE0B3007FC0AC /* MessageEvent.h */; };
@@ -11218,6 +11219,7 @@
71F6EE41255EDF9C00FC4C5B /* GridTrackSize.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GridTrackSize.cpp; sourceTree = "<group>"; };
71F936F71DD4F99B00922CC7 /* tracks-support.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode._javascript_; path = "tracks-support.js"; sourceTree = "<group>"; };
71FF851822A3F81F005D5959 /* NavigatorMaxTouchPoints.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NavigatorMaxTouchPoints.idl; sourceTree = "<group>"; };
+ 7211B5D6276536820076FEF8 /* FilterResults.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FilterResults.h; sourceTree = "<group>"; };
721443452240C8BA00F12FF7 /* SVGAnimatedValueProperty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedValueProperty.h; sourceTree = "<group>"; };
721443462240CAD200F12FF7 /* SVGValueProperty.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGValueProperty.h; sourceTree = "<group>"; };
7214B9B7274458FA003BE6DF /* FilterEffectVector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FilterEffectVector.h; sourceTree = "<group>"; };
@@ -26791,6 +26793,7 @@
49ECEB641499790D00CDD3A4 /* FilterOperation.h */,
49ECEB651499790D00CDD3A4 /* FilterOperations.cpp */,
49ECEB661499790D00CDD3A4 /* FilterOperations.h */,
+ 7211B5D6276536820076FEF8 /* FilterResults.h */,
84730D741248F0B300D3A9C9 /* LightSource.h */,
A1E1154513015C4E0054AC8C /* PointLightSource.cpp */,
84730D751248F0B300D3A9C9 /* PointLightSource.h */,
@@ -34386,6 +34389,7 @@
7246963E275C616700A9156A /* FilterImageVector.h in Headers */,
49ECEB6E1499790D00CDD3A4 /* FilterOperation.h in Headers */,
49ECEB701499790D00CDD3A4 /* FilterOperations.h in Headers */,
+ 72D73644278461A000398663 /* FilterResults.h in Headers */,
372C00D9129619F8005C9575 /* FindOptions.h in Headers */,
A8CFF04F0A154F09000A4234 /* FixedTableLayout.h in Headers */,
6FB7D2DD250FD828000207AA /* FlexFormattingContext.h in Headers */,
Modified: trunk/Source/WebCore/platform/graphics/ConcreteImageBuffer.h (287781 => 287782)
--- trunk/Source/WebCore/platform/graphics/ConcreteImageBuffer.h 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/ConcreteImageBuffer.h 2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2020-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -27,6 +27,7 @@
#include "Filter.h"
#include "FilterImage.h"
+#include "FilterResults.h"
#include "ImageBuffer.h"
#include "PixelBuffer.h"
@@ -146,7 +147,9 @@
return nullptr;
const_cast<ConcreteImageBuffer&>(*this).flushDrawingContext();
- auto result = filter.apply(this, { { }, logicalSize() });
+
+ FilterResults results;
+ auto result = filter.apply(this, { { }, logicalSize() }, results);
if (!result)
return nullptr;
Modified: trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp (287781 => 287782)
--- trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/GraphicsContext.cpp 2022-01-07 22:21:03 UTC (rev 287782)
@@ -631,9 +631,9 @@
ImageBuffer::drawConsuming(WTFMove(image), *this, destination, source, options);
}
-void GraphicsContext::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter)
+void GraphicsContext::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter, FilterResults& results)
{
- auto result = filter.apply(sourceImage, sourceImageRect);
+ auto result = filter.apply(sourceImage, sourceImageRect, results);
if (!result)
return;
Modified: trunk/Source/WebCore/platform/graphics/GraphicsContext.h (287781 => 287782)
--- trunk/Source/WebCore/platform/graphics/GraphicsContext.h 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/GraphicsContext.h 2022-01-07 22:21:03 UTC (rev 287782)
@@ -86,6 +86,7 @@
class AffineTransform;
class Filter;
+class FilterResults;
class FloatRoundedRect;
class Gradient;
class GraphicsContextPlatformPrivate;
@@ -452,7 +453,7 @@
WEBCORE_EXPORT void drawConsumingImageBuffer(RefPtr<ImageBuffer>, const FloatRect& destination, const ImagePaintingOptions& = { });
WEBCORE_EXPORT virtual void drawConsumingImageBuffer(RefPtr<ImageBuffer>, const FloatRect& destination, const FloatRect& source, const ImagePaintingOptions& = { });
- WEBCORE_EXPORT virtual void drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter&);
+ WEBCORE_EXPORT virtual void drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter&, FilterResults&);
virtual void drawPattern(NativeImage&, const FloatSize& imageSize, const FloatRect& destRect, const FloatRect& tileRect, const AffineTransform& patternTransform, const FloatPoint& phase, const FloatSize& spacing, const ImagePaintingOptions& = { }) = 0;
Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp (287781 => 287782)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.cpp 2022-01-07 22:21:03 UTC (rev 287782)
@@ -312,9 +312,9 @@
ASSERT_NOT_REACHED();
}
-void DrawFilteredImageBuffer::apply(GraphicsContext& context, WebCore::ImageBuffer* sourceImage)
+void DrawFilteredImageBuffer::apply(GraphicsContext& context, ImageBuffer* sourceImage, FilterResults& results)
{
- context.drawFilteredImageBuffer(sourceImage, m_sourceImageRect, m_filter);
+ context.drawFilteredImageBuffer(sourceImage, m_sourceImageRect, m_filter, results);
}
static TextStream& operator<<(TextStream& ts, const DrawFilteredImageBuffer& item)
Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h (287781 => 287782)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListItems.h 2022-01-07 22:21:03 UTC (rev 287782)
@@ -737,7 +737,7 @@
FloatRect destinationRect() const { return m_destinationRect; }
bool isValid() const { return m_imageBufferIdentifier.isValid(); }
- WEBCORE_EXPORT void apply(GraphicsContext&, WebCore::ImageBuffer&) const;
+ WEBCORE_EXPORT void apply(GraphicsContext&, ImageBuffer&) const;
NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const;
@@ -924,7 +924,7 @@
FloatRect sourceImageRect() const { return m_sourceImageRect; }
NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const;
- WEBCORE_EXPORT void apply(GraphicsContext&, WebCore::ImageBuffer* sourceImage);
+ WEBCORE_EXPORT void apply(GraphicsContext&, ImageBuffer* sourceImage, FilterResults&);
std::optional<FloatRect> globalBounds() const { return std::nullopt; }
std::optional<FloatRect> localBounds(const GraphicsContext&) const { return m_sourceImageRect; }
@@ -1039,7 +1039,7 @@
// FIXME: We might want to validate ImagePaintingOptions.
bool isValid() const { return m_imageBufferIdentifier.isValid(); }
- WEBCORE_EXPORT void apply(GraphicsContext&, WebCore::ImageBuffer&) const;
+ WEBCORE_EXPORT void apply(GraphicsContext&, ImageBuffer&) const;
NO_RETURN_DUE_TO_ASSERT void apply(GraphicsContext&) const;
Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp (287781 => 287782)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.cpp 2022-01-07 22:21:03 UTC (rev 287782)
@@ -146,12 +146,12 @@
recordSetMiterLimit(miterLimit);
}
-void Recorder::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter)
+void Recorder::drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter& filter, FilterResults& results)
{
appendStateChangeItemIfNecessary();
if (sourceImage && !canDrawImageBuffer(*sourceImage)) {
- GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
+ GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter, results);
return;
}
@@ -177,7 +177,7 @@
);
if (!isRecorded) {
- GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter);
+ GraphicsContext::drawFilteredImageBuffer(sourceImage, sourceImageRect, filter, results);
return;
}
}
Modified: trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h (287781 => 287782)
--- trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/displaylists/DisplayListRecorder.h 2022-01-07 22:21:03 UTC (rev 287782)
@@ -225,7 +225,7 @@
WEBCORE_EXPORT void applyFillPattern() final;
#endif
- WEBCORE_EXPORT void drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter&) final;
+ WEBCORE_EXPORT void drawFilteredImageBuffer(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, Filter&, FilterResults&) final;
WEBCORE_EXPORT void drawGlyphs(const Font&, const GlyphBufferGlyph*, const GlyphBufferAdvance*, unsigned numGlyphs, const FloatPoint& anchorPoint, FontSmoothingMode) final;
WEBCORE_EXPORT void drawGlyphsAndCacheFont(const Font&, const GlyphBufferGlyph*, const GlyphBufferAdvance*, unsigned count, const FloatPoint& localAnchor, FontSmoothingMode) final;
Modified: trunk/Source/WebCore/platform/graphics/filters/Filter.cpp (287781 => 287782)
--- trunk/Source/WebCore/platform/graphics/filters/Filter.cpp 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/filters/Filter.cpp 2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -81,7 +81,7 @@
return true;
}
-RefPtr<FilterImage> Filter::apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect)
+RefPtr<FilterImage> Filter::apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, FilterResults& results)
{
RefPtr<FilterImage> input;
@@ -92,7 +92,7 @@
return nullptr;
}
- auto result = apply(input.get());
+ auto result = apply(input.get(), results);
if (!result)
return nullptr;
Modified: trunk/Source/WebCore/platform/graphics/filters/Filter.h (287781 => 287782)
--- trunk/Source/WebCore/platform/graphics/filters/Filter.h 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/filters/Filter.h 2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,7 +1,7 @@
/*
* Copyright (C) 2009 Dirk Schulze <[email protected]>
* Copyright (C) 2013 Google Inc. All rights reserved.
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -32,6 +32,7 @@
class FilterEffect;
class FilterImage;
+class FilterResults;
class Filter : public FilterFunction {
using FilterFunction::apply;
@@ -65,8 +66,8 @@
bool clampFilterRegionIfNeeded();
- virtual RefPtr<FilterImage> apply(FilterImage* sourceImage) = 0;
- WEBCORE_EXPORT RefPtr<FilterImage> apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect);
+ virtual RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) = 0;
+ WEBCORE_EXPORT RefPtr<FilterImage> apply(ImageBuffer* sourceImage, const FloatRect& sourceImageRect, FilterResults&);
protected:
using FilterFunction::FilterFunction;
Modified: trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp (287781 => 287782)
--- trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp 2022-01-07 22:21:03 UTC (rev 287782)
@@ -3,7 +3,7 @@
* Copyright (C) 2009 Dirk Schulze <[email protected]>
* Copyright (C) Research In Motion Limited 2010. All rights reserved.
* Copyright (C) 2012 University of Szeged
- * Copyright (C) 2015-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2015-2022 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -27,6 +27,7 @@
#include "Filter.h"
#include "FilterEffectApplier.h"
#include "FilterEffectGeometry.h"
+#include "FilterResults.h"
#include "ImageBuffer.h"
#include "Logging.h"
#include <wtf/text/TextStream.h>
@@ -99,17 +100,17 @@
input->correctPremultipliedPixelBuffer();
}
-RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, FilterImage& input)
+RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, FilterImage& input, FilterResults& results)
{
- return apply(filter, FilterImageVector { Ref { input } });
+ return apply(filter, FilterImageVector { Ref { input } }, results);
}
-RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, const FilterImageVector& inputs, const std::optional<FilterEffectGeometry>& geometry)
+RefPtr<FilterImage> FilterEffect::apply(const Filter& filter, const FilterImageVector& inputs, FilterResults& results, const std::optional<FilterEffectGeometry>& geometry)
{
ASSERT(inputs.size() == numberOfImageInputs());
- if (m_filterImage)
- return m_filterImage;
+ if (auto result = results.effectResult(*this))
+ return result;
auto primitiveSubregion = calculatePrimitiveSubregion(filter, inputs, geometry);
auto imageRect = calculateImageRect(filter, inputs, primitiveSubregion);
@@ -126,8 +127,8 @@
if (!applier)
return nullptr;
- m_filterImage = FilterImage::create(primitiveSubregion, imageRect, absoluteImageRect, isAlphaImage, isValidPremultiplied, filter.renderingMode(), imageColorSpace);
- if (!m_filterImage)
+ auto result = FilterImage::create(primitiveSubregion, imageRect, absoluteImageRect, isAlphaImage, isValidPremultiplied, filter.renderingMode(), imageColorSpace);
+ if (!result)
return nullptr;
LOG_WITH_STREAM(Filters, stream
@@ -141,10 +142,11 @@
if (isValidPremultiplied)
correctPremultipliedInputs(inputs);
- if (!applier->apply(filter, inputs, *m_filterImage))
- m_filterImage = nullptr;
+ if (!applier->apply(filter, inputs, *result))
+ return nullptr;
- return m_filterImage;
+ results.setEffectResult(*this, inputs, { *result });
+ return result;
}
FilterEffect& FilterEffect::inputEffect(unsigned number) const
@@ -153,20 +155,6 @@
return m_inputEffects.at(number);
}
-void FilterEffect::clearResult()
-{
- m_filterImage = nullptr;
-}
-
-void FilterEffect::clearResultsRecursive()
-{
- // Clear all results, regardless that the current effect has
- // a result. Can be used if an effect is in an erroneous state.
- clearResult();
- for (auto& effect : m_inputEffects)
- effect->clearResultsRecursive();
-}
-
TextStream& FilterEffect::externalRepresentation(TextStream& ts, FilterRepresentation representation) const
{
// FIXME: We should dump the subRegions of the filter primitives here later. This isn't
Modified: trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h (287781 => 287782)
--- trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h 2022-01-07 22:21:03 UTC (rev 287782)
@@ -2,7 +2,7 @@
* Copyright (C) 2008 Alex Mathews <[email protected]>
* Copyright (C) 2009 Dirk Schulze <[email protected]>
* Copyright (C) Research In Motion Limited 2010. All rights reserved.
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -43,17 +43,12 @@
using FilterFunction::apply;
public:
- void clearResult() override;
- void clearResultsRecursive();
- bool hasResult() const { return m_filterImage; }
-
- RefPtr<FilterImage> filterImage() const { return m_filterImage; }
FilterImageVector takeImageInputs(FilterImageVector& stack) const;
FilterEffectVector& inputEffects() { return m_inputEffects; }
FilterEffect& inputEffect(unsigned) const;
- RefPtr<FilterImage> apply(const Filter&, const FilterImageVector& inputs, const std::optional<FilterEffectGeometry>& = std::nullopt);
+ RefPtr<FilterImage> apply(const Filter&, const FilterImageVector& inputs, FilterResults&, const std::optional<FilterEffectGeometry>& = std::nullopt);
const DestinationColorSpace& operatingColorSpace() const { return m_operatingColorSpace; }
virtual void setOperatingColorSpace(const DestinationColorSpace& colorSpace) { m_operatingColorSpace = colorSpace; }
@@ -83,12 +78,10 @@
virtual std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const = 0;
- RefPtr<FilterImage> apply(const Filter&, FilterImage& input) override;
+ RefPtr<FilterImage> apply(const Filter&, FilterImage& input, FilterResults&) override;
FilterEffectVector m_inputEffects;
- RefPtr<FilterImage> m_filterImage;
-
DestinationColorSpace m_operatingColorSpace { DestinationColorSpace::SRGB() };
};
Modified: trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h (287781 => 287782)
--- trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h 2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -40,6 +40,7 @@
namespace WebCore {
class Filter;
+class FilterResults;
enum class FilterRepresentation : uint8_t {
TestOutput,
@@ -96,9 +97,8 @@
virtual bool supportsCoreImageRendering() const { return false; }
#endif
- virtual RefPtr<FilterImage> apply(const Filter&, FilterImage&) { return nullptr; }
+ virtual RefPtr<FilterImage> apply(const Filter&, FilterImage&, FilterResults&) { return nullptr; }
virtual IntOutsets outsets() const { return { }; }
- virtual void clearResult() { }
virtual WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation = FilterRepresentation::TestOutput) const = 0;
Added: trunk/Source/WebCore/platform/graphics/filters/FilterResults.h (0 => 287782)
--- trunk/Source/WebCore/platform/graphics/filters/FilterResults.h (rev 0)
+++ trunk/Source/WebCore/platform/graphics/filters/FilterResults.h 2022-01-07 22:21:03 UTC (rev 287782)
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2022 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "FilterEffect.h"
+#include "FilterImageVector.h"
+#include <wtf/HashMap.h>
+#include <wtf/HashSet.h>
+
+namespace WebCore {
+
+class FilterEffect;
+class FilterImage;
+
+class FilterResults {
+public:
+ FilterResults() = default;
+
+ FilterImage* effectResult(FilterEffect& effect) const
+ {
+ return m_results.get(effect);
+ }
+
+ void setEffectResult(FilterEffect& effect, const FilterImageVector& inputs, Ref<FilterImage>&& result)
+ {
+ m_results.set({ effect }, WTFMove(result));
+
+ for (auto& input : inputs)
+ m_resultReferences.add(input, FilterEffectSet()).iterator->value.add(effect);
+ }
+
+ void clearEffectResult(FilterEffect& effect)
+ {
+ auto iterator = m_results.find(effect);
+ if (iterator == m_results.end())
+ return;
+
+ auto result = iterator->value;
+ m_results.remove(iterator);
+
+ for (auto& reference : m_resultReferences.get(result))
+ clearEffectResult(reference);
+ }
+
+private:
+ using FilterEffectSet = HashSet<Ref<FilterEffect>>;
+ HashMap<Ref<FilterEffect>, Ref<FilterImage>> m_results;
+ // The value is a list of FilterEffects, whose FilterImages depend on the key FilterImage.
+ HashMap<Ref<FilterImage>, FilterEffectSet> m_resultReferences;
+};
+
+} // namespace WebCore
Modified: trunk/Source/WebCore/rendering/CSSFilter.cpp (287781 => 287782)
--- trunk/Source/WebCore/rendering/CSSFilter.cpp 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/rendering/CSSFilter.cpp 2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2011-2022 Apple Inc. All rights reserved.
* Copyright (C) 2013 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -381,14 +381,8 @@
}
#endif
-void CSSFilter::clearIntermediateResults()
+RefPtr<FilterImage> CSSFilter::apply(FilterImage* sourceImage, FilterResults& results)
{
- for (auto& function : m_functions)
- function->clearResult();
-}
-
-RefPtr<FilterImage> CSSFilter::apply(FilterImage* sourceImage)
-{
if (!sourceImage)
return nullptr;
@@ -395,7 +389,7 @@
RefPtr<FilterImage> result = sourceImage;
for (auto& function : m_functions) {
- result = function->apply(*this, *result);
+ result = function->apply(*this, *result, results);
if (!result)
return nullptr;
}
Modified: trunk/Source/WebCore/rendering/CSSFilter.h (287781 => 287782)
--- trunk/Source/WebCore/rendering/CSSFilter.h 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/rendering/CSSFilter.h 2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011-2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2011-2022 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -27,8 +27,6 @@
#include "Filter.h"
#include "IntRectExtent.h"
-#include "LayoutRect.h"
-#include <wtf/TypeCasts.h>
namespace WebCore {
@@ -57,8 +55,7 @@
IntOutsets outsets() const final;
- void clearIntermediateResults();
- RefPtr<FilterImage> apply(FilterImage* sourceImage) final;
+ RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) final;
private:
CSSFilter(RenderingMode, const FloatSize& filterScale, ClipOperation, bool hasFilterThatMovesPixels, bool hasFilterThatShouldBeRestrictedBySecurityOrigin);
Modified: trunk/Source/WebCore/rendering/RenderLayerFilters.cpp (287781 => 287782)
--- trunk/Source/WebCore/rendering/RenderLayerFilters.cpp 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/rendering/RenderLayerFilters.cpp 2022-01-07 22:21:03 UTC (rev 287782)
@@ -222,11 +222,9 @@
ASSERT(inputContext());
inputContext()->restore();
- auto& filter = *m_filter;
+ FilterResults results;
+ destinationContext.drawFilteredImageBuffer(m_sourceImage.get(), m_filterRegion, *m_filter, results);
- destinationContext.drawFilteredImageBuffer(m_sourceImage.get(), m_filterRegion, filter);
- filter.clearIntermediateResults();
-
LOG_WITH_STREAM(Filters, stream << "RenderLayerFilters " << this << " applyFilterEffect done\n");
}
Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp (287781 => 287782)
--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.cpp 2022-01-07 22:21:03 UTC (rev 287782)
@@ -215,7 +215,7 @@
if (!filterData.boundaries.isEmpty()) {
filterData.state = FilterData::Built;
- context->drawFilteredImageBuffer(filterData.sourceGraphicBuffer.get(), filterData.drawingRegion, *filterData.filter);
+ context->drawFilteredImageBuffer(filterData.sourceGraphicBuffer.get(), filterData.drawingRegion, *filterData.filter, filterData.results);
}
LOG_WITH_STREAM(Filters, stream << "RenderSVGResourceFilter " << this << " postApplyResource done\n");
@@ -245,7 +245,7 @@
// or none of them will be changed.
if (!primitve->setFilterEffectAttribute(effect, attribute))
return;
- builder->clearResultsRecursive(*effect);
+ filterData->results.clearEffectResult(*effect);
// Repaint the image on the screen.
markClientForInvalidation(*objectFilterDataPair.key, RepaintInvalidation);
Modified: trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h (287781 => 287782)
--- trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGResourceFilter.h 2022-01-07 22:21:03 UTC (rev 287782)
@@ -23,6 +23,7 @@
#pragma once
+#include "FilterResults.h"
#include "ImageBuffer.h"
#include "RenderSVGResourceContainer.h"
#include "SVGFilter.h"
@@ -51,6 +52,7 @@
FloatRect drawingRegion;
FloatSize scale;
FilterDataState state { PaintingSource };
+ FilterResults results;
};
class GraphicsContext;
Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp (287781 => 287782)
--- trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp 2022-01-07 22:21:03 UTC (rev 287782)
@@ -2,7 +2,7 @@
* Copyright (C) 2009 Dirk Schulze <[email protected]>
* Copyright (C) Research In Motion Limited 2010. All rights reserved.
* Copyright (C) 2013 Google Inc. All rights reserved.
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -23,6 +23,7 @@
#include "config.h"
#include "SVGFilter.h"
+#include "FilterResults.h"
#include "SVGFilterBuilder.h"
#include "SVGFilterElement.h"
#include "SourceGraphic.h"
@@ -130,12 +131,12 @@
return copyToVector(effects);
}
-RefPtr<FilterImage> SVGFilter::apply(const Filter&, FilterImage& sourceImage)
+RefPtr<FilterImage> SVGFilter::apply(const Filter&, FilterImage& sourceImage, FilterResults& results)
{
- return apply(&sourceImage);
+ return apply(&sourceImage, results);
}
-RefPtr<FilterImage> SVGFilter::apply(FilterImage* sourceImage)
+RefPtr<FilterImage> SVGFilter::apply(FilterImage* sourceImage, FilterResults& results)
{
ASSERT(!m_expression.isEmpty());
@@ -146,8 +147,8 @@
auto geometry = term.geometry;
if (effect->filterType() == FilterEffect::Type::SourceGraphic) {
- if (auto result = effect->filterImage()) {
- stack.append(result.releaseNonNull());
+ if (auto result = results.effectResult(effect)) {
+ stack.append({ *result });
continue;
}
@@ -161,12 +162,7 @@
// Need to remove the inputs here in case the effect already has a result.
auto inputs = effect->takeImageInputs(stack);
- if (auto result = effect->filterImage()) {
- stack.append(result.releaseNonNull());
- continue;
- }
-
- auto result = term.effect->apply(*this, inputs, geometry);
+ auto result = term.effect->apply(*this, inputs, results, geometry);
if (!result)
return nullptr;
@@ -183,13 +179,6 @@
return lastEffect()->outsets();
}
-void SVGFilter::clearResult()
-{
- ASSERT(!m_expression.isEmpty());
- for (auto& term : m_expression)
- term.effect->clearResult();
-}
-
TextStream& SVGFilter::externalRepresentation(TextStream& ts, FilterRepresentation representation) const
{
for (auto it = m_expression.rbegin(), end = m_expression.rend(); it != end; ++it) {
Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h (287781 => 287782)
--- trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h 2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,7 +1,7 @@
/*
* Copyright (C) 2009 Dirk Schulze <[email protected]>
* Copyright (C) 2013 Google Inc. All rights reserved.
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -49,7 +49,7 @@
RefPtr<FilterEffect> lastEffect() const final;
FilterEffectVector effectsOfType(FilterFunction::Type) const final;
- RefPtr<FilterImage> apply(FilterImage* sourceImage) final;
+ RefPtr<FilterImage> apply(FilterImage* sourceImage, FilterResults&) final;
WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const final;
@@ -64,9 +64,8 @@
#endif
FloatSize resolvedSize(const FloatSize&) const final;
- RefPtr<FilterImage> apply(const Filter&, FilterImage& sourceImage) final;
+ RefPtr<FilterImage> apply(const Filter&, FilterImage& sourceImage, FilterResults&) final;
IntOutsets outsets() const final;
- void clearResult() final;
FloatRect m_targetBoundingBox;
SVGUnitTypes::SVGUnitType m_primitiveUnits;
Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp (287781 => 287782)
--- trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp 2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2009 Dirk Schulze <[email protected]>
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -41,7 +41,6 @@
{
m_builtinEffects.add(SourceGraphic::effectName(), sourceGraphic.ptr());
m_builtinEffects.add(SourceAlpha::effectName(), SourceAlpha::create(sourceGraphic));
- addBuiltinEffects();
}
static OptionSet<FilterEffectGeometry::Flags> effectGeometryFlagsForElement(SVGElement& element)
@@ -102,14 +101,11 @@
#endif
if (auto renderer = effectElement.renderer())
- appendEffectToEffectReferences(effect.copyRef(), renderer);
+ appendEffectToEffectRenderer(*effect, *renderer);
add(effectElement.result(), effect);
}
- if (!effect)
- clearEffects();
-
return effect;
}
@@ -142,46 +138,11 @@
return m_namedEffects.get(id);
}
-void SVGFilterBuilder::appendEffectToEffectReferences(RefPtr<FilterEffect>&& effect, RenderObject* object)
+void SVGFilterBuilder::appendEffectToEffectRenderer(FilterEffect& effect, RenderObject& object)
{
- // The effect must be a newly created filter effect.
- ASSERT(!m_effectReferences.contains(effect));
- ASSERT(!object || !m_effectRenderer.contains(object));
- m_effectReferences.add(effect, FilterEffectSet());
-
- unsigned numberOfInputEffects = effect->inputEffects().size();
-
- // It is not possible to add the same value to a set twice.
- for (unsigned i = 0; i < numberOfInputEffects; ++i)
- effectReferences(effect->inputEffect(i)).add(effect.get());
-
- // If object is null, that means the element isn't attached for some
- // reason, which in turn mean that certain types of invalidation will not
- // work (the LayoutObject -> FilterEffect mapping will not be defined).
- if (object)
- m_effectRenderer.add(object, effect.get());
+ m_effectRenderer.add(&object, &effect);
}
-void SVGFilterBuilder::clearEffects()
-{
- m_lastEffect = nullptr;
- m_namedEffects.clear();
- m_effectReferences.clear();
- m_effectRenderer.clear();
- addBuiltinEffects();
-}
-
-void SVGFilterBuilder::clearResultsRecursive(FilterEffect& effect)
-{
- if (!effect.hasResult())
- return;
-
- effect.clearResult();
-
- for (auto& reference : effectReferences(effect))
- clearResultsRecursive(*reference);
-}
-
std::optional<FilterEffectGeometry> SVGFilterBuilder::effectGeometry(FilterEffect& effect) const
{
auto it = m_effectGeometryMap.find(effect);
Modified: trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h (287781 => 287782)
--- trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h 2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,7 +1,7 @@
/*
* Copyright (C) 2008 Alex Mathews <[email protected]>
* Copyright (C) 2009 Dirk Schulze <[email protected]>
- * Copyright (C) 2021 Apple Inc. All rights reserved.
+ * Copyright (C) 2021-2022 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -31,6 +31,7 @@
namespace WebCore {
+class FilterEffect;
class RenderObject;
class SVGFilterElement;
@@ -37,8 +38,6 @@
class SVGFilterBuilder {
WTF_MAKE_FAST_ALLOCATED;
public:
- typedef HashSet<FilterEffect*> FilterEffectSet;
-
SVGFilterBuilder() = default;
void setTargetBoundingBox(const FloatRect& r) { m_targetBoundingBox = r; }
@@ -48,44 +47,22 @@
void setPrimitiveUnits(SVGUnitTypes::SVGUnitType units) { m_primitiveUnits = units; }
void add(const AtomString& id, RefPtr<FilterEffect>);
-
RefPtr<FilterEffect> getEffectById(const AtomString&) const;
- FilterEffect* lastEffect() const { return m_lastEffect.get(); }
- void appendEffectToEffectReferences(RefPtr<FilterEffect>&&, RenderObject*);
-
- inline FilterEffectSet& effectReferences(FilterEffect& effect)
- {
- // Only allowed for effects belongs to this builder.
- ASSERT(m_effectReferences.contains(&effect));
- return m_effectReferences.find(&effect)->value;
- }
-
// Required to change the attributes of a filter during an svgAttributeChanged.
+ void appendEffectToEffectRenderer(FilterEffect&, RenderObject&);
inline FilterEffect* effectByRenderer(RenderObject* object) { return m_effectRenderer.get(object); }
- void clearEffects();
- void clearResultsRecursive(FilterEffect&);
-
void setupBuiltinEffects(Ref<FilterEffect> sourceGraphic);
RefPtr<FilterEffect> buildFilterEffects(SVGFilterElement&);
bool buildExpression(SVGFilterExpression&) const;
private:
- inline void addBuiltinEffects()
- {
- for (auto& effect : m_builtinEffects.values())
- m_effectReferences.add(effect, FilterEffectSet());
- }
-
std::optional<FilterEffectGeometry> effectGeometry(FilterEffect&) const;
bool buildEffectExpression(FilterEffect&, FilterEffectVector& stack, unsigned level, SVGFilterExpression&) const;
HashMap<AtomString, RefPtr<FilterEffect>> m_builtinEffects;
HashMap<AtomString, RefPtr<FilterEffect>> m_namedEffects;
- // The value is a list, which contains those filter effects,
- // which depends on the key filter effect.
- HashMap<RefPtr<FilterEffect>, FilterEffectSet> m_effectReferences;
HashMap<RenderObject*, FilterEffect*> m_effectRenderer;
RefPtr<FilterEffect> m_lastEffect;
Modified: trunk/Source/WebKit/ChangeLog (287781 => 287782)
--- trunk/Source/WebKit/ChangeLog 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebKit/ChangeLog 2022-01-07 22:21:03 UTC (rev 287782)
@@ -1,3 +1,14 @@
+2022-01-07 Said Abou-Hallawa <[email protected]>
+
+ [GPU Process] Remove the result FilterImage from FilterEffect
+ https://bugs.webkit.org/show_bug.cgi?id=232840
+ rdar://85425842
+
+ Reviewed by Darin Adler.
+
+ * GPUProcess/graphics/RemoteDisplayListRecorder.cpp:
+ (WebKit::RemoteDisplayListRecorder::drawFilteredImageBuffer):
+
2022-01-07 Patrick Angle <[email protected]>
[Cocoa] Web Driver: WebSocket over TLS failing over WebDriver with acceptInsecureCerts on Big Sur
Modified: trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp (287781 => 287782)
--- trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp 2022-01-07 21:52:15 UTC (rev 287781)
+++ trunk/Source/WebKit/GPUProcess/graphics/RemoteDisplayListRecorder.cpp 2022-01-07 22:21:03 UTC (rev 287782)
@@ -30,6 +30,7 @@
#include "RemoteDisplayListRecorderMessages.h"
#include <WebCore/BitmapImage.h>
+#include <WebCore/FilterResults.h>
namespace WebKit {
using namespace WebCore;
@@ -255,7 +256,8 @@
}
}
- handleItem(DisplayList::DrawFilteredImageBuffer(sourceImageIdentifier, sourceImageRect, WTFMove(filter)), sourceImage.get());
+ FilterResults results;
+ handleItem(DisplayList::DrawFilteredImageBuffer(sourceImageIdentifier, sourceImageRect, WTFMove(filter)), sourceImage.get(), results);
}
void RemoteDisplayListRecorder::drawGlyphs(DisplayList::DrawGlyphs&& item)