fast image operations
Diffstat (limited to 'src/convert.rs')
-rw-r--r--src/convert.rs36
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();