sprite: add parameters to pass start position and render target size

This commit is contained in:
2026-09-26 19:41:08 +02:00
parent ab7b9401a5
commit bee2883e10
2 changed files with 27 additions and 16 deletions
+20 -15
View File
@@ -4,26 +4,31 @@ use embedded_graphics::{
}; };
use embedded_graphics_core::draw_target::DrawTarget; use embedded_graphics_core::draw_target::DrawTarget;
pub fn render_sprite_onto_ili9341<D>(ili9341: &mut D, sprite: &[u8], palette: &Palette) pub fn render_sprite_onto_ili9341<D>(
where ili9341: &mut D,
sprite: &[u8],
palette: &Palette,
start_pos: Point,
size: usize,
) where
D: DrawTarget<Color = Rgb565>, D: DrawTarget<Color = Rgb565>,
{ {
log::info!("rendering sprite...");
let pixel_count = sprite.len() * 2; let pixel_count = sprite.len() * 2;
if pixel_count == 0 { if pixel_count == 0 {
return; return;
} }
let mut src_width = 1usize; let src_size = pixel_count.isqrt();
while src_width * src_width < pixel_count {
src_width += 1;
}
let target_width = 240usize; log::debug!("pixel count: {pixel_count}");
let scale = core::cmp::max(1, target_width / src_width); log::debug!("src size: {src_size}");
let scale = size as f64 / src_size as f64;
for y in 0..src_width { log::debug!("scale: {scale}");
for x in 0..src_width { for y in 0..src_size {
let pixel_index = y * src_width + x; for x in 0..src_size {
let pixel_index = y * src_size + x;
if pixel_index >= pixel_count { if pixel_index >= pixel_count {
break; break;
} }
@@ -39,10 +44,10 @@ where
let color = palette[color_index as usize]; let color = palette[color_index as usize];
let start_x = (x * scale) as i32; let start_x = start_pos.x + (x as f64 * scale) as i32;
let start_y = (y * scale) as i32; let start_y = start_pos.y + (y as f64 * scale) as i32;
let end_x = core::cmp::min(start_x + scale as i32, target_width as i32); let end_x = start_x + scale as i32 + 1;
let end_y = core::cmp::min(start_y + scale as i32, target_width as i32); let end_y = start_y + scale as i32 + 1;
let width = u32::try_from(end_x - start_x).unwrap(); let width = u32::try_from(end_x - start_x).unwrap();
let height = u32::try_from(end_y - start_y).unwrap(); let height = u32::try_from(end_y - start_y).unwrap();
+7 -1
View File
@@ -104,7 +104,13 @@ impl Navigable for CardView {
.map_err(PrimaryDisplayError::from)?; .map_err(PrimaryDisplayError::from)?;
let palette: Palette = self.card.cardtype.clone().into(); 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(()) Ok(())
} }
} }