- Add LZWDecoder filter using lzw crate v0.10 - Support /EarlyChange parameter (default 1, late 0) - Early change (1): Adobe/TIFF variant, code size increases BEFORE - Late change (0): GIF variant, code size increases AFTER - Full predictor support (TIFF predictor 2, PNG predictors 10-15) - Bomb limit protection with partial bytes on exceed - INV-8 maintained: partial bytes returned on decode errors - 23 tests pass (19 unit tests + 4 proptests) - Fixtures generated using lzw crate for verification Acceptance criteria: - Critical test /EarlyChange=0 byte-perfect: PASS - LZWDecode without /DecodeParms defaults: PASS - LZWDecode + /Predictor 12: PASS - Truncated stream partial bytes: PASS - Bomb limit honored: PASS - proptest no panic: PASS - INV-8 maintained: PASS Refs: Plan Phase 1.5 line 1142, PDF spec 7.4.4 Co-Authored-By: Claude Code <noreply@anthropic.com>
26 lines
1.1 KiB
Rust
26 lines
1.1 KiB
Rust
use lzw::{MsbReader, Decoder, DecoderEarlyChange};
|
|
|
|
fn main() {
|
|
// Test basic encoding/decoding
|
|
let data = b"hello world!";
|
|
|
|
// Encode with early change
|
|
let mut encoder = lzw::EncoderEarlyChange::new(lzw::MsbWriter::new(), 8);
|
|
let encoded_early: Vec<u8> = encoder.encode_bytes(data).0;
|
|
println!("Encoded (early change): {:02x?}", encoded_early);
|
|
|
|
// Decode with early change
|
|
let mut decoder = DecoderEarlyChange::new(MsbReader::new(), 8);
|
|
let (consumed, decoded) = decoder.decode_bytes(&encoded_early).unwrap();
|
|
println!("Decoded (early change): {:?}", std::str::from_utf8(decoded).unwrap());
|
|
|
|
// Encode with late change
|
|
let mut encoder2 = lzw::Encoder::new(lzw::MsbWriter::new(), 8);
|
|
let encoded_late: Vec<u8> = encoder2.encode_bytes(data).0;
|
|
println!("Encoded (late change): {:02x?}", encoded_late);
|
|
|
|
// Decode with late change
|
|
let mut decoder2 = Decoder::new(MsbReader::new(), 8);
|
|
let (consumed2, decoded2) = decoder2.decode_bytes(&encoded_late).unwrap();
|
|
println!("Decoded (late change): {:?}", std::str::from_utf8(decoded2).unwrap());
|
|
}
|