1use image::{ImageBuffer, Luma, Rgb};
2use ndarray::{Array2, Array3};
3
4use crate::aggregate::Aggregate;
5
6#[derive(Clone)]
7pub enum WaveletLayerBuffer {
8 Grayscale { data: Array2<f32> },
9 Rgb { data: Array3<f32> },
10}
11
12impl Aggregate for WaveletLayerBuffer {
13 fn min(&self) -> f32 {
14 match self {
15 WaveletLayerBuffer::Grayscale { data } => data.min(),
16 WaveletLayerBuffer::Rgb { data } => data.min(),
17 }
18 }
19
20 fn max(&self) -> f32 {
21 match self {
22 WaveletLayerBuffer::Grayscale { data } => data.max(),
23 WaveletLayerBuffer::Rgb { data } => data.max(),
24 }
25 }
26}
27
28#[derive(Clone)]
29pub enum WaveletLayerImageBuffer {
30 Grayscale {
31 buffer: ImageBuffer<Luma<f32>, Vec<f32>>,
32 },
33 Rgb {
34 buffer: ImageBuffer<Rgb<f32>, Vec<f32>>,
35 },
36}
37
38impl From<WaveletLayerBuffer> for WaveletLayerImageBuffer {
39 fn from(value: WaveletLayerBuffer) -> Self {
40 match value {
41 WaveletLayerBuffer::Grayscale { data } => {
42 let (height, width) = data.dim();
43
44 let mut buffer: ImageBuffer<Luma<f32>, Vec<f32>> =
45 ImageBuffer::new(width as u32, height as u32);
46
47 for (x, y, pixel) in buffer.enumerate_pixels_mut() {
48 let intensity = data[(y as usize, x as usize)];
49 *pixel = Luma([intensity]);
50 }
51
52 WaveletLayerImageBuffer::Grayscale { buffer }
53 }
54 WaveletLayerBuffer::Rgb { data } => {
55 let (height, width, _) = data.dim();
56
57 let mut buffer: ImageBuffer<Rgb<f32>, Vec<f32>> =
58 ImageBuffer::new(width as u32, height as u32);
59
60 for (x, y, pixel) in buffer.enumerate_pixels_mut() {
61 let red = data[(y as usize, x as usize, 0)];
62 let green = data[(y as usize, x as usize, 1)];
63 let blue = data[(y as usize, x as usize, 2)];
64
65 *pixel = Rgb([red, green, blue]);
66 }
67
68 WaveletLayerImageBuffer::Rgb { buffer }
69 }
70 }
71 }
72}
73
74#[derive(Clone)]
75pub struct WaveletLayer {
76 pub buffer: WaveletLayerBuffer,
77 pub pixel_scale: Option<usize>,
78}
79
80impl WaveletLayer {
81 pub fn is_residue_layer(&self) -> bool {
82 self.pixel_scale.is_none()
83 }
84}