fast image operations
Diffstat (limited to 'src/term/kitty.rs')
-rw-r--r--src/term/kitty.rs105
1 files changed, 0 insertions, 105 deletions
diff --git a/src/term/kitty.rs b/src/term/kitty.rs
deleted file mode 100644
index cb692b4..0000000
--- a/src/term/kitty.rs
+++ /dev/null
@@ -1,105 +0,0 @@
-use super::{b64, Basic};
-use crate::Image;
-use std::borrow::Cow;
-use std::fmt::{Debug, Display, Formatter, Result, Write};
-
-/// Outputs [Kitty Graphics Protocol](https://sw.kovidgoyal.net/kitty/graphics-protocol) encoded data.
-pub struct Kitty<T: AsRef<[u8]>, const N: usize>(pub Image<T, N>);
-
-impl<T: AsRef<[u8]>, const N: usize> std::ops::Deref for Kitty<T, N> {
- type Target = Image<T, N>;
-
- fn deref(&self) -> &Self::Target {
- &self.0
- }
-}
-
-impl<T: AsRef<[u8]>, const N: usize> Display for Kitty<T, N>
-where
- [(); N]: Basic,
-{
- fn fmt(&self, f: &mut Formatter<'_>) -> Result {
- self.write(f)
- }
-}
-
-impl<T: AsRef<[u8]>, const N: usize> Debug for Kitty<T, N>
-where
- [(); N]: Basic,
-{
- fn fmt(&self, f: &mut Formatter<'_>) -> Result {
- self.write(f)
- }
-}
-
-impl<T: AsRef<[u8]>, const N: usize> Kitty<T, N> {
- /// Write out kitty gfx data.
- pub fn write(&self, to: &mut impl Write) -> Result
- where
- [(); N]: Basic,
- {
- macro_rules! cast {
- ($n:literal) => {
- (
- Cow::Owned(
- <Image<Box<[u8]>, 3>>::from({
- // SAFETY: ...
- unsafe { self.as_ref().trans::<$n>() }
- })
- .take_buffer()
- .to_vec(),
- ),
- "24",
- )
- };
- }
- let (bytes, dtype) = {
- match N {
- 1 => cast!(1),
- 2 => cast!(2),
- 3 => (Cow::from(self.bytes()), "24"),
- 4 => (Cow::from(self.bytes()), "32"),
- _ => unreachable!(),
- }
- };
- let (w, h) = (self.width(), self.height());
-
- let enc = b64::encode(&bytes);
- let mut chunks = enc
- .as_bytes()
- .chunks(4096)
- // SAFETY: b64
- .map(|x| unsafe { std::str::from_utf8_unchecked(x) });
-
- let last = chunks.len();
- const H: &str = "_G";
- const MORE: &str = "m";
-
- const DISPLAY: char = 'T';
- const ACTION: char = 'a';
- const DATATYPE: char = 'f';
- const TYPE: char = 't';
- const DIRECT: char = 'd';
-
- const E: &str = r"\";
-
- let payload = chunks.next().unwrap();
- let more = (last > 1) as u8;
- write!(to, "{H}{DATATYPE}={dtype},{ACTION}={DISPLAY},{TYPE}={DIRECT},s={w},v={h},{MORE}={more};{payload}{E}")?;
-
- for (payload, i) in chunks.zip(2..) {
- let more = (i != last) as u8;
- write!(to, "{H}{MORE}={more};{payload}{E}")?;
- }
- Ok(())
- }
-}
-
-#[test]
-fn test() {
- let x = Image::<_, 3>::open("tdata/cat.png");
- use std::hash::Hasher;
- let mut h = std::hash::DefaultHasher::new();
- h.write(Kitty(x).to_string().as_bytes());
- assert_eq!(h.finish(), 0x1cc13114bcf3cc3);
-}