Skip to main content

library_tests/
test_images.rs

1use wolfram_library_link::{
2    self as wll, ColorSpace, Image, NumericArray, Pixel, UninitImage, UninitNumericArray,
3};
4
5
6#[wll::export]
7fn test_image_arg(image: &Image<bool>) -> NumericArray<i8> {
8    let mut array = UninitNumericArray::from_dimensions(&[image.flattened_length()]);
9
10    for pair in image
11        .as_slice()
12        .iter()
13        .zip(array.as_slice_mut().into_iter())
14    {
15        let (pixel, elem): (&i8, &mut std::mem::MaybeUninit<i8>) = pair;
16        elem.write(*pixel);
17    }
18
19    // Safety: We iterated over every element in `array` and initialized it with the
20    //         corresponding pixel value from `image`.
21    unsafe { array.assume_init() }
22}
23
24// fn test_image_manual_arg(image: Image<bool>) -> NumericArray<bool> {
25//     todo!("")
26// }
27
28#[wll::export]
29fn test_create_bitmap_image() -> Image<bool> {
30    let width = 2;
31    let height = 2;
32    let channels = 1;
33
34    let mut image = UninitImage::<bool>::new_2d(
35        width,
36        height,
37        channels,
38        ColorSpace::Automatic,
39        false,
40    );
41
42    image.set(Pixel::D2([1, 1]), 1, false);
43    image.set(Pixel::D2([1, 2]), 1, true);
44    image.set(Pixel::D2([2, 1]), 1, true);
45    image.set(Pixel::D2([2, 2]), 1, false);
46
47    unsafe { image.assume_init() }
48}
49
50/// Create an image with four pixels, where the top left image is red, the top right
51/// pixel is green, the bottom left pixel is blue, and the bottom right pixel is light
52/// gray.
53#[wll::export]
54fn test_create_color_rgb_u8_image() -> Image<u8> {
55    let width = 2;
56    let height = 2;
57    let channels = 3; // Red, green, and blue.
58
59    let mut image: UninitImage<u8> =
60        UninitImage::new_2d(width, height, channels, ColorSpace::RGB, false);
61
62    // Red, green, and blue channels indices.
63    const R: usize = 1;
64    const G: usize = 2;
65    const B: usize = 3;
66
67    // Set every pixel value to black. The image data is otherwise completely
68    // uninitialized memory, and can contain arbitrary values.
69    image.zero();
70
71    // Set the top left, top right, and bottom left pixels on only one color channel.
72    image.set(Pixel::D2([1, 1]), R, u8::MAX);
73    image.set(Pixel::D2([1, 2]), G, u8::MAX);
74    image.set(Pixel::D2([2, 1]), B, u8::MAX);
75
76    // Make this pixel white, by setting R, G, and B channels to ~80%.
77    image.set(Pixel::D2([2, 2]), R, 200);
78    image.set(Pixel::D2([2, 2]), G, 200);
79    image.set(Pixel::D2([2, 2]), B, 200);
80
81    unsafe { image.assume_init() }
82}
83
84/// Create an image with four pixels, where the top left image is red, the top right
85/// pixel is green, the bottom left pixel is blue, and the bottom right pixel is light
86/// gray.
87#[wll::export]
88fn test_create_color_rgb_f32_image() -> Image<f32> {
89    let width = 2;
90    let height = 2;
91    let channels = 3; // Red, green, and blue.
92
93    let mut image: UninitImage<f32> =
94        UninitImage::new_2d(width, height, channels, ColorSpace::RGB, false);
95
96    // Red, green, and blue channels indices.
97    const R: usize = 1;
98    const G: usize = 2;
99    const B: usize = 3;
100
101    // Set every pixel value to black. The image data is otherwise completely
102    // uninitialized memory, and can contain arbitrary values.
103    image.zero();
104
105    // Set the top left, top right, and bottom left pixels on only one color channel.
106    image.set(Pixel::D2([1, 1]), R, 1.0);
107    image.set(Pixel::D2([1, 2]), G, 1.0);
108    image.set(Pixel::D2([2, 1]), B, 1.0);
109
110    // Make this pixel white, by setting R, G, and B channels to 80%.
111    image.set(Pixel::D2([2, 2]), R, 0.8);
112    image.set(Pixel::D2([2, 2]), G, 0.8);
113    image.set(Pixel::D2([2, 2]), B, 0.8);
114
115    unsafe { image.assume_init() }
116}