|
use crate::CHANNELS_IN_RGB; |
|
|
|
#[derive(Clone, Copy)] |
|
pub struct RawPixel { |
|
pub value: u16, |
|
pub row: usize, |
|
pub column: usize, |
|
} |
|
|
|
#[derive(Clone, Copy)] |
|
pub struct Pixel { |
|
pub values: [u16; CHANNELS_IN_RGB], |
|
pub row: usize, |
|
pub column: usize, |
|
} |
|
|
|
pub trait RawPixelTransform { |
|
fn apply(&mut self, pixel: RawPixel) -> u16; |
|
} |
|
|
|
impl<T: Fn(RawPixel) -> u16> RawPixelTransform for T { |
|
fn apply(&mut self, pixel: RawPixel) -> u16 { |
|
self(pixel) |
|
} |
|
} |
|
|
|
macro_rules! impl_raw_pixel_transform { |
|
($($idx:tt $t:tt),+) => { |
|
impl<$($t,)+> RawPixelTransform for ($($t,)+) |
|
where |
|
$($t: RawPixelTransform,)+ |
|
{ |
|
fn apply(&mut self, mut pixel: RawPixel) -> u16 { |
|
$(pixel.value = self.$idx.apply(pixel);)* |
|
|
|
pixel.value |
|
} |
|
} |
|
}; |
|
} |
|
|
|
impl_raw_pixel_transform!(0 A); |
|
impl_raw_pixel_transform!(0 A, 1 B); |
|
impl_raw_pixel_transform!(0 A, 1 B, 2 C); |
|
impl_raw_pixel_transform!(0 A, 1 B, 2 C, 3 D); |
|
impl_raw_pixel_transform!(0 A, 1 B, 2 C, 3 D, 4 E); |
|
impl_raw_pixel_transform!(0 A, 1 B, 2 C, 3 D, 4 E, 5 F); |
|
impl_raw_pixel_transform!(0 A, 1 B, 2 C, 3 D, 4 E, 5 F, 6 G); |
|
impl_raw_pixel_transform!(0 A, 1 B, 2 C, 3 D, 4 E, 5 F, 6 G, 7 H); |
|
|
|
pub trait PixelTransform { |
|
fn apply(&mut self, pixel: Pixel) -> [u16; CHANNELS_IN_RGB]; |
|
} |
|
|
|
impl<T: Fn(Pixel) -> [u16; CHANNELS_IN_RGB]> PixelTransform for T { |
|
fn apply(&mut self, pixel: Pixel) -> [u16; CHANNELS_IN_RGB] { |
|
self(pixel) |
|
} |
|
} |
|
|
|
macro_rules! impl_pixel_transform { |
|
($($idx:tt $t:tt),+) => { |
|
impl<$($t,)+> PixelTransform for ($($t,)+) |
|
where |
|
$($t: PixelTransform,)+ |
|
{ |
|
fn apply(&mut self, mut pixel: Pixel) -> [u16; CHANNELS_IN_RGB] { |
|
$(pixel.values = self.$idx.apply(pixel);)* |
|
|
|
pixel.values |
|
} |
|
} |
|
}; |
|
} |
|
|
|
impl_pixel_transform!(0 A); |
|
impl_pixel_transform!(0 A, 1 B); |
|
impl_pixel_transform!(0 A, 1 B, 2 C); |
|
impl_pixel_transform!(0 A, 1 B, 2 C, 3 D); |
|
impl_pixel_transform!(0 A, 1 B, 2 C, 3 D, 4 E); |
|
impl_pixel_transform!(0 A, 1 B, 2 C, 3 D, 4 E, 5 F); |
|
impl_pixel_transform!(0 A, 1 B, 2 C, 3 D, 4 E, 5 F, 6 G); |
|
impl_pixel_transform!(0 A, 1 B, 2 C, 3 D, 4 E, 5 F, 6 G, 7 H); |
|
|