From 3a827cfde72ab58f2a6f2e5ab82d365556ab4483 Mon Sep 17 00:00:00 2001 From: Sofia Date: Sat, 13 Sep 2025 15:00:42 +0300 Subject: [PATCH] Add simple text rendering --- src/font.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- src/main.rs | 11 +++++++++-- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/font.rs b/src/font.rs index 41130b3..f4c44d5 100644 --- a/src/font.rs +++ b/src/font.rs @@ -78,7 +78,7 @@ fn letter(character: char) -> [u8; 8] { ], 'r' => [ 0b11111111, 0b10000001, 0b10000001, 0b11111111, 0b11111100, 0b10000010, 0b10000001, - 0b00000001, + 0b10000001, ], 's' => [ 0b01111111, 0b10000000, 0b10000000, 0b01111110, 0b00000001, 0b00000001, 0b00000001, @@ -112,10 +112,55 @@ fn letter(character: char) -> [u8; 8] { 0b11111111, 0b00000111, 0b00001100, 0b00011000, 0b00110000, 0b01100000, 0b11000000, 0b11111111, ], + '!' => [ + 0b01000000, 0b01000000, 0b01000000, 0b01000000, 0b01000000, 0b01000000, 0b00000000, + 0b01000000, + ], + ',' => [ + 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b01000000, + 0b10000000, + ], _ => [0; 8], } } +pub fn draw_text( + display: &mut Display, + text: &str, + fg: Rgb565, + bg: Rgb565, + position: Vec2, + scale: u16, +) { + let mut curr_pos = position; + + let kerning = 9 * scale; + let original_x = position.x; + + for c in text.chars() { + if c == '\n' { + curr_pos.y += kerning; + continue; + } + if c == ' ' { + curr_pos.x += kerning; + continue; + } + if curr_pos.x + kerning > 240 { + curr_pos.x = original_x; + curr_pos.y += kerning; + } + if curr_pos.y + kerning > 240 { + curr_pos.y = 0; + } + + Letter::from(c, fg, bg) + .iter() + .draw(display, curr_pos, scale); + curr_pos.x += kerning; + } +} + pub struct Letter { base: [u8; 8], pub fg: Rgb565, @@ -160,7 +205,7 @@ impl<'a> Iterator for LetterIter<'a> { fn next(&mut self) -> Option { let byte_idx = self.idx / 8; - let bit_idx = self.idx % 8; + let bit_idx = 7 - (self.idx % 8); if byte_idx >= 8 { None } else { diff --git a/src/main.rs b/src/main.rs index 9758871..24929c5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,7 +19,7 @@ use panic_halt as _; use crate::{ display::{Display, Rgb565, Vec2}, - font::Letter, + font::{Letter, draw_text}, graphics::{Image, LARGE_CAT_UNSAFE, PRESS_BTN_UNSAFE, draw_image}, peripherals::Button, }; @@ -94,7 +94,14 @@ fn main() -> ! { let letter = Letter::from('h', Rgb565::white(), Rgb565::black()); - letter.iter().draw(&mut display, Vec2 { x: 10, y: 10 }, 4); + draw_text( + &mut display, + "hello there!", + Rgb565::white(), + Rgb565::red(), + Vec2 { x: 10, y: 10 }, + 3, + ); loop { if button.poll() {