mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 01:37:36 +00:00
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:
parent
962040b49c
commit
2198091bbc
11 changed files with 132 additions and 20 deletions
|
@ -1,5 +1,6 @@
|
|||
set(SOURCES
|
||||
DOMTreeModel.cpp
|
||||
ImageDecoderClientAdapter.cpp
|
||||
OutOfProcessWebView.cpp
|
||||
StylePropertiesModel.cpp
|
||||
WebContentClient.cpp
|
||||
|
@ -13,6 +14,6 @@ set(GENERATED_SOURCES
|
|||
)
|
||||
|
||||
serenity_lib(LibWebView webview)
|
||||
target_link_libraries(LibWebView LibGfx LibGUI LibIPC LibWeb)
|
||||
target_link_libraries(LibWebView LibGfx LibGUI LibImageDecoderClient LibIPC LibWeb)
|
||||
|
||||
add_subdirectory(DumpLayoutTree)
|
||||
|
|
41
Userland/Libraries/LibWebView/ImageDecoderClientAdapter.cpp
Normal file
41
Userland/Libraries/LibWebView/ImageDecoderClientAdapter.cpp
Normal 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;
|
||||
}
|
||||
|
||||
}
|
32
Userland/Libraries/LibWebView/ImageDecoderClientAdapter.h
Normal file
32
Userland/Libraries/LibWebView/ImageDecoderClientAdapter.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Dex♪ <dexes.ttp@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/NonnullRefPtr.h>
|
||||
#include <LibWeb/ImageDecoding.h>
|
||||
|
||||
namespace ImageDecoderClient {
|
||||
class Client;
|
||||
}
|
||||
|
||||
namespace WebView {
|
||||
|
||||
class ImageDecoderClientAdapter : public Web::ImageDecoding::Decoder {
|
||||
public:
|
||||
static NonnullRefPtr<ImageDecoderClientAdapter> create();
|
||||
|
||||
virtual ~ImageDecoderClientAdapter() override = default;
|
||||
|
||||
virtual Optional<Web::ImageDecoding::DecodedImage> decode_image(ReadonlyBytes) override;
|
||||
|
||||
private:
|
||||
explicit ImageDecoderClientAdapter() = default;
|
||||
|
||||
RefPtr<ImageDecoderClient::Client> m_client;
|
||||
};
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue