mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 03:42:44 +00:00 
			
		
		
		
	 eb4a69c377
			
		
	
	
		eb4a69c377
		
	
	
	
	
		
			
			By taking ownership of the bitmaps after decoding them, we avoid having to call an API that would give us a const Bitmap.
		
			
				
	
	
		
			61 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020-2021, Andreas Kling <kling@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include <LibCore/AnonymousBuffer.h>
 | |
| #include <LibImageDecoderClient/Client.h>
 | |
| 
 | |
| namespace ImageDecoderClient {
 | |
| 
 | |
| Client::Client(NonnullOwnPtr<Core::LocalSocket> socket)
 | |
|     : IPC::ConnectionToServer<ImageDecoderClientEndpoint, ImageDecoderServerEndpoint>(*this, move(socket))
 | |
| {
 | |
| }
 | |
| 
 | |
| void Client::die()
 | |
| {
 | |
|     if (on_death)
 | |
|         on_death();
 | |
| }
 | |
| 
 | |
| Optional<DecodedImage> Client::decode_image(ReadonlyBytes encoded_data, Optional<DeprecatedString> 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<void>(), 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.resize(response.bitmaps().size());
 | |
|     auto bitmaps = response.take_bitmaps();
 | |
|     for (size_t i = 0; i < image.frames.size(); ++i) {
 | |
|         auto& frame = image.frames[i];
 | |
|         frame.bitmap = bitmaps[i].bitmap();
 | |
|         frame.duration = response.durations()[i];
 | |
|     }
 | |
|     return image;
 | |
| }
 | |
| 
 | |
| }
 |