mirror of
https://github.com/RGBCube/serenity
synced 2025-05-16 19:45:07 +00:00
ImageDecoder+LibImageDecoder+LibWeb: Support animations in ImageDecoder
The ImageDecoder service now returns a list of image frames, each with a duration value. The code for in-process image decoding is removed from LibWeb, an all image decode requests are sent out-of-process to ImageDecoder. :^) This won't scale super well to very long and/or large animations, but we can work on improving that separately. The main goal here is simply to stop doing any image decoding inside LibWeb. Fixes #5165.
This commit is contained in:
parent
449d56ef74
commit
7449c1b27f
10 changed files with 143 additions and 73 deletions
|
@ -46,20 +46,30 @@ void Client::handle(const Messages::ImageDecoderClient::Dummy&)
|
|||
{
|
||||
}
|
||||
|
||||
RefPtr<Gfx::Bitmap> Client::decode_image(const ByteBuffer& encoded_data)
|
||||
Optional<DecodedImage> Client::decode_image(const ByteBuffer& encoded_data)
|
||||
{
|
||||
if (encoded_data.is_empty())
|
||||
return nullptr;
|
||||
return {};
|
||||
|
||||
auto encoded_buffer = Core::AnonymousBuffer::create_with_size(encoded_data.size());
|
||||
if (!encoded_buffer.is_valid()) {
|
||||
dbgln("Could not allocate encoded buffer");
|
||||
return nullptr;
|
||||
return {};
|
||||
}
|
||||
|
||||
memcpy(encoded_buffer.data<void>(), encoded_data.data(), encoded_data.size());
|
||||
auto response = send_sync<Messages::ImageDecoderServer::DecodeImage>(move(encoded_buffer));
|
||||
return response->bitmap().bitmap();
|
||||
|
||||
DecodedImage image;
|
||||
image.is_animated = response->is_animated();
|
||||
image.loop_count = response->loop_count();
|
||||
image.frames.resize(response->bitmaps().size());
|
||||
for (size_t i = 0; i < image.frames.size(); ++i) {
|
||||
auto& frame = image.frames[i];
|
||||
frame.bitmap = response->bitmaps()[i].bitmap();
|
||||
frame.duration = response->durations()[i];
|
||||
}
|
||||
return move(image);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue