fast image operations
Diffstat (limited to 'src/term/iterm2.rs')
| -rw-r--r-- | src/term/iterm2.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/term/iterm2.rs b/src/term/iterm2.rs new file mode 100644 index 0000000..b6a9663 --- /dev/null +++ b/src/term/iterm2.rs @@ -0,0 +1,61 @@ +use super::b64; +use crate::{Image, WritePng}; +use std::fmt::{Debug, Display, Formatter, Result, Write}; + +/// Outputs [Iterm2 Inline image protocol](https://iterm2.com/documentation-images.html) encoded data. +pub struct Iterm2<T: AsRef<[u8]>, const N: usize>(pub Image<T, N>); +impl<T: AsRef<[u8]>, const N: usize> std::ops::Deref for Iterm2<T, N> { + type Target = Image<T, N>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl<T: AsRef<[u8]>, const N: usize> Display for Iterm2<T, N> +where + Image<T, N>: WritePng, +{ + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + self.write(f) + } +} + +impl<T: AsRef<[u8]>, const N: usize> Debug for Iterm2<T, N> +where + Image<T, N>: WritePng, +{ + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + self.write(f) + } +} + +impl<T: AsRef<[u8]>, const N: usize> Iterm2<T, N> +where + Image<T, N>: WritePng, +{ + /// 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(); + let mut e = Vec::with_capacity(b64::size(&d)); + b64::encode(&d, &mut e).unwrap(); + writeln!( + to, + "]1337;File=inline=1;preserveAspectRatio=1;size={}:{}", + d.len(), + // SAFETY: b64 + unsafe { std::str::from_utf8_unchecked(&e) } + )?; + Ok(()) + } +} + +#[test] +fn test() { + let x = Image::<_, 3>::open("tdata/small_cat.png"); + use std::hash::Hasher; + let mut h = std::hash::DefaultHasher::new(); + h.write(Iterm2(x).to_string().as_bytes()); + assert_eq!(h.finish(), 0x32e81fb3cea8336f); +} |