diff --git a/Userland/Applications/ImageViewer/ViewWidget.cpp b/Userland/Applications/ImageViewer/ViewWidget.cpp index f3ae54932ca..b2f5c8545a1 100644 --- a/Userland/Applications/ImageViewer/ViewWidget.cpp +++ b/Userland/Applications/ImageViewer/ViewWidget.cpp @@ -237,7 +237,7 @@ ErrorOr ViewWidget::try_open_file(String const& path, Core::File& file) // Use out-of-process decoding for raster formats. auto client = TRY(ImageDecoderClient::Client::try_create()); auto mime_type = Core::guess_mime_type_based_on_filename(path); - auto decoded_image = client->decode_image(file_data, mime_type); + auto decoded_image = client->decode_image(file_data, OptionalNone {}, mime_type); if (!decoded_image.has_value()) { return Error::from_string_literal("Failed to decode image"); } diff --git a/Userland/Applications/PixelPaint/Image.cpp b/Userland/Applications/PixelPaint/Image.cpp index 7d2b9de8f9b..94b3ac34345 100644 --- a/Userland/Applications/PixelPaint/Image.cpp +++ b/Userland/Applications/PixelPaint/Image.cpp @@ -57,7 +57,7 @@ ErrorOr> Image::decode_bitmap(ReadonlyBytes bitmap_da auto optional_mime_type = guessed_mime_type.map([](auto mime_type) { return mime_type.to_byte_string(); }); // FIXME: Find a way to avoid the memory copying here. - auto maybe_decoded_image = client->decode_image(bitmap_data, optional_mime_type); + auto maybe_decoded_image = client->decode_image(bitmap_data, OptionalNone {}, optional_mime_type); if (!maybe_decoded_image.has_value()) return Error::from_string_literal("Image decode failed"); diff --git a/Userland/Libraries/LibImageDecoderClient/Client.cpp b/Userland/Libraries/LibImageDecoderClient/Client.cpp index ae085b8aa38..0aa014b9879 100644 --- a/Userland/Libraries/LibImageDecoderClient/Client.cpp +++ b/Userland/Libraries/LibImageDecoderClient/Client.cpp @@ -20,7 +20,7 @@ void Client::die() on_death(); } -Optional Client::decode_image(ReadonlyBytes encoded_data, Optional mime_type) +Optional Client::decode_image(ReadonlyBytes encoded_data, Optional ideal_size, Optional mime_type) { if (encoded_data.is_empty()) return {}; @@ -33,7 +33,7 @@ Optional Client::decode_image(ReadonlyBytes encoded_data, Optional auto encoded_buffer = encoded_buffer_or_error.release_value(); memcpy(encoded_buffer.data(), encoded_data.data(), encoded_data.size()); - auto response_or_error = try_decode_image(move(encoded_buffer), mime_type); + auto response_or_error = try_decode_image(move(encoded_buffer), ideal_size, mime_type); if (response_or_error.is_error()) { dbgln("ImageDecoder died heroically"); diff --git a/Userland/Libraries/LibImageDecoderClient/Client.h b/Userland/Libraries/LibImageDecoderClient/Client.h index 5862022cd2b..ed163252c5a 100644 --- a/Userland/Libraries/LibImageDecoderClient/Client.h +++ b/Userland/Libraries/LibImageDecoderClient/Client.h @@ -32,7 +32,7 @@ class Client final public: Client(NonnullOwnPtr); - Optional decode_image(ReadonlyBytes, Optional mime_type = {}); + Optional decode_image(ReadonlyBytes, Optional ideal_size = {}, Optional mime_type = {}); Function on_death; diff --git a/Userland/Services/ImageDecoder/ConnectionFromClient.cpp b/Userland/Services/ImageDecoder/ConnectionFromClient.cpp index e7382169684..54ad58adcdf 100644 --- a/Userland/Services/ImageDecoder/ConnectionFromClient.cpp +++ b/Userland/Services/ImageDecoder/ConnectionFromClient.cpp @@ -22,10 +22,10 @@ void ConnectionFromClient::die() Core::EventLoop::current().quit(0); } -static void decode_image_to_bitmaps_and_durations_with_decoder(Gfx::ImageDecoder const& decoder, Vector& bitmaps, Vector& durations) +static void decode_image_to_bitmaps_and_durations_with_decoder(Gfx::ImageDecoder const& decoder, Optional ideal_size, Vector& bitmaps, Vector& durations) { for (size_t i = 0; i < decoder.frame_count(); ++i) { - auto frame_or_error = decoder.frame(i); + auto frame_or_error = decoder.frame(i, ideal_size); if (frame_or_error.is_error()) { bitmaps.append(Gfx::ShareableBitmap {}); durations.append(0); @@ -37,7 +37,7 @@ static void decode_image_to_bitmaps_and_durations_with_decoder(Gfx::ImageDecoder } } -static void decode_image_to_details(Core::AnonymousBuffer const& encoded_buffer, Optional const& known_mime_type, bool& is_animated, u32& loop_count, Vector& bitmaps, Vector& durations) +static void decode_image_to_details(Core::AnonymousBuffer const& encoded_buffer, Optional ideal_size, Optional const& known_mime_type, bool& is_animated, u32& loop_count, Vector& bitmaps, Vector& durations) { VERIFY(bitmaps.size() == 0); VERIFY(durations.size() == 0); @@ -54,10 +54,10 @@ static void decode_image_to_details(Core::AnonymousBuffer const& encoded_buffer, } is_animated = decoder->is_animated(); loop_count = decoder->loop_count(); - decode_image_to_bitmaps_and_durations_with_decoder(*decoder, bitmaps, durations); + decode_image_to_bitmaps_and_durations_with_decoder(*decoder, ideal_size, bitmaps, durations); } -Messages::ImageDecoderServer::DecodeImageResponse ConnectionFromClient::decode_image(Core::AnonymousBuffer const& encoded_buffer, Optional const& mime_type) +Messages::ImageDecoderServer::DecodeImageResponse ConnectionFromClient::decode_image(Core::AnonymousBuffer const& encoded_buffer, Optional const& ideal_size, Optional const& mime_type) { if (!encoded_buffer.is_valid()) { dbgln_if(IMAGE_DECODER_DEBUG, "Encoded data is invalid"); @@ -68,7 +68,7 @@ Messages::ImageDecoderServer::DecodeImageResponse ConnectionFromClient::decode_i u32 loop_count = 0; Vector bitmaps; Vector durations; - decode_image_to_details(encoded_buffer, mime_type, is_animated, loop_count, bitmaps, durations); + decode_image_to_details(encoded_buffer, ideal_size, mime_type, is_animated, loop_count, bitmaps, durations); return { is_animated, loop_count, bitmaps, durations }; } diff --git a/Userland/Services/ImageDecoder/ConnectionFromClient.h b/Userland/Services/ImageDecoder/ConnectionFromClient.h index d982f31c2d8..7d3fe8a1e2d 100644 --- a/Userland/Services/ImageDecoder/ConnectionFromClient.h +++ b/Userland/Services/ImageDecoder/ConnectionFromClient.h @@ -26,7 +26,7 @@ public: private: explicit ConnectionFromClient(NonnullOwnPtr); - virtual Messages::ImageDecoderServer::DecodeImageResponse decode_image(Core::AnonymousBuffer const&, Optional const& mime_type) override; + virtual Messages::ImageDecoderServer::DecodeImageResponse decode_image(Core::AnonymousBuffer const&, Optional const& ideal_size, Optional const& mime_type) override; }; } diff --git a/Userland/Services/ImageDecoder/ImageDecoderServer.ipc b/Userland/Services/ImageDecoder/ImageDecoderServer.ipc index 7fe3c721a36..10e92fe8cd8 100644 --- a/Userland/Services/ImageDecoder/ImageDecoderServer.ipc +++ b/Userland/Services/ImageDecoder/ImageDecoderServer.ipc @@ -3,5 +3,5 @@ endpoint ImageDecoderServer { - decode_image(Core::AnonymousBuffer data, Optional mime_type) => (bool is_animated, u32 loop_count, Vector bitmaps, Vector durations) + decode_image(Core::AnonymousBuffer data, Optional ideal_size, Optional mime_type) => (bool is_animated, u32 loop_count, Vector bitmaps, Vector durations) }