use rusty_jpeg::decode::Decoder;
use std::io::Cursor;
const LIBJPEG_PROGRESSIVE: &[u8] = include_bytes!("fixtures/progressive_libjpeg.jpg");
#[test]
fn progressive_dc_scan_before_any_ac_table_does_not_panic() {
let img = Decoder::new(Cursor::new(LIBJPEG_PROGRESSIVE))
.decode()
.expect("libjpeg progressive file must decode");
assert_eq!(img.len(), 32 * 32 * 3, "unexpected decoded size");
let first = img[0];
assert!(
img.iter().any(|&p| p != first),
"decoded progressive image is a flat constant"
);
}
#[test]
fn progressive_decodes_through_the_planar_path_too() {
let mut d = Decoder::new(Cursor::new(LIBJPEG_PROGRESSIVE));
d.set_single_threaded(true);
let img = d.decode_planar().expect("planar progressive decode");
assert_eq!(img.components.len(), 3);
for c in &img.components {
let need = c.stride * c.height.saturating_sub(1) + c.width;
assert!(c.data.len() >= need, "plane smaller than its geometry");
}
}
#[test]
fn missing_ac_table_on_an_ac_scan_is_an_error_not_a_panic() {
for cut in (24..LIBJPEG_PROGRESSIVE.len()).step_by(7) {
let data = &LIBJPEG_PROGRESSIVE[..cut];
let res = std::panic::catch_unwind(|| {
let mut d = Decoder::new(Cursor::new(data));
d.set_single_threaded(true);
d.decode().is_ok()
});
assert!(
res.is_ok(),
"panicked on a progressive file truncated to {cut} bytes"
);
}
}
#[test]
fn oversized_progressive_frame_is_rejected_before_allocating() {
let mut data = LIBJPEG_PROGRESSIVE.to_vec();
let mut i = 2;
let mut patched = false;
while i + 9 < data.len() {
if data[i] != 0xFF {
i += 1;
continue;
}
let m = data[i + 1];
if m == 0xD8 || m == 0xD9 || (0xD0..=0xD7).contains(&m) {
i += 2;
continue;
}
let ln = ((data[i + 2] as usize) << 8) | data[i + 3] as usize;
if m == 0xC2 {
data[i + 5] = 0xFF;
data[i + 6] = 0xFF;
data[i + 7] = 0xFF;
data[i + 8] = 0xFF;
patched = true;
break;
}
i += 2 + ln;
}
assert!(patched, "test fixture has no SOF2 to patch");
let mut d = Decoder::new(Cursor::new(&data));
d.set_single_threaded(true);
d.set_max_decoding_buffer_size(64 * 1024 * 1024);
assert!(
d.decode().is_err(),
"a 65535x65535 progressive frame was accepted under a 64 MB limit"
);
}