Skip to main content

08_vimage_processing/
08_vimage_processing.rs

1use apple_accelerate::{
2    clip_to_alpha_argb8888, contrast_stretch_planar8, convert_argb8888_to_planar8,
3    convert_planar8_to_argb8888, scale_argb8888, vimage_flags, ImageBuffer,
4};
5
6fn main() {
7    let mut source = vec![255_u8, 10, 20, 30];
8    let mut scaled = vec![0_u8; 16];
9    let src = ImageBuffer::from_argb8888(&mut source, 1, 1).expect("src");
10    let mut dst = ImageBuffer::from_argb8888(&mut scaled, 2, 2).expect("dst");
11    scale_argb8888(&src, &mut dst, vimage_flags::NO_FLAGS).expect("scale");
12    for pixel in scaled.chunks_exact(4) {
13        assert_eq!(pixel, &[255, 10, 20, 30]);
14    }
15
16    let mut interleaved = vec![255_u8, 10, 20, 30, 128, 40, 50, 60];
17    let mut alpha = vec![0_u8; 2];
18    let mut red = vec![0_u8; 2];
19    let mut green = vec![0_u8; 2];
20    let mut blue = vec![0_u8; 2];
21    let src_interleaved =
22        ImageBuffer::from_argb8888(&mut interleaved, 2, 1).expect("src interleaved");
23    let mut alpha_plane = ImageBuffer::from_planar8(&mut alpha, 2, 1).expect("alpha");
24    let mut red_plane = ImageBuffer::from_planar8(&mut red, 2, 1).expect("red");
25    let mut green_plane = ImageBuffer::from_planar8(&mut green, 2, 1).expect("green");
26    let mut blue_plane = ImageBuffer::from_planar8(&mut blue, 2, 1).expect("blue");
27    convert_argb8888_to_planar8(
28        &src_interleaved,
29        &mut alpha_plane,
30        &mut red_plane,
31        &mut green_plane,
32        &mut blue_plane,
33        vimage_flags::NO_FLAGS,
34    )
35    .expect("deinterleave");
36
37    let alpha_plane = ImageBuffer::from_planar8(&mut alpha, 2, 1).expect("alpha src");
38    let red_plane = ImageBuffer::from_planar8(&mut red, 2, 1).expect("red src");
39    let green_plane = ImageBuffer::from_planar8(&mut green, 2, 1).expect("green src");
40    let blue_plane = ImageBuffer::from_planar8(&mut blue, 2, 1).expect("blue src");
41    let mut reinterleaved = vec![0_u8; 8];
42    let mut dst_interleaved =
43        ImageBuffer::from_argb8888(&mut reinterleaved, 2, 1).expect("dst interleaved");
44    convert_planar8_to_argb8888(
45        &alpha_plane,
46        &red_plane,
47        &green_plane,
48        &blue_plane,
49        &mut dst_interleaved,
50        vimage_flags::NO_FLAGS,
51    )
52    .expect("reinterleave");
53    assert_eq!(reinterleaved, interleaved);
54
55    let mut clip_source = vec![64_u8, 100, 50, 10];
56    let mut clip_dest = vec![0_u8; 4];
57    let src_clip = ImageBuffer::from_argb8888(&mut clip_source, 1, 1).expect("clip src");
58    let mut dst_clip = ImageBuffer::from_argb8888(&mut clip_dest, 1, 1).expect("clip dst");
59    clip_to_alpha_argb8888(&src_clip, &mut dst_clip, vimage_flags::NO_FLAGS).expect("clip");
60    assert_eq!(clip_dest, vec![64, 64, 50, 10]);
61
62    let mut planar_src = vec![5_u8, 15, 25, 35];
63    let mut planar_dst = vec![0_u8; 4];
64    let src_planar = ImageBuffer::from_planar8(&mut planar_src, 2, 2).expect("planar src");
65    let mut dst_planar = ImageBuffer::from_planar8(&mut planar_dst, 2, 2).expect("planar dst");
66    contrast_stretch_planar8(&src_planar, &mut dst_planar, vimage_flags::NO_FLAGS)
67        .expect("stretch");
68    assert_eq!(planar_dst, vec![0, 85, 170, 255]);
69
70    println!("vimage smoke passed: scaled={scaled:?} reinterleaved={reinterleaved:?} clipped={clip_dest:?}");
71}