fast image operations
Diffstat (limited to 'src/convert.rs')
-rw-r--r--src/convert.rs21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/convert.rs b/src/convert.rs
index 8a6d7a4..3c6c54f 100644
--- a/src/convert.rs
+++ b/src/convert.rs
@@ -6,14 +6,15 @@ fn map<const A: usize, const B: usize>(image: Image<&[u8], A>) -> Image<Box<[u8]
where
[u8; B]: PFrom<A>,
{
- let buffer = image
- .chunked()
- .copied()
- .flat_map(<[u8; B] as PFrom<A>>::pfrom)
- .collect::<Vec<_>>()
- .into();
- // SAFETY: ctor
- unsafe { Image::new(image.width, image.height, buffer) }
+ // SAFETY: size unchanged, just change pixels
+ unsafe {
+ image.mapped(|buf| {
+ buf.array_chunks::<A>()
+ .copied()
+ .flat_map(<[u8; B] as PFrom<A>>::pfrom)
+ .collect()
+ })
+ }
}
macro_rules! convert {
@@ -64,12 +65,12 @@ boxconv!(4 => 2);
boxconv!(4 => 3);
#[inline]
-const fn pack([r, g, b, a]: [u8; 4]) -> u32 {
+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]
-const fn unpack(n: u32) -> [u8; 4] {
+pub const fn unpack(n: u32) -> [u8; 4] {
[
((n >> 16) & 0xFF) as u8,
((n >> 8) & 0xFF) as u8,