use std::num::NonZeroUsize;
use crate::util::Pixel;
use semisafe::option::unwrap as semisafe_opt_unwrap;
use semisafe::slice::get as semisafe_get;
use semisafe::slice::get_mut as semisafe_get_mut;
pub(super) fn average2<T: Pixel>(
dest: &mut [T],
src1: &[T],
src2: &[T],
pitch: NonZeroUsize,
width: NonZeroUsize,
height: NonZeroUsize,
) {
let mut offset = 0;
for _j in 0..height.get() {
for i in 0..width.get() {
match size_of::<T>() {
1 => {
let a: u16 = semisafe_get(src1, offset + i).as_();
let b: u16 = semisafe_get(src2, offset + i).as_();
*semisafe_get_mut(dest, offset + i) =
semisafe_opt_unwrap(T::from((a + b + 1) / 2));
}
2 => {
let a: u32 = semisafe_get(src1, offset + i).as_();
let b: u32 = semisafe_get(src2, offset + i).as_();
*semisafe_get_mut(dest, offset + i) =
semisafe_opt_unwrap(T::from((a + b + 1) / 2));
}
_ => unreachable!(),
}
}
offset += pitch.get();
}
}