Skip to content

Commit

Permalink
Port Filter, CSSFilter & SVGFilter to the new IPC serialization format
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=266021

Reviewed by Alex Christensen.

* Source/WebCore/rendering/CSSFilter.cpp:
(WebCore::CSSFilter::create):
* Source/WebCore/rendering/CSSFilter.h:
* Source/WebCore/svg/graphics/filters/SVGFilter.cpp:
(WebCore::SVGFilter::create):
* Source/WebCore/svg/graphics/filters/SVGFilter.h:
* Source/WebKit/Shared/WebCoreArgumentCoders.cpp:
(IPC::ArgumentCoder<CSSFilter>::encode): Deleted.
(IPC::ArgumentCoder<CSSFilter>::decode): Deleted.
(IPC::ArgumentCoder<SVGFilter>::encode): Deleted.
(IPC::ArgumentCoder<SVGFilter>::decode): Deleted.
(IPC::ArgumentCoder<Filter>::encode): Deleted.
(IPC::ArgumentCoder<Filter>::decode): Deleted.
* Source/WebKit/Shared/WebCoreArgumentCoders.h:
* Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in:

Canonical link: https://commits.webkit.org/271739@main
  • Loading branch information
cdumez committed Dec 8, 2023
1 parent de2c00f commit 1f9e3fc
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 184 deletions.
20 changes: 18 additions & 2 deletions Source/WebCore/rendering/CSSFilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,18 @@ RefPtr<CSSFilter> CSSFilter::create(RenderElement& renderer, const FilterOperati
return filter;
}

RefPtr<CSSFilter> CSSFilter::create(Vector<Ref<FilterFunction>>&& functions)
Ref<CSSFilter> CSSFilter::create(Vector<Ref<FilterFunction>>&& functions)
{
return adoptRef(new CSSFilter(WTFMove(functions)));
return adoptRef(*new CSSFilter(WTFMove(functions)));
}

Ref<CSSFilter> CSSFilter::create(Vector<Ref<FilterFunction>>&& functions, OptionSet<FilterRenderingMode> filterRenderingModes, const FloatSize& filterScale, const FloatRect& filterRegion)
{
Ref filter = adoptRef(*new CSSFilter(WTFMove(functions), filterScale, filterRegion));
// Setting filter rendering modes cannot be moved to the constructor because it ends up
// calling supportedFilterRenderingModes() which is a virtual function.
filter->setFilterRenderingModes(filterRenderingModes);
return filter;
}

CSSFilter::CSSFilter(const FloatSize& filterScale, bool hasFilterThatMovesPixels, bool hasFilterThatShouldBeRestrictedBySecurityOrigin)
Expand All @@ -78,6 +87,13 @@ CSSFilter::CSSFilter(Vector<Ref<FilterFunction>>&& functions)
{
}

CSSFilter::CSSFilter(Vector<Ref<FilterFunction>>&& functions, const FloatSize& filterScale, const FloatRect& filterRegion)
: Filter(Type::CSSFilter, filterScale, filterRegion)
, m_functions(WTFMove(functions))
{
clampFilterRegionIfNeeded();
}

