add ARGBu8x4 -> byte casting helper traits/methods
This commit is contained in:
parent
a7567b8c0f
commit
ae07b9cd37
|
@ -549,6 +549,16 @@ pub fn tinted_blend_argb_simd(tint: SimdColor4u8, src: SimdColor4u8, dest: SimdC
|
|||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
pub trait BytesAsColors<T> {
|
||||
unsafe fn as_colors(&self) -> &[T];
|
||||
unsafe fn as_colors_mut(&mut self) -> &mut [T];
|
||||
}
|
||||
|
||||
pub trait ColorsAsBytes {
|
||||
fn as_bytes(&self) -> &[u8];
|
||||
fn as_bytes_mut(&mut self) -> &mut [u8];
|
||||
}
|
||||
|
||||
/// Unpacked 32-bit color represented as individual 8-bit color components where the components are in the
|
||||
/// order alpha, red, green, blue.
|
||||
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
|
||||
|
@ -696,6 +706,46 @@ impl From<ARGBf32x4> for ARGBu8x4 {
|
|||
}
|
||||
}
|
||||
|
||||
impl BytesAsColors<ARGBu8x4> for [u8] {
|
||||
#[inline]
|
||||
unsafe fn as_colors(&self) -> &[ARGBu8x4] {
|
||||
std::slice::from_raw_parts(
|
||||
self.as_ptr() as *const ARGBu8x4, //
|
||||
self.len() / std::mem::size_of::<ARGBu8x4>(),
|
||||
)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
unsafe fn as_colors_mut(&mut self) -> &mut [ARGBu8x4] {
|
||||
std::slice::from_raw_parts_mut(
|
||||
self.as_mut_ptr() as *mut ARGBu8x4, //
|
||||
self.len() / std::mem::size_of::<ARGBu8x4>(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
impl ColorsAsBytes for [ARGBu8x4] {
|
||||
#[inline]
|
||||
fn as_bytes(&self) -> &[u8] {
|
||||
unsafe {
|
||||
std::slice::from_raw_parts(
|
||||
self.as_ptr() as *const u8, //
|
||||
std::mem::size_of_val(self),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn as_bytes_mut(&mut self) -> &mut [u8] {
|
||||
unsafe {
|
||||
std::slice::from_raw_parts_mut(
|
||||
self.as_mut_ptr() as *mut u8, //
|
||||
std::mem::size_of_val(self),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Unpacked 32-bit color represented as individual normalized f32 color components (0.0 to 1.0) where the
|
||||
/// components are in the order alpha, red, green, blue.
|
||||
#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
|
||||
|
@ -1038,6 +1088,83 @@ mod tests {
|
|||
assert_eq!([0xff, 0xff, 0xff, 0xff], ARGBu8x4::from(0xffffffff).tint(ARGBu8x4::from(0x00112233)).to_array());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn argbu8x4_bytes_to_colors_casting() {
|
||||
let mut bytes =
|
||||
[0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff];
|
||||
|
||||
let colors = unsafe { bytes.as_colors() };
|
||||
assert_eq!(
|
||||
colors,
|
||||
[
|
||||
ARGBu8x4::from_argb([0xff, 0xff, 0x00, 0x00]),
|
||||
ARGBu8x4::from_argb([0xff, 0x00, 0xff, 0x00]),
|
||||
ARGBu8x4::from_argb([0xff, 0x00, 0x00, 0xff]),
|
||||
ARGBu8x4::from_argb([0xff, 0xff, 0x00, 0xff]),
|
||||
]
|
||||
);
|
||||
|
||||
let colors = unsafe { bytes.as_colors_mut() };
|
||||
assert_eq!(
|
||||
colors,
|
||||
[
|
||||
ARGBu8x4::from_argb([0xff, 0xff, 0x00, 0x00]),
|
||||
ARGBu8x4::from_argb([0xff, 0x00, 0xff, 0x00]),
|
||||
ARGBu8x4::from_argb([0xff, 0x00, 0x00, 0xff]),
|
||||
ARGBu8x4::from_argb([0xff, 0xff, 0x00, 0xff]),
|
||||
]
|
||||
);
|
||||
|
||||
// bytes slice which is NOT an exact multiple of 4
|
||||
let mut bytes = [
|
||||
0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x7f, 0x7f,
|
||||
];
|
||||
|
||||
let colors = unsafe { bytes.as_colors() };
|
||||
assert_eq!(
|
||||
colors,
|
||||
[
|
||||
ARGBu8x4::from_argb([0xff, 0xff, 0x00, 0x00]),
|
||||
ARGBu8x4::from_argb([0xff, 0x00, 0xff, 0x00]),
|
||||
ARGBu8x4::from_argb([0xff, 0x00, 0x00, 0xff]),
|
||||
ARGBu8x4::from_argb([0xff, 0xff, 0x00, 0xff]),
|
||||
]
|
||||
);
|
||||
|
||||
let colors = unsafe { bytes.as_colors_mut() };
|
||||
assert_eq!(
|
||||
colors,
|
||||
[
|
||||
ARGBu8x4::from_argb([0xff, 0xff, 0x00, 0x00]),
|
||||
ARGBu8x4::from_argb([0xff, 0x00, 0xff, 0x00]),
|
||||
ARGBu8x4::from_argb([0xff, 0x00, 0x00, 0xff]),
|
||||
ARGBu8x4::from_argb([0xff, 0xff, 0x00, 0xff]),
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn argbu8x4_colors_to_bytes_casting() {
|
||||
let mut colors = [
|
||||
ARGBu8x4::from_argb([0xff, 0xff, 0x00, 0x00]),
|
||||
ARGBu8x4::from_argb([0xff, 0x00, 0xff, 0x00]),
|
||||
ARGBu8x4::from_argb([0xff, 0x00, 0x00, 0xff]),
|
||||
ARGBu8x4::from_argb([0xff, 0xff, 0x00, 0xff]),
|
||||
];
|
||||
|
||||
let bytes = colors.as_bytes();
|
||||
assert_eq!(
|
||||
bytes,
|
||||
[0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff]
|
||||
);
|
||||
|
||||
let bytes = colors.as_bytes_mut();
|
||||
assert_eq!(
|
||||
bytes,
|
||||
[0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn argbf32x4() {
|
||||
let mut color = ARGBf32x4(simd::f32x4::from_array([0.5, 0.1, 0.2, 0.3]));
|
||||
|
|
Loading…
Reference in a new issue