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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/**
* @file lv_font.c
*
*/
/*********************
* INCLUDES
*********************/
#include "lv_font.h"
#include "../misc/lv_text.h"
#include "../misc/lv_utils.h"
#include "../misc/lv_log.h"
#include "../misc/lv_assert.h"
#include "../stdlib/lv_string.h"
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
/**********************
* STATIC VARIABLES
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
const void * lv_font_get_glyph_bitmap(lv_font_glyph_dsc_t * g_dsc, uint32_t letter,
lv_draw_buf_t * draw_buf)
{
const lv_font_t * font_p = g_dsc->resolved_font;
LV_ASSERT_NULL(font_p);
return font_p->get_glyph_bitmap(g_dsc, letter, draw_buf);
}
bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_out, uint32_t letter,
uint32_t letter_next)
{
LV_ASSERT_NULL(font_p);
LV_ASSERT_NULL(dsc_out);
#if LV_USE_FONT_PLACEHOLDER
const lv_font_t * placeholder_font = NULL;
#endif
const lv_font_t * f = font_p;
dsc_out->resolved_font = NULL;
while(f) {
bool found = f->get_glyph_dsc(f, dsc_out, letter, f->kerning == LV_FONT_KERNING_NONE ? 0 : letter_next);
if(found) {
if(!dsc_out->is_placeholder) {
dsc_out->resolved_font = f;
return true;
}
#if LV_USE_FONT_PLACEHOLDER
else if(placeholder_font == NULL) {
placeholder_font = f;
}
#endif
}
f = f->fallback;
}
#if LV_USE_FONT_PLACEHOLDER
if(placeholder_font != NULL) {
placeholder_font->get_glyph_dsc(placeholder_font, dsc_out, letter,
placeholder_font->kerning == LV_FONT_KERNING_NONE ? 0 : letter_next);
dsc_out->resolved_font = placeholder_font;
return true;
}
#endif
#if LV_USE_FONT_PLACEHOLDER
dsc_out->box_w = font_p->line_height / 2;
dsc_out->adv_w = dsc_out->box_w + 2;
#else
dsc_out->box_w = 0;
dsc_out->adv_w = 0;
#endif
dsc_out->resolved_font = NULL;
dsc_out->box_h = font_p->line_height;
dsc_out->ofs_x = 0;
dsc_out->ofs_y = 0;
dsc_out->format = LV_FONT_GLYPH_FORMAT_A1;
dsc_out->is_placeholder = true;
return false;
}
uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32_t letter_next)
{
LV_ASSERT_NULL(font);
lv_font_glyph_dsc_t g;
/*Return zero if letter is marker*/
if(_lv_text_is_marker(letter)) return 0;
lv_font_get_glyph_dsc(font, &g, letter, letter_next);
return g.adv_w;
}
void lv_font_set_kerning(lv_font_t * font, lv_font_kerning_t kerning)
{
LV_ASSERT_NULL(font);
font->kerning = kerning;
}
/**********************
* STATIC FUNCTIONS
**********************/
|