diff --git a/Libraries/LibWeb/CMakeLists.txt b/Libraries/LibWeb/CMakeLists.txt index 5d5ff07149c..174f243e8ac 100644 --- a/Libraries/LibWeb/CMakeLists.txt +++ b/Libraries/LibWeb/CMakeLists.txt @@ -825,6 +825,7 @@ set(SOURCES SVG/SVGEllipseElement.cpp SVG/SVGFEBlendElement.cpp SVG/SVGFEFloodElement.cpp + SVG/SVGFEGaussianBlurElement.cpp SVG/SVGFilterElement.cpp SVG/SVGForeignObjectElement.cpp SVG/SVGGElement.cpp diff --git a/Libraries/LibWeb/DOM/ElementFactory.cpp b/Libraries/LibWeb/DOM/ElementFactory.cpp index 42860ab8d6e..e8c3d319c4a 100644 --- a/Libraries/LibWeb/DOM/ElementFactory.cpp +++ b/Libraries/LibWeb/DOM/ElementFactory.cpp @@ -93,6 +93,7 @@ #include #include #include +#include #include #include #include @@ -467,6 +468,8 @@ static GC::Ref create_svg_element(JS::Realm& realm, Document& d return realm.create(document, move(qualified_name)); if (local_name == SVG::TagNames::feFlood) return realm.create(document, move(qualified_name)); + if (local_name == SVG::TagNames::feGaussianBlur) + return realm.create(document, move(qualified_name)); if (local_name == SVG::TagNames::filter) return realm.create(document, move(qualified_name)); if (local_name.equals_ignoring_ascii_case(SVG::TagNames::foreignObject)) diff --git a/Libraries/LibWeb/Forward.h b/Libraries/LibWeb/Forward.h index 24d9d9060f1..2db3a52be92 100644 --- a/Libraries/LibWeb/Forward.h +++ b/Libraries/LibWeb/Forward.h @@ -969,6 +969,7 @@ class SVGElement; class SVGEllipseElement; class SVGFEBlendElement; class SVGFEFloodElement; +class SVGFEGaussianBlurElement; class SVGFilterElement; class SVGForeignObjectElement; class SVGGeometryElement; diff --git a/Libraries/LibWeb/SVG/AttributeNames.h b/Libraries/LibWeb/SVG/AttributeNames.h index 628a6edb5f2..42b4528bd6d 100644 --- a/Libraries/LibWeb/SVG/AttributeNames.h +++ b/Libraries/LibWeb/SVG/AttributeNames.h @@ -79,6 +79,8 @@ namespace Web::SVG::AttributeNames { __ENUMERATE_SVG_ATTRIBUTE(spreadMethod, "spreadMethod") \ __ENUMERATE_SVG_ATTRIBUTE(startOffset, "startOffset") \ __ENUMERATE_SVG_ATTRIBUTE(stdDeviation, "stdDeviation") \ + __ENUMERATE_SVG_ATTRIBUTE(stdDeviationX, "stdDeviationX") \ + __ENUMERATE_SVG_ATTRIBUTE(stdDeviationY, "stdDeviationY") \ __ENUMERATE_SVG_ATTRIBUTE(stitchTiles, "stitchTiles") \ __ENUMERATE_SVG_ATTRIBUTE(stopColor, "stop-color") \ __ENUMERATE_SVG_ATTRIBUTE(stopOpacity, "stop-opacity") \ diff --git a/Libraries/LibWeb/SVG/SVGFEGaussianBlurElement.cpp b/Libraries/LibWeb/SVG/SVGFEGaussianBlurElement.cpp new file mode 100644 index 00000000000..1125376ebef --- /dev/null +++ b/Libraries/LibWeb/SVG/SVGFEGaussianBlurElement.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2025, Lucien Fiorini + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "SVGAnimatedEnumeration.h" + +#include +#include +#include +#include + +namespace Web::SVG { + +GC_DEFINE_ALLOCATOR(SVGFEGaussianBlurElement); + +SVGFEGaussianBlurElement::SVGFEGaussianBlurElement(DOM::Document& document, DOM::QualifiedName qualified_name) + : SVGElement(document, qualified_name) +{ +} + +void SVGFEGaussianBlurElement::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGFEGaussianBlurElement); +} + +void SVGFEGaussianBlurElement::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + SVGFilterPrimitiveStandardAttributes::visit_edges(visitor); + visitor.visit(m_in1); +} + +GC::Ref SVGFEGaussianBlurElement::in1() +{ + if (!m_in1) + m_in1 = SVGAnimatedString::create(realm(), *this, AttributeNames::in); + + return *m_in1; +} + +GC::Ref SVGFEGaussianBlurElement::std_deviation_x() const +{ + // FIXME: Resolve the actual value from AttributeNames::stdDeviationX. + return SVGAnimatedNumber::create(realm(), 125.0f, 125.0f); +} + +GC::Ref SVGFEGaussianBlurElement::std_deviation_y() const +{ + // FIXME: Resolve the actual value from AttributeNames::stdDeviationY. + return SVGAnimatedNumber::create(realm(), 125.0f, 125.0f); +} + +GC::Ref SVGFEGaussianBlurElement::edge_mode() const +{ + // FIXME: Resolve the actual value from AttributeNames::edgeMode. + return SVGAnimatedEnumeration::create(realm(), 0); +} + +} diff --git a/Libraries/LibWeb/SVG/SVGFEGaussianBlurElement.h b/Libraries/LibWeb/SVG/SVGFEGaussianBlurElement.h new file mode 100644 index 00000000000..4c91af40f59 --- /dev/null +++ b/Libraries/LibWeb/SVG/SVGFEGaussianBlurElement.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2025, Lucien Fiorini + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::SVG { + +class SVGFEGaussianBlurElement final + : public SVGElement + , public SVGFilterPrimitiveStandardAttributes { + WEB_PLATFORM_OBJECT(SVGFEGaussianBlurElement, SVGElement); + GC_DECLARE_ALLOCATOR(SVGFEGaussianBlurElement); + +public: + virtual ~SVGFEGaussianBlurElement() override = default; + + GC::Ref in1(); + GC::Ref std_deviation_x() const; + GC::Ref std_deviation_y() const; + GC::Ref edge_mode() const; + +private: + SVGFEGaussianBlurElement(DOM::Document&, DOM::QualifiedName); + + virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Cell::Visitor&) override; + + GC::Ptr m_in1; +}; + +} diff --git a/Libraries/LibWeb/SVG/SVGFEGaussianBlurElement.idl b/Libraries/LibWeb/SVG/SVGFEGaussianBlurElement.idl new file mode 100644 index 00000000000..1886e5096b6 --- /dev/null +++ b/Libraries/LibWeb/SVG/SVGFEGaussianBlurElement.idl @@ -0,0 +1,23 @@ +#import +#import +#import + +// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEGaussianBlurElement +[Exposed=Window] +interface SVGFEGaussianBlurElement : SVGElement { + + // Edge Mode Values + const unsigned short SVG_EDGEMODE_UNKNOWN = 0; + const unsigned short SVG_EDGEMODE_DUPLICATE = 1; + const unsigned short SVG_EDGEMODE_WRAP = 2; + const unsigned short SVG_EDGEMODE_NONE = 3; + + readonly attribute SVGAnimatedString in1; + readonly attribute SVGAnimatedNumber stdDeviationX; + readonly attribute SVGAnimatedNumber stdDeviationY; + readonly attribute SVGAnimatedEnumeration edgeMode; + + [FIXME] void setStdDeviation(float stdDeviationX, float stdDeviationY); +}; + +SVGFEGaussianBlurElement includes SVGFilterPrimitiveStandardAttributes; diff --git a/Libraries/LibWeb/SVG/TagNames.h b/Libraries/LibWeb/SVG/TagNames.h index 755cb9e319e..4a253e7c96f 100644 --- a/Libraries/LibWeb/SVG/TagNames.h +++ b/Libraries/LibWeb/SVG/TagNames.h @@ -19,6 +19,7 @@ namespace Web::SVG::TagNames { __ENUMERATE_SVG_TAG(ellipse) \ __ENUMERATE_SVG_TAG(feBlend) \ __ENUMERATE_SVG_TAG(feFlood) \ + __ENUMERATE_SVG_TAG(feGaussianBlur) \ __ENUMERATE_SVG_TAG(filter) \ __ENUMERATE_SVG_TAG(foreignObject) \ __ENUMERATE_SVG_TAG(g) \ diff --git a/Libraries/LibWeb/idl_files.cmake b/Libraries/LibWeb/idl_files.cmake index 28eb414ac9a..5fa1d463343 100644 --- a/Libraries/LibWeb/idl_files.cmake +++ b/Libraries/LibWeb/idl_files.cmake @@ -342,6 +342,7 @@ libweb_js_bindings(SVG/SVGCircleElement) libweb_js_bindings(SVG/SVGEllipseElement) libweb_js_bindings(SVG/SVGFEBlendElement) libweb_js_bindings(SVG/SVGFEFloodElement) +libweb_js_bindings(SVG/SVGFEGaussianBlurElement) libweb_js_bindings(SVG/SVGFilterElement) libweb_js_bindings(SVG/SVGForeignObjectElement) libweb_js_bindings(SVG/SVGLength) diff --git a/Tests/LibWeb/Text/expected/all-window-properties.txt b/Tests/LibWeb/Text/expected/all-window-properties.txt index a14fb166742..b6685611e19 100644 --- a/Tests/LibWeb/Text/expected/all-window-properties.txt +++ b/Tests/LibWeb/Text/expected/all-window-properties.txt @@ -340,6 +340,7 @@ SVGElement SVGEllipseElement SVGFEBlendElement SVGFEFloodElement +SVGFEGaussianBlurElement SVGFilterElement SVGForeignObjectElement SVGGElement