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;
};