fast image operations
Diffstat (limited to 'src/pixels/wam.rs')
| -rw-r--r-- | src/pixels/wam.rs | 28 |
1 files changed, 9 insertions, 19 deletions
diff --git a/src/pixels/wam.rs b/src/pixels/wam.rs index ccf7d9f..e33d496 100644 --- a/src/pixels/wam.rs +++ b/src/pixels/wam.rs @@ -1,37 +1,27 @@ use super::{float, unfloat}; use atools::prelude::*; -use umath::{generic_float::Constructors, FF32}; #[allow(dead_code)] pub trait Wam { /// this function weighs the sides and combines - /// - /// # Safety - /// - /// pls make l = <code>0..=[f32::MAX]/2</code>, r = <code>0..=[f32::MAX]/2</code> - unsafe fn wam(self, b: Self, l: FF32, r: FF32) -> Self; + fn wam(self, b: Self, l: f32, r: f32) -> Self; } impl<const N: usize> Wam for [u8; N] { - unsafe fn wam(self, b: Self, l: FF32, r: FF32) -> Self { + fn wam(self, b: Self, l: f32, r: f32) -> Self { // SAFETY: read [`weigh`] - self.zip(b).map(|(a, b)| unsafe { weigh(a, b, l, r) }) + self.zip(b).map(|(a, b)| weigh(a, b, l, r)) } } #[inline(always)] -/// # Safety -/// -/// floats must be smart -unsafe fn weigh(a: u8, b: u8, l: FF32, r: FF32) -> u8 { - // SAFETY: float(x) returns 0..=1, 0..=1 * f32::MAX isn't Inf, but if you add 1.0 and then mul by max again, you get inf (big bad, hence unsafe fn) - unsafe { unfloat((float(a) * l + float(b) * r).clamp(FF32::zero(), FF32::one())) } +#[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() { - unsafe { - assert_eq!(weigh(10, 20, FF32::new(0.5), FF32::new(0.5)), 15); - assert_eq!(weigh(10, 20, FF32::new(0.9), FF32::new(0.1)), 11); - assert_eq!(weigh(150, 150, FF32::new(1.8), FF32::new(0.8)), 255); - } + 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); } |