fast_image_resize/convolution/u16x4/
native.rs

1use crate::convolution::optimisations::Normalizer32;
2use crate::pixels::U16x4;
3use crate::{ImageView, ImageViewMut};
4
5#[inline(always)]
6pub(crate) fn horiz_convolution(
7    src_view: &impl ImageView<Pixel = U16x4>,
8    dst_view: &mut impl ImageViewMut<Pixel = U16x4>,
9    offset: u32,
10    normalizer: &Normalizer32,
11) {
12    let precision = normalizer.precision();
13    let coefficients_chunks = normalizer.chunks();
14    let initial: i64 = 1 << (precision - 1);
15
16    let src_rows = src_view.iter_rows(offset);
17    let dst_rows = dst_view.iter_rows_mut(0);
18    for (dst_row, src_row) in dst_rows.zip(src_rows) {
19        for (coeffs_chunk, dst_pixel) in coefficients_chunks.iter().zip(dst_row.iter_mut()) {
20            let first_x_src = coeffs_chunk.start as usize;
21            let mut ss = [initial; 4];
22            let src_pixels = unsafe { src_row.get_unchecked(first_x_src..) };
23            for (&k, src_pixel) in coeffs_chunk.values().iter().zip(src_pixels) {
24                for (i, s) in ss.iter_mut().enumerate() {
25                    *s += src_pixel.0[i] as i64 * (k as i64);
26                }
27            }
28            for (i, s) in ss.iter().copied().enumerate() {
29                dst_pixel.0[i] = normalizer.clip(s);
30            }
31        }
32    }
33}