#[cfg(all(target_arch = "x86_64", feature = "simd"))]
mod avx2;
mod rust;
#[cfg(test)]
mod tests;
use std::num::NonZeroUsize;
use crate::util::Pixel;
pub type LimitChangesFn = unsafe fn(
dest: *mut u8,
dest_stride_bytes: NonZeroUsize,
src: *const u8,
src_stride_bytes: NonZeroUsize,
width: NonZeroUsize,
height: NonZeroUsize,
limit: u16,
);
#[must_use]
#[inline]
pub fn select_limit_changes<T: Pixel>() -> LimitChangesFn {
#[cfg(all(target_arch = "x86_64", feature = "simd", feature = "experimental"))]
if cpudetect::x86_64::is_x86_64_v3_compatible() {
return match std::mem::size_of::<T>() {
1 => avx2::limit_changes_u8,
2 => avx2::limit_changes_u16,
_ => unreachable!(),
};
}
rust::limit_changes::<T>
}