From 6d746b21a541ff5aec88743f28d496bd8c8b84b4 Mon Sep 17 00:00:00 2001 From: Luke D Jones Date: Mon, 5 Apr 2021 17:12:00 +1200 Subject: [PATCH] Anime gifs --- Cargo.lock | 30 +++-- README.md | 5 + asusctl/Cargo.toml | 3 +- asusctl/examples/animatrix-diag-png.rs | 41 +++++++ asusctl/examples/animatrix-diag.rs | 33 ++++++ asusctl/examples/animatrix-gif.rs | 60 ++++++++++ asusctl/examples/animatrix-png.rs | 2 +- asusctl/examples/controller.gif | Bin 0 -> 33167 bytes asusctl/examples/controller.png | Bin 0 -> 9033 bytes asusctl/examples/diag_sq.png | Bin 0 -> 9033 bytes asusctl/examples/levelup.png | Bin 0 -> 9613 bytes asusctl/examples/sunset.gif | Bin 0 -> 40406 bytes rog-anime/Cargo.toml | 1 - rog-anime/src/anime_diagonal.rs | 145 +++++++++++++++++++++++++ rog-anime/src/anime_grid.rs | 59 +++++----- 15 files changed, 339 insertions(+), 40 deletions(-) create mode 100644 asusctl/examples/animatrix-diag-png.rs create mode 100644 asusctl/examples/animatrix-diag.rs create mode 100644 asusctl/examples/animatrix-gif.rs create mode 100644 asusctl/examples/controller.gif create mode 100644 asusctl/examples/controller.png create mode 100644 asusctl/examples/diag_sq.png create mode 100644 asusctl/examples/levelup.png create mode 100644 asusctl/examples/sunset.gif create mode 100644 rog-anime/src/anime_diagonal.rs diff --git a/Cargo.lock b/Cargo.lock index db0ac285..d3d1290c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,6 +43,7 @@ name = "asusctl" version = "3.3.1" dependencies = [ "daemon", + "gif", "glam", "gumdrop", "rog_anime", @@ -177,6 +178,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "concurrent-queue" version = "1.2.2" @@ -440,6 +447,16 @@ dependencies = [ "wasi 0.10.2+wasi-snapshot-preview1", ] +[[package]] +name = "gif" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a668f699973d0f573d15749b7002a9ac9e1f9c6b220e7b165601334c173d8de" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "glam" version = "0.13.1" @@ -735,12 +752,6 @@ version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" -[[package]] -name = "owo-colors" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2fe43bf372b08cc9ccee5144715db59c79ab00168bbe4cf0d274dc0d5f64d7f" - [[package]] name = "parking" version = "2.0.0" @@ -948,7 +959,6 @@ name = "rog_anime" version = "1.0.0" dependencies = [ "glam", - "owo-colors", "pix", "png_pong", "serde", @@ -1307,6 +1317,12 @@ version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" +[[package]] +name = "weezl" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a32b378380f4e9869b22f0b5177c68a5519f03b3454fde0b291455ddbae266c" + [[package]] name = "wepoll-sys" version = "3.0.1" diff --git a/README.md b/README.md index fd3f2e3c..9f363dce 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,11 @@ will probably suffer another rename once it becomes generic enough to do so. - `nvidia`, uses the Nvidia gpu only - `vfio`, binds the Nvidia gpu to vfio for VM pass-through +**Rebootless note:** You must edit `/etc/default/grub` to remove `nvidia-drm.modeset=1` +from the line `GRUB_CMDLINE_LINUX=` and then recreate your grub config. In fedora +you can do this with `sudo grub2-mkconfig -o /etc/grub2.cfg` - other distro may be +similar but with a different config location. + This can be disabled in the config with `"manage_gfx": false,`. Additionally there is an extra setting for laptops capable of g-sync dedicated gfx mode to enable the graphics switching to switch on dedicated gfx for "nvidia" mode. diff --git a/asusctl/Cargo.toml b/asusctl/Cargo.toml index 5145ddfe..b3141b49 100644 --- a/asusctl/Cargo.toml +++ b/asusctl/Cargo.toml @@ -19,4 +19,5 @@ yansi-term = "^0.1" [dev-dependencies] tinybmp = "^0.2.3" glam = "*" -rog_dbus = { path = "../rog-dbus" } \ No newline at end of file +rog_dbus = { path = "../rog-dbus" } +gif = "^0.11.2" \ No newline at end of file diff --git a/asusctl/examples/animatrix-diag-png.rs b/asusctl/examples/animatrix-diag-png.rs new file mode 100644 index 00000000..40a9e7b3 --- /dev/null +++ b/asusctl/examples/animatrix-diag-png.rs @@ -0,0 +1,41 @@ +use std::{env, error::Error, path::Path, process::exit}; + +use rog_anime::{ + AniMeDataBuffer, {AniMeDiagonal, Vec2}, +}; +use rog_dbus::AuraDbusClient; + +fn main() -> Result<(), Box> { + let (client, _) = AuraDbusClient::new().unwrap(); + + let args: Vec = env::args().into_iter().collect(); + if args.len() != 7 { + println!( + "Usage: " + ); + println!("e.g, asusctl/examples/doom_large.png 0.9 0.9 0.4 0.0 0.0 0.8"); + println!("All args except path and fineness are floats"); + exit(-1); + } + + let matrix = AniMeDiagonal::from_png( + Path::new(&args[1]), + Vec2::new( + args[2].parse::().unwrap(), + args[3].parse::().unwrap(), + ), + Vec2::new( + args[4].parse::().unwrap(), + args[5].parse::().unwrap(), + ), + args[6].parse::().unwrap(), + )?; + + client + .proxies() + .anime() + .write(::from(&matrix)) + .unwrap(); + + Ok(()) +} diff --git a/asusctl/examples/animatrix-diag.rs b/asusctl/examples/animatrix-diag.rs new file mode 100644 index 00000000..7bb9d126 --- /dev/null +++ b/asusctl/examples/animatrix-diag.rs @@ -0,0 +1,33 @@ +use std::{thread::sleep, time::Duration}; + +use rog_anime::{AniMeDataBuffer, AniMeDiagonal}; +use rog_dbus::AuraDbusClient; + +// In usable data: +// Top row start at 1, ends at 32 + +// 74w x 36h diagonal used by the windows app + +fn main() { + let (client, _) = AuraDbusClient::new().unwrap(); + + + for step in (2..50).rev() { + let mut matrix = AniMeDiagonal::new(); + for c in (0..60).into_iter().step_by(step) { + for i in matrix.get_mut().iter_mut() { + i[c] = 50; + } + } + + for c in (0..35).into_iter().step_by(step) { + for i in matrix.get_mut()[c].iter_mut() { + *i = 50; + } + } + + let m = ::from(&matrix); + client.proxies().anime().write(m).unwrap(); + sleep(Duration::from_millis(300)); + } +} diff --git a/asusctl/examples/animatrix-gif.rs b/asusctl/examples/animatrix-gif.rs new file mode 100644 index 00000000..8b7dd58e --- /dev/null +++ b/asusctl/examples/animatrix-gif.rs @@ -0,0 +1,60 @@ +use std::{env, fs::File, path::Path, thread::sleep, time::Duration}; + +use rog_anime::{AniMeDataBuffer, AniMeDiagonal}; +use rog_dbus::AuraDbusClient; + +struct AniMeFrame { + data: AniMeDataBuffer, + delay: Duration, +} + +fn main() { + let (client, _) = AuraDbusClient::new().unwrap(); + + let args: Vec = env::args().into_iter().collect(); + // if args.len() != 7 { + // exit(-1); + // } + + let mut frames = Vec::new(); + let mut matrix = AniMeDiagonal::new(); + + let mut decoder = gif::DecodeOptions::new(); + // Configure the decoder such that it will expand the image to RGBA. + decoder.set_color_output(gif::ColorOutput::RGBA); + // Read the file header + let file = File::open(Path::new(&args[1])).unwrap(); + let mut decoder = decoder.read_info(file).unwrap(); + + while let Some(frame) = decoder.read_next_frame().unwrap() { + let wait = frame.delay; + for (y, row) in frame.buffer.chunks(frame.width as usize * 4).enumerate() { + for (x, px) in row.chunks(4).enumerate() { + if px[3] != 255 { + // should be t but not in some gifs? What, ASUS, what? + continue; + } + matrix.get_mut()[y + frame.top as usize][x + frame.left as usize] = px[0]; + } + } + client + .proxies() + .anime() + .write(::from(&matrix)) + .unwrap(); + + frames.push(AniMeFrame { + data: ::from(&matrix), + delay: Duration::from_millis(wait as u64), + }); + + sleep(Duration::from_millis(wait as u64)); + } + + loop { + for frame in frames.iter() { + client.proxies().anime().write(frame.data.clone()).unwrap(); + sleep(frame.delay); + } + } +} diff --git a/asusctl/examples/animatrix-png.rs b/asusctl/examples/animatrix-png.rs index dc6619a3..a3560ebd 100644 --- a/asusctl/examples/animatrix-png.rs +++ b/asusctl/examples/animatrix-png.rs @@ -11,7 +11,7 @@ fn main() -> Result<(), Box> { let args: Vec = env::args().into_iter().collect(); if args.len() != 8 { println!( - "Usage: " + "Usage: " ); println!("e.g, asusctl/examples/doom_large.png 0.9 0.9 0.4 0.0 0.0, 0.8"); println!("All args except path and fineness are floats"); diff --git a/asusctl/examples/controller.gif b/asusctl/examples/controller.gif new file mode 100644 index 0000000000000000000000000000000000000000..ace761cdbd9d48e9a738741fdb80c7362daa8eb4 GIT binary patch literal 33167 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 literal 0 HcmV?d00001 diff --git a/asusctl/examples/diag_sq.png b/asusctl/examples/diag_sq.png new file mode 100644 index 0000000000000000000000000000000000000000..36e29a15a62e32c38fed5f8a68e3a3890e458dec GIT binary patch literal 9033 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 literal 0 HcmV?d00001 diff --git a/asusctl/examples/levelup.png b/asusctl/examples/levelup.png new file mode 100644 index 0000000000000000000000000000000000000000..b7a8d333db4910a7b388eb07335e43c476fe4706 GIT binary patch literal 9613 zcmeHrXH=70yKSga1f(gTXef%(5<*SrgkA*%1cDHf&_hBJNB~6<6p$*SfYK49NK>kS zQlv={RHTS>q!$rI1n~y++uQHneZO<|80Y-k86#z_HJ|yccdq%YH}8r#YpTb_BESLw z0N4!lwJoUMhSawx6Fv1aR1Dn<0C24YoI6jlK$3xY0?x(V3j-wi<1s)C#oYw}pbXF4 zwY|er&v|XEf(4|RY1`RHi6M{AY}eZM_kIt-HU!DCku2f4JU&zG;v-vaV

1pIJnX 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 literal 0 HcmV?d00001 diff --git a/asusctl/examples/sunset.gif b/asusctl/examples/sunset.gif new file mode 100644 index 0000000000000000000000000000000000000000..f114859c249e13b8dd6a6766086b75526b7dd897 GIT binary patch literal 40406 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%0D-AtiAj^m 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 ipWz0M;lD7Dn1M~fL2e~B`1KgbfBcU{|9}6r#Qy Self { + Self::new() + } +} + +impl AniMeDiagonal { + pub fn new() -> Self { + Self([[0u8; WIDTH]; HEIGHT]) + } + + pub fn get_mut(&mut self) -> &mut [[u8; WIDTH]; HEIGHT] { + &mut self.0 + } + + // use with height - y + const fn dy(x: usize, y: usize) -> usize { + x / 2 + x % 2 + y + } + + fn get_row(&self, x: usize, y: usize, len: usize) -> Vec { + let mut buf = Vec::with_capacity(len); + for i in 0..len { + let val = self.0[HEIGHT - y - i - 1][x + i]; + buf.push(val); + } + buf + } + + /// Generate the base image from inputs. The result can be displayed as is or + /// updated via scale, position, or angle then displayed again after `update()`. + pub fn from_png( + path: &Path, + scale: Vec2, + offset: Vec2, + bright: f32, + ) -> Result { + use pix::el::Pixel; + let data = std::fs::read(path)?; + let data = std::io::Cursor::new(data); + let decoder = png_pong::Decoder::new(data)?.into_steps(); + let png_pong::Step { raster, delay: _ } = decoder.last().ok_or(AnimeError::NoFrames)??; + + let mut matrix = AniMeDiagonal::new(); + + let width; + match raster { + png_pong::PngRaster::Graya8(ras) => { + width = ras.width(); + for (y, row) in ras.pixels() + .chunks(width as usize).enumerate() { + for (x, px) in row.iter().enumerate() { + let v = ::from(px.one() * bright); + matrix.0[y][x] = v; + } + } + } + _ => return Err(AnimeError::Format), + }; + + Ok(matrix) + } +} + +impl From<&AniMeDiagonal> for AniMeDataBuffer { + /// Do conversion from the nested Vec in AniMeMatrix to the two required + /// packets suitable for sending over USB + #[inline] + fn from(anime: &AniMeDiagonal) -> Self { + let mut buf = vec![0u8; ANIME_DATA_LEN]; + + buf[1..=33].copy_from_slice(&anime.get_row(2, 3, 33)); + buf[34..=66].copy_from_slice(&anime.get_row(2, 2, 33)); + buf[68..=100].copy_from_slice(&anime.get_row(2, 1, 33)); + buf[101..=134].copy_from_slice(&anime.get_row(2, 0, 34)); + buf[136..=169].copy_from_slice(&anime.get_row(3, 0, 34)); + buf[170..=202].copy_from_slice(&anime.get_row(4, 0, 33)); + buf[204..=236].copy_from_slice(&anime.get_row(5, 0, 33)); + buf[237..=268].copy_from_slice(&anime.get_row(6, 0, 32)); + buf[270..=301].copy_from_slice(&anime.get_row(7, 0, 32)); + buf[302..=332].copy_from_slice(&anime.get_row(8, 0, 31)); + buf[334..=364].copy_from_slice(&anime.get_row(9, 0, 31)); + buf[365..=394].copy_from_slice(&anime.get_row(10, 0, 30)); + buf[396..=425].copy_from_slice(&anime.get_row(11, 0, 30)); + buf[426..=454].copy_from_slice(&anime.get_row(12, 0, 29)); + buf[456..=484].copy_from_slice(&anime.get_row(13, 0, 29)); + buf[485..=512].copy_from_slice(&anime.get_row(14, 0, 28)); + buf[514..=541].copy_from_slice(&anime.get_row(15, 0, 28)); + buf[542..=568].copy_from_slice(&anime.get_row(16, 0, 27)); + buf[570..=596].copy_from_slice(&anime.get_row(17, 0, 27)); + buf[597..=622].copy_from_slice(&anime.get_row(18, 0, 26)); + buf[624..=649].copy_from_slice(&anime.get_row(19, 0, 26)); + buf[650..=674].copy_from_slice(&anime.get_row(20, 0, 25)); + buf[676..=700].copy_from_slice(&anime.get_row(21, 0, 25)); + buf[701..=724].copy_from_slice(&anime.get_row(22, 0, 24)); + buf[726..=749].copy_from_slice(&anime.get_row(23, 0, 24)); + buf[750..=772].copy_from_slice(&anime.get_row(24, 0, 23)); + buf[774..=796].copy_from_slice(&anime.get_row(25, 0, 23)); + buf[797..=818].copy_from_slice(&anime.get_row(26, 0, 22)); + buf[820..=841].copy_from_slice(&anime.get_row(27, 0, 22)); + buf[842..=862].copy_from_slice(&anime.get_row(28, 0, 21)); + buf[864..=884].copy_from_slice(&anime.get_row(29, 0, 21)); + buf[885..=904].copy_from_slice(&anime.get_row(30, 0, 20)); + buf[906..=925].copy_from_slice(&anime.get_row(31, 0, 20)); + buf[926..=944].copy_from_slice(&anime.get_row(32, 0, 19)); + buf[946..=964].copy_from_slice(&anime.get_row(33, 0, 19)); + buf[965..=982].copy_from_slice(&anime.get_row(34, 0, 18)); + buf[984..=1001].copy_from_slice(&anime.get_row(35, 0, 18)); + buf[1002..=1018].copy_from_slice(&anime.get_row(36, 0, 17)); + buf[1020..=1036].copy_from_slice(&anime.get_row(37, 0, 17)); + buf[1037..=1052].copy_from_slice(&anime.get_row(38, 0, 16)); + buf[1054..=1069].copy_from_slice(&anime.get_row(39, 0, 16)); + buf[1070..=1084].copy_from_slice(&anime.get_row(40, 0, 15)); + buf[1086..=1100].copy_from_slice(&anime.get_row(41, 0, 15)); + buf[1101..=1114].copy_from_slice(&anime.get_row(42, 0, 14)); + buf[1116..=1129].copy_from_slice(&anime.get_row(43, 0, 14)); + buf[1130..=1142].copy_from_slice(&anime.get_row(44, 0, 13)); + buf[1144..=1156].copy_from_slice(&anime.get_row(45, 0, 13)); + buf[1157..=1168].copy_from_slice(&anime.get_row(46, 0, 12)); + buf[1170..=1181].copy_from_slice(&anime.get_row(47, 0, 12)); + buf[1182..=1192].copy_from_slice(&anime.get_row(48, 0, 11)); + buf[1194..=1204].copy_from_slice(&anime.get_row(49, 0, 11)); + buf[1205..=1214].copy_from_slice(&anime.get_row(50, 0, 10)); + buf[1216..=1225].copy_from_slice(&anime.get_row(51, 0, 10)); + buf[1226..=1234].copy_from_slice(&anime.get_row(52, 0, 9)); + buf[1236..=1244].copy_from_slice(&anime.get_row(53, 0, 9)); + + AniMeDataBuffer::from_vec(buf) + } +} diff --git a/rog-anime/src/anime_grid.rs b/rog-anime/src/anime_grid.rs index 0d0d319a..253f6406 100644 --- a/rog-anime/src/anime_grid.rs +++ b/rog-anime/src/anime_grid.rs @@ -1,6 +1,5 @@ use crate::anime_data::{AniMeDataBuffer, ANIME_DATA_LEN}; use crate::anime_image::LED_IMAGE_POSITIONS; -use owo_colors::{OwoColorize, Rgb}; const WIDTH: usize = 33; const HEIGHT: usize = 55; @@ -44,38 +43,38 @@ impl AniMeGrid { } } - pub fn debug_print(&self) { - // this is the index from right. It is used to progressively shorten rows - let mut prog_row_len = WIDTH - 2; + // pub fn debug_print(&self) { + // // this is the index from right. It is used to progressively shorten rows + // let mut prog_row_len = WIDTH - 2; - for (count, row) in self.0.iter().enumerate() { - // Switch to next block (looks like ) - if count % 2 != 0 { - // Row after 6 is only 1 less, then rows after 7 follow pattern - if count == 7 { - prog_row_len -= 1; - } else { - prog_row_len -= 2; - } - } else { - prog_row_len += 1; // if count 6, 0 - } + // for (count, row) in self.0.iter().enumerate() { + // // Switch to next block (looks like ) + // if count % 2 != 0 { + // // Row after 6 is only 1 less, then rows after 7 follow pattern + // if count == 7 { + // prog_row_len -= 1; + // } else { + // prog_row_len -= 2; + // } + // } else { + // prog_row_len += 1; // if count 6, 0 + // } - let index = row.len() - prog_row_len; + // let index = row.len() - prog_row_len; - if count % 2 == 0 { - print!(" "); - } - for (i, n) in row.iter().enumerate() { - if i >= index { - print!(" {}", "XXX".color(Rgb(0, *n, 0))); - } else { - print!(" "); - } - } - println!(); - } - } + // if count % 2 == 0 { + // print!(" "); + // } + // for (i, n) in row.iter().enumerate() { + // if i >= index { + // print!(" {}", "XXX".color(Rgb(0, *n, 0))); + // } else { + // print!(" "); + // } + // } + // println!(); + // } + // } } impl From for AniMeDataBuffer {