#[inline(always)]
fn load_u16<const BE: bool>(v: u16) -> u16 {
if BE { u16::from_be(v) } else { u16::from_le(v) }
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn rgb48_to_rgb_row<const BE: bool>(rgb48: &[u16], rgb_out: &mut [u8], width: usize) {
debug_assert!(rgb48.len() >= width * 3, "rgb48 row too short");
debug_assert!(rgb_out.len() >= width * 3, "rgb_out row too short");
for x in 0..width {
let src = x * 3;
let dst = x * 3;
rgb_out[dst] = (load_u16::<BE>(rgb48[src]) >> 8) as u8;
rgb_out[dst + 1] = (load_u16::<BE>(rgb48[src + 1]) >> 8) as u8;
rgb_out[dst + 2] = (load_u16::<BE>(rgb48[src + 2]) >> 8) as u8;
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn rgb48_to_rgb_u16_row<const BE: bool>(
rgb48: &[u16],
rgb_u16_out: &mut [u16],
width: usize,
) {
debug_assert!(rgb48.len() >= width * 3, "rgb48 row too short");
debug_assert!(rgb_u16_out.len() >= width * 3, "rgb_u16_out row too short");
if BE {
for i in 0..width * 3 {
rgb_u16_out[i] = u16::from_be(rgb48[i]);
}
} else {
for i in 0..width * 3 {
rgb_u16_out[i] = u16::from_le(rgb48[i]);
}
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn rgb48_to_rgba_row<const BE: bool>(rgb48: &[u16], rgba_out: &mut [u8], width: usize) {
debug_assert!(rgb48.len() >= width * 3, "rgb48 row too short");
debug_assert!(rgba_out.len() >= width * 4, "rgba_out row too short");
for x in 0..width {
let src = x * 3;
let dst = x * 4;
rgba_out[dst] = (load_u16::<BE>(rgb48[src]) >> 8) as u8;
rgba_out[dst + 1] = (load_u16::<BE>(rgb48[src + 1]) >> 8) as u8;
rgba_out[dst + 2] = (load_u16::<BE>(rgb48[src + 2]) >> 8) as u8;
rgba_out[dst + 3] = 0xFF;
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn rgb48_to_rgba_u16_row<const BE: bool>(
rgb48: &[u16],
rgba_u16_out: &mut [u16],
width: usize,
) {
debug_assert!(rgb48.len() >= width * 3, "rgb48 row too short");
debug_assert!(
rgba_u16_out.len() >= width * 4,
"rgba_u16_out row too short"
);
for x in 0..width {
let src = x * 3;
let dst = x * 4;
rgba_u16_out[dst] = load_u16::<BE>(rgb48[src]);
rgba_u16_out[dst + 1] = load_u16::<BE>(rgb48[src + 1]);
rgba_u16_out[dst + 2] = load_u16::<BE>(rgb48[src + 2]);
rgba_u16_out[dst + 3] = 0xFFFF;
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn bgr48_to_rgb_row<const BE: bool>(bgr48: &[u16], rgb_out: &mut [u8], width: usize) {
debug_assert!(bgr48.len() >= width * 3, "bgr48 row too short");
debug_assert!(rgb_out.len() >= width * 3, "rgb_out row too short");
for x in 0..width {
let src = x * 3;
let dst = x * 3;
rgb_out[dst] = (load_u16::<BE>(bgr48[src + 2]) >> 8) as u8; rgb_out[dst + 1] = (load_u16::<BE>(bgr48[src + 1]) >> 8) as u8; rgb_out[dst + 2] = (load_u16::<BE>(bgr48[src]) >> 8) as u8; }
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn bgr48_to_rgb_u16_row<const BE: bool>(
bgr48: &[u16],
rgb_u16_out: &mut [u16],
width: usize,
) {
debug_assert!(bgr48.len() >= width * 3, "bgr48 row too short");
debug_assert!(rgb_u16_out.len() >= width * 3, "rgb_u16_out row too short");
for x in 0..width {
let src = x * 3;
let dst = x * 3;
rgb_u16_out[dst] = load_u16::<BE>(bgr48[src + 2]); rgb_u16_out[dst + 1] = load_u16::<BE>(bgr48[src + 1]); rgb_u16_out[dst + 2] = load_u16::<BE>(bgr48[src]); }
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn bgr48_to_rgba_row<const BE: bool>(bgr48: &[u16], rgba_out: &mut [u8], width: usize) {
debug_assert!(bgr48.len() >= width * 3, "bgr48 row too short");
debug_assert!(rgba_out.len() >= width * 4, "rgba_out row too short");
for x in 0..width {
let src = x * 3;
let dst = x * 4;
rgba_out[dst] = (load_u16::<BE>(bgr48[src + 2]) >> 8) as u8; rgba_out[dst + 1] = (load_u16::<BE>(bgr48[src + 1]) >> 8) as u8; rgba_out[dst + 2] = (load_u16::<BE>(bgr48[src]) >> 8) as u8; rgba_out[dst + 3] = 0xFF;
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn bgr48_to_rgba_u16_row<const BE: bool>(
bgr48: &[u16],
rgba_u16_out: &mut [u16],
width: usize,
) {
debug_assert!(bgr48.len() >= width * 3, "bgr48 row too short");
debug_assert!(
rgba_u16_out.len() >= width * 4,
"rgba_u16_out row too short"
);
for x in 0..width {
let src = x * 3;
let dst = x * 4;
rgba_u16_out[dst] = load_u16::<BE>(bgr48[src + 2]); rgba_u16_out[dst + 1] = load_u16::<BE>(bgr48[src + 1]); rgba_u16_out[dst + 2] = load_u16::<BE>(bgr48[src]); rgba_u16_out[dst + 3] = 0xFFFF;
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn rgba64_to_rgb_row<const BE: bool>(rgba64: &[u16], rgb_out: &mut [u8], width: usize) {
debug_assert!(rgba64.len() >= width * 4, "rgba64 row too short");
debug_assert!(rgb_out.len() >= width * 3, "rgb_out row too short");
for x in 0..width {
let src = x * 4;
let dst = x * 3;
rgb_out[dst] = (load_u16::<BE>(rgba64[src]) >> 8) as u8;
rgb_out[dst + 1] = (load_u16::<BE>(rgba64[src + 1]) >> 8) as u8;
rgb_out[dst + 2] = (load_u16::<BE>(rgba64[src + 2]) >> 8) as u8;
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn rgba64_to_rgb_u16_row<const BE: bool>(
rgba64: &[u16],
rgb_u16_out: &mut [u16],
width: usize,
) {
debug_assert!(rgba64.len() >= width * 4, "rgba64 row too short");
debug_assert!(rgb_u16_out.len() >= width * 3, "rgb_u16_out row too short");
for x in 0..width {
let src = x * 4;
let dst = x * 3;
rgb_u16_out[dst] = load_u16::<BE>(rgba64[src]);
rgb_u16_out[dst + 1] = load_u16::<BE>(rgba64[src + 1]);
rgb_u16_out[dst + 2] = load_u16::<BE>(rgba64[src + 2]);
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn rgba64_to_rgba_row<const BE: bool>(
rgba64: &[u16],
rgba_out: &mut [u8],
width: usize,
) {
debug_assert!(rgba64.len() >= width * 4, "rgba64 row too short");
debug_assert!(rgba_out.len() >= width * 4, "rgba_out row too short");
for x in 0..width {
let i = x * 4;
rgba_out[i] = (load_u16::<BE>(rgba64[i]) >> 8) as u8;
rgba_out[i + 1] = (load_u16::<BE>(rgba64[i + 1]) >> 8) as u8;
rgba_out[i + 2] = (load_u16::<BE>(rgba64[i + 2]) >> 8) as u8;
rgba_out[i + 3] = (load_u16::<BE>(rgba64[i + 3]) >> 8) as u8;
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn rgba64_to_rgba_u16_row<const BE: bool>(
rgba64: &[u16],
rgba_u16_out: &mut [u16],
width: usize,
) {
debug_assert!(rgba64.len() >= width * 4, "rgba64 row too short");
debug_assert!(
rgba_u16_out.len() >= width * 4,
"rgba_u16_out row too short"
);
if BE {
for i in 0..width * 4 {
rgba_u16_out[i] = u16::from_be(rgba64[i]);
}
} else {
for i in 0..width * 4 {
rgba_u16_out[i] = u16::from_le(rgba64[i]);
}
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn bgra64_to_rgb_row<const BE: bool>(bgra64: &[u16], rgb_out: &mut [u8], width: usize) {
debug_assert!(bgra64.len() >= width * 4, "bgra64 row too short");
debug_assert!(rgb_out.len() >= width * 3, "rgb_out row too short");
for x in 0..width {
let src = x * 4;
let dst = x * 3;
rgb_out[dst] = (load_u16::<BE>(bgra64[src + 2]) >> 8) as u8; rgb_out[dst + 1] = (load_u16::<BE>(bgra64[src + 1]) >> 8) as u8; rgb_out[dst + 2] = (load_u16::<BE>(bgra64[src]) >> 8) as u8; }
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn bgra64_to_rgb_u16_row<const BE: bool>(
bgra64: &[u16],
rgb_u16_out: &mut [u16],
width: usize,
) {
debug_assert!(bgra64.len() >= width * 4, "bgra64 row too short");
debug_assert!(rgb_u16_out.len() >= width * 3, "rgb_u16_out row too short");
for x in 0..width {
let src = x * 4;
let dst = x * 3;
rgb_u16_out[dst] = load_u16::<BE>(bgra64[src + 2]); rgb_u16_out[dst + 1] = load_u16::<BE>(bgra64[src + 1]); rgb_u16_out[dst + 2] = load_u16::<BE>(bgra64[src]); }
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn bgra64_to_rgba_row<const BE: bool>(
bgra64: &[u16],
rgba_out: &mut [u8],
width: usize,
) {
debug_assert!(bgra64.len() >= width * 4, "bgra64 row too short");
debug_assert!(rgba_out.len() >= width * 4, "rgba_out row too short");
for x in 0..width {
let src = x * 4;
let dst = x * 4;
rgba_out[dst] = (load_u16::<BE>(bgra64[src + 2]) >> 8) as u8; rgba_out[dst + 1] = (load_u16::<BE>(bgra64[src + 1]) >> 8) as u8; rgba_out[dst + 2] = (load_u16::<BE>(bgra64[src]) >> 8) as u8; rgba_out[dst + 3] = (load_u16::<BE>(bgra64[src + 3]) >> 8) as u8; }
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub(crate) fn bgra64_to_rgba_u16_row<const BE: bool>(
bgra64: &[u16],
rgba_u16_out: &mut [u16],
width: usize,
) {
debug_assert!(bgra64.len() >= width * 4, "bgra64 row too short");
debug_assert!(
rgba_u16_out.len() >= width * 4,
"rgba_u16_out row too short"
);
for x in 0..width {
let src = x * 4;
let dst = x * 4;
rgba_u16_out[dst] = load_u16::<BE>(bgra64[src + 2]); rgba_u16_out[dst + 1] = load_u16::<BE>(bgra64[src + 1]); rgba_u16_out[dst + 2] = load_u16::<BE>(bgra64[src]); rgba_u16_out[dst + 3] = load_u16::<BE>(bgra64[src + 3]); }
}
#[cfg(all(test, feature = "std"))]
mod tests;