pdftract/crates/pdftract-core/examples/test_lzw_api.rs
jedarden 1959ff2446 feat(pdftract-3uu6v): implement LZWDecode with /EarlyChange parameter
- 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>
2026-05-22 22:38:31 -04:00

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());
}