mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 09:42:45 +00:00 
			
		
		
		
	Userland: Return empty if ImageDecoder client receives an invalid frame
This simplifies error checking for all the users of the ImageDecoder client.
This commit is contained in:
		
							parent
							
								
									e6c1429311
								
							
						
					
					
						commit
						eaa6304aab
					
				
					 6 changed files with 11 additions and 15 deletions
				
			
		|  | @ -246,7 +246,7 @@ ErrorOr<void> ViewWidget::try_open_file(String const& path, Core::File& file) | ||||||
|         frames.ensure_capacity(decoded_image->frames.size()); |         frames.ensure_capacity(decoded_image->frames.size()); | ||||||
|         for (u32 i = 0; i < decoded_image->frames.size(); i++) { |         for (u32 i = 0; i < decoded_image->frames.size(); i++) { | ||||||
|             auto& frame_data = decoded_image->frames[i]; |             auto& frame_data = decoded_image->frames[i]; | ||||||
|             frames.unchecked_append({ BitmapImage::create(*frame_data.bitmap), int(frame_data.duration) }); |             frames.unchecked_append({ BitmapImage::create(frame_data.bitmap), int(frame_data.duration) }); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -66,10 +66,7 @@ ErrorOr<NonnullRefPtr<Gfx::Bitmap>> Image::decode_bitmap(ReadonlyBytes bitmap_da | ||||||
|     if (decoded_image.frames.is_empty()) |     if (decoded_image.frames.is_empty()) | ||||||
|         return Error::from_string_literal("Image decode failed (no frames)"); |         return Error::from_string_literal("Image decode failed (no frames)"); | ||||||
| 
 | 
 | ||||||
|     auto decoded_bitmap = decoded_image.frames.first().bitmap; |     return decoded_image.frames.first().bitmap; | ||||||
|     if (decoded_bitmap.is_null()) |  | ||||||
|         return Error::from_string_literal("Image decode failed (no bitmap for frame)"); |  | ||||||
|     return decoded_bitmap.release_nonnull(); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| ErrorOr<NonnullRefPtr<Image>> Image::create_from_bitmap(NonnullRefPtr<Gfx::Bitmap> const& bitmap) | ErrorOr<NonnullRefPtr<Image>> Image::create_from_bitmap(NonnullRefPtr<Gfx::Bitmap> const& bitmap) | ||||||
|  |  | ||||||
|  | @ -48,12 +48,13 @@ Optional<DecodedImage> Client::decode_image(ReadonlyBytes encoded_data, Optional | ||||||
|     DecodedImage image; |     DecodedImage image; | ||||||
|     image.is_animated = response.is_animated(); |     image.is_animated = response.is_animated(); | ||||||
|     image.loop_count = response.loop_count(); |     image.loop_count = response.loop_count(); | ||||||
|     image.frames.resize(response.bitmaps().size()); |     image.frames.ensure_capacity(response.bitmaps().size()); | ||||||
|     auto bitmaps = response.take_bitmaps(); |     auto bitmaps = response.take_bitmaps(); | ||||||
|     for (size_t i = 0; i < image.frames.size(); ++i) { |     for (size_t i = 0; i < bitmaps.size(); ++i) { | ||||||
|         auto& frame = image.frames[i]; |         if (!bitmaps[i].is_valid()) | ||||||
|         frame.bitmap = bitmaps[i].bitmap(); |             return {}; | ||||||
|         frame.duration = response.durations()[i]; | 
 | ||||||
|  |         image.frames.empend(*bitmaps[i].bitmap(), response.durations()[i]); | ||||||
|     } |     } | ||||||
|     return image; |     return image; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ | ||||||
| namespace ImageDecoderClient { | namespace ImageDecoderClient { | ||||||
| 
 | 
 | ||||||
| struct Frame { | struct Frame { | ||||||
|     RefPtr<Gfx::Bitmap> bitmap; |     NonnullRefPtr<Gfx::Bitmap> bitmap; | ||||||
|     u32 duration { 0 }; |     u32 duration { 0 }; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -31,9 +31,7 @@ Optional<Web::Platform::DecodedImage> ImageCodecPluginSerenity::decode_image(Rea | ||||||
|     decoded_image.is_animated = result.is_animated; |     decoded_image.is_animated = result.is_animated; | ||||||
|     decoded_image.loop_count = result.loop_count; |     decoded_image.loop_count = result.loop_count; | ||||||
|     for (auto const& frame : result.frames) { |     for (auto const& frame : result.frames) { | ||||||
|         if (!frame.bitmap) |         decoded_image.frames.empend(frame.bitmap, frame.duration); | ||||||
|             return {}; |  | ||||||
|         decoded_image.frames.empend(move(frame.bitmap), frame.duration); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return decoded_image; |     return decoded_image; | ||||||
|  |  | ||||||
|  | @ -80,7 +80,7 @@ ErrorOr<NonnullRefPtr<Client>> Client::create(StringView image_path, StringView | ||||||
|     if (!maybe_image.has_value()) |     if (!maybe_image.has_value()) | ||||||
|         return Error::from_string_view("Image could not be read"sv); |         return Error::from_string_view("Image could not be read"sv); | ||||||
| 
 | 
 | ||||||
|     auto image = maybe_image->frames.take_first().bitmap.release_nonnull(); |     auto image = maybe_image->frames.take_first().bitmap; | ||||||
| 
 | 
 | ||||||
|     // Make sure to not draw out of bounds; some servers will disconnect us for that!
 |     // Make sure to not draw out of bounds; some servers will disconnect us for that!
 | ||||||
|     if (image->width() > canvas_size.width()) { |     if (image->width() > canvas_size.width()) { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Tim Ledbetter
						Tim Ledbetter