static RefPtr<FilterEffect> createBlurEffect(const BlurFilterOperation& blurOperation)
{
float stdDeviation = floatValueForLength(blurOperation.stdDeviation(), 0);
Expand Down
4 changes: 3 additions & 1 deletion Source/WebCore/rendering/CSSFilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ class CSSFilter final : public Filter {
WTF_MAKE_FAST_ALLOCATED;
public:
static RefPtr<CSSFilter> create(RenderElement&, const FilterOperations&, OptionSet<FilterRenderingMode> preferredFilterRenderingModes, const FloatSize& filterScale, const FloatRect& targetBoundingBox, const GraphicsContext& destinationContext);
WEBCORE_EXPORT static RefPtr<CSSFilter> create(Vector<Ref<FilterFunction>>&&);
WEBCORE_EXPORT static Ref<CSSFilter> create(Vector<Ref<FilterFunction>>&&);
WEBCORE_EXPORT static Ref<CSSFilter> create(Vector<Ref<FilterFunction>>&&, OptionSet<FilterRenderingMode>, const FloatSize& filterScale, const FloatRect& filterRegion);

const Vector<Ref<FilterFunction>>& functions() const { return m_functions; }

Expand All @@ -58,6 +59,7 @@ class CSSFilter final : public Filter {
private:
CSSFilter(const FloatSize& filterScale, bool hasFilterThatMovesPixels, bool hasFilterThatShouldBeRestrictedBySecurityOrigin);
CSSFilter(Vector<Ref<FilterFunction>>&&);
CSSFilter(Vector<Ref<FilterFunction>>&&, const FloatSize& filterScale, const FloatRect& filterRegion);

bool buildFilterFunctions(RenderElement&, const FilterOperations&, OptionSet<FilterRenderingMode> preferredFilterRenderingModes, const FloatRect& targetBoundingBox, const GraphicsContext& destinationContext);

Expand Down
20 changes: 19 additions & 1 deletion Source/WebCore/svg/graphics/filters/SVGFilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,20 @@ RefPtr<SVGFilter> SVGFilter::create(SVGFilterElement& filterElement, OptionSet<F
return filter;
}

RefPtr<SVGFilter> SVGFilter::create(const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits, SVGFilterExpression&& expression, FilterEffectVector&& effects, std::optional<RenderingResourceIdentifier> renderingResourceIdentifier)
Ref<SVGFilter> SVGFilter::create(const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits, SVGFilterExpression&& expression, FilterEffectVector&& effects, std::optional<RenderingResourceIdentifier> renderingResourceIdentifier)
{
return adoptRef(*new SVGFilter(targetBoundingBox, primitiveUnits, WTFMove(expression), WTFMove(effects), renderingResourceIdentifier));
}

Ref<SVGFilter> SVGFilter::create(const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits, SVGFilterExpression&& expression, FilterEffectVector&& effects, std::optional<RenderingResourceIdentifier> renderingResourceIdentifier, OptionSet<FilterRenderingMode> filterRenderingModes, const FloatSize& filterScale, const FloatRect& filterRegion)
{
Ref filter = adoptRef(*new SVGFilter(targetBoundingBox, primitiveUnits, WTFMove(expression), WTFMove(effects), renderingResourceIdentifier, filterScale, filterRegion));
// Setting filter rendering modes cannot be moved to the constructor because it ends up
// calling supportedFilterRenderingModes() which is a virtual function.
filter->setFilterRenderingModes(filterRenderingModes);
return filter;
}

SVGFilter::SVGFilter(const FloatSize& filterScale, const FloatRect& filterRegion, const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits, std::optional<RenderingResourceIdentifier> renderingResourceIdentifier)
: Filter(Filter::Type::SVGFilter, filterScale, filterRegion, renderingResourceIdentifier)
, m_targetBoundingBox(targetBoundingBox)
Expand All @@ -76,6 +85,15 @@ SVGFilter::SVGFilter(const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitTy
{
}

SVGFilter::SVGFilter(const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits, SVGFilterExpression&& expression, FilterEffectVector&& effects, std::optional<RenderingResourceIdentifier> renderingResourceIdentifier, const FloatSize& filterScale, const FloatRect& filterRegion)
: Filter(Filter::Type::SVGFilter, filterScale, filterRegion, renderingResourceIdentifier)
, m_targetBoundingBox(targetBoundingBox)
, m_primitiveUnits(primitiveUnits)
, m_expression(WTFMove(expression))
, m_effects(WTFMove(effects))
{
}

static std::optional<std::tuple<SVGFilterEffectsGraph, FilterEffectGeometryMap>> buildFilterEffectsGraph(SVGFilterElement& filterElement, const SVGFilter& filter, const GraphicsContext& destinationContext)
{
if (filterElement.countChildNodes() > maxCountChildNodes)
Expand Down
4 changes: 3 additions & 1 deletion Source/WebCore/svg/graphics/filters/SVGFilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ class SVGFilterElement;
class SVGFilter final : public Filter {
public:
static RefPtr<SVGFilter> create(SVGFilterElement&, OptionSet<FilterRenderingMode> preferredFilterRenderingModes, const FloatSize& filterScale, const FloatRect& filterRegion, const FloatRect& targetBoundingBox, const GraphicsContext& destinationContext, std::optional<RenderingResourceIdentifier> = std::nullopt);
WEBCORE_EXPORT static RefPtr<SVGFilter> create(const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits, SVGFilterExpression&&, FilterEffectVector&&, std::optional<RenderingResourceIdentifier>);
WEBCORE_EXPORT static Ref<SVGFilter> create(const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits, SVGFilterExpression&&, FilterEffectVector&&, std::optional<RenderingResourceIdentifier>);
WEBCORE_EXPORT static Ref<SVGFilter> create(const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits, SVGFilterExpression&&, FilterEffectVector&&, std::optional<RenderingResourceIdentifier>, OptionSet<FilterRenderingMode>, const FloatSize& filterScale, const FloatRect& filterRegion);

static bool isIdentity(SVGFilterElement&);
static IntOutsets calculateOutsets(SVGFilterElement&, const FloatRect& targetBoundingBox);
Expand All @@ -65,6 +66,7 @@ class SVGFilter final : public Filter {
private:
SVGFilter(const FloatSize& filterScale, const FloatRect& filterRegion, const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits, std::optional<RenderingResourceIdentifier>);
SVGFilter(const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits, SVGFilterExpression&&, FilterEffectVector&&, std::optional<RenderingResourceIdentifier>);
SVGFilter(const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits, SVGFilterExpression&&, FilterEffectVector&&, std::optional<RenderingResourceIdentifier>, const FloatSize& filterScale, const FloatRect& filterRegion);

static std::optional<std::tuple<SVGFilterExpression, FilterEffectVector>> buildExpression(SVGFilterElement&, const SVGFilter&, const GraphicsContext& destinationContext);
void setExpression(SVGFilterExpression&& expression) { m_expression = WTFMove(expression); }
Expand Down
158 changes: 0 additions & 158 deletions Source/WebKit/Shared/WebCoreArgumentCoders.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1326,164 +1326,6 @@ std::optional<Ref<FilterEffect>> ArgumentCoder<FilterEffect>::decode(Decoder& de
return std::nullopt;
}

template<typename Encoder>
void ArgumentCoder<CSSFilter>::encode(Encoder& encoder, const CSSFilter& filter)
{
encoder << filter.functions().size();
for (auto& function : filter.functions())
encoder << function;
}

template
void ArgumentCoder<CSSFilter>::encode<Encoder>(Encoder&, const CSSFilter&);
template
void ArgumentCoder<CSSFilter>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, const CSSFilter&);

std::optional<Ref<CSSFilter>> ArgumentCoder<CSSFilter>::decode(Decoder& decoder)
{
std::optional<size_t> size;
decoder >> size;
if (!size || !*size)
return std::nullopt;

Vector<Ref<FilterFunction>> functions;
functions.reserveInitialCapacity(*size);

for (size_t i = 0; i < *size; ++i) {
std::optional<Ref<FilterFunction>> function;

decoder >> function;
if (!function)
return std::nullopt;

functions.append(WTFMove(*function));
}

auto filter = CSSFilter::create(WTFMove(functions));
if (!filter)
return std::nullopt;

return filter.releaseNonNull();
}

template<typename Encoder>
void ArgumentCoder<SVGFilter>::encode(Encoder& encoder, const SVGFilter& filter)
{
encoder << filter.targetBoundingBox();
encoder << filter.primitiveUnits();

encoder << filter.expression();
encoder << filter.effects();

encoder << filter.renderingResourceIdentifierIfExists();
}

template
void ArgumentCoder<SVGFilter>::encode<Encoder>(Encoder&, const SVGFilter&);
template
void ArgumentCoder<SVGFilter>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, const SVGFilter&);

std::optional<Ref<SVGFilter>> ArgumentCoder<SVGFilter>::decode(Decoder& decoder)
{
std::optional<FloatRect> targetBoundingBox;
decoder >> targetBoundingBox;
if (!targetBoundingBox)
return std::nullopt;

std::optional<SVGUnitTypes::SVGUnitType> primitiveUnits;
decoder >> primitiveUnits;
if (!primitiveUnits)
return std::nullopt;

std::optional<SVGFilterExpression> expression;
decoder >> expression;
if (!expression || expression->isEmpty())
return std::nullopt;

std::optional<Vector<Ref<FilterEffect>>> effects;
decoder >> effects;
if (!effects || effects->isEmpty())
return std::nullopt;

std::optional<std::optional<RenderingResourceIdentifier>> renderingResourceIdentifier;
decoder >> renderingResourceIdentifier;
if (!renderingResourceIdentifier)
return std::nullopt;

auto filter = WebCore::SVGFilter::create(*targetBoundingBox, *primitiveUnits, WTFMove(*expression), WTFMove(*effects), *renderingResourceIdentifier);
if (!filter)
return std::nullopt;

return filter.releaseNonNull();
}

template<typename Encoder>
void ArgumentCoder<Filter>::encode(Encoder& encoder, const Filter& filter)
{
encoder << filter.filterType();

if (is<CSSFilter>(filter))
encoder << downcast<CSSFilter>(filter);
else
encoder << downcast<SVGFilter>(filter);

encoder << filter.filterRenderingModes();
encoder << filter.filterScale();
encoder << filter.filterRegion();
}

template
void ArgumentCoder<Filter>::encode<Encoder>(Encoder&, const Filter&);
template
void ArgumentCoder<Filter>::encode<StreamConnectionEncoder>(StreamConnectionEncoder&, const Filter&);

std::optional<Ref<Filter>> ArgumentCoder<Filter>::decode(Decoder& decoder)
{
std::optional<FilterFunction::Type> type;
decoder >> type;
if (!type)
return std::nullopt;

std::optional<Ref<Filter>> filter;

if (*type == FilterFunction::Type::CSSFilter) {
std::optional<Ref<CSSFilter>> cssFilter;
decoder >> cssFilter;
if (!cssFilter)
return std::nullopt;

filter = WTFMove(*cssFilter);
} else {
std::optional<Ref<SVGFilter>> svgFilter;
decoder >> svgFilter;
if (!svgFilter)
return std::nullopt;

filter = WTFMove(*svgFilter);
}

std::optional<OptionSet<FilterRenderingMode>> filterRenderingModes;
decoder >> filterRenderingModes;
if (!filterRenderingModes)
return std::nullopt;

std::optional<FloatSize> filterScale;
decoder >> filterScale;
if (!filterScale)
return std::nullopt;

std::optional<FloatRect> filterRegion;
decoder >> filterRegion;
if (!filterRegion)
return std::nullopt;

(*filter)->setFilterRenderingModes(*filterRenderingModes);
(*filter)->setFilterScale(*filterScale);
(*filter)->setFilterRegion(*filterRegion);

return filter;
}

#if ENABLE(ENCRYPTED_MEDIA)
void ArgumentCoder<WebCore::CDMInstanceSession::Message>::encode(Encoder& encoder, const WebCore::CDMInstanceSession::Message& message)
{
Expand Down
21 changes: 0 additions & 21 deletions Source/WebKit/Shared/WebCoreArgumentCoders.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,11 +104,9 @@ namespace WebCore {

class AppKitControlSystemImage;
class BlobPart;
class CSSFilter;
class ControlPart;
class Credential;
class Cursor;
class Filter;
class FilterEffect;
class FilterFunction;
class FilterOperation;
Expand All @@ -121,7 +119,6 @@ class LightSource;
class PaymentInstallmentConfiguration;
class PixelBuffer;
class ResourceError;
class SVGFilter;
class ScriptBuffer;
class SerializedScriptValue;
class SharedBuffer;
Expand Down Expand Up @@ -325,24 +322,6 @@ template<> struct ArgumentCoder<WebCore::FilterEffect> {
static std::optional<Ref<WebCore::FilterEffect>> decode(Decoder&);
};

template<> struct ArgumentCoder<WebCore::CSSFilter> {
template<typename Encoder>
static void encode(Encoder&, const WebCore::CSSFilter&);
static std::optional<Ref<WebCore::CSSFilter>> decode(Decoder&);
};

template<> struct ArgumentCoder<WebCore::SVGFilter> {
template<typename Encoder>
static void encode(Encoder&, const WebCore::SVGFilter&);
static std::optional<Ref<WebCore::SVGFilter>> decode(Decoder&);
};

template<> struct ArgumentCoder<WebCore::Filter> {
template<typename Encoder>
static void encode(Encoder&, const WebCore::Filter&);
static std::optional<Ref<WebCore::Filter>> decode(Decoder&);
};

#if ENABLE(DATA_DETECTION)

template<> struct ArgumentCoder<WebCore::DataDetectorElementInfo> {
Expand Down
25 changes: 25 additions & 0 deletions Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in
Original file line number Diff line number Diff line change
Expand Up @@ -6577,6 +6577,31 @@ struct WebCore::KeypressCommand {
}
#endif

[AdditionalEncoder=StreamConnectionEncoder, RefCounted] class WebCore::Filter subclasses {
WebCore::CSSFilter
WebCore::SVGFilter
}

[AdditionalEncoder=StreamConnectionEncoder, RefCounted] class WebCore::CSSFilter {
Vector<Ref<WebCore::FilterFunction>> functions();

OptionSet<WebCore::FilterRenderingMode> filterRenderingModes();
WebCore::FloatSize filterScale();
WebCore::FloatRect filterRegion();
}

[AdditionalEncoder=StreamConnectionEncoder, RefCounted] class WebCore::SVGFilter {
WebCore::FloatRect targetBoundingBox();
WebCore::SVGUnitTypes::SVGUnitType primitiveUnits();
WebCore::SVGFilterExpression expression();
Vector<Ref<WebCore::FilterEffect>> effects();
std::optional<WebCore::RenderingResourceIdentifier> renderingResourceIdentifierIfExists();

OptionSet<WebCore::FilterRenderingMode> filterRenderingModes();
WebCore::FloatSize filterScale();
WebCore::FloatRect filterRegion();
}

[Nested] enum class WebCore::UserStyleLevel : bool;

header: <WebCore/WheelEventTestMonitor.h>
Expand Down

0 comments on commit 1f9e3fc

Please sign in to comment.