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