fast image operations
-rw-r--r--src/lib.rs14
-rw-r--r--src/term/bloc.rs17
-rw-r--r--src/term/iterm2.rs2
-rw-r--r--src/term/kitty.rs2
4 files changed, 24 insertions, 11 deletions
diff --git a/src/lib.rs b/src/lib.rs
index a0d1e7c..33a27f7 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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(),