1#![cfg(target_endian = "little")]
11#![allow(dead_code)]
12#![allow(unused_macros)]
13
14use super::*;
15
16pub trait WritableImageU16Ext: WritableImage<u16> {
18 fn blit_rgba16<RI>(&mut self, src: &RI, offset: (isize, isize))
24 where
25 RI: ReadableImage<u16>,
26 {
27 #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
29 {
30 #[cfg(feature = "std")]
34 {
35 if is_x86_feature_detected!("avx2") {
36 unsafe { blit_rgb16_avx2_explicit(self, src, offset) };
37 } else if is_x86_feature_detected!("sse2") {
38 unsafe { blit_rgb16_sse2_explicit(self, src, offset) };
39 } else {
40 unsafe { blit_rgb16_fully_unrolled_no_intrinsics(self, src, offset) };
42 }
43 }
44 #[cfg(all(not(feature = "std"), target_feature = "avx2"))]
45 {
46 unsafe { blit_rgb16_avx2_explicit(self, src, offset) };
47 }
48 #[cfg(all(not(feature = "std"), not(target_feature = "avx2"), target_feature = "sse2"))]
49 {
50 unsafe { blit_rgb16_sse2_explicit(self, src, offset) };
51 }
52 #[cfg(all(not(feature = "std"), not(target_feature = "avx2"), not(target_feature = "sse2")))]
53 {
54 unsafe { blit_rgb16_fully_unrolled_no_intrinsics(self, src, offset) };
55 }
56 }
57 #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
59 {
60 unsafe { blit_blend_rectilinear_fully_unrolled_no_intrinsics(self, src, offset) };
63 }
64 }
65}
66
67unsafe fn blit_rgb16_fully_unrolled_no_intrinsics<WI, RI>(dest: &mut WI, src: &RI, offset: (isize, isize))
68where
69 WI: WritableImage<u16> + ?Sized,
70 RI: ReadableImage<u16>,
71{
72 dest.blit_generic(src, offset, |src, dest| if (src as i16) < 0 { src } else { dest });
73}
74
75#[target_feature(enable = "sse2")]
76#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
77unsafe fn blit_rgb16_sse2_explicit<WI, RI>(dest: &mut WI, src: &RI, offset: (isize, isize))
78where
79 WI: WritableImage<u16> + ?Sized,
80 RI: ReadableImage<u16>,
81{
82 dest.blit_generic(src, offset, |src, dest| if (src as i16) < 0 { src } else { dest });
84}
85
86#[target_feature(enable = "avx2")]
87#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
88unsafe fn blit_rgb16_avx2_explicit<WI, RI>(dest: &mut WI, src: &RI, offset: (isize, isize))
89where
90 WI: WritableImage<u16> + ?Sized,
91 RI: ReadableImage<u16>,
92{
93 dest.blit_generic(src, offset, |src, dest| if (src as i16) < 0 { src } else { dest });
95}