diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index f02819d86b..4d7d69c06b 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -206,6 +206,7 @@ set(SOURCES Geometry/DOMRect.cpp Geometry/DOMRectList.cpp Geometry/DOMRectReadOnly.cpp + HTML/AnimatedBitmapDecodedImageData.cpp HTML/AttributeNames.cpp HTML/BrowsingContext.cpp HTML/BrowsingContextGroup.cpp diff --git a/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.cpp b/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.cpp new file mode 100644 index 0000000000..4323cdb009 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2023, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Web::HTML { + +ErrorOr> AnimatedBitmapDecodedImageData::create(Vector&& frames, size_t loop_count, bool animated) +{ + return adopt_nonnull_ref_or_enomem(new (nothrow) AnimatedBitmapDecodedImageData(move(frames), loop_count, animated)); +} + +AnimatedBitmapDecodedImageData::AnimatedBitmapDecodedImageData(Vector&& frames, size_t loop_count, bool animated) + : m_frames(move(frames)) + , m_loop_count(loop_count) + , m_animated(animated) +{ +} + +AnimatedBitmapDecodedImageData::~AnimatedBitmapDecodedImageData() = default; + +RefPtr AnimatedBitmapDecodedImageData::bitmap(size_t frame_index) const +{ + if (frame_index >= m_frames.size()) + return nullptr; + return m_frames[frame_index].bitmap; +} + +int AnimatedBitmapDecodedImageData::frame_duration(size_t frame_index) const +{ + if (frame_index >= m_frames.size()) + return 0; + return m_frames[frame_index].duration; +} + +Optional AnimatedBitmapDecodedImageData::natural_width() const +{ + return m_frames.first().bitmap->width(); +} + +Optional AnimatedBitmapDecodedImageData::natural_height() const +{ + return m_frames.first().bitmap->height(); +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.h b/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.h new file mode 100644 index 0000000000..068624a8b0 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/AnimatedBitmapDecodedImageData.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::HTML { + +class AnimatedBitmapDecodedImageData final : public DecodedImageData { +public: + struct Frame { + RefPtr bitmap; + int duration { 0 }; + }; + + static ErrorOr> create(Vector&&, size_t loop_count, bool animated); + virtual ~AnimatedBitmapDecodedImageData() override; + + virtual RefPtr bitmap(size_t frame_index) const override; + virtual int frame_duration(size_t frame_index) const override; + + virtual size_t frame_count() const override { return m_frames.size(); } + 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; + +private: + AnimatedBitmapDecodedImageData(Vector&&, size_t loop_count, bool animated); + + Vector m_frames; + size_t m_loop_count { 0 }; + bool m_animated { false }; +}; + +} diff --git a/Userland/Libraries/LibWeb/HTML/DecodedImageData.cpp b/Userland/Libraries/LibWeb/HTML/DecodedImageData.cpp index f8dbe2f7b7..67c9987fc8 100644 --- a/Userland/Libraries/LibWeb/HTML/DecodedImageData.cpp +++ b/Userland/Libraries/LibWeb/HTML/DecodedImageData.cpp @@ -4,47 +4,12 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include #include namespace Web::HTML { -ErrorOr> DecodedImageData::create(Vector&& frames, size_t loop_count, bool animated) -{ - return adopt_nonnull_ref_or_enomem(new (nothrow) DecodedImageData(move(frames), loop_count, animated)); -} - -DecodedImageData::DecodedImageData(Vector&& frames, size_t loop_count, bool animated) - : m_frames(move(frames)) - , m_loop_count(loop_count) - , m_animated(animated) -{ -} +DecodedImageData::DecodedImageData() = default; DecodedImageData::~DecodedImageData() = default; -RefPtr DecodedImageData::bitmap(size_t frame_index) const -{ - if (frame_index >= m_frames.size()) - return nullptr; - return m_frames[frame_index].bitmap; -} - -int DecodedImageData::frame_duration(size_t frame_index) const -{ - if (frame_index >= m_frames.size()) - return 0; - return m_frames[frame_index].duration; -} - -Optional DecodedImageData::natural_width() const -{ - return m_frames.first().bitmap->width(); -} - -Optional DecodedImageData::natural_height() const -{ - return m_frames.first().bitmap->height(); -} - } diff --git a/Userland/Libraries/LibWeb/HTML/DecodedImageData.h b/Userland/Libraries/LibWeb/HTML/DecodedImageData.h index 41f062abd5..d2db297e2b 100644 --- a/Userland/Libraries/LibWeb/HTML/DecodedImageData.h +++ b/Userland/Libraries/LibWeb/HTML/DecodedImageData.h @@ -13,32 +13,22 @@ namespace Web::HTML { // https://html.spec.whatwg.org/multipage/images.html#img-req-data -class DecodedImageData final : public RefCounted { +class DecodedImageData : public RefCounted { public: - struct Frame { - RefPtr bitmap; - int duration { 0 }; - }; + virtual ~DecodedImageData(); - static ErrorOr> create(Vector&&, size_t loop_count, bool animated); - ~DecodedImageData(); + virtual RefPtr bitmap(size_t frame_index) const = 0; + virtual int frame_duration(size_t frame_index) const = 0; - RefPtr bitmap(size_t frame_index) const; - int frame_duration(size_t frame_index) const; + virtual size_t frame_count() const = 0; + virtual size_t loop_count() const = 0; + virtual bool is_animated() const = 0; - size_t frame_count() const { return m_frames.size(); } - size_t loop_count() const { return m_loop_count; } - bool is_animated() const { return m_animated; } + virtual Optional natural_width() const = 0; + virtual Optional natural_height() const = 0; - Optional natural_width() const; - Optional natural_height() const; - -private: - DecodedImageData(Vector&&, size_t loop_count, bool animated); - - Vector m_frames; - size_t m_loop_count { 0 }; - bool m_animated { false }; +protected: + DecodedImageData(); }; } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp index bd583596ad..fe22a0ad2b 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLImageElement.cpp @@ -14,8 +14,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -530,15 +530,15 @@ void HTMLImageElement::handle_successful_fetch(AK::URL const& url_string, ImageR return; } - Vector frames; + Vector frames; for (auto& frame : result.value().frames) { - frames.append(DecodedImageData::Frame { + frames.append(AnimatedBitmapDecodedImageData::Frame { .bitmap = frame.bitmap, .duration = static_cast(frame.duration), }); } - auto image_data = DecodedImageData::create(move(frames), result.value().loop_count, result.value().is_animated).release_value_but_fixme_should_propagate_errors(); + auto image_data = AnimatedBitmapDecodedImageData::create(move(frames), result.value().loop_count, result.value().is_animated).release_value_but_fixme_should_propagate_errors(); image_request.set_image_data(image_data); ListOfAvailableImages::Key key;