/* * Copyright (c) 2020, Matthew Olsson * Copyright (c) 2021-2022, Sam Atkins * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include namespace Web::SVG { class SVGGraphicsElement : public SVGElement { WEB_PLATFORM_OBJECT(SVGGraphicsElement, SVGElement); public: virtual void apply_presentational_hints(CSS::StyleProperties&) const override; virtual void attribute_changed(FlyString const& name, Optional const& value) override; Optional fill_color() const; Optional fill_rule() const; Optional stroke_color() const; Optional stroke_width() const; Optional fill_opacity() const; Optional stroke_opacity() const; float visible_stroke_width() const { if (auto color = stroke_color(); color.has_value() && color->alpha() > 0) return stroke_width().value_or(0); return 0; } Gfx::AffineTransform get_transform() const; Optional fill_paint_style(SVGPaintContext const&) const; Optional stroke_paint_style(SVGPaintContext const&) const; JS::GCPtr mask() const; protected: SVGGraphicsElement(DOM::Document&, DOM::QualifiedName); virtual void initialize(JS::Realm&) override; virtual Gfx::AffineTransform element_transform() const { return m_transform; } Optional svg_paint_computed_value_to_gfx_paint_style(SVGPaintContext const& paint_context, Optional const& paint_value) const; Gfx::AffineTransform m_transform = {}; template JS::GCPtr try_resolve_url_to(URL const& url) const { if (!url.fragment().has_value()) return {}; auto node = document().get_element_by_id(*url.fragment()); if (!node) return {}; if (is(*node)) return static_cast(*node); return {}; } private: virtual bool is_svg_graphics_element() const final { return true; } }; Gfx::AffineTransform transform_from_transform_list(ReadonlySpan transform_list); } namespace Web::DOM { template<> inline bool Node::fast_is() const { return is_svg_graphics_element(); } }