diff --git a/Userland/Libraries/LibGfx/ImageFormats/PortableImageLoaderCommon.h b/Userland/Libraries/LibGfx/ImageFormats/PortableImageLoaderCommon.h index 39c635db4b..0733774a07 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/PortableImageLoaderCommon.h +++ b/Userland/Libraries/LibGfx/ImageFormats/PortableImageLoaderCommon.h @@ -184,52 +184,35 @@ static void set_pixels(TContext& context, Vector const& color_data) } template -static bool decode(TContext& context) +static ErrorOr 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 {}; } } diff --git a/Userland/Libraries/LibGfx/ImageFormats/PortableImageMapLoader.h b/Userland/Libraries/LibGfx/ImageFormats/PortableImageMapLoader.h index 5698df5eb5..0fff8600de 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/PortableImageMapLoader.h +++ b/Userland/Libraries/LibGfx/ImageFormats/PortableImageMapLoader.h @@ -93,9 +93,11 @@ IntSize PortableImageDecoderPlugin::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,9 +170,10 @@ ErrorOr PortableImageDecoderPlugin::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);