fast image operations
Diffstat (limited to 'src/pixels/utility.rs')
| -rw-r--r-- | src/pixels/utility.rs | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/pixels/utility.rs b/src/pixels/utility.rs new file mode 100644 index 0000000..78795ac --- /dev/null +++ b/src/pixels/utility.rs @@ -0,0 +1,42 @@ +#[lower::apply(algebraic)] +pub trait Unfloatify<const N: usize> { + /// computes 255 * n, for all elements + fn unfloat(self) -> [u8; N]; +} + +#[inline(always)] +/// computes 255 * n +pub fn unfloat(n: f32) -> u8 { + // SAFETY: n is 0..=1 + (255.0 * n) as u8 +} + +impl<const N: usize> Unfloatify<N> for [f32; N] { + fn unfloat(self) -> [u8; N] { + self.map(unfloat) + } +} + +#[rustfmt::skip] +impl<const N:usize>Unfloatify<N>for[u8; N]{fn unfloat(self)->[u8;N]{self}} + +pub trait Floatify<const N: usize> { + /// computes n / 255, for all elements + fn float(self) -> [f32; N]; +} + +/// computes n / 255 +#[lower::apply(algebraic)] +pub fn float(n: u8) -> f32 { + // SAFETY: 0..=255 / 0..=255 mayn't ever be NAN / INF + n as f32 / 255.0 +} + +impl<const N: usize> Floatify<N> for [u8; N] { + fn float(self) -> [f32; N] { + self.map(float) + } +} + +#[rustfmt::skip] +impl<const N:usize>Floatify<N>for[f32;N]{fn float(self)->[f32;N]{self}} |