#[cfg(any(
target_arch = "aarch64",
target_arch = "x86_64",
target_arch = "wasm32"
))]
use crate::row::arch;
#[cfg(target_arch = "x86_64")]
use crate::row::avx2_available;
#[cfg(target_arch = "x86_64")]
use crate::row::avx512_available;
#[cfg(target_arch = "aarch64")]
use crate::row::neon_available;
#[cfg(target_arch = "wasm32")]
use crate::row::simd128_available;
#[cfg(target_arch = "x86_64")]
use crate::row::sse41_available;
use crate::row::{
packed_yuv422_row_bytes, rgb_row_bytes, rgb_row_elems, rgba_row_bytes, rgba_row_elems, scalar,
};
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn rgb565_to_rgb_row(src: &[u8], rgb_out: &mut [u8], width: usize, use_simd: bool) {
let out_min = rgb_row_bytes(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgb_out.len() >= out_min, "rgb_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::rgb565_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::rgb565_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::rgb565_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::rgb565_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::rgb565_to_rgb_row(src, rgb_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::rgb565_to_rgb_row(src, rgb_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn rgb565_to_rgba_row(src: &[u8], rgba_out: &mut [u8], width: usize, use_simd: bool) {
let out_min = rgba_row_bytes(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgba_out.len() >= out_min, "rgba_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::rgb565_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::rgb565_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::rgb565_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::rgb565_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::rgb565_to_rgba_row(src, rgba_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::rgb565_to_rgba_row(src, rgba_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn rgb565_to_rgb_u16_row(src: &[u8], rgb_out: &mut [u16], width: usize, use_simd: bool) {
let out_min = rgb_row_elems(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgb_out.len() >= out_min, "rgb_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::rgb565_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::rgb565_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::rgb565_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::rgb565_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::rgb565_to_rgb_u16_row(src, rgb_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::rgb565_to_rgb_u16_row(src, rgb_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn rgb565_to_rgba_u16_row(src: &[u8], rgba_out: &mut [u16], width: usize, use_simd: bool) {
let out_min = rgba_row_elems(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgba_out.len() >= out_min, "rgba_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::rgb565_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::rgb565_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::rgb565_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::rgb565_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::rgb565_to_rgba_u16_row(src, rgba_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::rgb565_to_rgba_u16_row(src, rgba_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bgr565_to_rgb_row(src: &[u8], rgb_out: &mut [u8], width: usize, use_simd: bool) {
let out_min = rgb_row_bytes(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgb_out.len() >= out_min, "rgb_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::bgr565_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::bgr565_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::bgr565_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::bgr565_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::bgr565_to_rgb_row(src, rgb_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::bgr565_to_rgb_row(src, rgb_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bgr565_to_rgba_row(src: &[u8], rgba_out: &mut [u8], width: usize, use_simd: bool) {
let out_min = rgba_row_bytes(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgba_out.len() >= out_min, "rgba_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::bgr565_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::bgr565_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::bgr565_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::bgr565_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::bgr565_to_rgba_row(src, rgba_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::bgr565_to_rgba_row(src, rgba_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bgr565_to_rgb_u16_row(src: &[u8], rgb_out: &mut [u16], width: usize, use_simd: bool) {
let out_min = rgb_row_elems(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgb_out.len() >= out_min, "rgb_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::bgr565_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::bgr565_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::bgr565_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::bgr565_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::bgr565_to_rgb_u16_row(src, rgb_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::bgr565_to_rgb_u16_row(src, rgb_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bgr565_to_rgba_u16_row(src: &[u8], rgba_out: &mut [u16], width: usize, use_simd: bool) {
let out_min = rgba_row_elems(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgba_out.len() >= out_min, "rgba_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::bgr565_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::bgr565_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::bgr565_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::bgr565_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::bgr565_to_rgba_u16_row(src, rgba_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::bgr565_to_rgba_u16_row(src, rgba_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn rgb555_to_rgb_row(src: &[u8], rgb_out: &mut [u8], width: usize, use_simd: bool) {
let out_min = rgb_row_bytes(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgb_out.len() >= out_min, "rgb_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::rgb555_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::rgb555_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::rgb555_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::rgb555_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::rgb555_to_rgb_row(src, rgb_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::rgb555_to_rgb_row(src, rgb_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn rgb555_to_rgba_row(src: &[u8], rgba_out: &mut [u8], width: usize, use_simd: bool) {
let out_min = rgba_row_bytes(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgba_out.len() >= out_min, "rgba_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::rgb555_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::rgb555_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::rgb555_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::rgb555_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::rgb555_to_rgba_row(src, rgba_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::rgb555_to_rgba_row(src, rgba_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn rgb555_to_rgb_u16_row(src: &[u8], rgb_out: &mut [u16], width: usize, use_simd: bool) {
let out_min = rgb_row_elems(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgb_out.len() >= out_min, "rgb_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::rgb555_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::rgb555_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::rgb555_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::rgb555_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::rgb555_to_rgb_u16_row(src, rgb_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::rgb555_to_rgb_u16_row(src, rgb_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn rgb555_to_rgba_u16_row(src: &[u8], rgba_out: &mut [u16], width: usize, use_simd: bool) {
let out_min = rgba_row_elems(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgba_out.len() >= out_min, "rgba_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::rgb555_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::rgb555_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::rgb555_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::rgb555_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::rgb555_to_rgba_u16_row(src, rgba_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::rgb555_to_rgba_u16_row(src, rgba_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bgr555_to_rgb_row(src: &[u8], rgb_out: &mut [u8], width: usize, use_simd: bool) {
let out_min = rgb_row_bytes(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgb_out.len() >= out_min, "rgb_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::bgr555_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::bgr555_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::bgr555_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::bgr555_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::bgr555_to_rgb_row(src, rgb_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::bgr555_to_rgb_row(src, rgb_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bgr555_to_rgba_row(src: &[u8], rgba_out: &mut [u8], width: usize, use_simd: bool) {
let out_min = rgba_row_bytes(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgba_out.len() >= out_min, "rgba_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::bgr555_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::bgr555_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::bgr555_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::bgr555_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::bgr555_to_rgba_row(src, rgba_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::bgr555_to_rgba_row(src, rgba_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bgr555_to_rgb_u16_row(src: &[u8], rgb_out: &mut [u16], width: usize, use_simd: bool) {
let out_min = rgb_row_elems(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgb_out.len() >= out_min, "rgb_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::bgr555_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::bgr555_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::bgr555_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::bgr555_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::bgr555_to_rgb_u16_row(src, rgb_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::bgr555_to_rgb_u16_row(src, rgb_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bgr555_to_rgba_u16_row(src: &[u8], rgba_out: &mut [u16], width: usize, use_simd: bool) {
let out_min = rgba_row_elems(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgba_out.len() >= out_min, "rgba_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::bgr555_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::bgr555_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::bgr555_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::bgr555_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::bgr555_to_rgba_u16_row(src, rgba_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::bgr555_to_rgba_u16_row(src, rgba_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn rgb444_to_rgb_row(src: &[u8], rgb_out: &mut [u8], width: usize, use_simd: bool) {
let out_min = rgb_row_bytes(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgb_out.len() >= out_min, "rgb_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::rgb444_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::rgb444_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::rgb444_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::rgb444_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::rgb444_to_rgb_row(src, rgb_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::rgb444_to_rgb_row(src, rgb_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn rgb444_to_rgba_row(src: &[u8], rgba_out: &mut [u8], width: usize, use_simd: bool) {
let out_min = rgba_row_bytes(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgba_out.len() >= out_min, "rgba_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::rgb444_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::rgb444_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::rgb444_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::rgb444_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::rgb444_to_rgba_row(src, rgba_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::rgb444_to_rgba_row(src, rgba_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn rgb444_to_rgb_u16_row(src: &[u8], rgb_out: &mut [u16], width: usize, use_simd: bool) {
let out_min = rgb_row_elems(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgb_out.len() >= out_min, "rgb_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::rgb444_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::rgb444_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::rgb444_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::rgb444_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::rgb444_to_rgb_u16_row(src, rgb_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::rgb444_to_rgb_u16_row(src, rgb_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn rgb444_to_rgba_u16_row(src: &[u8], rgba_out: &mut [u16], width: usize, use_simd: bool) {
let out_min = rgba_row_elems(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgba_out.len() >= out_min, "rgba_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::rgb444_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::rgb444_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::rgb444_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::rgb444_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::rgb444_to_rgba_u16_row(src, rgba_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::rgb444_to_rgba_u16_row(src, rgba_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bgr444_to_rgb_row(src: &[u8], rgb_out: &mut [u8], width: usize, use_simd: bool) {
let out_min = rgb_row_bytes(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgb_out.len() >= out_min, "rgb_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::bgr444_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::bgr444_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::bgr444_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::bgr444_to_rgb_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::bgr444_to_rgb_row(src, rgb_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::bgr444_to_rgb_row(src, rgb_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bgr444_to_rgba_row(src: &[u8], rgba_out: &mut [u8], width: usize, use_simd: bool) {
let out_min = rgba_row_bytes(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgba_out.len() >= out_min, "rgba_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::bgr444_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::bgr444_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::bgr444_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::bgr444_to_rgba_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::bgr444_to_rgba_row(src, rgba_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::bgr444_to_rgba_row(src, rgba_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bgr444_to_rgb_u16_row(src: &[u8], rgb_out: &mut [u16], width: usize, use_simd: bool) {
let out_min = rgb_row_elems(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgb_out.len() >= out_min, "rgb_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::bgr444_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::bgr444_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::bgr444_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::bgr444_to_rgb_u16_row(src, rgb_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::bgr444_to_rgb_u16_row(src, rgb_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::bgr444_to_rgb_u16_row(src, rgb_out, width);
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn bgr444_to_rgba_u16_row(src: &[u8], rgba_out: &mut [u16], width: usize, use_simd: bool) {
let out_min = rgba_row_elems(width);
let src_min = packed_yuv422_row_bytes(width);
assert!(src.len() >= src_min, "src row too short");
assert!(rgba_out.len() >= out_min, "rgba_out too short");
#[cfg(target_arch = "aarch64")]
if use_simd && neon_available() {
unsafe {
return arch::neon::legacy_rgb::bgr444_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx512_available() {
unsafe {
return arch::x86_avx512::legacy_rgb::bgr444_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && avx2_available() {
unsafe {
return arch::x86_avx2::legacy_rgb::bgr444_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "x86_64")]
if use_simd && sse41_available() {
unsafe {
return arch::x86_sse41::legacy_rgb::bgr444_to_rgba_u16_row(src, rgba_out, width);
}
}
#[cfg(target_arch = "wasm32")]
if use_simd && simd128_available() {
unsafe {
return arch::wasm_simd128::legacy_rgb::bgr444_to_rgba_u16_row(src, rgba_out, width);
}
}
let _ = use_simd;
scalar::legacy_rgb::bgr444_to_rgba_u16_row(src, rgba_out, width);
}
#[cfg(all(test, feature = "std"))]
mod tests {
#[cfg(target_pointer_width = "32")]
use super::*;
#[cfg(target_pointer_width = "32")]
const OVERFLOW_WIDTH_X2: usize = {
let c = (usize::MAX / 2) + 1;
c + (c & 1)
};
#[cfg(target_pointer_width = "32")]
const OVERFLOW_WIDTH_X3: usize = {
let c = (usize::MAX / 3) + 1;
c + (c & 1)
};
#[cfg(target_pointer_width = "32")]
const OVERFLOW_WIDTH_X4: usize = {
let c = (usize::MAX / 4) + 1;
c + (c & 1)
};
#[cfg(target_pointer_width = "32")]
#[test]
#[should_panic(expected = "overflows usize")]
fn rgb565_to_rgb_rejects_src_width_times_2_overflow() {
let src: [u8; 0] = [];
let mut rgb: [u8; 0] = [];
rgb565_to_rgb_row(&src, &mut rgb, OVERFLOW_WIDTH_X2, false);
}
#[cfg(target_pointer_width = "32")]
#[test]
#[should_panic(expected = "overflows usize")]
fn rgb565_to_rgb_rejects_out_width_times_3_overflow() {
let src: [u8; 0] = [];
let mut rgb: [u8; 0] = [];
rgb565_to_rgb_row(&src, &mut rgb, OVERFLOW_WIDTH_X3, false);
}
#[cfg(target_pointer_width = "32")]
#[test]
#[should_panic(expected = "overflows usize")]
fn rgb565_to_rgba_rejects_out_width_times_4_overflow() {
let src: [u8; 0] = [];
let mut rgba: [u8; 0] = [];
rgb565_to_rgba_row(&src, &mut rgba, OVERFLOW_WIDTH_X4, false);
}
#[cfg(target_pointer_width = "32")]
#[test]
#[should_panic(expected = "overflows usize")]
fn bgr444_to_rgb_u16_rejects_out_width_times_3_overflow() {
let src: [u8; 0] = [];
let mut rgb: [u16; 0] = [];
bgr444_to_rgb_u16_row(&src, &mut rgb, OVERFLOW_WIDTH_X3, false);
}
}