1 #include "mf_scaledfont.h"
2
3 struct scaled_renderstate
4 {
5 mf_pixel_callback_t orig_callback;
6 void *orig_state;
7 uint8_t x_scale;
8 uint8_t y_scale;
9 int16_t x0;
10 int16_t y0;
11 };
12
scaled_pixel_callback(int16_t x,int16_t y,uint8_t count,uint8_t alpha,void * state)13 static void scaled_pixel_callback(int16_t x, int16_t y, uint8_t count,
14 uint8_t alpha, void *state)
15 {
16 struct scaled_renderstate *rstate = state;
17 uint8_t dy;
18
19 count *= rstate->x_scale;
20 x = rstate->x0 + x * rstate->x_scale;
21 y = rstate->y0 + y * rstate->y_scale;
22
23 for (dy = 0; dy < rstate->y_scale; dy++)
24 {
25 rstate->orig_callback(x, y + dy, count, alpha, rstate->orig_state);
26 }
27 }
28
scaled_character_width(const struct mf_font_s * font,mf_char character)29 static uint8_t scaled_character_width(const struct mf_font_s *font,
30 mf_char character)
31 {
32 struct mf_scaledfont_s *sfont = (struct mf_scaledfont_s*)font;
33 uint8_t basewidth;
34
35 basewidth = sfont->basefont->character_width(sfont->basefont, character);
36
37 return sfont->x_scale * basewidth;
38 }
39
scaled_render_character(const struct mf_font_s * font,int16_t x0,int16_t y0,mf_char character,mf_pixel_callback_t callback,void * state)40 static uint8_t scaled_render_character(const struct mf_font_s *font,
41 int16_t x0, int16_t y0,
42 mf_char character,
43 mf_pixel_callback_t callback,
44 void *state)
45 {
46 struct mf_scaledfont_s *sfont = (struct mf_scaledfont_s*)font;
47 struct scaled_renderstate rstate;
48 uint8_t basewidth;
49
50 rstate.orig_callback = callback;
51 rstate.orig_state = state;
52 rstate.x_scale = sfont->x_scale;
53 rstate.y_scale = sfont->y_scale;
54 rstate.x0 = x0;
55 rstate.y0 = y0;
56
57 basewidth = sfont->basefont->render_character(sfont->basefont, 0, 0,
58 character, scaled_pixel_callback, &rstate);
59
60 return sfont->x_scale * basewidth;
61 }
62
mf_scale_font(struct mf_scaledfont_s * newfont,const struct mf_font_s * basefont,uint8_t x_scale,uint8_t y_scale)63 void mf_scale_font(struct mf_scaledfont_s *newfont,
64 const struct mf_font_s *basefont,
65 uint8_t x_scale, uint8_t y_scale)
66 {
67 newfont->font = *basefont;
68 newfont->basefont = basefont;
69
70 newfont->font.width *= x_scale;
71 newfont->font.height *= y_scale;
72 newfont->font.baseline_x *= x_scale;
73 newfont->font.baseline_y *= y_scale;
74 newfont->font.min_x_advance *= x_scale;
75 newfont->font.max_x_advance *= x_scale;
76 newfont->font.line_height *= y_scale;
77 newfont->font.character_width = &scaled_character_width;
78 newfont->font.render_character = &scaled_render_character;
79
80 newfont->x_scale = x_scale;
81 newfont->y_scale = y_scale;
82 }
83
84