fast image operations
Diffstat (limited to 'src/overlay.rs')
| -rw-r--r-- | src/overlay.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/overlay.rs b/src/overlay.rs index 3027808..7f39e49 100644 --- a/src/overlay.rs +++ b/src/overlay.rs @@ -112,6 +112,34 @@ unsafe fn blit(mut rgb: &mut [u8], mut rgba: &[u8]) { } } +#[doc(hidden)] +#[unsafe(no_mangle)] +pub fn copy_rgb_bgr_(i: &[[u8; 3]], o: &mut [[u8; 4]]) { + unsafe { assert_unchecked(i.len() == o.len()) }; + let mut i = i.as_flattened(); + let mut o = o.as_flattened_mut(); + while i.len() >= 32 { + let dst = unsafe { o.first_chunk_mut::<32>().unwrap_unchecked() }; // 8 pixels (32) + let src = u8x32::from_array(*i.first_chunk().unwrap()); // 8 pixels (24) + let src = simd_swizzle!( + src, + // range::<8>().map(_ * 3).map(|x| [x + 2, x + 1, x, 31]).flatten() + [ + 2, 1, 0, 31, 5, 4, 3, 31, 8, 7, 6, 31, 11, 10, 9, 31, 14, 13, 12, 31, 17, 16, 15, + 31, 20, 19, 18, 31, 23, 22, 21, 31, + ], + ); + src.copy_to_slice(dst); + i = &i[24..]; + o = &mut o[32..]; + } + while let Some(&[r, g, b]) = i.first_chunk() { + unsafe { *o.first_chunk_mut::<4>().unwrap_unchecked() = [b, g, r, 0] }; + o = &mut o[4..]; + i = &i[3..]; + } +} + impl<T: AsMut<[u8]> + AsRef<[u8]>, U: AsRef<[u8]>> Overlay<Image<U, 4>> for Image<T, 4> { #[inline] #[cfg_attr(debug_assertions, track_caller)] |