From 1ae772c7d3b29217d0451852c4c57d2985c35934 Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Thu, 13 Jul 2023 23:39:10 -0400 Subject: [PATCH] LibGfx/JPEG: Decode the header in `create()` This is done as a part of #19893. --- .../LibGfx/ImageFormats/JPEGLoader.cpp | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp index f52c851fc0..3d0afc70eb 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/JPEGLoader.cpp @@ -1857,22 +1857,18 @@ static ErrorOr parse_header(JPEGStream& stream, JPEGLoadingContext& contex static ErrorOr decode_header(JPEGLoadingContext& context) { - if (context.state < JPEGLoadingContext::State::HeaderDecoded) { - if (auto result = parse_header(context.stream, context); result.is_error()) { - context.state = JPEGLoadingContext::State::Error; - return result.release_error(); - } + VERIFY(context.state < JPEGLoadingContext::State::HeaderDecoded); + TRY(parse_header(context.stream, context)); - if constexpr (JPEG_DEBUG) { - dbgln("Image width: {}", context.frame.width); - dbgln("Image height: {}", context.frame.height); - dbgln("Macroblocks in a row: {}", context.mblock_meta.hpadded_count); - dbgln("Macroblocks in a column: {}", context.mblock_meta.vpadded_count); - dbgln("Macroblock meta padded total: {}", context.mblock_meta.padded_total); - } - - context.state = JPEGLoadingContext::State::HeaderDecoded; + if constexpr (JPEG_DEBUG) { + dbgln("Image width: {}", context.frame.width); + dbgln("Image height: {}", context.frame.height); + dbgln("Macroblocks in a row: {}", context.mblock_meta.hpadded_count); + dbgln("Macroblocks in a column: {}", context.mblock_meta.vpadded_count); + dbgln("Macroblock meta padded total: {}", context.mblock_meta.padded_total); } + + context.state = JPEGLoadingContext::State::HeaderDecoded; return {}; } @@ -1905,7 +1901,6 @@ static ErrorOr> construct_macroblocks(JPEGLoadingContext& con static ErrorOr decode_jpeg(JPEGLoadingContext& context) { - TRY(decode_header(context)); auto macroblocks = TRY(construct_macroblocks(context)); TRY(dequantize(context, macroblocks)); inverse_dct(context, macroblocks); @@ -1923,12 +1918,7 @@ JPEGImageDecoderPlugin::~JPEGImageDecoderPlugin() = default; IntSize JPEGImageDecoderPlugin::size() { - if (m_context->state == JPEGLoadingContext::State::Error) - return {}; - if (m_context->state >= JPEGLoadingContext::State::FrameDecoded) - return { m_context->frame.width, m_context->frame.height }; - - return {}; + return { m_context->frame.width, m_context->frame.height }; } bool JPEGImageDecoderPlugin::sniff(ReadonlyBytes data) @@ -1942,7 +1932,9 @@ bool JPEGImageDecoderPlugin::sniff(ReadonlyBytes data) ErrorOr> JPEGImageDecoderPlugin::create(ReadonlyBytes data) { auto stream = TRY(try_make(data)); - return adopt_nonnull_own_or_enomem(new (nothrow) JPEGImageDecoderPlugin(move(stream))); + auto plugin = TRY(adopt_nonnull_own_or_enomem(new (nothrow) JPEGImageDecoderPlugin(move(stream)))); + TRY(decode_header(*plugin->m_context)); + return plugin; } bool JPEGImageDecoderPlugin::is_animated() @@ -1986,8 +1978,6 @@ ErrorOr JPEGImageDecoderPlugin::frame(size_t index, Option ErrorOr> JPEGImageDecoderPlugin::icc_data() { - TRY(decode_header(*m_context)); - if (m_context->icc_data.has_value()) return *m_context->icc_data; return OptionalNone {};