From a8f041ae116b7f1122b722ce9725347babf0ae92 Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Sun, 23 Jul 2023 14:18:58 -0400 Subject: [PATCH] LibGfx/JPEGXL: Add support for complex distribution clustering Complex distribution - distributions that are encoded using an internal symbol decoder with a single distribution, are very often used for lz77 compressed images. This is a requirement for the lz77_flower test case. --- .../LibGfx/ImageFormats/JPEGXLLoader.cpp | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibGfx/ImageFormats/JPEGXLLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/JPEGXLLoader.cpp index 66a8919ed6..99e9a99a0d 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/JPEGXLLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/JPEGXLLoader.cpp @@ -1214,16 +1214,29 @@ private: u16 num_clusters = 0; - if (is_simple) { - u8 const nbits = TRY(stream.read_bits(2)); + auto const read_clusters = [&](auto&& reader) -> ErrorOr { for (u8 i {}; i < num_distrib; ++i) { - m_clusters[i] = TRY(stream.read_bits(nbits)); + m_clusters[i] = TRY(reader()); if (m_clusters[i] >= num_clusters) num_clusters = m_clusters[i] + 1; } + return {}; + }; + if (is_simple) { + u8 const nbits = TRY(stream.read_bits(2)); + TRY(read_clusters([nbits, &stream]() { return stream.read_bits(nbits); })); } else { - TODO(); + auto const use_mtf = TRY(stream.read_bit()); + if (num_distrib == 2) + TODO(); + + auto decoder = TRY(EntropyDecoder::create(stream, 1)); + + TRY(read_clusters([&]() { return decoder.decode_hybrid_uint(stream, 0); })); + + if (use_mtf) + TODO(); } TRY(m_configs.try_resize(num_clusters)); return {};