1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
use crate::rendering::{MovePositionRenderer, Renderer};
use crate::{
Result, FONT_ASCII_LOWERCASE, FONT_ASCII_UPPERCASE, FONT_HEIGHT,
FONT_QUESTIONMARK, FONT_WIDTH,
};
use sdl2::rect::Point;
fn render_letter(renderer: &mut dyn Renderer, letter: char) -> Result<()> {
let tilenr = match letter {
c if (' '..='Z').contains(&c) => {
c as usize - ' ' as usize + FONT_ASCII_UPPERCASE
}
c if ('a'..='z').contains(&c) => {
c as usize - 'a' as usize + FONT_ASCII_LOWERCASE
}
_ => FONT_QUESTIONMARK,
} as usize;
renderer.place_tile(tilenr, Point::new(0, 0))
}
pub fn render(renderer: &mut dyn Renderer, text: &str) -> Result<()> {
let mut offset_x = 0;
let mut offset_y = 0;
for c in text.chars() {
if c == '\n' {
offset_x = 0;
offset_y += FONT_HEIGHT as i32;
} else {
let mut renderer = MovePositionRenderer {
offset_x,
offset_y,
upstream: renderer,
};
render_letter(&mut renderer, c)?;
offset_x += FONT_WIDTH as i32;
}
}
Ok(())
}