From bee2883e1015327e0d1f4b04b502dede4ca9a3d6 Mon Sep 17 00:00:00 2001 From: rhetenor Date: Sat, 26 Sep 2026 19:41:08 +0200 Subject: [PATCH] sprite: add parameters to pass start position and render target size --- src/display/sprite.rs | 35 ++++++++++++++++++++--------------- src/views/card_view.rs | 8 +++++++- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/display/sprite.rs b/src/display/sprite.rs index b5dec5b..b089c8c 100644 --- a/src/display/sprite.rs +++ b/src/display/sprite.rs @@ -4,26 +4,31 @@ use embedded_graphics::{ }; use embedded_graphics_core::draw_target::DrawTarget; -pub fn render_sprite_onto_ili9341(ili9341: &mut D, sprite: &[u8], palette: &Palette) -where +pub fn render_sprite_onto_ili9341( + ili9341: &mut D, + sprite: &[u8], + palette: &Palette, + start_pos: Point, + size: usize, +) where D: DrawTarget, { + log::info!("rendering sprite..."); let pixel_count = sprite.len() * 2; if pixel_count == 0 { return; } - let mut src_width = 1usize; - while src_width * src_width < pixel_count { - src_width += 1; - } + let src_size = pixel_count.isqrt(); - let target_width = 240usize; - let scale = core::cmp::max(1, target_width / src_width); + log::debug!("pixel count: {pixel_count}"); + log::debug!("src size: {src_size}"); + let scale = size as f64 / src_size as f64; - for y in 0..src_width { - for x in 0..src_width { - let pixel_index = y * src_width + x; + log::debug!("scale: {scale}"); + for y in 0..src_size { + for x in 0..src_size { + let pixel_index = y * src_size + x; if pixel_index >= pixel_count { break; } @@ -39,10 +44,10 @@ where let color = palette[color_index as usize]; - let start_x = (x * scale) as i32; - let start_y = (y * scale) as i32; - let end_x = core::cmp::min(start_x + scale as i32, target_width as i32); - let end_y = core::cmp::min(start_y + scale as i32, target_width as i32); + let start_x = start_pos.x + (x as f64 * scale) as i32; + let start_y = start_pos.y + (y as f64 * scale) as i32; + let end_x = start_x + scale as i32 + 1; + let end_y = start_y + scale as i32 + 1; let width = u32::try_from(end_x - start_x).unwrap(); let height = u32::try_from(end_y - start_y).unwrap(); diff --git a/src/views/card_view.rs b/src/views/card_view.rs index d67ff56..9eb71b9 100644 --- a/src/views/card_view.rs +++ b/src/views/card_view.rs @@ -104,7 +104,13 @@ impl Navigable for CardView { .map_err(PrimaryDisplayError::from)?; let palette: Palette = self.card.cardtype.clone().into(); - render_sprite_onto_ili9341(display, self.card.sprite.data.as_slice(), &palette); + render_sprite_onto_ili9341( + display, + self.card.sprite.data.as_slice(), + &palette, + Point::new(13, 10), + 215, + ); Ok(()) } }