fast image operations
Diffstat (limited to 'src/convert.rs')
| -rw-r--r-- | src/convert.rs | 36 |
1 files changed, 6 insertions, 30 deletions
diff --git a/src/convert.rs b/src/convert.rs index 3c6c54f..2b0d192 100644 --- a/src/convert.rs +++ b/src/convert.rs @@ -1,6 +1,6 @@ //! define From's for images. //! these conversions are defined by [`PFrom`]. -use crate::{pixels::convert::PFrom, Image}; +use crate::{pixels::convert::PFrom, Image, Pack}; fn map<const A: usize, const B: usize>(image: Image<&[u8], A>) -> Image<Box<[u8]>, B> where @@ -64,33 +64,13 @@ boxconv!(4 => 1); boxconv!(4 => 2); boxconv!(4 => 3); -#[inline] -pub const fn pack([r, g, b, a]: [u8; 4]) -> u32 { - ((a as u32) << 24) | ((r as u32) << 16) | ((g as u32) << 8) | (b as u32) -} - -#[inline] -pub const fn unpack(n: u32) -> [u8; 4] { - [ - ((n >> 16) & 0xFF) as u8, - ((n >> 8) & 0xFF) as u8, - (n & 0xFF) as u8, - ((n >> 24) & 0xFF) as u8, - ] -} - impl<const N: usize> From<Image<&[u8], N>> for Image<Box<[u32]>, 1> where - [u8; 4]: PFrom<N>, + [u8; N]: Pack, { /// Pack into ARGB. fn from(value: Image<&[u8], N>) -> Self { - let buf = value - .chunked() - .copied() - .map(PFrom::pfrom) - .map(pack) - .collect(); + let buf = value.chunked().map(Pack::pack).collect(); // SAFETY: ctor unsafe { Self::new(value.width, value.height, buf) } } @@ -98,18 +78,14 @@ where pub fn unpack_all<const N: usize>(buffer: &[u32]) -> impl Iterator<Item = u8> + '_ where - [u8; N]: PFrom<4>, + [u8; N]: Pack, { - buffer - .iter() - .copied() - .map(unpack) - .flat_map(<[u8; N] as PFrom<4>>::pfrom) + buffer.iter().copied().flat_map(<[u8; N]>::unpack) } impl<const N: usize> From<Image<&[u32], 1>> for Image<Box<[u8]>, N> where - [u8; N]: PFrom<4>, + [u8; N]: Pack, { fn from(value: Image<&[u32], 1>) -> Self { let buf = unpack_all(value.buffer).collect(); |