#[cfg(test)]
use std::mem::size_of;
use std::{num::NonZeroUsize, slice};
#[cfg(test)]
use crate::util::Pixel;
#[cfg(test)]
#[must_use]
pub(super) fn luma_sum<T: Pixel>(
width: NonZeroUsize,
height: NonZeroUsize,
src: &[T],
src_pitch: NonZeroUsize,
) -> u64 {
match (size_of::<T>(), width.get(), height.get()) {
(1, 4, 4) => luma_sum_u8::<4, 4>(src.as_ptr().cast(), src_pitch),
(1, 8, 4) => luma_sum_u8::<8, 4>(src.as_ptr().cast(), src_pitch),
(1, 8, 8) => luma_sum_u8::<8, 8>(src.as_ptr().cast(), src_pitch),
(1, 16, 2) => luma_sum_u8::<16, 2>(src.as_ptr().cast(), src_pitch),
(1, 16, 8) => luma_sum_u8::<16, 8>(src.as_ptr().cast(), src_pitch),
(1, 16, 16) => luma_sum_u8::<16, 16>(src.as_ptr().cast(), src_pitch),
(1, 32, 16) => luma_sum_u8::<32, 16>(src.as_ptr().cast(), src_pitch),
(1, 32, 32) => luma_sum_u8::<32, 32>(src.as_ptr().cast(), src_pitch),
(1, 64, 32) => luma_sum_u8::<64, 32>(src.as_ptr().cast(), src_pitch),
(1, 64, 64) => luma_sum_u8::<64, 64>(src.as_ptr().cast(), src_pitch),
(1, 128, 64) => luma_sum_u8::<128, 64>(src.as_ptr().cast(), src_pitch),
(1, 128, 128) => luma_sum_u8::<128, 128>(src.as_ptr().cast(), src_pitch),
(2, 4, 4) => luma_sum_u16::<4, 4>(src.as_ptr().cast(), src_pitch),
(2, 8, 4) => luma_sum_u16::<8, 4>(src.as_ptr().cast(), src_pitch),
(2, 8, 8) => luma_sum_u16::<8, 8>(src.as_ptr().cast(), src_pitch),
(2, 16, 2) => luma_sum_u16::<16, 2>(src.as_ptr().cast(), src_pitch),
(2, 16, 8) => luma_sum_u16::<16, 8>(src.as_ptr().cast(), src_pitch),
(2, 16, 16) => luma_sum_u16::<16, 16>(src.as_ptr().cast(), src_pitch),
(2, 32, 16) => luma_sum_u16::<32, 16>(src.as_ptr().cast(), src_pitch),
(2, 32, 32) => luma_sum_u16::<32, 32>(src.as_ptr().cast(), src_pitch),
(2, 64, 32) => luma_sum_u16::<64, 32>(src.as_ptr().cast(), src_pitch),
(2, 64, 64) => luma_sum_u16::<64, 64>(src.as_ptr().cast(), src_pitch),
(2, 128, 64) => luma_sum_u16::<128, 64>(src.as_ptr().cast(), src_pitch),
(2, 128, 128) => luma_sum_u16::<128, 128>(src.as_ptr().cast(), src_pitch),
_ => unreachable!("unsupported block size"),
}
}
#[must_use]
pub(crate) fn luma_sum_u8<const WIDTH: usize, const HEIGHT: usize>(
src: *const u8,
src_pitch: NonZeroUsize,
) -> u64 {
let mut luma_sum = 0u64;
for j in 0..HEIGHT {
let src_row = unsafe { slice::from_raw_parts(src.add(j * src_pitch.get()), WIDTH) };
for &pix in src_row {
let pixel_value: u64 = pix as _;
luma_sum += pixel_value;
}
}
luma_sum
}
#[must_use]
pub(crate) fn luma_sum_u16<const WIDTH: usize, const HEIGHT: usize>(
src: *const u8,
src_pitch: NonZeroUsize,
) -> u64 {
let src: *const u16 = src.cast();
let mut luma_sum = 0u64;
for j in 0..HEIGHT {
let src_row = unsafe { slice::from_raw_parts(src.add(j * src_pitch.get()), WIDTH) };
for &pix in src_row {
let pixel_value: u64 = pix as _;
luma_sum += pixel_value;
}
}
luma_sum
}