From 3e1245260d6a270e98c2c96fe90109004201b1ae Mon Sep 17 00:00:00 2001 From: Adam Gausmann Date: Fri, 31 Oct 2025 12:33:45 -0500 Subject: [PATCH] Replace tga with bmp for code size reduction Saved almost 100K just because the TGA parsing code was getting duplicated for each draw target. Compression may still be helpful later but it needs to reuse/share the decompression code and not duplicate it extra times. --- Cargo.lock | 25 ++++------------------ firmware/Cargo.toml | 2 +- firmware/src/art.rs | 40 +++++++++++++++++++++++++++++------ firmware/src/assets/eye1.bmp | Bin 0 -> 1098 bytes firmware/src/assets/eye1.tga | Bin 220 -> 0 bytes firmware/src/assets/hal.bmp | Bin 0 -> 1098 bytes firmware/src/assets/hal.tga | Bin 269 -> 0 bytes 7 files changed, 38 insertions(+), 29 deletions(-) create mode 100644 firmware/src/assets/eye1.bmp delete mode 100644 firmware/src/assets/eye1.tga create mode 100644 firmware/src/assets/hal.bmp delete mode 100644 firmware/src/assets/hal.tga diff --git a/Cargo.lock b/Cargo.lock index 2fbb89e..ceb8588 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -768,7 +768,7 @@ dependencies = [ "mipidsi", "rgb", "smart-leds", - "tinytga", + "tinybmp", ] [[package]] @@ -810,12 +810,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3c8dda44ff03a2f238717214da50f65d5a53b45cd213a7370424ffdb6fae815" -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "mipidsi" version = "0.9.0" @@ -849,16 +843,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "num-traits" version = "0.2.19" @@ -1280,13 +1264,12 @@ dependencies = [ ] [[package]] -name = "tinytga" -version = "0.5.0" +name = "tinybmp" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "477839bd612acb4d0551915eaf6eef8cc1b3a9dd58e18e9c2b746c78614a25d5" +checksum = "df43af2cb7b369009aa14144959bb4f2720ab62034c9073242f2d3a186c2edb6" dependencies = [ "embedded-graphics", - "nom", ] [[package]] diff --git a/firmware/Cargo.toml b/firmware/Cargo.toml index b857b6b..d5440b1 100644 --- a/firmware/Cargo.toml +++ b/firmware/Cargo.toml @@ -47,6 +47,6 @@ embedded-hal-bus = "0.3.0" embassy-futures = "0.1.2" heapless = "0.8.0" rgb = "0.8.52" -tinytga = "0.5.0" smart-leds = "0.4.0" fixed = "1.29.0" +tinybmp = "0.6.0" diff --git a/firmware/src/art.rs b/firmware/src/art.rs index 7b5238c..563a8fa 100644 --- a/firmware/src/art.rs +++ b/firmware/src/art.rs @@ -1,17 +1,16 @@ use embassy_time::Duration; -use embedded_graphics::{image::Image, pixelcolor::Rgb888, prelude::*, primitives::Rectangle}; -use fixed::types::U0F8; +use embedded_graphics::{pixelcolor::Rgb888, prelude::*, primitives::Rectangle}; use smart_leds::hsv::{Hsv, hsv2rgb}; -use tinytga::Tga; +use tinybmp::Bmp; pub struct Hal { - image_data: Tga<'static, Rgb888>, + image_data: Bmp<'static, Rgb888>, } impl Hal { pub fn new() -> Self { Self { - image_data: Tga::from_slice(include_bytes!("assets/hal.tga")).unwrap(), + image_data: Bmp::from_slice(include_bytes!("assets/hal.bmp")).unwrap(), } } } @@ -29,13 +28,13 @@ impl Drawable for Hal { } pub struct HappyEyes { - image_data: Tga<'static, Rgb888>, + image_data: Bmp<'static, Rgb888>, } impl HappyEyes { pub fn new() -> Self { Self { - image_data: Tga::from_slice(include_bytes!("assets/eye1.tga")).unwrap(), + image_data: Bmp::from_slice(include_bytes!("assets/eye1.bmp")).unwrap(), } } } @@ -123,6 +122,33 @@ impl<'a, D: Dimensions> Dimensions for RainbowFilter<'a, D> { } } +pub struct ColorMapFilter<'a, D> { + pub inner_target: &'a mut D, + pub filter: fn(Rgb888) -> Rgb888, +} + +impl<'a, D: DrawTarget> DrawTarget for ColorMapFilter<'a, D> { + type Color = D::Color; + type Error = D::Error; + + fn draw_iter(&mut self, pixels: I) -> Result<(), Self::Error> + where + I: IntoIterator>, + { + self.inner_target.draw_iter( + pixels + .into_iter() + .map(|Pixel(point, color)| Pixel(point, (self.filter)(color))), + ) + } +} + +impl<'a, D: Dimensions> Dimensions for ColorMapFilter<'a, D> { + fn bounding_box(&self) -> Rectangle { + self.inner_target.bounding_box() + } +} + fn mix_u8(a: u8, b: u8) -> u8 { (a as u16 * b as u16 / 255) as u8 } diff --git a/firmware/src/assets/eye1.bmp b/firmware/src/assets/eye1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b28005d9aae6bee47313ac385fdceda5b68e975d GIT binary patch literal 1098 zcmZ?r^9Y%mKuV3=%++f#Co%1A{O(1cL>@#D4|`2mTKi zh*L&D)qf;FKq+o%pc%L&sV@Vuj?R`sya5R<{9ZzK7&0487qS#G8%-JU_5xKx%pt}! fxMHlE)89`w!p+miRgVDxmF`qK diff --git a/firmware/src/assets/hal.bmp b/firmware/src/assets/hal.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dafa851ef5698659743edd27a37f0da855974a02 GIT binary patch literal 1098 zcmZ?r^9Y%mKuV3=%++f#Co%1A{O(1cL>@#D4|`2mTKi zh*L&TRWk#_UIwn63=FOWl~PZ^P6n(04BlX50t^SB8|VOc69~CCBcRbm z(|Q@t2AjCTAMlp0j|+GhM+i