image_swizzle 0.3.0

SIMD accelerated image swizzling routines
Documentation
#[allow(unused_macros)]
macro_rules! impl_tests {
    () => {
        fn generate_xxxx_image(width: usize, height: usize, x1: u8, x2: u8, x3: u8, x4: u8) -> Vec<u8> {
            assert!((width * height * 4) % 4 == 0);
            let mut xxxx = Vec::with_capacity(width * height);
            for _ in 0..width * height {
                xxxx.push(x1);
                xxxx.push(x2);
                xxxx.push(x3);
                xxxx.push(x4);
            }
            xxxx
        }

        #[test]
        fn test_rgba_to_bgra_inplace() {
            let (width, height) = (1920, 1080);
            let mut rgba_img = generate_xxxx_image(width, height, 111, 222, 100, 255);
            let correct_bgra = generate_xxxx_image(width, height, 100, 222, 111, 255);
            rgba_to_bgra_inplace(&mut rgba_img);
            assert_eq!(rgba_img, correct_bgra);
        }

        #[test]
        fn test_rgba_to_bgra_inplace_short_lane_count() {
            let (width, height) = (3, 3);
            let mut rgba_img = generate_xxxx_image(width, height, 111, 222, 100, 255);
            let correct_bgra = generate_xxxx_image(width, height, 100, 222, 111, 255);
            rgba_to_bgra_inplace(&mut rgba_img);
            assert_eq!(rgba_img, correct_bgra);
        }

        #[test]
        fn test_rgba_to_bgra_inplace_combi() {
            let (width, height) = (5, 5);
            let mut rgba_img = generate_xxxx_image(width, height, 111, 222, 100, 255);
            let correct_bgra = generate_xxxx_image(width, height, 100, 222, 111, 255);
            rgba_to_bgra_inplace(&mut rgba_img);
            assert_eq!(rgba_img, correct_bgra);
        }

        #[test]
        fn test_rgba32_to_rgba_inplace() {
            let (width, height) = (10, 10);
            #[cfg(target_endian = "little")]
            let mut rgba_img = generate_xxxx_image(width, height, 255, 222, 111, 0);
            #[cfg(target_endian = "big")]
            todo!();
            let correct = generate_xxxx_image(width, height, 0, 111, 222, 255);
            rgba32_to_rgba_inplace(&mut rgba_img);
            assert_eq!(rgba_img, correct);
        }

        #[test]
        fn test_rgba32_to_bgra_inplace() {
            let (width, height) = (10, 10);
            #[cfg(target_endian = "little")]
            let mut rgba_img = generate_xxxx_image(width, height, 255, 222, 111, 0);
            #[cfg(target_endian = "big")]
            todo!();
            let correct = generate_xxxx_image(width, height, 222, 111, 0, 255);
            rgba32_to_bgra_inplace(&mut rgba_img);
            assert_eq!(rgba_img, correct);
        }

        #[test]
        fn test_rgba_to_bgra() {
            let (width, height) = (1920, 1080);
            let rgba_img = generate_xxxx_image(width, height, 111, 222, 100, 255);
            let correct_bgra = generate_xxxx_image(width, height, 100, 222, 111, 255);
            let mut bgra = vec![0; width * height * 4];
            rgba_to_bgra(&rgba_img, &mut bgra);
            assert_eq!(bgra, correct_bgra);
        }

        #[test]
        #[should_panic]
        fn test_panic_rgba_to_bgra() {
            let (width, height) = (1920, 1080);
            let rgba_img = generate_xxxx_image(width, height, 111, 222, 100, 255);
            let correct_bgra = generate_xxxx_image(width, height, 100, 222, 111, 255);
            let mut bgra = vec![0; width * height * 4 - 10];
            rgba_to_bgra(&rgba_img, &mut bgra);
            assert_eq!(bgra, correct_bgra);
        }

        #[test]
        fn test_bgra_to_rgba_inplace() {
            let (width, height) = (1920, 1080);
            let mut bgra = generate_xxxx_image(width, height, 111, 222, 100, 255);
            let correct_rgba = generate_xxxx_image(width, height, 100, 222, 111, 255);
            bgra_to_rgba_inplace(&mut bgra);
            assert_eq!(bgra, correct_rgba);
        }

        #[test]
        fn test_bgra_to_rgba() {
            let (width, height) = (1920, 1080);
            let bgra = generate_xxxx_image(width, height, 111, 222, 100, 255);
            let correct_rgba = generate_xxxx_image(width, height, 100, 222, 111, 255);
            let mut rgba = vec![0; width * height * 4];
            bgra_to_rgba(&bgra, &mut rgba);
            assert_eq!(rgba, correct_rgba);
        }

        #[test]
        fn test_rgb0_to_rgbx_inplace() {
            let (width, height) = (1920, 1080);
            let mut rgb0_img = generate_xxxx_image(width, height, 111, 222, 100, 0);
            let correct_rgbx = generate_xxxx_image(width, height, 111, 222, 100, 255);
            rgb0_to_rgbx_inplace(&mut rgb0_img);
            assert_eq!(rgb0_img, correct_rgbx);
        }

        #[test]
        fn test_rgb0_to_rgbx() {
            let (width, height) = (1920, 1080);
            let rgb0_img = generate_xxxx_image(width, height, 111, 222, 100, 0);
            let correct_rgbx = generate_xxxx_image(width, height, 111, 222, 100, 255);
            let mut rgbx = vec![0; width * height * 4];
            rgb0_to_rgbx(&rgb0_img, &mut rgbx);
            assert_eq!(rgbx, correct_rgbx);
        }

        #[test]
        fn test_bgr0_to_bgrx_inplace() {
            let (width, height) = (10, 10);
            let mut bgr0_img = generate_xxxx_image(width, height, 111, 222, 100, 0);
            let correct_bgrx = generate_xxxx_image(width, height, 111, 222, 100, 255);
            bgr0_to_bgrx_inplace(&mut bgr0_img);
            assert_eq!(bgr0_img, correct_bgrx);
        }

        #[test]
        fn test_bgr0_to_bgrx() {
            let (width, height) = (10, 10);
            let bgr0_img = generate_xxxx_image(width, height, 111, 222, 100, 0);
            let correct_bgrx = generate_xxxx_image(width, height, 111, 222, 100, 255);
            let mut bgrx = vec![0; width * height * 4];
            bgr0_to_bgrx(&bgr0_img, &mut bgrx);
            assert_eq!(bgrx, correct_bgrx);
        }

        #[test]
        fn test_rgb0_to_bgrx_inplace() {
            let (width, height) = (1920, 1080);
            let mut rgb0_img = generate_xxxx_image(width, height, 111, 222, 100, 0);
            let correct_bgrx = generate_xxxx_image(width, height, 100, 222, 111, 255);
            rgb0_to_bgrx_inplace(&mut rgb0_img);
            assert_eq!(rgb0_img, correct_bgrx);
        }

        #[test]
        fn test_rgb0_to_bgrx() {
            let (width, height) = (1920, 1080);
            let rgb0_img = generate_xxxx_image(width, height, 111, 222, 100, 0);
            let correct_bgrx = generate_xxxx_image(width, height, 100, 222, 111, 255);
            let mut bgrx = vec![0; width * height * 4];
            rgb0_to_bgrx(&rgb0_img, &mut bgrx);
            assert_eq!(bgrx, correct_bgrx);
        }

        #[test]
        fn test_bgr0_to_rgbx_inplace() {
            let (width, height) = (4, 4);
            let mut bgr0_img = generate_xxxx_image(width, height, 111, 222, 100, 0);
            let correct_rgbx = generate_xxxx_image(width, height, 100, 222, 111, 255);
            bgr0_to_rgbx_inplace(&mut bgr0_img);
            assert_eq!(bgr0_img, correct_rgbx);
        }

        #[test]
        fn test_bgr0_to_rgbx() {
            let (width, height) = (1920, 1080);
            let bgr0_img = generate_xxxx_image(width, height, 111, 222, 100, 0);
            let correct_rgbx = generate_xxxx_image(width, height, 100, 222, 111, 255);
            let mut rgbx = vec![0; width * height * 4];
            bgr0_to_rgbx(&bgr0_img, &mut rgbx);
            assert_eq!(rgbx, correct_rgbx);
        }

        #[test]
        fn test_argb_to_rgba_inplace() {
            let (width, height) = (1920, 1080);
            let (r, g, b, a) = (1, 2, 3, 4);
            let mut argb = generate_xxxx_image(width, height, a, r, g, b);
            let correct_rgba = generate_xxxx_image(width, height, r, g, b, a);
            argb_to_rgba_inplace(&mut argb);
            assert_eq!(argb, correct_rgba);
        }
    }
}

#[allow(unused_imports)]
pub(crate) use impl_tests;