fast image operations
Diffstat (limited to 'src/pixels/wam.rs')
| -rw-r--r-- | src/pixels/wam.rs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/pixels/wam.rs b/src/pixels/wam.rs new file mode 100644 index 0000000..e33d496 --- /dev/null +++ b/src/pixels/wam.rs @@ -0,0 +1,27 @@ +use super::{float, unfloat}; +use atools::prelude::*; +#[allow(dead_code)] +pub trait Wam { + /// this function weighs the sides and combines + fn wam(self, b: Self, l: f32, r: f32) -> Self; +} + +impl<const N: usize> Wam for [u8; N] { + fn wam(self, b: Self, l: f32, r: f32) -> Self { + // SAFETY: read [`weigh`] + self.zip(b).map(|(a, b)| weigh(a, b, l, r)) + } +} + +#[inline(always)] +#[lower::apply(algebraic)] +fn weigh(a: u8, b: u8, l: f32, r: f32) -> u8 { + unfloat((float(a) * l + float(b) * r).clamp(0., 1.)) +} + +#[test] +fn weig() { + assert_eq!(weigh(10, 20, 0.5, 0.5), 15); + assert_eq!(weigh(10, 20, 0.9, 0.1), 11); + assert_eq!(weigh(150, 150, 1.8, 0.8), 255); +} |