fast image operations
futureproof transmutation issues
| -rw-r--r-- | src/lib.rs | 14 | ||||
| -rw-r--r-- | src/term/bloc.rs | 17 | ||||
| -rw-r--r-- | src/term/iterm2.rs | 2 | ||||
| -rw-r--r-- | src/term/kitty.rs | 2 |
4 files changed, 24 insertions, 11 deletions
@@ -86,7 +86,7 @@ confusable_idents, internal_features )] -use std::{hint::assert_unchecked, num::NonZeroU32, ops::Range}; +use std::{hint::assert_unchecked, intrinsics::transmute_unchecked, num::NonZeroU32, ops::Range}; mod affine; #[cfg(feature = "blur")] @@ -448,6 +448,18 @@ impl<T, const CHANNELS: usize> Image<T, CHANNELS> { self.buffer().as_ref().len() } + /// Transforms the N + /// + /// # Safety + /// + /// i think you can see why this is a problem. + /// + /// # WHY??? + /// + /// sometimes rust is silly with generics + unsafe fn trans<const N: usize>(self) -> Image<T, N> { + unsafe { transmute_unchecked(self) } + } /// # Safety /// /// the output index is not guaranteed to be in bounds diff --git a/src/term/bloc.rs b/src/term/bloc.rs index 7bafd78..58c8655 100644 --- a/src/term/bloc.rs +++ b/src/term/bloc.rs @@ -50,16 +50,17 @@ where let (w, h) = fit((self.width(), self.height())); macro_rules! n { ($n:literal) => { - transmute::<Image<Box<[u8]>, $n>, Image<Box<[u8]>, N>>( - transmute::<Image<&[u8], N>, Image<&[u8], $n>>(self.as_ref()) - .scale::<scale::Nearest>(w, h), - ) + self.as_ref() + .trans::<$n>() + .scale::<scale::Nearest>(w, h) + .trans::<N>() }; (o $n:literal) => { - transmute::<Image<Box<[u8]>, 1>, Image<Box<[u8]>, N>>( - transmute::<Image<Vec<u8>, N>, Image<Vec<u8>, 1>>(self.as_ref().to_owned()) - .scale::<scale::Nearest>(w, h), - ) + self.as_ref() + .to_owned() + .trans::<1>() + .scale::<scale::Nearest>(w, h) + .trans::<N>() }; } // SAFETY: #[allow(clippy::undocumented_unsafe_blocks)] diff --git a/src/term/iterm2.rs b/src/term/iterm2.rs index 9a737a7..8ec5f42 100644 --- a/src/term/iterm2.rs +++ b/src/term/iterm2.rs @@ -42,7 +42,7 @@ where ($n:literal) => { WritePng::write( // SAFETY: ... i renounce traits - &unsafe { transmute::<Image<&[u8], N>, Image<&[u8], $n>>(self.as_ref()) }, + &unsafe { self.as_ref().trans::<$n>() }, &mut d, ) .unwrap() diff --git a/src/term/kitty.rs b/src/term/kitty.rs index b1db99a..dd13cb7 100644 --- a/src/term/kitty.rs +++ b/src/term/kitty.rs @@ -45,7 +45,7 @@ impl<T: AsRef<[u8]>, const N: usize> Kitty<T, N> { Cow::Owned( <Image<Box<[u8]>, 3>>::from({ // SAFETY: ... - unsafe { transmute::<Image<&[u8], N>, Image<&[u8], $n>>(self.as_ref()) } + unsafe { self.as_ref().trans::<$n>() } }) .take_buffer() .to_vec(), |