1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#![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<Box<[u32]>, pal<'a, 4>>,
) {
    let pal = fimg::Image::<Box<[f32]>, 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::<Vec<_>>();
    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>);