fast image operations
Diffstat (limited to 'src/pixels/wam.rs')
-rw-r--r--src/pixels/wam.rs28
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);
}