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