From 33ca35f1c7deebb74b180613d584f8575210c7ed Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Sat, 22 Jul 2023 13:02:50 -0400 Subject: [PATCH] LibGfx/JPEGXL: Apply transformations after all PassGroups The original image this decoder was written for has a single PassGroup, so applying transformations after each PassGroup or after all of them was equivalent. This patch fix the behavior for images with 0 or more than one PassGroup. --- .../LibGfx/ImageFormats/JPEGXLLoader.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Userland/Libraries/LibGfx/ImageFormats/JPEGXLLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/JPEGXLLoader.cpp index f5a1d92df4..a2bfafe94f 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/JPEGXLLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/JPEGXLLoader.cpp @@ -1447,8 +1447,7 @@ static void apply_transformation(Image& image, TransformInfo const& transformati static ErrorOr read_pass_group(LittleEndianInputBitStream& stream, Image& image, FrameHeader const& frame_header, - u32 group_dim, - Vector const& transform_infos) + u32 group_dim) { if (frame_header.encoding == FrameHeader::Encoding::kVarDCT) { (void)stream; @@ -1469,9 +1468,6 @@ static ErrorOr read_pass_group(LittleEndianInputBitStream& stream, TODO(); } - for (auto const& transformation : transform_infos.in_reverse()) - apply_transformation(image, transformation); - return {}; } /// @@ -1538,9 +1534,15 @@ static ErrorOr read_frame(LittleEndianInputBitStream& stream, } auto const num_pass_group = frame.num_groups * frame.frame_header.passes.num_passes; - auto const& transform_info = frame.lf_global.gmodular.modular_header.transform; + auto const& transform_infos = frame.lf_global.gmodular.modular_header.transform; for (u64 i {}; i < num_pass_group; ++i) - TRY(read_pass_group(stream, image, frame.frame_header, group_dim, transform_info)); + TRY(read_pass_group(stream, image, frame.frame_header, group_dim)); + + // G.4.2 - Modular group data + // When all modular groups are decoded, the inverse transforms are applied to + // the at that point fully decoded GlobalModular image, as specified in H.6. + for (auto const& transformation : transform_infos.in_reverse()) + apply_transformation(image, transformation); return frame; }