use djvu_rs::{
DjVuDocument, Pixmap,
iw44_encode::{Iw44EncodeOptions, encode_iw44_color},
iw44_new::Iw44Image,
jb2_encode::encode_jb2_dict,
};
const CORPUS: &str = "tests/corpus/conquete_paix.djvu";
fn decode_bg44(chunks: &[&[u8]]) -> Option<Pixmap> {
let mut img = Iw44Image::new();
for c in chunks {
img.decode_chunk(c).ok()?;
}
img.to_rgb().ok()
}
#[test]
fn iw44_bg44_size_does_not_regress() {
let data = std::fs::read(CORPUS).expect("corpus fixture present");
let doc = DjVuDocument::parse(&data).expect("parse corpus");
let opts = Iw44EncodeOptions::default();
let mut total = 0usize;
let mut pages = 0usize;
for pi in 0..doc.page_count() {
if pages == 2 {
break;
}
let page = match doc.page(pi) {
Ok(p) => p,
Err(_) => continue,
};
let chunks = page.bg44_chunks();
if chunks.is_empty() {
continue;
}
let pm = match decode_bg44(&chunks) {
Some(p) => p,
None => continue,
};
total += encode_iw44_color(&pm, &opts)
.iter()
.map(|v| v.len())
.sum::<usize>();
pages += 1;
}
assert_eq!(pages, 2, "expected 2 BG44 pages in the fixture");
const CEIL: usize = 121_100; assert!(
total <= CEIL,
"IW44 BG44 re-encode grew to {total} B (ceiling {CEIL}, baseline 119_230) \
— encoder size regression. If this is an intentional change, update the ceiling."
);
}
#[test]
fn jb2_mask_size_does_not_regress() {
let data = std::fs::read(CORPUS).expect("corpus fixture present");
let doc = DjVuDocument::parse(&data).expect("parse corpus");
let mut total = 0usize;
let mut pages = 0usize;
for pi in 0..doc.page_count() {
if pages == 3 {
break;
}
let page = match doc.page(pi) {
Ok(p) => p,
Err(_) => continue,
};
let bm = match page.extract_mask() {
Ok(Some(b)) => b,
_ => continue,
};
total += encode_jb2_dict(&bm).len();
pages += 1;
}
assert_eq!(pages, 3, "expected 3 mask pages in the fixture");
const CEIL: usize = 12_580; assert!(
total <= CEIL,
"JB2 mask re-encode grew to {total} B (ceiling {CEIL}, baseline 12_395) \
— encoder size regression. If this is an intentional change, update the ceiling."
);
}