1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 03:47:35 +00:00

LibGfx/JPEG: Decode the header in create()

This is done as a part of #19893.
This commit is contained in:
Lucas CHOLLET 2023-07-13 23:39:10 -04:00 committed by Andreas Kling
parent 2f125b86aa
commit 1ae772c7d3

View file

@ -1857,22 +1857,18 @@ static ErrorOr<void> parse_header(JPEGStream& stream, JPEGLoadingContext& contex
static ErrorOr<void> decode_header(JPEGLoadingContext& context) static ErrorOr<void> decode_header(JPEGLoadingContext& context)
{ {
if (context.state < JPEGLoadingContext::State::HeaderDecoded) { VERIFY(context.state < JPEGLoadingContext::State::HeaderDecoded);
if (auto result = parse_header(context.stream, context); result.is_error()) { TRY(parse_header(context.stream, context));
context.state = JPEGLoadingContext::State::Error;
return result.release_error();
}
if constexpr (JPEG_DEBUG) { if constexpr (JPEG_DEBUG) {
dbgln("Image width: {}", context.frame.width); dbgln("Image width: {}", context.frame.width);
dbgln("Image height: {}", context.frame.height); dbgln("Image height: {}", context.frame.height);
dbgln("Macroblocks in a row: {}", context.mblock_meta.hpadded_count); dbgln("Macroblocks in a row: {}", context.mblock_meta.hpadded_count);
dbgln("Macroblocks in a column: {}", context.mblock_meta.vpadded_count); dbgln("Macroblocks in a column: {}", context.mblock_meta.vpadded_count);
dbgln("Macroblock meta padded total: {}", context.mblock_meta.padded_total); dbgln("Macroblock meta padded total: {}", context.mblock_meta.padded_total);
}
context.state = JPEGLoadingContext::State::HeaderDecoded;
} }
context.state = JPEGLoadingContext::State::HeaderDecoded;
return {}; return {};
} }
@ -1905,7 +1901,6 @@ static ErrorOr<Vector<Macroblock>> construct_macroblocks(JPEGLoadingContext& con
static ErrorOr<void> decode_jpeg(JPEGLoadingContext& context) static ErrorOr<void> decode_jpeg(JPEGLoadingContext& context)
{ {
TRY(decode_header(context));
auto macroblocks = TRY(construct_macroblocks(context)); auto macroblocks = TRY(construct_macroblocks(context));
TRY(dequantize(context, macroblocks)); TRY(dequantize(context, macroblocks));
inverse_dct(context, macroblocks); inverse_dct(context, macroblocks);
@ -1923,12 +1918,7 @@ JPEGImageDecoderPlugin::~JPEGImageDecoderPlugin() = default;
IntSize JPEGImageDecoderPlugin::size() IntSize JPEGImageDecoderPlugin::size()
{ {
if (m_context->state == JPEGLoadingContext::State::Error) return { m_context->frame.width, m_context->frame.height };
return {};
if (m_context->state >= JPEGLoadingContext::State::FrameDecoded)
return { m_context->frame.width, m_context->frame.height };
return {};
} }
bool JPEGImageDecoderPlugin::sniff(ReadonlyBytes data) bool JPEGImageDecoderPlugin::sniff(ReadonlyBytes data)
@ -1942,7 +1932,9 @@ bool JPEGImageDecoderPlugin::sniff(ReadonlyBytes data)
ErrorOr<NonnullOwnPtr<ImageDecoderPlugin>> JPEGImageDecoderPlugin::create(ReadonlyBytes data) ErrorOr<NonnullOwnPtr<ImageDecoderPlugin>> JPEGImageDecoderPlugin::create(ReadonlyBytes data)
{ {
auto stream = TRY(try_make<FixedMemoryStream>(data)); auto stream = TRY(try_make<FixedMemoryStream>(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() bool JPEGImageDecoderPlugin::is_animated()
@ -1986,8 +1978,6 @@ ErrorOr<ImageFrameDescriptor> JPEGImageDecoderPlugin::frame(size_t index, Option
ErrorOr<Optional<ReadonlyBytes>> JPEGImageDecoderPlugin::icc_data() ErrorOr<Optional<ReadonlyBytes>> JPEGImageDecoderPlugin::icc_data()
{ {
TRY(decode_header(*m_context));
if (m_context->icc_data.has_value()) if (m_context->icc_data.has_value())
return *m_context->icc_data; return *m_context->icc_data;
return OptionalNone {}; return OptionalNone {};