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
44
45
46
47
48
49
50
use blit::{Color, BlitBuffer};
#[derive(Debug, Copy, Clone)]
pub struct FontSettings {
pub start: char,
pub char_size: (usize, usize),
pub leading_offset: i32,
pub mask_color: Color
}
#[derive(Debug)]
pub struct Font {
buffer: BlitBuffer,
settings: FontSettings
}
impl Font {
pub fn new(buffer: BlitBuffer, settings: FontSettings) -> Self {
Font { buffer, settings }
}
pub fn draw_char(&self, buffer: &mut Vec<u32>, buffer_width: usize, ch: char, pos: (i32, i32)) {
let offset = ch as u8 - self.settings.start as u8;
let rect = (offset as i32 * self.settings.char_size.0 as i32, 0,
self.settings.char_size.0 as i32, self.settings.char_size.1 as i32);
self.buffer.blit_rect(buffer, buffer_width, pos, rect);
}
pub fn draw_string(&self, buffer: &mut Vec<u32>, buffer_width: usize, string: &String, pos: (i32, i32)) {
let chars = string.chars();
let mut new_pos = pos;
for ch in chars.into_iter() {
match ch {
' ' => {
new_pos.0 += self.settings.char_size.0 as i32;
},
'\n' => {
new_pos.0 = pos.0;
new_pos.1 += self.settings.char_size.1 as i32 + self.settings.leading_offset;
},
ch => {
self.draw_char(buffer, buffer_width, ch, new_pos);
new_pos.0 += self.settings.char_size.0 as i32;
}
}
}
}
}