diff --git a/Userland/Libraries/LibCompress/LZWDecoder.h b/Userland/Libraries/LibCompress/LZWDecoder.h index 21d30fdf71..2317fbd091 100644 --- a/Userland/Libraries/LibCompress/LZWDecoder.h +++ b/Userland/Libraries/LibCompress/LZWDecoder.h @@ -12,6 +12,7 @@ #include #include #include +#include #include namespace Compress { @@ -33,6 +34,34 @@ public: init_code_table(); } + static ErrorOr decode_all(ReadonlyBytes bytes, u8 initial_code_size, i32 offset_for_size_change = 0) + { + auto memory_stream = make(bytes); + auto lzw_stream = make(MaybeOwned(move(memory_stream))); + Compress::LZWDecoder lzw_decoder { MaybeOwned { move(lzw_stream) }, initial_code_size, offset_for_size_change }; + + ByteBuffer decoded; + + u16 const clear_code = lzw_decoder.add_control_code(); + u16 const end_of_data_code = lzw_decoder.add_control_code(); + + while (true) { + auto const code = TRY(lzw_decoder.next_code()); + + if (code == clear_code) { + lzw_decoder.reset(); + continue; + } + + if (code == end_of_data_code) + break; + + TRY(decoded.try_append(lzw_decoder.get_output())); + } + + return decoded; + } + u16 add_control_code() { u16 const control_code = m_code_table.size(); diff --git a/Userland/Libraries/LibPDF/Filter.cpp b/Userland/Libraries/LibPDF/Filter.cpp index f43de7969a..63eebd7bfe 100644 --- a/Userland/Libraries/LibPDF/Filter.cpp +++ b/Userland/Libraries/LibPDF/Filter.cpp @@ -198,29 +198,7 @@ PDFErrorOr Filter::handle_lzw_and_flate_parameters(ByteBuffer buffer PDFErrorOr Filter::decode_lzw(ReadonlyBytes bytes, int predictor, int columns, int colors, int bits_per_component, int early_change) { - auto memory_stream = make(bytes); - auto lzw_stream = make(MaybeOwned(move(memory_stream))); - Compress::LZWDecoder lzw_decoder { MaybeOwned { move(lzw_stream) }, 8, -early_change }; - - ByteBuffer decoded; - - u16 const clear_code = lzw_decoder.add_control_code(); - u16 const end_of_data_code = lzw_decoder.add_control_code(); - - while (true) { - auto const code = TRY(lzw_decoder.next_code()); - - if (code == clear_code) { - lzw_decoder.reset(); - continue; - } - - if (code == end_of_data_code) - break; - - TRY(decoded.try_append(lzw_decoder.get_output())); - } - + auto decoded = TRY(Compress::LZWDecoder::decode_all(bytes, 8, -early_change)); return handle_lzw_and_flate_parameters(move(decoded), predictor, columns, colors, bits_per_component); }