fast image operations
Diffstat (limited to 'src/term/iterm2.rs')
| -rw-r--r-- | src/term/iterm2.rs | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/term/iterm2.rs b/src/term/iterm2.rs index b6a9663..a6e5bac 100644 --- a/src/term/iterm2.rs +++ b/src/term/iterm2.rs @@ -1,5 +1,6 @@ -use super::b64; +use super::{b64, Basic}; use crate::{Image, WritePng}; +use core::intrinsics::transmute_unchecked as transmute; use std::fmt::{Debug, Display, Formatter, Result, Write}; /// Outputs [Iterm2 Inline image protocol](https://iterm2.com/documentation-images.html) encoded data. @@ -14,7 +15,7 @@ impl<T: AsRef<[u8]>, const N: usize> std::ops::Deref for Iterm2<T, N> { impl<T: AsRef<[u8]>, const N: usize> Display for Iterm2<T, N> where - Image<T, N>: WritePng, + [(); N]: Basic, { fn fmt(&self, f: &mut Formatter<'_>) -> Result { self.write(f) @@ -23,7 +24,7 @@ where impl<T: AsRef<[u8]>, const N: usize> Debug for Iterm2<T, N> where - Image<T, N>: WritePng, + [(); N]: Basic, { fn fmt(&self, f: &mut Formatter<'_>) -> Result { self.write(f) @@ -32,12 +33,28 @@ where impl<T: AsRef<[u8]>, const N: usize> Iterm2<T, N> where - Image<T, N>: WritePng, + [(); N]: Basic, { /// Write out kitty gfx data. pub fn write(&self, to: &mut impl Write) -> Result { let mut d = Vec::with_capacity(1024); - WritePng::write(&**self, &mut d).unwrap(); + macro_rules! n { + ($n:literal) => { + WritePng::write( + // SAFETY: ... i renounce traits + &unsafe { transmute::<Image<&[u8], N>, Image<&[u8], $n>>(self.as_ref()) }, + &mut d, + ) + .unwrap() + }; + } + match N { + 1 => n![1], + 2 => n![2], + 3 => n![3], + 4 => n![4], + _ => unreachable!(), + } let mut e = Vec::with_capacity(b64::size(&d)); b64::encode(&d, &mut e).unwrap(); writeln!( |