LibWeb: Add ImageProvider virtual to access the DecodedImageData

...and also the current frame index, in case of animations.
This commit is contained in:
Andreas Kling 2025-11-04 20:51:46 +01:00 committed by Andreas Kling
parent 5b88b76b84
commit cebd4cc10d
Notes: github-actions[bot] 2025-11-05 08:13:10 +00:00
8 changed files with 33 additions and 2 deletions

View file

@ -1281,4 +1281,11 @@ bool HTMLImageElement::allows_auto_sizes() const
|| sizes->starts_with_bytes("auto,"sv, AK::CaseSensitivity::CaseInsensitive));
}
GC::Ptr<DecodedImageData> HTMLImageElement::decoded_image_data() const
{
if (!m_current_request)
return nullptr;
return m_current_request->image_data();
}
}

View file

@ -92,7 +92,7 @@ public:
ImageRequest& current_request() { return *m_current_request; }
ImageRequest const& current_request() const { return *m_current_request; }
size_t current_frame_index() const { return m_current_frame_index; }
virtual size_t current_frame_index() const override { return m_current_frame_index; }
// https://html.spec.whatwg.org/multipage/images.html#upgrade-the-pending-request-to-the-current-request
void upgrade_pending_request_to_current_request();
@ -108,6 +108,7 @@ public:
virtual RefPtr<Gfx::ImmutableBitmap> current_image_bitmap_sized(Gfx::IntSize) const override;
virtual void set_visible_in_viewport(bool) override;
virtual GC::Ptr<DOM::Element const> to_html_element() const override { return *this; }
virtual GC::Ptr<DecodedImageData> decoded_image_data() const override;
virtual void visit_edges(Cell::Visitor&) override;

View file

@ -285,6 +285,8 @@ private:
virtual RefPtr<Gfx::ImmutableBitmap> current_image_bitmap_sized(Gfx::IntSize) const override;
virtual void set_visible_in_viewport(bool) override;
virtual GC::Ptr<DOM::Element const> to_html_element() const override { return *this; }
virtual size_t current_frame_index() const override { return 0; }
virtual GC::Ptr<HTML::DecodedImageData> decoded_image_data() const override { return image_data(); }
virtual void initialize(JS::Realm&) override;
virtual void visit_edges(Cell::Visitor&) override;

View file

@ -84,6 +84,8 @@ private:
virtual RefPtr<Gfx::ImmutableBitmap> current_image_bitmap_sized(Gfx::IntSize) const override;
virtual void set_visible_in_viewport(bool) override;
virtual GC::Ptr<DOM::Element const> to_html_element() const override { return *this; }
virtual size_t current_frame_index() const override { return 0; }
virtual GC::Ptr<DecodedImageData> decoded_image_data() const override { return image_data(); }
GC::Ptr<DecodedImageData> image_data() const;

View file

@ -19,6 +19,10 @@ public:
virtual bool is_image_available() const = 0;
virtual size_t current_frame_index() const = 0;
virtual GC::Ptr<HTML::DecodedImageData> decoded_image_data() const = 0;
virtual Optional<CSSPixels> intrinsic_width() const = 0;
virtual Optional<CSSPixels> intrinsic_height() const = 0;
Optional<CSSPixelSize> intrinsic_size() const;

View file

@ -230,6 +230,12 @@ public:
m_layout_node = layout_node;
}
virtual size_t current_frame_index() const override { return 0; }
virtual GC::Ptr<HTML::DecodedImageData> decoded_image_data() const override
{
return m_image->image_data();
}
private:
GeneratedContentImageProvider(NonnullRefPtr<CSS::ImageStyleValue> image)
: Client(image)

View file

@ -282,4 +282,11 @@ void SVGImageElement::animate()
paintable()->set_needs_display();
}
GC::Ptr<HTML::DecodedImageData> SVGImageElement::decoded_image_data() const
{
if (!m_resource_request)
return nullptr;
return m_resource_request->image_data();
}
}

View file

@ -13,7 +13,7 @@
namespace Web::SVG {
class SVGImageElement
class SVGImageElement final
: public SVGGraphicsElement
, public SVGURIReferenceMixin<SupportsXLinkHref::Yes>
, public Layout::ImageProvider {
@ -39,6 +39,8 @@ public:
virtual RefPtr<Gfx::ImmutableBitmap> current_image_bitmap_sized(Gfx::IntSize) const override;
virtual void set_visible_in_viewport(bool) override { }
virtual GC::Ptr<DOM::Element const> to_html_element() const override { return *this; }
virtual size_t current_frame_index() const override { return m_current_frame_index; }
virtual GC::Ptr<HTML::DecodedImageData> decoded_image_data() const override;
protected:
SVGImageElement(DOM::Document&, DOM::QualifiedName);