/* * Copyright (c) 2020-2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include #include namespace ImageDecoderClient { Client::Client(NonnullOwnPtr socket) : IPC::ConnectionToServer(*this, move(socket)) { } void Client::die() { if (on_death) on_death(); } Optional Client::decode_image(ReadonlyBytes encoded_data, Optional mime_type) { if (encoded_data.is_empty()) return {}; auto encoded_buffer_or_error = Core::AnonymousBuffer::create_with_size(encoded_data.size()); if (encoded_buffer_or_error.is_error()) { dbgln("Could not allocate encoded buffer"); return {}; } 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); if (response_or_error.is_error()) { dbgln("ImageDecoder died heroically"); return {}; } auto& response = response_or_error.value(); if (response.bitmaps().is_empty()) return {}; DecodedImage image; image.is_animated = response.is_animated(); image.loop_count = response.loop_count(); image.frames.ensure_capacity(response.bitmaps().size()); auto bitmaps = response.take_bitmaps(); for (size_t i = 0; i < bitmaps.size(); ++i) { if (!bitmaps[i].is_valid()) return {}; image.frames.empend(*bitmaps[i].bitmap(), response.durations()[i]); } return image; } }