diff --git a/CHANGELOG.md b/CHANGELOG.md index ccb25ac3..7578db3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased ] +### Added +- Clear command for anime `asusctl anime --clear` will clear the display +### Changed +- Make rog-anime more error tolerent. Remove various asserts and return errors instead +- Return error if a pixel-gif is larger than the anime-display dimensions + ## [4.2.1] - 2022-07-18 ### Added - Add panel overdrive support (autodetects if supported) diff --git a/asusctl/src/anime_cli.rs b/asusctl/src/anime_cli.rs index 928d1586..63968052 100644 --- a/asusctl/src/anime_cli.rs +++ b/asusctl/src/anime_cli.rs @@ -16,6 +16,8 @@ pub struct AnimeCommand { pub boot_enable: Option, #[options(meta = "", help = "set global AniMe brightness value")] pub brightness: Option, + #[options(help = "clear the display")] + pub clear: bool, #[options(command)] pub command: Option, } diff --git a/asusctl/src/main.rs b/asusctl/src/main.rs index 78715cda..dcccc417 100644 --- a/asusctl/src/main.rs +++ b/asusctl/src/main.rs @@ -230,6 +230,13 @@ fn handle_anime( verify_brightness(bright); dbus.proxies().anime().set_brightness(bright)? } + if cmd.clear { + let anime_type = get_anime_type()?; + let data = vec![0u8; anime_type.data_length()]; + let tmp = AnimeDataBuffer::from_vec(anime_type, data)?; + dbus.proxies().anime().write(tmp)?; + } + if let Some(action) = cmd.command.as_ref() { let anime_type = get_anime_type()?; match action { diff --git a/rog-anime/src/error.rs b/rog-anime/src/error.rs index dadf790f..08c77bd9 100644 --- a/rog-anime/src/error.rs +++ b/rog-anime/src/error.rs @@ -20,6 +20,8 @@ pub enum AnimeError { UnsupportedDevice, InvalidBrightness(f32), DataBufferLength, + PixelGifWidth(usize), + PixelGifHeight(usize), } impl fmt::Display for AnimeError { @@ -49,6 +51,13 @@ impl fmt::Display for AnimeError { "Image brightness must be between 0.0 and 1.0 (inclusive), was {}", bright ), + AnimeError::PixelGifWidth(n) => { + write!(f, "The gif used for pixel-perfect gif is is wider than {n}") + } + AnimeError::PixelGifHeight(n) => write!( + f, + "The gif used for pixel-perfect gif is is taller than {n}" + ), } } } diff --git a/rog-anime/src/gif.rs b/rog-anime/src/gif.rs index 03793d5c..28059320 100644 --- a/rog-anime/src/gif.rs +++ b/rog-anime/src/gif.rs @@ -3,6 +3,7 @@ use serde_derive::{Deserialize, Serialize}; use std::convert::TryFrom; use std::{fs::File, path::Path, time::Duration}; +use crate::error::AnimeError; use crate::{error::Result, AnimeDataBuffer, AnimeDiagonal, AnimeImage, AnimeType, Pixel}; #[derive(Debug, Clone, Deserialize, Serialize)] @@ -117,8 +118,17 @@ impl AnimeGif { // 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] as f32 * brightness) as u8; + let tmp = matrix.get_mut(); + let y = y + frame.top as usize; + if y >= tmp.len() { + return Err(AnimeError::PixelGifHeight(tmp.len())); + } + let x = x + frame.left as usize; + if x >= tmp[y].len() { + return Err(AnimeError::PixelGifWidth(tmp[y].len())); + } + + matrix.get_mut()[y][x] = (px[0] as f32 * brightness) as u8; } }