LibGfx/PortableFormat: Propagate errors from decode()

This commit is contained in:
Lucas CHOLLET 2023-03-12 23:03:08 -04:00 committed by Andreas Kling
parent 7ec310384a
commit fd04b2dc9b
2 changed files with 20 additions and 34 deletions

View file

@ -184,52 +184,35 @@ static void set_pixels(TContext& context, Vector<Gfx::Color> const& color_data)
}
template<typename TContext>
static bool decode(TContext& context)
static ErrorOr<void> decode(TContext& context)
{
if (context.state >= TContext::State::Decoded)
return true;
return {};
auto error_guard = ArmedScopeGuard([&] {
context.state = TContext::State::Error;
});
TRY(read_magic_number(context));
if (read_magic_number(context).is_error())
return false;
TRY(read_whitespace(context));
if (read_whitespace(context).is_error())
return false;
if (read_width(context).is_error())
return false;
if (read_whitespace(context).is_error())
return false;
if (read_height(context).is_error())
return false;
TRY(read_width(context));
TRY(read_whitespace(context));
TRY(read_height(context));
if (context.width > maximum_width_for_decoded_images || context.height > maximum_height_for_decoded_images) {
dbgln("This portable network image is too large for comfort: {}x{}", context.width, context.height);
return false;
return Error::from_string_literal("This portable network image is too large.");
}
if (read_whitespace(context).is_error())
return false;
TRY(read_whitespace(context));
if constexpr (requires { context.format_details.max_val; }) {
if (read_max_val(context).is_error())
return false;
if (read_whitespace(context).is_error())
return false;
TRY(read_max_val(context));
TRY(read_whitespace(context));
}
if (read_image_data(context).is_error())
return false;
TRY(read_image_data(context));
error_guard.disarm();
context.state = TContext::State::Decoded;
return true;
return {};
}
}

View file

@ -93,10 +93,12 @@ IntSize PortableImageDecoderPlugin<TContext>::size()
return {};
if (m_context->state < TContext::State::Decoded) {
bool success = decode(*m_context);
if (!success)
if (decode(*m_context).is_error()) {
m_context->state = TContext::State::Error;
// FIXME: We should propagate errors
return {};
}
}
return { m_context->width, m_context->height };
}
@ -168,10 +170,11 @@ ErrorOr<ImageFrameDescriptor> PortableImageDecoderPlugin<TContext>::frame(size_t
return Error::from_string_literal("PortableImageDecoderPlugin: Decoding failed");
if (m_context->state < TContext::State::Decoded) {
bool success = decode(*m_context);
if (!success)
if (decode(*m_context).is_error()) {
m_context->state = TContext::State::Error;
return Error::from_string_literal("PortableImageDecoderPlugin: Decoding failed");
}
}
VERIFY(m_context->bitmap);
return ImageFrameDescriptor { m_context->bitmap, 0 };