use kui_core::{Core, ImageFit, ImageId, ImageOpts, NodeSpec, Quad, QuadKind, Sampling, Size};
fn rgba(w: u32, h: u32) -> Vec<u8> {
vec![0x80; (w * h * 4) as usize]
}
fn draw(core: &mut Core, id: ImageId, opts: ImageOpts, spec: NodeSpec, scale: f32) -> Quad {
let mut ui = core.frame(Size::new(800.0, 600.0), scale);
ui.image_with(id, opts, spec);
ui.finish();
let (dl, _) = core.output();
dl.quads
.iter()
.find(|q| matches!(q.kind, QuadKind::Image | QuadKind::Texture))
.copied()
.expect("the image's quad")
}
fn texels(q: &Quad) -> (u32, u32) {
(q.uv[2], q.uv[3])
}
#[test]
fn a_photo_drawn_small_names_the_deepest_level_that_covers_it() {
let mut core = Core::new();
let id = core.resources.add_image(1024, 1024, rgba(1024, 1024));
let q = draw(
&mut core,
id,
ImageOpts::default(),
NodeSpec::column().size(100.0, 100.0),
1.0,
);
assert_eq!(q.kind, QuadKind::Image);
assert_eq!(texels(&q), (128, 128));
assert_eq!((q.rect.w, q.rect.h), (100.0, 100.0));
assert!(core.atlas.has_image_level(id, 3));
assert!(!core.atlas.has_image_level(id, 0), "level 0 never went in");
let q = draw(
&mut core,
id,
ImageOpts::default(),
NodeSpec::column().size(600.0, 600.0),
1.0,
);
assert_eq!(texels(&q), (1024, 1024));
}
#[test]
fn the_display_scale_and_a_node_scale_both_count() {
let mut core = Core::new();
let id = core.resources.add_image(1024, 1024, rgba(1024, 1024));
let q = draw(
&mut core,
id,
ImageOpts::default(),
NodeSpec::column().size(100.0, 100.0),
2.0,
);
assert_eq!(texels(&q), (256, 256));
let q = draw(
&mut core,
id,
ImageOpts::default(),
NodeSpec::column().size(400.0, 400.0).scale(0.25),
1.0,
);
assert_eq!(texels(&q), (128, 128));
}
#[test]
fn cover_crops_the_level() {
let mut core = Core::new();
let id = core.resources.add_image(1000, 500, rgba(1000, 500));
let opts = ImageOpts {
fit: ImageFit::Cover,
..ImageOpts::default()
};
let q = draw(
&mut core,
id,
opts,
NodeSpec::column().size(100.0, 100.0),
1.0,
);
assert_eq!(texels(&q), (125, 125));
}
#[test]
fn nearest_and_a_stream_draw_level_zero() {
let mut core = Core::new();
let id = core.resources.add_image(512, 512, rgba(512, 512));
let nearest = ImageOpts {
sampling: Sampling::Nearest,
..ImageOpts::default()
};
let q = draw(
&mut core,
id,
nearest,
NodeSpec::column().size(50.0, 50.0),
1.0,
);
assert_eq!(texels(&q), (512, 512));
assert!(core.update_image(id, 512, 512, rgba(512, 512)));
let q = draw(
&mut core,
id,
ImageOpts::default(),
NodeSpec::column().size(50.0, 50.0),
1.0,
);
assert_eq!(q.kind, QuadKind::Texture, "a stream is texture-backed");
let (dl, _) = core.output();
assert_eq!(dl.textures[0].uv, [0, 0, 512, 512], "and drawn whole");
}
#[test]
fn an_image_past_a_page_drawn_small_is_drawn_from_the_page() {
let mut core = Core::new();
let id = core.resources.add_image(4100, 64, rgba(4100, 64));
let q = draw(
&mut core,
id,
ImageOpts::default(),
NodeSpec::column().size(100.0, 1.0),
1.0,
);
assert_eq!(q.kind, QuadKind::Image);
assert_eq!(texels(&q), (129, 2));
let (dl, _) = core.output();
assert!(dl.textures.is_empty());
}
#[test]
fn the_page_holds_the_halved_pixels() {
let mut core = Core::new();
let px = [
[0, 0, 0, 255],
[255, 255, 255, 255],
[0, 0, 0, 255],
[255, 255, 255, 255],
]
.concat();
let id = core.resources.add_image(2, 2, px);
let q = draw(
&mut core,
id,
ImageOpts::default(),
NodeSpec::column().size(1.0, 1.0),
1.0,
);
assert_eq!(texels(&q), (1, 1));
let at = ((q.uv[1] * core.atlas.size + q.uv[0]) * 4) as usize;
let texel = &core.atlas.pixels[at..at + 4];
assert!((187..=189).contains(&texel[0]), "{texel:?}");
assert_eq!(texel[3], 255);
}