1 /**
2 * @file lv_font.h
3 *
4 */
5
6 #ifndef LV_FONT_H
7 #define LV_FONT_H
8
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12
13 /*********************
14 * INCLUDES
15 *********************/
16 #include "../lv_conf_internal.h"
17 #include <stdint.h>
18 #include <stddef.h>
19 #include <stdbool.h>
20
21 #include "lv_symbol_def.h"
22 #include "../misc/lv_area.h"
23
24 /*********************
25 * DEFINES
26 *********************/
27
28 /* imgfont identifier */
29 #define LV_IMGFONT_BPP 9
30
31 /**********************
32 * TYPEDEFS
33 **********************/
34
35 /*------------------
36 * General types
37 *-----------------*/
38
39 struct _lv_font_t;
40 /** Describes the properties of a glyph.*/
41 typedef struct {
42 const struct _lv_font_t *
43 resolved_font; /**< Pointer to a font where the glyph was actually found after handling fallbacks*/
44 uint16_t adv_w; /**< The glyph needs this space. Draw the next glyph after this width.*/
45 uint16_t box_w; /**< Width of the glyph's bounding box*/
46 uint16_t box_h; /**< Height of the glyph's bounding box*/
47 int16_t ofs_x; /**< x offset of the bounding box*/
48 int16_t ofs_y; /**< y offset of the bounding box*/
49 uint8_t bpp: 4; /**< Bit-per-pixel: 1, 2, 4, 8*/
50 uint8_t is_placeholder: 1; /** Glyph is missing. But placeholder will still be displayed */
51 } lv_font_glyph_dsc_t;
52
53 /** The bitmaps might be upscaled by 3 to achieve subpixel rendering.*/
54 enum {
55 LV_FONT_SUBPX_NONE,
56 LV_FONT_SUBPX_HOR,
57 LV_FONT_SUBPX_VER,
58 LV_FONT_SUBPX_BOTH,
59 };
60
61 typedef uint8_t lv_font_subpx_t;
62
63 /** Describe the properties of a font*/
64 typedef struct _lv_font_t {
65 /** Get a glyph's descriptor from a font*/
66 bool (*get_glyph_dsc)(const struct _lv_font_t *, lv_font_glyph_dsc_t *, uint32_t letter, uint32_t letter_next);
67
68 /** Get a glyph's bitmap from a font*/
69 const uint8_t * (*get_glyph_bitmap)(const struct _lv_font_t *, uint32_t);
70
71 /*Pointer to the font in a font pack (must have the same line height)*/
72 lv_coord_t line_height; /**< The real line height where any text fits*/
73 lv_coord_t base_line; /**< Base line measured from the top of the line_height*/
74 uint8_t subpx : 2; /**< An element of `lv_font_subpx_t`*/
75
76 int8_t underline_position; /**< Distance between the top of the underline and base line (< 0 means below the base line)*/
77 int8_t underline_thickness; /**< Thickness of the underline*/
78
79 const void * dsc; /**< Store implementation specific or run_time data or caching here*/
80 const struct _lv_font_t * fallback; /**< Fallback font for missing glyph. Resolved recursively */
81 #if LV_USE_USER_DATA
82 void * user_data; /**< Custom user data for font.*/
83 #endif
84 } lv_font_t;
85
86 /**********************
87 * GLOBAL PROTOTYPES
88 **********************/
89
90 /**
91 * Return with the bitmap of a font.
92 * @param font_p pointer to a font
93 * @param letter a UNICODE character code
94 * @return pointer to the bitmap of the letter
95 */
96 const uint8_t * lv_font_get_glyph_bitmap(const lv_font_t * font_p, uint32_t letter);
97
98 /**
99 * Get the descriptor of a glyph
100 * @param font_p pointer to font
101 * @param dsc_out store the result descriptor here
102 * @param letter a UNICODE letter code
103 * @param letter_next the next letter after `letter`. Used for kerning
104 * @return true: descriptor is successfully loaded into `dsc_out`.
105 * false: the letter was not found, no data is loaded to `dsc_out`
106 */
107 bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_out, uint32_t letter,
108 uint32_t letter_next);
109
110 /**
111 * Get the width of a glyph with kerning
112 * @param font pointer to a font
113 * @param letter a UNICODE letter
114 * @param letter_next the next letter after `letter`. Used for kerning
115 * @return the width of the glyph
116 */
117 uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32_t letter_next);
118
119 /**
120 * Get the line height of a font. All characters fit into this height
121 * @param font_p pointer to a font
122 * @return the height of a font
123 */
lv_font_get_line_height(const lv_font_t * font_p)124 static inline lv_coord_t lv_font_get_line_height(const lv_font_t * font_p)
125 {
126 return font_p->line_height;
127 }
128
129 /**********************
130 * MACROS
131 **********************/
132
133 #define LV_FONT_DECLARE(font_name) extern const lv_font_t font_name;
134
135 #if LV_FONT_MONTSERRAT_8
136 LV_FONT_DECLARE(lv_font_montserrat_8)
137 #endif
138
139 #if LV_FONT_MONTSERRAT_10
LV_FONT_DECLARE(lv_font_montserrat_10)140 LV_FONT_DECLARE(lv_font_montserrat_10)
141 #endif
142
143 #if LV_FONT_MONTSERRAT_12
144 LV_FONT_DECLARE(lv_font_montserrat_12)
145 #endif
146
147 #if LV_FONT_MONTSERRAT_14
148 LV_FONT_DECLARE(lv_font_montserrat_14)
149 #endif
150
151 #if LV_FONT_MONTSERRAT_16
152 LV_FONT_DECLARE(lv_font_montserrat_16)
153 #endif
154
155 #if LV_FONT_MONTSERRAT_18
156 LV_FONT_DECLARE(lv_font_montserrat_18)
157 #endif
158
159 #if LV_FONT_MONTSERRAT_20
160 LV_FONT_DECLARE(lv_font_montserrat_20)
161 #endif
162
163 #if LV_FONT_MONTSERRAT_22
164 LV_FONT_DECLARE(lv_font_montserrat_22)
165 #endif
166
167 #if LV_FONT_MONTSERRAT_24
168 LV_FONT_DECLARE(lv_font_montserrat_24)
169 #endif
170
171 #if LV_FONT_MONTSERRAT_26
172 LV_FONT_DECLARE(lv_font_montserrat_26)
173 #endif
174
175 #if LV_FONT_MONTSERRAT_28
176 LV_FONT_DECLARE(lv_font_montserrat_28)
177 #endif
178
179 #if LV_FONT_MONTSERRAT_30
180 LV_FONT_DECLARE(lv_font_montserrat_30)
181 #endif
182
183 #if LV_FONT_MONTSERRAT_32
184 LV_FONT_DECLARE(lv_font_montserrat_32)
185 #endif
186
187 #if LV_FONT_MONTSERRAT_34
188 LV_FONT_DECLARE(lv_font_montserrat_34)
189 #endif
190
191 #if LV_FONT_MONTSERRAT_36
192 LV_FONT_DECLARE(lv_font_montserrat_36)
193 #endif
194
195 #if LV_FONT_MONTSERRAT_38
196 LV_FONT_DECLARE(lv_font_montserrat_38)
197 #endif
198
199 #if LV_FONT_MONTSERRAT_40
200 LV_FONT_DECLARE(lv_font_montserrat_40)
201 #endif
202
203 #if LV_FONT_MONTSERRAT_42
204 LV_FONT_DECLARE(lv_font_montserrat_42)
205 #endif
206
207 #if LV_FONT_MONTSERRAT_44
208 LV_FONT_DECLARE(lv_font_montserrat_44)
209 #endif
210
211 #if LV_FONT_MONTSERRAT_46
212 LV_FONT_DECLARE(lv_font_montserrat_46)
213 #endif
214
215 #if LV_FONT_MONTSERRAT_48
216 LV_FONT_DECLARE(lv_font_montserrat_48)
217 #endif
218
219 #if LV_FONT_MONTSERRAT_12_SUBPX
220 LV_FONT_DECLARE(lv_font_montserrat_12_subpx)
221 #endif
222
223 #if LV_FONT_MONTSERRAT_28_COMPRESSED
224 LV_FONT_DECLARE(lv_font_montserrat_28_compressed)
225 #endif
226
227 #if LV_FONT_DEJAVU_16_PERSIAN_HEBREW
228 LV_FONT_DECLARE(lv_font_dejavu_16_persian_hebrew)
229 #endif
230
231 #if LV_FONT_SIMSUN_16_CJK
232 LV_FONT_DECLARE(lv_font_simsun_16_cjk)
233 #endif
234
235 #if LV_FONT_UNSCII_8
236 LV_FONT_DECLARE(lv_font_unscii_8)
237 #endif
238
239 #if LV_FONT_UNSCII_16
240 LV_FONT_DECLARE(lv_font_unscii_16)
241 #endif
242
243 /*Declare the custom (user defined) fonts*/
244 #ifdef LV_FONT_CUSTOM_DECLARE
245 LV_FONT_CUSTOM_DECLARE
246 #endif
247
248 /**
249 * Just a wrapper around LV_FONT_DEFAULT because it might be more convenient to use a function in some cases
250 * @return pointer to LV_FONT_DEFAULT
251 */
252 static inline const lv_font_t * lv_font_default(void)
253 {
254 return LV_FONT_DEFAULT;
255 }
256
257 #ifdef __cplusplus
258 } /*extern "C"*/
259 #endif
260
261 #endif /*USE_FONT*/
262