LibWeb: Abstract the image decoding via Web::ImageDecoding::Decoder

After this change, LibWeb now expects Web::ImageDecoding::Decoder to be
pre-initialized with a concrete implementation before using the webpage.
The previous implementation, based on the ImageDecoder service, has been
provided directly through an adapter in LibWebClient, and is now used as
the default value by WebContent.
This commit is contained in:
DexesTTP 2022-04-30 11:21:21 +02:00 committed by Andreas Kling
parent 962040b49c
commit 2198091bbc
Notes: sideshowbarker 2024-07-17 10:53:54 +09:00
11 changed files with 132 additions and 20 deletions

View file

@ -0,0 +1,41 @@
/*
* Copyright (c) 2022, Dex <dexes.ttp@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibImageDecoderClient/Client.h>
#include <LibWebView/ImageDecoderClientAdapter.h>
namespace WebView {
NonnullRefPtr<ImageDecoderClientAdapter> ImageDecoderClientAdapter::create()
{
return adopt_ref(*new ImageDecoderClientAdapter());
}
Optional<Web::ImageDecoding::DecodedImage> ImageDecoderClientAdapter::decode_image(ReadonlyBytes bytes)
{
if (!m_client) {
m_client = ImageDecoderClient::Client::try_create().release_value_but_fixme_should_propagate_errors();
m_client->on_death = [&] {
m_client = nullptr;
};
}
auto result_or_empty = m_client->decode_image(bytes);
if (!result_or_empty.has_value())
return {};
auto result = result_or_empty.release_value();
Web::ImageDecoding::DecodedImage decoded_image;
decoded_image.is_animated = result.is_animated;
decoded_image.loop_count = result.loop_count;
for (auto const& frame : result.frames) {
decoded_image.frames.empend(move(frame.bitmap), frame.duration);
}
return decoded_image;
}
}