/* * Copyright (c) 2024, Tim Ledbetter * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Web::SVG { class SVGImageElement : public SVGGraphicsElement , public SVGURIReferenceMixin , public Layout::ImageProvider { WEB_PLATFORM_OBJECT(SVGImageElement, SVGGraphicsElement); public: virtual void attribute_changed(FlyString const& name, Optional const& old_value, Optional const& value, Optional const& namespace_) override; GC::Ref x(); GC::Ref y(); GC::Ref width(); GC::Ref height(); Gfx::Rect bounding_box() const; // ^Layout::ImageProvider virtual bool is_image_available() const override; virtual Optional intrinsic_width() const override; virtual Optional intrinsic_height() const override; virtual Optional intrinsic_aspect_ratio() const override; virtual RefPtr current_image_bitmap(Gfx::IntSize = {}) const override; virtual void set_visible_in_viewport(bool) override { } virtual GC::Ref to_html_element() const override { return *this; } protected: SVGImageElement(DOM::Document&, DOM::QualifiedName); virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; void process_the_url(Optional const& href); void fetch_the_document(URL::URL const& url); private: virtual GC::Ptr create_layout_node(CSS::StyleProperties) override; void animate(); GC::Ptr m_x; GC::Ptr m_y; GC::Ptr m_width; GC::Ptr m_height; RefPtr m_animation_timer; size_t m_current_frame_index { 0 }; size_t m_loops_completed { 0 }; URL::URL m_href; GC::Ptr m_resource_request; Optional m_load_event_delayer; }; }