use super::*;
#[inline]
#[target_feature(enable = "avx2")]
pub(crate) unsafe fn rgb_to_hsv_row(
rgb: &[u8],
h_out: &mut [u8],
s_out: &mut [u8],
v_out: &mut [u8],
width: usize,
) {
debug_assert!(rgb.len() >= width * 3);
debug_assert!(h_out.len() >= width);
debug_assert!(s_out.len() >= width);
debug_assert!(v_out.len() >= width);
unsafe {
let mut x = 0usize;
while x + 32 <= width {
rgb_to_hsv_16_pixels(
rgb.as_ptr().add(x * 3),
h_out.as_mut_ptr().add(x),
s_out.as_mut_ptr().add(x),
v_out.as_mut_ptr().add(x),
);
rgb_to_hsv_16_pixels(
rgb.as_ptr().add(x * 3 + 48),
h_out.as_mut_ptr().add(x + 16),
s_out.as_mut_ptr().add(x + 16),
v_out.as_mut_ptr().add(x + 16),
);
x += 32;
}
if x < width {
scalar::rgb_to_hsv_row(
&rgb[x * 3..width * 3],
&mut h_out[x..width],
&mut s_out[x..width],
&mut v_out[x..width],
width - x,
);
}
}
}
#[inline]
#[target_feature(enable = "avx2")]
pub(crate) unsafe fn rgb_to_luma_row(
rgb: &[u8],
luma_out: &mut [u8],
width: usize,
matrix: ColorMatrix,
full_range: bool,
) {
debug_assert!(rgb.len() >= width * 3);
debug_assert!(luma_out.len() >= width);
let (k_r, k_g, k_b) = scalar::luma_coefficients_q15(matrix);
unsafe {
let kr_v = _mm_set1_epi32(k_r);
let kg_v = _mm_set1_epi32(k_g);
let kb_v = _mm_set1_epi32(k_b);
let rnd_v = _mm_set1_epi32(1 << 14);
let mut x = 0usize;
while x + 32 <= width {
rgb_to_luma_16_pixels(
rgb.as_ptr().add(x * 3),
luma_out.as_mut_ptr().add(x),
kr_v,
kg_v,
kb_v,
rnd_v,
full_range,
);
rgb_to_luma_16_pixels(
rgb.as_ptr().add(x * 3 + 48),
luma_out.as_mut_ptr().add(x + 16),
kr_v,
kg_v,
kb_v,
rnd_v,
full_range,
);
x += 32;
}
if x < width {
scalar::rgb_to_luma_row(
&rgb[x * 3..width * 3],
&mut luma_out[x..width],
width - x,
matrix,
full_range,
);
}
}
}