use crate::core::{Pix, PixelDepth, Result};
pub fn make_subsample_tab_2x() -> Vec<u8> {
let mut tab = vec![0u8; 256];
for i in 0..256u16 {
let mut val = 0u8;
if i & 0x80 != 0 {
val |= 0x80;
}
if i & 0x40 != 0 {
val |= 0x08;
}
if i & 0x20 != 0 {
val |= 0x40;
}
if i & 0x10 != 0 {
val |= 0x04;
}
if i & 0x08 != 0 {
val |= 0x20;
}
if i & 0x04 != 0 {
val |= 0x02;
}
if i & 0x02 != 0 {
val |= 0x10;
}
if i & 0x01 != 0 {
val |= 0x01;
}
tab[i as usize] = val;
}
tab
}
pub fn reduce_binary_2(pix: &Pix) -> Result<Pix> {
if pix.depth() != PixelDepth::Bit1 {
return Err(crate::core::Error::UnsupportedDepth(pix.depth().bits()));
}
let ws = pix.width();
let hs = pix.height();
if hs <= 1 {
return Err(crate::core::Error::InvalidParameter(
"height must be at least 2".into(),
));
}
let wd = ws / 2;
let hd = hs / 2;
let pixd = Pix::new(wd, hd, PixelDepth::Bit1)?;
let mut pixd = pixd
.try_into_mut()
.map_err(|_| crate::core::Error::AllocationFailed)?;
for id in 0..hd {
let is = id * 2;
for jd in 0..wd {
let js = jd * 2;
let val = pix.get_pixel(js, is).unwrap_or(0);
if val != 0 {
pixd.set_pixel(jd, id, 1)?;
}
}
}
Ok(pixd.into())
}