diff --git a/Userland/Libraries/LibGfx/ImageFormats/CCITTDecoder.cpp b/Userland/Libraries/LibGfx/ImageFormats/CCITTDecoder.cpp index ef9d7a5272b..d39e55ec1c8 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/CCITTDecoder.cpp +++ b/Userland/Libraries/LibGfx/ImageFormats/CCITTDecoder.cpp @@ -596,13 +596,19 @@ ErrorOr decode_ccitt_group3(ReadonlyBytes bytes, u32 image_width, u3 // NOTE: For whatever reason, the last EOL doesn't seem to be included for (u32 i = 0; i < image_height; ++i) { - TRY(read_eol(*bit_stream, options.use_fill_bits)); + if (options.require_end_of_line == Group3Options::RequireEndOfLine::Yes) + TRY(read_eol(*bit_stream, options.use_fill_bits)); TRY(decode_single_ccitt3_1d_line(*bit_stream, *decoded_bits, image_width)); + if (options.encoded_byte_aligned == Group3Options::EncodedByteAligned::Yes) + bit_stream->align_to_byte_boundary(); } return decoded_bytes; } + if (options.require_end_of_line == Group3Options::RequireEndOfLine::No || options.encoded_byte_aligned == Group3Options::EncodedByteAligned::Yes) + return Error::from_string_literal("CCITTDecoder: Unsupported option for CCITT3 2D decoding"); + TRY(decode_single_ccitt3_2d_block(*bit_stream, *decoded_bits, image_width, image_height, options.use_fill_bits)); return decoded_bytes; } diff --git a/Userland/Libraries/LibGfx/ImageFormats/CCITTDecoder.h b/Userland/Libraries/LibGfx/ImageFormats/CCITTDecoder.h index b27754f60e3..6b7f756e55a 100644 --- a/Userland/Libraries/LibGfx/ImageFormats/CCITTDecoder.h +++ b/Userland/Libraries/LibGfx/ImageFormats/CCITTDecoder.h @@ -43,9 +43,24 @@ struct Group3Options { Yes = 1, }; + // Addition from the PDF specification + enum class RequireEndOfLine : u8 { + No = 0, + Yes = 1, + }; + + enum class EncodedByteAligned : u8 { + No = 0, + Yes = 1, + }; + Mode dimensions = Mode::OneDimension; Compression compression = Compression::Compressed; UseFillBits use_fill_bits = UseFillBits::No; + + // Default values are set to be compatible with the CCITT specification + RequireEndOfLine require_end_of_line = RequireEndOfLine::Yes; + EncodedByteAligned encoded_byte_aligned = EncodedByteAligned::No; }; ErrorOr decode_ccitt_group3(ReadonlyBytes bytes, u32 image_width, u32 image_height, Group3Options const& options);