1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 12:17:44 +00:00

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.
This commit is contained in:
Lucas CHOLLET 2023-07-23 14:18:58 -04:00 committed by Andreas Kling
parent 18c511f54c
commit a8f041ae11

View file

@ -1214,15 +1214,28 @@ private:
u16 num_clusters = 0; u16 num_clusters = 0;
if (is_simple) { auto const read_clusters = [&](auto&& reader) -> ErrorOr<void> {
u8 const nbits = TRY(stream.read_bits(2));
for (u8 i {}; i < num_distrib; ++i) { 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) if (m_clusters[i] >= num_clusters)
num_clusters = m_clusters[i] + 1; 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 { } else {
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(); TODO();
} }
TRY(m_configs.try_resize(num_clusters)); TRY(m_configs.try_resize(num_clusters));