Zahlenrendern für Prototyp.
[hackover2013-badge-firmware.git] / badge / ui / font.c
1 #include "font.h"
2 #include "sprite.h"
3
4 #include <drivers/fatfs/ff.h>
5
6 static uint8_t badge_framebuffer_render_char_with_fd(badge_framebuffer *fb, int8_t pos_x, int8_t pos_y, char c, FIL *fd) {
7 UINT readbytes;
8 uint8_t buffer[BADGE_FONT_WIDTH];
9
10 if(c == 32) {
11 // intentionally left empty.
12 } else if(c >= 32 &&
13 FR_OK == f_lseek(fd, (c - 33) * BADGE_FONT_WIDTH) &&
14 FR_OK == f_read(fd, buffer, sizeof(buffer), &readbytes)) {
15 badge_sprite sp = { BADGE_FONT_WIDTH, BADGE_FONT_HEIGHT, buffer };
16 badge_framebuffer_blt(fb, pos_x, pos_y, &sp, 0);
17 } else {
18 return -1;
19 }
20
21 return 0;
22 }
23
24 static FRESULT open_font_file(FIL *fd) {
25 return f_open(fd, "font.dat", FA_OPEN_EXISTING | FA_READ);
26 }
27
28 uint8_t badge_framebuffer_render_char(badge_framebuffer *fb, int8_t pos_x, int8_t pos_y, char c) {
29 FIL fd;
30
31 if(FR_OK == open_font_file(&fd)) {
32 badge_framebuffer_render_char_with_fd(fb, pos_x, pos_y, c, &fd);
33 f_close(&fd);
34 return 0;
35 }
36
37 return -1;
38 }
39
40 uint8_t badge_framebuffer_render_text(badge_framebuffer *fb, int8_t pos_x, int8_t pos_y, char const *text) {
41 uint8_t count = 0;
42 FIL fd;
43
44 if(FR_OK == open_font_file(&fd)) {
45 while(*text) {
46 if(0 != badge_framebuffer_render_char_with_fd(fb, pos_x, pos_y, *text, &fd)) {
47 break;
48 }
49
50 ++count;
51 ++text;
52 pos_x += BADGE_FONT_WIDTH;
53 }
54
55 f_close(&fd);
56 }
57
58 return count;
59 }
60
61 static uint8_t badge_framebuffer_render_number_with_fd(badge_framebuffer *fb, int8_t *pos_x, int8_t pos_y, uint8_t number, FIL *fd) {
62 if(number > 10) {
63 badge_framebuffer_render_number_with_fd(fb, pos_x, pos_y, number / 10, fd);
64 }
65
66 uint8_t err = badge_framebuffer_render_char_with_fd(fb, *pos_x, pos_y, '0' + number % 10, fd);
67
68 if(err != 0) return err;
69
70 *pos_x += BADGE_FONT_WIDTH;
71 return 0;
72 }
73
74 uint8_t badge_framebuffer_render_number(badge_framebuffer *fb, int8_t pos_x, int8_t pos_y, uint8_t number) {
75 FIL fd;
76
77 if(FR_OK == open_font_file(&fd)) {
78 uint8_t err = badge_framebuffer_render_number_with_fd(fb, &pos_x, pos_y, number, &fd);
79
80 if(err != 0) {
81 return err;
82 }
83 }
84
85 return 0;
86 }
This page took 0.056835 seconds and 5 git commands to generate.