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 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); }