use crate::alpha::AlphaMulDiv;
use crate::{error, CpuExtensions};
use crate::{ImageView, ImageViewMut};
#[derive(Default, Debug, Clone)]
pub struct MulDiv {
cpu_extensions: CpuExtensions,
}
impl MulDiv {
#[inline(always)]
pub fn cpu_extensions(&self) -> CpuExtensions {
self.cpu_extensions
}
pub unsafe fn set_cpu_extensions(&mut self, extensions: CpuExtensions) {
self.cpu_extensions = extensions;
}
pub unsafe fn multiply_alpha<P: AlphaMulDiv>(
&self,
src_image: &ImageView<'_, P>,
dst_image: &mut ImageViewMut<'_, P>,
) {
let cpu_extensions = self.cpu_extensions;
if src_image.width() != dst_image.width() || src_image.height() != dst_image.height() {
error!();
}
P::multiply_alpha(src_image, dst_image, cpu_extensions);
}
pub fn multiply_alpha_inplace<P: AlphaMulDiv>(&self, image: &mut ImageViewMut<'_, P>) {
let cpu_extensions = self.cpu_extensions;
P::multiply_alpha_inplace(image, cpu_extensions);
}
pub unsafe fn divide_alpha<P: AlphaMulDiv>(
&self,
src_image: &ImageView<'_, P>,
dst_image: &mut ImageViewMut<'_, P>,
) {
let cpu_extensions = self.cpu_extensions;
if src_image.width() != dst_image.width() || src_image.height() != dst_image.height() {
error!();
}
P::divide_alpha(src_image, dst_image, cpu_extensions);
}
pub fn divide_alpha_inplace<P: AlphaMulDiv>(&self, image: &mut ImageViewMut<'_, P>) {
let cpu_extensions = self.cpu_extensions;
P::divide_alpha_inplace(image, cpu_extensions);
}
}