use crate::halftone::{
decode_halftone_region, HalftoneRegionParams, PatternDict, PatternDictParams,
};
use crate::image::{ComposeOp, Jbig2Image};
#[test]
fn parse_pattern_dict() {
let data = [0x00, 4, 4, 0x00, 0x00, 0x00, 0x03];
let (params, consumed) = PatternDictParams::parse(&data).unwrap();
assert!(!params.hdmmr);
assert_eq!(params.hdtemplate, 0);
assert_eq!(params.hdpw, 4);
assert_eq!(params.hdph, 4);
assert_eq!(params.graymax, 3);
assert_eq!(consumed, 7);
}
#[test]
fn parse_pattern_dict_mmr() {
let data = [0x01, 8, 8, 0x00, 0x00, 0x00, 0x0F]; let (params, _) = PatternDictParams::parse(&data).unwrap();
assert!(params.hdmmr);
assert_eq!(params.graymax, 15);
}
#[test]
fn decode_patterns() {
let mut collective = Jbig2Image::new(16, 4);
collective.set_pixel(4, 0, 1);
collective.set_pixel(9, 1, 1);
for x in 12..16 {
collective.set_pixel(x, 0, 1);
}
let pdict = PatternDict::from_collective(&collective, 4, 4, 4);
assert_eq!(pdict.patterns.len(), 4);
assert_eq!(pdict.hpw, 4);
assert_eq!(pdict.hph, 4);
assert_eq!(pdict.patterns[0].get_pixel(0, 0), 0); assert_eq!(pdict.patterns[1].get_pixel(0, 0), 1); assert_eq!(pdict.patterns[2].get_pixel(1, 1), 1);
assert_eq!(pdict.patterns[3].get_pixel(0, 0), 1);
assert_eq!(pdict.patterns[3].get_pixel(3, 0), 1);
}
#[test]
fn parse_halftone_region() {
let mut data = vec![0x00]; data.extend_from_slice(&2u32.to_be_bytes()); data.extend_from_slice(&2u32.to_be_bytes()); data.extend_from_slice(&0i32.to_be_bytes()); data.extend_from_slice(&0i32.to_be_bytes()); data.extend_from_slice(&0x0100u16.to_be_bytes()); data.extend_from_slice(&0x0100u16.to_be_bytes());
let (params, consumed) = HalftoneRegionParams::parse(&data).unwrap();
assert!(!params.hmmr);
assert_eq!(params.hgw, 2);
assert_eq!(params.hgh, 2);
assert_eq!(params.hgx, 0);
assert_eq!(params.hgy, 0);
assert_eq!(params.hrx, 0x0100);
assert_eq!(params.hry, 0x0100);
assert_eq!(consumed, 21);
}
#[test]
fn decode_halftone_simple() {
let mut collective = Jbig2Image::new(8, 4);
collective.set_pixel(4, 0, 1);
let pdict = PatternDict::from_collective(&collective, 4, 4, 2);
let params = HalftoneRegionParams {
hmmr: false,
htemplate: 0,
henableskip: false,
hcombop: ComposeOp::Or,
hdefpixel: false,
hgw: 2,
hgh: 2,
hgx: 0,
hgy: 0,
hrx: 4 << 8,
hry: 0,
};
let mut image = Jbig2Image::new(8, 8);
let gray_vals = vec![vec![0u32, 1], vec![1, 0]];
decode_halftone_region(¶ms, &mut image, &pdict, &gray_vals).unwrap();
assert_eq!(image.get_pixel(0, 0), 0);
assert_eq!(image.get_pixel(4, 0), 1);
}
#[test]
fn halftone_with_skip() {
let mut collective = Jbig2Image::new(4, 4);
collective.set_pixel(0, 0, 1);
let pdict = PatternDict::from_collective(&collective, 4, 4, 1);
let params = HalftoneRegionParams {
hmmr: false,
htemplate: 0,
henableskip: true,
hcombop: ComposeOp::Or,
hdefpixel: false,
hgw: 3,
hgh: 1,
hgx: 0,
hgy: 0,
hrx: 4 << 8,
hry: 0,
};
let mut image = Jbig2Image::new(8, 4);
let gray_vals = vec![vec![0u32], vec![0], vec![0]];
decode_halftone_region(¶ms, &mut image, &pdict, &gray_vals).unwrap();
}
#[test]
fn halftone_default_pixel() {
let pdict = PatternDict {
patterns: vec![Jbig2Image::new(4, 4)],
hpw: 4,
hph: 4,
};
let params = HalftoneRegionParams {
hmmr: false,
htemplate: 0,
henableskip: false,
hcombop: ComposeOp::Or,
hdefpixel: true, hgw: 0,
hgh: 0,
hgx: 0,
hgy: 0,
hrx: 0,
hry: 0,
};
let mut image = Jbig2Image::new(8, 8);
decode_halftone_region(¶ms, &mut image, &pdict, &[]).unwrap();
assert_eq!(image.get_pixel(0, 0), 1);
assert_eq!(image.get_pixel(7, 7), 1);
}