Skip to content

Commit cebd4cc

Browse files
committed
LibWeb: Add ImageProvider virtual to access the DecodedImageData
...and also the current frame index, in case of animations.
1 parent 5b88b76 commit cebd4cc

File tree

8 files changed

+33
-2
lines changed

8 files changed

+33
-2
lines changed

Libraries/LibWeb/HTML/HTMLImageElement.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1281,4 +1281,11 @@ bool HTMLImageElement::allows_auto_sizes() const
12811281
|| sizes->starts_with_bytes("auto,"sv, AK::CaseSensitivity::CaseInsensitive));
12821282
}
12831283

1284+
GC::Ptr<DecodedImageData> HTMLImageElement::decoded_image_data() const
1285+
{
1286+
if (!m_current_request)
1287+
return nullptr;
1288+
return m_current_request->image_data();
1289+
}
1290+
12841291
}

Libraries/LibWeb/HTML/HTMLImageElement.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class HTMLImageElement final
9292
ImageRequest& current_request() { return *m_current_request; }
9393
ImageRequest const& current_request() const { return *m_current_request; }
9494

95-
size_t current_frame_index() const { return m_current_frame_index; }
95+
virtual size_t current_frame_index() const override { return m_current_frame_index; }
9696

9797
// https://html.spec.whatwg.org/multipage/images.html#upgrade-the-pending-request-to-the-current-request
9898
void upgrade_pending_request_to_current_request();
@@ -108,6 +108,7 @@ class HTMLImageElement final
108108
virtual RefPtr<Gfx::ImmutableBitmap> current_image_bitmap_sized(Gfx::IntSize) const override;
109109
virtual void set_visible_in_viewport(bool) override;
110110
virtual GC::Ptr<DOM::Element const> to_html_element() const override { return *this; }
111+
virtual GC::Ptr<DecodedImageData> decoded_image_data() const override;
111112

112113
virtual void visit_edges(Cell::Visitor&) override;
113114

Libraries/LibWeb/HTML/HTMLInputElement.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,8 @@ class WEB_API HTMLInputElement final
285285
virtual RefPtr<Gfx::ImmutableBitmap> current_image_bitmap_sized(Gfx::IntSize) const override;
286286
virtual void set_visible_in_viewport(bool) override;
287287
virtual GC::Ptr<DOM::Element const> to_html_element() const override { return *this; }
288+
virtual size_t current_frame_index() const override { return 0; }
289+
virtual GC::Ptr<HTML::DecodedImageData> decoded_image_data() const override { return image_data(); }
288290

289291
virtual void initialize(JS::Realm&) override;
290292
virtual void visit_edges(Cell::Visitor&) override;

Libraries/LibWeb/HTML/HTMLObjectElement.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ class HTMLObjectElement final
8484
virtual RefPtr<Gfx::ImmutableBitmap> current_image_bitmap_sized(Gfx::IntSize) const override;
8585
virtual void set_visible_in_viewport(bool) override;
8686
virtual GC::Ptr<DOM::Element const> to_html_element() const override { return *this; }
87+
virtual size_t current_frame_index() const override { return 0; }
88+
virtual GC::Ptr<DecodedImageData> decoded_image_data() const override { return image_data(); }
8789

8890
GC::Ptr<DecodedImageData> image_data() const;
8991

Libraries/LibWeb/Layout/ImageProvider.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ class ImageProvider {
1919

2020
virtual bool is_image_available() const = 0;
2121

22+
virtual size_t current_frame_index() const = 0;
23+
24+
virtual GC::Ptr<HTML::DecodedImageData> decoded_image_data() const = 0;
25+
2226
virtual Optional<CSSPixels> intrinsic_width() const = 0;
2327
virtual Optional<CSSPixels> intrinsic_height() const = 0;
2428
Optional<CSSPixelSize> intrinsic_size() const;

Libraries/LibWeb/Layout/TreeBuilder.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,12 @@ class GeneratedContentImageProvider final
230230
m_layout_node = layout_node;
231231
}
232232

233+
virtual size_t current_frame_index() const override { return 0; }
234+
virtual GC::Ptr<HTML::DecodedImageData> decoded_image_data() const override
235+
{
236+
return m_image->image_data();
237+
}
238+
233239
private:
234240
GeneratedContentImageProvider(NonnullRefPtr<CSS::ImageStyleValue> image)
235241
: Client(image)

Libraries/LibWeb/SVG/SVGImageElement.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,4 +282,11 @@ void SVGImageElement::animate()
282282
paintable()->set_needs_display();
283283
}
284284

285+
GC::Ptr<HTML::DecodedImageData> SVGImageElement::decoded_image_data() const
286+
{
287+
if (!m_resource_request)
288+
return nullptr;
289+
return m_resource_request->image_data();
290+
}
291+
285292
}

Libraries/LibWeb/SVG/SVGImageElement.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
namespace Web::SVG {
1515

16-
class SVGImageElement
16+
class SVGImageElement final
1717
: public SVGGraphicsElement
1818
, public SVGURIReferenceMixin<SupportsXLinkHref::Yes>
1919
, public Layout::ImageProvider {
@@ -39,6 +39,8 @@ class SVGImageElement
3939
virtual RefPtr<Gfx::ImmutableBitmap> current_image_bitmap_sized(Gfx::IntSize) const override;
4040
virtual void set_visible_in_viewport(bool) override { }
4141
virtual GC::Ptr<DOM::Element const> to_html_element() const override { return *this; }
42+
virtual size_t current_frame_index() const override { return m_current_frame_index; }
43+
virtual GC::Ptr<HTML::DecodedImageData> decoded_image_data() const override;
4244

4345
protected:
4446
SVGImageElement(DOM::Document&, DOM::QualifiedName);

0 commit comments

Comments
 (0)