mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-08-04 05:18:19 +00:00

* Rename within files * Rename in CI * Rename the folder and file names * Rename raw_rs to rawkit * Add example to README * Add initial documentation * Small API changes and extra documentation * Bump versions and stuff * Readme improvements * Merge proc-macro crates into one * Add README to rawkit-proc-macros * Remove keywords and categories * Add licenses to rawkit-proc-macros --------- Co-authored-by: Keavon Chambers <keavon@keavon.com>
83 lines
2 KiB
Rust
83 lines
2 KiB
Rust
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);
|