diff --git a/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.cpp b/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.cpp index 4323cdb009..06805f789c 100644 --- a/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.cpp +++ b/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.cpp @@ -37,14 +37,19 @@ int AnimatedBitmapDecodedImageData::frame_duration(size_t frame_index) const return m_frames[frame_index].duration; } -Optional AnimatedBitmapDecodedImageData::natural_width() const +Optional AnimatedBitmapDecodedImageData::intrinsic_width() const { return m_frames.first().bitmap->width(); } -Optional AnimatedBitmapDecodedImageData::natural_height() const +Optional AnimatedBitmapDecodedImageData::intrinsic_height() const { return m_frames.first().bitmap->height(); } +Optional AnimatedBitmapDecodedImageData::intrinsic_aspect_ratio() const +{ + return static_cast(m_frames.first().bitmap->width()) / static_cast(m_frames.first().bitmap->height()); +} + } diff --git a/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.h b/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.h index 068624a8b0..0d24dbd36e 100644 --- a/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.h +++ b/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.h @@ -27,8 +27,9 @@ public: virtual size_t loop_count() const override { return m_loop_count; } virtual bool is_animated() const override { return m_animated; } - virtual Optional natural_width() const override; - virtual Optional natural_height() const override; + virtual Optional intrinsic_width() const override; + virtual Optional intrinsic_height() const override; + virtual Optional intrinsic_aspect_ratio() const override; private: AnimatedBitmapDecodedImageData(Vector&&, size_t loop_count, bool animated); diff --git a/Userland/Libraries/LibWeb/HTML/DecodedImageData.h b/Userland/Libraries/LibWeb/HTML/DecodedImageData.h index d2db297e2b..100722767a 100644 --- a/Userland/Libraries/LibWeb/HTML/DecodedImageData.h +++ b/Userland/Libraries/LibWeb/HTML/DecodedImageData.h @@ -9,6 +9,7 @@ #include #include #include +#include namespace Web::HTML { @@ -24,8 +25,9 @@ public: virtual size_t loop_count() const = 0; virtual bool is_animated() const = 0; - virtual Optional natural_width() const = 0; - virtual Optional natural_height() const = 0; + virtual Optional intrinsic_width() const = 0; + virtual Optional intrinsic_height() const = 0; + virtual Optional intrinsic_aspect_ratio() const = 0; protected: DecodedImageData(); diff --git a/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp index fe22a0ad2b..3abb9a292a 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp @@ -111,6 +111,27 @@ RefPtr HTMLImageElement::bitmap() const return current_image_bitmap(); } +Optional HTMLImageElement::intrinsic_width() const +{ + if (auto image_data = m_current_request->image_data()) + return image_data->intrinsic_width(); + return {}; +} + +Optional HTMLImageElement::intrinsic_height() const +{ + if (auto image_data = m_current_request->image_data()) + return image_data->intrinsic_height(); + return {}; +} + +Optional HTMLImageElement::intrinsic_aspect_ratio() const +{ + if (auto image_data = m_current_request->image_data()) + return image_data->intrinsic_aspect_ratio(); + return {}; +} + RefPtr HTMLImageElement::current_image_bitmap() const { if (auto data = m_current_request->image_data()) diff --git a/Userland/Libraries/LibWeb/HTML/HTMLImageElement.h b/Userland/Libraries/LibWeb/HTML/HTMLImageElement.h index 8f35409906..abb5d1f77b 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLImageElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLImageElement.h @@ -78,6 +78,9 @@ public: void upgrade_pending_request_to_current_request(); // ^Layout::ImageProvider + virtual Optional intrinsic_width() const override; + virtual Optional intrinsic_height() const override; + virtual Optional intrinsic_aspect_ratio() const override; virtual RefPtr current_image_bitmap() const override; virtual void set_visible_in_viewport(bool) override; diff --git a/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.cpp index 5f131ef349..4c25726b0d 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.cpp @@ -350,6 +350,27 @@ i32 HTMLObjectElement::default_tab_index_value() const return 0; } +Optional HTMLObjectElement::intrinsic_width() const +{ + if (m_image_loader.has_value()) + return m_image_loader->bitmap(0)->width(); + return {}; +} + +Optional HTMLObjectElement::intrinsic_height() const +{ + if (m_image_loader.has_value()) + return m_image_loader->bitmap(0)->height(); + return {}; +} + +Optional HTMLObjectElement::intrinsic_aspect_ratio() const +{ + if (m_image_loader.has_value()) + return static_cast(m_image_loader->bitmap(0)->width()) / static_cast(m_image_loader->bitmap(0)->height()); + return {}; +} + RefPtr HTMLObjectElement::current_image_bitmap() const { if (m_image_loader.has_value()) diff --git a/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.h b/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.h index b06d4d0790..d728f4cc72 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLObjectElement.h @@ -70,6 +70,9 @@ private: virtual i32 default_tab_index_value() const override; // ^Layout::ImageProvider + virtual Optional intrinsic_width() const override; + virtual Optional intrinsic_height() const override; + virtual Optional intrinsic_aspect_ratio() const override; virtual RefPtr current_image_bitmap() const override; virtual void set_visible_in_viewport(bool) override; diff --git a/Userland/Libraries/LibWeb/Layout/ImageBox.cpp b/Userland/Libraries/LibWeb/Layout/ImageBox.cpp index 22770d00e6..5aa621f70b 100644 --- a/Userland/Libraries/LibWeb/Layout/ImageBox.cpp +++ b/Userland/Libraries/LibWeb/Layout/ImageBox.cpp @@ -23,18 +23,9 @@ ImageBox::~ImageBox() = default; void ImageBox::prepare_for_replaced_layout() { - auto bitmap = m_image_provider.current_image_bitmap(); - - if (!bitmap) { - set_intrinsic_width(0); - set_intrinsic_height(0); - } else { - auto width = bitmap->width(); - auto height = bitmap->height(); - set_intrinsic_width(width); - set_intrinsic_height(height); - set_intrinsic_aspect_ratio(static_cast(width) / static_cast(height)); - } + set_intrinsic_width(m_image_provider.intrinsic_width()); + set_intrinsic_height(m_image_provider.intrinsic_height()); + set_intrinsic_aspect_ratio(m_image_provider.intrinsic_aspect_ratio()); if (renders_as_alt_text()) { auto& image_element = verify_cast(dom_node()); diff --git a/Userland/Libraries/LibWeb/Layout/ImageProvider.h b/Userland/Libraries/LibWeb/Layout/ImageProvider.h index 39537295c2..1a45c3de8b 100644 --- a/Userland/Libraries/LibWeb/Layout/ImageProvider.h +++ b/Userland/Libraries/LibWeb/Layout/ImageProvider.h @@ -6,12 +6,18 @@ #pragma once +#include + namespace Web::Layout { class ImageProvider { public: virtual ~ImageProvider() { } + virtual Optional intrinsic_width() const = 0; + virtual Optional intrinsic_height() const = 0; + virtual Optional intrinsic_aspect_ratio() const = 0; + virtual RefPtr current_image_bitmap() const = 0; virtual void set_visible_in_viewport(bool) = 0; };