| 
									
										
										
										
											2022-09-16 15:15:14 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2022, Dex♪ <dexes.ttp@gmail.com> | 
					
						
							|  |  |  |  * Copyright (c) 2022, Andreas Kling <kling@serenityos.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-02 12:01:17 -06:00
										 |  |  | #include "ImageCodecPlugin.h"
 | 
					
						
							| 
									
										
										
										
											2023-10-31 15:27:23 -06:00
										 |  |  | #ifdef AK_OS_ANDROID
 | 
					
						
							|  |  |  | #    include <Ladybird/Android/src/main/cpp/WebContentService.h>
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #    include "HelperProcess.h"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2023-09-08 06:30:50 -04:00
										 |  |  | #include "Utilities.h"
 | 
					
						
							| 
									
										
										
										
											2022-09-16 15:15:14 +02:00
										 |  |  | #include <LibGfx/Bitmap.h>
 | 
					
						
							| 
									
										
										
										
											2023-03-21 14:58:06 -04:00
										 |  |  | #include <LibGfx/ImageFormats/ImageDecoder.h>
 | 
					
						
							| 
									
										
										
										
											2023-09-08 06:30:50 -04:00
										 |  |  | #include <LibImageDecoderClient/Client.h>
 | 
					
						
							| 
									
										
										
										
											2022-09-16 15:15:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace Ladybird { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-02 12:01:17 -06:00
										 |  |  | ImageCodecPlugin::~ImageCodecPlugin() = default; | 
					
						
							| 
									
										
										
										
											2022-09-16 15:15:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 06:30:50 -04:00
										 |  |  | Optional<Web::Platform::DecodedImage> ImageCodecPlugin::decode_image(ReadonlyBytes bytes) | 
					
						
							| 
									
										
										
										
											2022-09-16 15:15:14 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2023-09-08 06:30:50 -04:00
										 |  |  |     if (!m_client) { | 
					
						
							| 
									
										
										
										
											2023-10-31 15:27:23 -06:00
										 |  |  | #ifdef AK_OS_ANDROID
 | 
					
						
							|  |  |  |         m_client = MUST(bind_service<ImageDecoderClient::Client>(&bind_image_decoder_java)); | 
					
						
							|  |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2023-09-08 06:30:50 -04:00
										 |  |  |         auto candidate_image_decoder_paths = get_paths_for_helper_process("ImageDecoder"sv).release_value_but_fixme_should_propagate_errors(); | 
					
						
							|  |  |  |         m_client = launch_image_decoder_process(candidate_image_decoder_paths).release_value_but_fixme_should_propagate_errors(); | 
					
						
							| 
									
										
										
										
											2023-10-31 15:27:23 -06:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2023-09-08 06:30:50 -04:00
										 |  |  |         m_client->on_death = [&] { | 
					
						
							|  |  |  |             m_client = nullptr; | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-09-16 15:15:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 06:30:50 -04:00
										 |  |  |     auto result_or_empty = m_client->decode_image(bytes); | 
					
						
							|  |  |  |     if (!result_or_empty.has_value()) | 
					
						
							| 
									
										
										
										
											2022-09-16 15:15:14 +02:00
										 |  |  |         return {}; | 
					
						
							| 
									
										
										
										
											2023-09-08 06:30:50 -04:00
										 |  |  |     auto result = result_or_empty.release_value(); | 
					
						
							| 
									
										
										
										
											2022-09-16 15:15:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 06:30:50 -04:00
										 |  |  |     Web::Platform::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); | 
					
						
							| 
									
										
										
										
											2022-09-16 15:15:14 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 06:30:50 -04:00
										 |  |  |     return decoded_image; | 
					
						
							| 
									
										
										
										
											2022-09-16 15:15:14 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |