mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 10:18:11 +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