From 7cbf76586a59d5a4bbb63ba063a3f88fe8c66130 Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Wed, 26 Jul 2023 13:41:59 -0400 Subject: [PATCH] LibGfx/JPEGXL: Start parsing the `ExtraChannelInfo` bundle This implementation is not feature complete yet as it only supports channels with a type different of `ExtraChannelType::kAlpha`. This patch also introduces the `read_enum` function. --- .../LibGfx/ImageFormats/JPEGXLLoader.cpp | 46 ++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibGfx/ImageFormats/JPEGXLLoader.cpp b/Userland/Libraries/LibGfx/ImageFormats/JPEGXLLoader.cpp index 676181b348..6a20fec8d2 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/JPEGXLLoader.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/JPEGXLLoader.cpp @@ -68,6 +68,12 @@ static ALWAYS_INLINE ErrorOr U64(LittleEndianInputBitStream& stream) return value; } +template +ErrorOr read_enum(LittleEndianInputBitStream& stream) +{ + return static_cast(U32(0, 1, 2 + TRY(stream.read_bits(4)), 18 + TRY(stream.read_bits(6)))); +} + // This is not specified static ErrorOr read_string(LittleEndianInputBitStream& stream) { @@ -313,11 +319,47 @@ struct AnimationHeader { }; struct ExtraChannelInfo { + enum class ExtraChannelType { + kAlpha = 0, + kDepth = 1, + kSpotColour = 2, + kSelectionMask = 3, + kBlack = 4, + kCFA = 5, + kThermal = 6, + kNonOptional = 15, + kOptional = 16, + }; + + bool d_alpha { true }; + ExtraChannelType type { ExtraChannelType::kAlpha }; + BitDepth bit_depth {}; + u32 dim_shift {}; + String name; + bool alpha_associated { false }; }; -static ErrorOr read_extra_channel_info(LittleEndianInputBitStream&) +static ErrorOr read_extra_channel_info(LittleEndianInputBitStream& stream) { - TODO(); + ExtraChannelInfo extra_channel_info; + + extra_channel_info.d_alpha = TRY(stream.read_bit()); + + if (!extra_channel_info.d_alpha) { + extra_channel_info.type = TRY(read_enum(stream)); + extra_channel_info.bit_depth = TRY(read_bit_depth(stream)); + extra_channel_info.dim_shift = U32(0, 3, 4, 1 + TRY(stream.read_bits(3))); + extra_channel_info.name = TRY(read_string(stream)); + + if (extra_channel_info.type == ExtraChannelInfo::ExtraChannelType::kAlpha) + extra_channel_info.alpha_associated = TRY(stream.read_bit()); + } + + if (extra_channel_info.type != ExtraChannelInfo::ExtraChannelType::kAlpha) { + TODO(); + } + + return extra_channel_info; } struct ToneMapping {