From dbe179f0d53c7ce6e1768d50c8d331ca09adb3c1 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Mon, 8 Apr 2024 21:49:21 -0400 Subject: [PATCH] LibGfx/JPEG2000: Decode tile-part QCD and QCC marker segment data --- .../Libraries/LibGfx/ImageFormats/JPEG2000Loader.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibGfx/ImageFormats/JPEG2000Loader.cpp b/Userland/Libraries/LibGfx/ImageFormats/JPEG2000Loader.cpp index 8ef3f2f4434..55ee90333c2 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/JPEG2000Loader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/JPEG2000Loader.cpp @@ -469,6 +469,8 @@ struct TilePartData { }; struct TileData { + Optional qcd; + Vector qccs; Vector tile_parts; }; @@ -660,7 +662,13 @@ static ErrorOr parse_codestream_tile_header(JPEG2000LoadingContext& contex case J2K_PLT: case J2K_COM: { auto marker = TRY(read_marker_at_cursor(context)); - if (marker.marker == J2K_COM) { + if (marker.marker == J2K_QCD) { + if (tile.qcd.has_value()) + return Error::from_string_literal("JPEG2000ImageDecoderPlugin: Multiple QCD markers in tile header"); + tile.qcd = TRY(read_quantization_default(marker.data.value())); + } else if (marker.marker == J2K_QCC) { + tile.qccs.append(TRY(read_quantization_component(marker.data.value(), context.siz.components.size()))); + } else if (marker.marker == J2K_COM) { tile_part.coms.append(TRY(read_comment(marker.data.value()))); } else { // FIXME: These are valid main header markers. Parse contents.