use rizzma::artist::{Affine2D, Artist, AxesImage};
use rizzma::core::color::{Colormap, default_colormap};
use rizzma::skia::SkiaRenderer;
fn pixel(r: &SkiaRenderer, x: u32, y: u32) -> [u8; 4] {
let p = r.pixmap().pixel(x, y).expect("pixel in bounds");
[p.red(), p.green(), p.blue(), p.alpha()]
}
fn max_diff(a: [u8; 4], b: [u8; 4]) -> i32 {
(0..4)
.map(|i| (i32::from(a[i]) - i32::from(b[i])).abs())
.max()
.unwrap_or(0)
}
#[test]
fn gradient_image_varies_and_matches_default_cmap_endpoints() {
let mut renderer = SkiaRenderer::new(100, 100, 72.0);
let data = vec![0.0, 1.0, 2.0, 3.0];
let img = AxesImage::new(data, 4, 1)
.with_extent([0.0, 100.0, 0.0, 100.0]);
img.draw(&mut renderer, &Affine2D::identity());
let top = pixel(&renderer, 50, 2);
let bottom = pixel(&renderer, 50, 97);
assert!(top[3] > 200 && bottom[3] > 200, "image should be opaque");
assert!(
max_diff(top, bottom) > 60,
"gradient should vary: top {top:?} vs bottom {bottom:?}"
);
let lo = default_colormap().sample(0.0).to_u8_array();
let hi = default_colormap().sample(1.0).to_u8_array();
assert!(
max_diff(top, lo) < 40,
"top should be ~cmap(0) {lo:?}, got {top:?}"
);
assert!(
max_diff(bottom, hi) < 40,
"bottom should be ~cmap(1) {hi:?}, got {bottom:?}"
);
}