From e7cddda7e13a2afac61d4de0a7f69987929ed045 Mon Sep 17 00:00:00 2001 From: MacDue Date: Sun, 2 Jul 2023 22:20:06 +0100 Subject: [PATCH] LibGfx: Allow passing an ideal size to image decoders The ideal size is the size the user will display the image. Raster formats should ignore this parameter, but vector formats can use it to generate a bitmap of the ideal size. --- Userland/Libraries/LibGfx/ImageFormats/BMPLoader.cpp | 2 +- Userland/Libraries/LibGfx/ImageFormats/BMPLoader.h | 2 +- Userland/Libraries/LibGfx/ImageFormats/DDSLoader.cpp | 2 +- Userland/Libraries/LibGfx/ImageFormats/DDSLoader.h | 2 +- Userland/Libraries/LibGfx/ImageFormats/GIFLoader.cpp | 2 +- Userland/Libraries/LibGfx/ImageFormats/GIFLoader.h | 2 +- Userland/Libraries/LibGfx/ImageFormats/ICOLoader.cpp | 2 +- Userland/Libraries/LibGfx/ImageFormats/ICOLoader.h | 2 +- Userland/Libraries/LibGfx/ImageFormats/ImageDecoder.h | 4 ++-- Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp | 2 +- Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.h | 2 +- Userland/Libraries/LibGfx/ImageFormats/PNGLoader.cpp | 2 +- Userland/Libraries/LibGfx/ImageFormats/PNGLoader.h | 2 +- .../Libraries/LibGfx/ImageFormats/PortableImageMapLoader.h | 4 ++-- Userland/Libraries/LibGfx/ImageFormats/QOILoader.cpp | 2 +- Userland/Libraries/LibGfx/ImageFormats/QOILoader.h | 2 +- Userland/Libraries/LibGfx/ImageFormats/TGALoader.cpp | 2 +- Userland/Libraries/LibGfx/ImageFormats/TGALoader.h | 2 +- Userland/Libraries/LibGfx/ImageFormats/WebPLoader.cpp | 2 +- Userland/Libraries/LibGfx/ImageFormats/WebPLoader.h | 2 +- 20 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Userland/Libraries/LibGfx/ImageFormats/BMPLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/BMPLoader.cpp index 062b937d9e..2aed49949a 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/BMPLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/BMPLoader.cpp @@ -1548,7 +1548,7 @@ size_t BMPImageDecoderPlugin::first_animated_frame_index() return 0; } -ErrorOr BMPImageDecoderPlugin::frame(size_t index) +ErrorOr BMPImageDecoderPlugin::frame(size_t index, Optional) { if (index > 0) return Error::from_string_literal("BMPImageDecoderPlugin: Invalid frame index"); diff --git a/Userland/Libraries/LibGfx/ImageFormats/BMPLoader.h b/Userland/Libraries/LibGfx/ImageFormats/BMPLoader.h index b865f0d18b..22d42f98e5 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/BMPLoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/BMPLoader.h @@ -36,7 +36,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual size_t first_animated_frame_index() override; - virtual ErrorOr frame(size_t index) override; + virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; virtual ErrorOr> icc_data() override; private: diff --git a/Userland/Libraries/LibGfx/ImageFormats/DDSLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/DDSLoader.cpp index 67f0b10a99..b31501886e 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/DDSLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/DDSLoader.cpp @@ -693,7 +693,7 @@ size_t DDSImageDecoderPlugin::first_animated_frame_index() return 0; } -ErrorOr DDSImageDecoderPlugin::frame(size_t index) +ErrorOr DDSImageDecoderPlugin::frame(size_t index, Optional) { if (index > 0) return Error::from_string_literal("DDSImageDecoderPlugin: Invalid frame index"); diff --git a/Userland/Libraries/LibGfx/ImageFormats/DDSLoader.h b/Userland/Libraries/LibGfx/ImageFormats/DDSLoader.h index 0cfd0b4805..d7e3c90956 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/DDSLoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/DDSLoader.h @@ -248,7 +248,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual size_t first_animated_frame_index() override; - virtual ErrorOr frame(size_t index) override; + virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; virtual ErrorOr> icc_data() override; private: diff --git a/Userland/Libraries/LibGfx/ImageFormats/GIFLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/GIFLoader.cpp index b77728b95c..e6509f0af8 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/GIFLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/GIFLoader.cpp @@ -633,7 +633,7 @@ size_t GIFImageDecoderPlugin::first_animated_frame_index() return 0; } -ErrorOr GIFImageDecoderPlugin::frame(size_t index) +ErrorOr GIFImageDecoderPlugin::frame(size_t index, Optional) { if (m_context->error_state >= GIFLoadingContext::ErrorState::FailedToDecodeAnyFrame) { return Error::from_string_literal("GIFImageDecoderPlugin: Decoding failed"); diff --git a/Userland/Libraries/LibGfx/ImageFormats/GIFLoader.h b/Userland/Libraries/LibGfx/ImageFormats/GIFLoader.h index a3c82cd876..f6631a48d7 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/GIFLoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/GIFLoader.h @@ -28,7 +28,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual size_t first_animated_frame_index() override; - virtual ErrorOr frame(size_t index) override; + virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; virtual ErrorOr> icc_data() override; private: diff --git a/Userland/Libraries/LibGfx/ImageFormats/ICOLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/ICOLoader.cpp index c0f19edbac..07a67e4b61 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/ICOLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/ICOLoader.cpp @@ -255,7 +255,7 @@ size_t ICOImageDecoderPlugin::first_animated_frame_index() return 0; } -ErrorOr ICOImageDecoderPlugin::frame(size_t index) +ErrorOr ICOImageDecoderPlugin::frame(size_t index, Optional) { if (index > 0) return Error::from_string_literal("ICOImageDecoderPlugin: Invalid frame index"); diff --git a/Userland/Libraries/LibGfx/ImageFormats/ICOLoader.h b/Userland/Libraries/LibGfx/ImageFormats/ICOLoader.h index 65e78ee79b..e9d57db380 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/ICOLoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/ICOLoader.h @@ -27,7 +27,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual size_t first_animated_frame_index() override; - virtual ErrorOr frame(size_t index) override; + virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; virtual ErrorOr> icc_data() override; private: diff --git a/Userland/Libraries/LibGfx/ImageFormats/ImageDecoder.h b/Userland/Libraries/LibGfx/ImageFormats/ImageDecoder.h index 716e628d2c..ee2c458029 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/ImageDecoder.h +++ b/Userland/Libraries/LibGfx/ImageFormats/ImageDecoder.h @@ -40,7 +40,7 @@ public: virtual size_t loop_count() = 0; virtual size_t frame_count() = 0; virtual size_t first_animated_frame_index() = 0; - virtual ErrorOr frame(size_t index) = 0; + virtual ErrorOr frame(size_t index, Optional ideal_size = {}) = 0; virtual ErrorOr> icc_data() = 0; protected: @@ -61,7 +61,7 @@ public: size_t loop_count() const { return m_plugin->loop_count(); } size_t frame_count() const { return m_plugin->frame_count(); } size_t first_animated_frame_index() const { return m_plugin->first_animated_frame_index(); } - ErrorOr frame(size_t index) const { return m_plugin->frame(index); } + ErrorOr frame(size_t index, Optional ideal_size = {}) const { return m_plugin->frame(index, ideal_size); } ErrorOr> icc_data() const { return m_plugin->icc_data(); } private: diff --git a/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp index edcbd73448..f9ce0a33df 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp @@ -1978,7 +1978,7 @@ size_t JPEGImageDecoderPlugin::first_animated_frame_index() return 0; } -ErrorOr JPEGImageDecoderPlugin::frame(size_t index) +ErrorOr JPEGImageDecoderPlugin::frame(size_t index, Optional) { if (index > 0) return Error::from_string_literal("JPEGImageDecoderPlugin: Invalid frame index"); diff --git a/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.h b/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.h index a29ecd8adc..b10aca628e 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.h @@ -30,7 +30,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual size_t first_animated_frame_index() override; - virtual ErrorOr frame(size_t index) override; + virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; virtual ErrorOr> icc_data() override; private: diff --git a/Userland/Libraries/LibGfx/ImageFormats/PNGLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/PNGLoader.cpp index 1998c34f02..607b580b81 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/PNGLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/PNGLoader.cpp @@ -1409,7 +1409,7 @@ static ErrorOr> render_animation_frame(AnimationFrame const& prev return rendered_bitmap; } -ErrorOr PNGImageDecoderPlugin::frame(size_t index) +ErrorOr PNGImageDecoderPlugin::frame(size_t index, Optional) { if (m_context->state == PNGLoadingContext::State::Error) return Error::from_string_literal("PNGImageDecoderPlugin: Decoding failed"); diff --git a/Userland/Libraries/LibGfx/ImageFormats/PNGLoader.h b/Userland/Libraries/LibGfx/ImageFormats/PNGLoader.h index 3435f77b54..053dd6b72e 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/PNGLoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/PNGLoader.h @@ -27,7 +27,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual size_t first_animated_frame_index() override; - virtual ErrorOr frame(size_t index) override; + virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; virtual ErrorOr> icc_data() override; private: diff --git a/Userland/Libraries/LibGfx/ImageFormats/PortableImageMapLoader.h b/Userland/Libraries/LibGfx/ImageFormats/PortableImageMapLoader.h index a87d7d4f50..6a5d631209 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/PortableImageMapLoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/PortableImageMapLoader.h @@ -72,7 +72,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual size_t first_animated_frame_index() override; - virtual ErrorOr frame(size_t index) override; + virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; virtual ErrorOr> icc_data() override; private: @@ -168,7 +168,7 @@ size_t PortableImageDecoderPlugin::first_animated_frame_index() } template -ErrorOr PortableImageDecoderPlugin::frame(size_t index) +ErrorOr PortableImageDecoderPlugin::frame(size_t index, Optional) { if (index > 0) return Error::from_string_literal("PortableImageDecoderPlugin: Invalid frame index"); diff --git a/Userland/Libraries/LibGfx/ImageFormats/QOILoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/QOILoader.cpp index 8dee9bc211..8af83d37e6 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/QOILoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/QOILoader.cpp @@ -212,7 +212,7 @@ ErrorOr> QOIImageDecoderPlugin::create(Readonl return adopt_nonnull_own_or_enomem(new (nothrow) QOIImageDecoderPlugin(move(stream))); } -ErrorOr QOIImageDecoderPlugin::frame(size_t index) +ErrorOr QOIImageDecoderPlugin::frame(size_t index, Optional) { if (index > 0) return Error::from_string_literal("Invalid frame index"); diff --git a/Userland/Libraries/LibGfx/ImageFormats/QOILoader.h b/Userland/Libraries/LibGfx/ImageFormats/QOILoader.h index 348451e57b..8ebb4e9aef 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/QOILoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/QOILoader.h @@ -51,7 +51,7 @@ public: virtual size_t loop_count() override { return 0; } virtual size_t frame_count() override { return 1; } virtual size_t first_animated_frame_index() override { return 0; } - virtual ErrorOr frame(size_t index) override; + virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; virtual ErrorOr> icc_data() override; private: diff --git a/Userland/Libraries/LibGfx/ImageFormats/TGALoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/TGALoader.cpp index de58a3b783..6c1184bf45 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/TGALoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/TGALoader.cpp @@ -264,7 +264,7 @@ size_t TGAImageDecoderPlugin::first_animated_frame_index() return 0; } -ErrorOr TGAImageDecoderPlugin::frame(size_t index) +ErrorOr TGAImageDecoderPlugin::frame(size_t index, Optional) { auto bits_per_pixel = m_context->header.bits_per_pixel; auto color_map = m_context->header.color_map_type; diff --git a/Userland/Libraries/LibGfx/ImageFormats/TGALoader.h b/Userland/Libraries/LibGfx/ImageFormats/TGALoader.h index 10fd68d1be..2ff3b7ff5a 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/TGALoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/TGALoader.h @@ -28,7 +28,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual size_t first_animated_frame_index() override; - virtual ErrorOr frame(size_t index) override; + virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; virtual ErrorOr> icc_data() override; private: diff --git a/Userland/Libraries/LibGfx/ImageFormats/WebPLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/WebPLoader.cpp index 1f9e4a9819..0e65e87c83 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/WebPLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/WebPLoader.cpp @@ -801,7 +801,7 @@ size_t WebPImageDecoderPlugin::first_animated_frame_index() return 0; } -ErrorOr WebPImageDecoderPlugin::frame(size_t index) +ErrorOr WebPImageDecoderPlugin::frame(size_t index, Optional) { if (index >= frame_count()) return Error::from_string_literal("WebPImageDecoderPlugin: Invalid frame index"); diff --git a/Userland/Libraries/LibGfx/ImageFormats/WebPLoader.h b/Userland/Libraries/LibGfx/ImageFormats/WebPLoader.h index e5122fec00..c0396f3007 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/WebPLoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/WebPLoader.h @@ -27,7 +27,7 @@ public: virtual size_t loop_count() override; virtual size_t frame_count() override; virtual size_t first_animated_frame_index() override; - virtual ErrorOr frame(size_t index) override; + virtual ErrorOr frame(size_t index, Optional ideal_size = {}) override; virtual ErrorOr> icc_data() override; private: