#![allow(incomplete_features)] #![feature(generic_const_exprs)] use fimg::{indexed::IndexedImage, Image}; use remapper::pal; fn test( k: &'static str, f: for<'a, 'b> fn(Image<&'b [f32], 4>, pal<'a, 4>) -> IndexedImage, pal<'a, 4>>, ) { let pal = fimg::Image::, 4>::from(fimg::Image::open("tdata/endesga.png").as_ref()); let pal = pal.flatten(); // let d = f(fimg::Image::open("tdata/small_cat.png").to_f32().as_ref(), &pal).to().to_u8().show(); let d = f( fimg::Image::open("tdata/small_cat.png").to_f32().as_ref(), pal::new(pal), ) .into_raw_parts() .0 .take_buffer() .iter() .map(|&x| x as u8) .collect::>(); match std::fs::read(format!("tests/tres/{k}")) { Ok(x) => assert!(x == d, "{k}! failed."), Err(_) => std::fs::write(format!("tests/tres/{k}"), d).unwrap(), } } macro_rules! test { ($x:ident, $call:path) => { #[test] fn $x() { test(stringify!($x), |x, p| $call(x, p)); } }; (boxed $x:ident, $call:path) => { #[test] fn $x() { test(stringify!($x), |x, p| $call(x.boxed(), p)) } }; } test!(o2x2, remapper::ordered::bayer2x2); test!(o4x4, remapper::ordered::bayer4x4); test!(o8x8, remapper::ordered::bayer8x8); test!(o16x16, remapper::ordered::bayer16x16); test!(o32x32, remapper::ordered::bayer32x32); test!(o64x64, remapper::ordered::bayer64x64); test!(boxed s1, remapper::diffusion::sierra::sierra::<255, 4>); test!(boxed s2, remapper::diffusion::sierra::sierra_two::<255, 4>); test!(boxed s3, remapper::diffusion::sierra::sierra_lite::<255, 4>);