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 062b937d9e5..2aed49949a1 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 b865f0d18b0..22d42f98e52 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 67f0b10a99f..b31501886ef 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 0cfd0b48058..d7e3c909564 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 b77728b95c2..e6509f0af8e 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 a3c82cd8764..f6631a48d7c 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 c0f19edbac3..07a67e4b616 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 65e78ee79b8..e9d57db380b 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 716e628d2cd..ee2c4580291 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 edcbd73448b..f9ce0a33df1 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 a29ecd8adc2..b10aca628e2 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 1998c34f02c..607b580b81a 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 3435f77b549..053dd6b72ec 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 a87d7d4f50f..6a5d6312091 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 8dee9bc2117..8af83d37e6f 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 348451e57bb..8ebb4e9aef6 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 de58a3b7830..6c1184bf459 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 10fd68d1be5..2ff3b7ff5ac 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 1f9e4a98195..0e65e87c83d 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 e5122fec00e..c0396f30077 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: