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