diff --git a/CHANGELOG.md b/CHANGELOG.md index 85372c769..0947a95b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,14 @@ # Changelog ## v7.4.0 (planned on 01.09.2020) -*Available in the `dev` branch* + +### New features +- arc: add set value by click feature +- arc: add `LV_ARC_PART_KNOB` similarly to slider +- send gestures even is the the obejct was dragged. User can check dragging with `lv_indev_is_dragging(lv_indev_act())` in the event function. +- Add `lv_font_load()` function - Loads a `lv_font_t` object from a binary font file +- Add `lv_font_free()` function - Frees the memory allocated by the `lv_font_load()` function +- Add style caching to reduce acces time of properties with default value ## v7.3.1 (18.08.2020) @@ -16,6 +23,7 @@ - Fix crash if `lv_table_set_col_cnt` is called before `lv_table_set_row_cnt` for the first time - Fix overflow in large image transformations - Limit extra button click area of button matrix's buttons. With large paddings it was counter intuitive. (Gaps are mapped to button when clicked). +- Fix `lv_btnmatrix_set_one_check` not forcing exactly one button to be checked - Fix color picker invalidation in rectangle mode - Init disabled days to gray color in calendar @@ -26,10 +34,9 @@ - Add `lv_event_send_refresh`, `lv_event_send_refresh_recursive` to easily send `LV_EVENT_REFRESH` to object - Add `lv_tabview_set_tab_name()` function - used to change a tab's name - Add `LV_THEME_MATERIAL_FLAG_NO_TRANSITION` and `LV_THEME_MATERIAL_FLAG_NO_FOCUS` flags -- Reduce code size by adding: `LV_USE_FONT_COMPRESSED`, `LV_FONT_USE_SUBPX`, `LV_USE_OUTLINE`, `LV_USE_PATTERN`, `LV_USE_VALUE_STR` and applying some optimization +- Reduce code size by adding: `LV_USE_FONT_COMPRESSED` and `LV_FONT_USE_SUBPX` and applying some optimization - Add `LV_MEMCPY_MEMSET_STD` to use standard `memcpy` and `memset` - ### Bugfixes - Do not print warning for missing glyph if its height OR width is zero. - Prevent duplicated sending of `LV_EVENT_INSERT` from text area diff --git a/a.patch b/a.patch new file mode 100644 index 000000000..9616d7c22 --- /dev/null +++ b/a.patch @@ -0,0 +1,29 @@ +diff --git a/scripts/release.py b/scripts/release.py +index 28370c66..bc5234e7 100755 +--- a/scripts/release.py ++++ b/scripts/release.py +@@ -395,12 +395,12 @@ def docs_update_dev_version(): + os.chdir("../") + + +-def publish_dev(): ++def publish_dev_and_master(): + pub_cmd = "git checkout dev; git push origin dev" + cmd("cd lvgl; " + pub_cmd) ++ pub_cmd = "git checkout master; git push origin master" ++ cmd("cd lvgl; " + pub_cmd) + +- pub_cmd = "git checkout dev; git push origin dev" +- cmd("cd docs; " + pub_cmd) + cmd("cd docs; git checkout master; ./update.py latest dev") + + def cleanup(): +@@ -463,7 +463,7 @@ if __name__ == '__main__': + + lvgl_update_dev_version() + docs_update_dev_version() +- publish_dev() ++ publish_dev_and_master() + + cleanup() + diff --git a/lv_conf_template.h b/lv_conf_template.h index e93be3b9d..6faeafad3 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -1,6 +1,6 @@ /** * @file lv_conf.h - * Configuration file for v7.3.1 + * Configuration file for v7.6.0-dev-dev */ /* @@ -687,6 +687,9 @@ typedef void * lv_obj_user_data_t; # define LV_ROLLER_INF_PAGES 7 #endif +/*Rotary (dependencies: lv_arc, lv_btn)*/ +#define LV_USE_ROTARY 1 + /*Slider (dependencies: lv_bar)*/ #define LV_USE_SLIDER 1 diff --git a/lvgl.h b/lvgl.h index e7437e188..0cc2f8fae 100644 --- a/lvgl.h +++ b/lvgl.h @@ -40,6 +40,7 @@ extern "C" { #include "src/lv_themes/lv_theme.h" #include "src/lv_font/lv_font.h" +#include "src/lv_font/lv_font_loader.h" #include "src/lv_font/lv_font_fmt_txt.h" #include "src/lv_misc/lv_printf.h" @@ -81,6 +82,18 @@ extern "C" { #include "src/lv_api_map.h" +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + /********************** * MACROS **********************/ diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index d43134241..8a031535f 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -1047,6 +1047,10 @@ e.g. "stm32f769xx.h" or "stm32f429xx.h" */ #endif #endif +/*Rotary (dependencies: lv_arc, lv_btn)*/ +#ifndef LV_USE_ROTARY +#define LV_USE_ROTARY 1 +#endif /*Slider (dependencies: lv_bar)*/ #ifndef LV_USE_SLIDER #define LV_USE_SLIDER 1 diff --git a/src/lv_core/lv_disp.h b/src/lv_core/lv_disp.h index a0757accf..888a0c093 100644 --- a/src/lv_core/lv_disp.h +++ b/src/lv_core/lv_disp.h @@ -209,7 +209,7 @@ static inline void lv_scr_load(lv_obj_t * scr) * 1 dip is 2 px on a 320 DPI screen * https://stackoverflow.com/questions/2025282/what-is-the-difference-between-px-dip-dp-and-sp */ -#define LV_DPX(n) LV_MATH_MAX((( lv_disp_get_dpi(NULL) * (n) + 80) / 160), 1) /*+80 for rounding*/ +#define LV_DPX(n) (n == 0 ? 0 :LV_MATH_MAX((( lv_disp_get_dpi(NULL) * (n) + 80) / 160), 1)) /*+80 for rounding*/ static inline lv_coord_t lv_dpx(lv_coord_t n) { diff --git a/src/lv_core/lv_indev.c b/src/lv_core/lv_indev.c index 3b1d2b25c..f15852129 100644 --- a/src/lv_core/lv_indev.c +++ b/src/lv_core/lv_indev.c @@ -1490,7 +1490,6 @@ static lv_obj_t * get_dragged_obj(lv_obj_t * obj) static void indev_gesture(lv_indev_proc_t * proc) { - if(proc->types.pointer.drag_in_prog) return; if(proc->types.pointer.gesture_sent) return; lv_obj_t * gesture_obj = proc->types.pointer.act_obj; diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index 953da5ac5..3db3ae401 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -103,7 +103,9 @@ static void lv_event_mark_deleted(lv_obj_t * obj); static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find); static void lv_obj_del_async_cb(void * obj); static void obj_del_core(lv_obj_t * obj); - +static void update_style_cache(lv_obj_t * obj, uint8_t part, uint16_t prop); +static void update_style_cache_children(lv_obj_t * obj); +static void invalidate_style_cache(lv_obj_t * obj, uint8_t part, lv_style_property_t prop); /********************** * STATIC VARIABLES **********************/ @@ -503,43 +505,11 @@ void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area) { LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - if(lv_obj_get_hidden(obj)) return; + lv_area_t area_tmp; + lv_area_copy(&area_tmp, area); + bool visible = lv_obj_area_is_visible(obj, &area_tmp); - /*Invalidate the object only if it belongs to the curent or previous'*/ - lv_obj_t * obj_scr = lv_obj_get_screen(obj); - lv_disp_t * disp = lv_obj_get_disp(obj_scr); - if(obj_scr == lv_disp_get_scr_act(disp) || - obj_scr == lv_disp_get_scr_prev(disp) || - obj_scr == lv_disp_get_layer_top(disp) || - obj_scr == lv_disp_get_layer_sys(disp)) { - - /*Truncate the area to the object*/ - lv_area_t obj_coords; - lv_coord_t ext_size = obj->ext_draw_pad; - lv_area_copy(&obj_coords, &obj->coords); - obj_coords.x1 -= ext_size; - obj_coords.y1 -= ext_size; - obj_coords.x2 += ext_size; - obj_coords.y2 += ext_size; - - bool is_common; - lv_area_t area_trunc; - - is_common = _lv_area_intersect(&area_trunc, area, &obj_coords); - if(is_common == false) return; /*The area is not on the object*/ - - /*Truncate recursively to the parents*/ - lv_obj_t * par = lv_obj_get_parent(obj); - while(par != NULL) { - is_common = _lv_area_intersect(&area_trunc, &area_trunc, &par->coords); - if(is_common == false) break; /*If no common parts with parent break;*/ - if(lv_obj_get_hidden(par)) return; /*If the parent is hidden then the child is hidden and won't be drawn*/ - - par = lv_obj_get_parent(par); - } - - if(is_common) _lv_inv_area(disp, &area_trunc); - } + if(visible) _lv_inv_area(lv_obj_get_disp(obj), &area_tmp); } /** @@ -562,6 +532,74 @@ void lv_obj_invalidate(const lv_obj_t * obj) lv_obj_invalidate_area(obj, &obj_coords); } + +/** + * Tell whether an area of an object is visible (even partially) now or not + * @param obj pointer to an object + * @param area the are to check. The visible part of the area will be written back here. + * @return true: visible; false: not visible (hidden, out of parent, on other screen, etc) + */ +bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area) +{ + if(lv_obj_get_hidden(obj)) return false; + + /*Invalidate the object only if it belongs to the curent or previous'*/ + lv_obj_t * obj_scr = lv_obj_get_screen(obj); + lv_disp_t * disp = lv_obj_get_disp(obj_scr); + if(obj_scr == lv_disp_get_scr_act(disp) || + obj_scr == lv_disp_get_scr_prev(disp) || + obj_scr == lv_disp_get_layer_top(disp) || + obj_scr == lv_disp_get_layer_sys(disp)) { + + /*Truncate the area to the object*/ + lv_area_t obj_coords; + lv_coord_t ext_size = obj->ext_draw_pad; + lv_area_copy(&obj_coords, &obj->coords); + obj_coords.x1 -= ext_size; + obj_coords.y1 -= ext_size; + obj_coords.x2 += ext_size; + obj_coords.y2 += ext_size; + + bool is_common; + + is_common = _lv_area_intersect(area, area, &obj_coords); + if(is_common == false) return false; /*The area is not on the object*/ + + /*Truncate recursively to the parents*/ + lv_obj_t * par = lv_obj_get_parent(obj); + while(par != NULL) { + is_common = _lv_area_intersect(area, area, &par->coords); + if(is_common == false) return false; /*If no common parts with parent break;*/ + if(lv_obj_get_hidden(par)) return false; /*If the parent is hidden then the child is hidden and won't be drawn*/ + + par = lv_obj_get_parent(par); + } + } + + return true; +} + +/** + * Tell whether an object is visible (even partially) now or not + * @param obj pointer to an object + * @return true: visible; false: not visible (hidden, out of parent, on other screen, etc) + */ +bool lv_obj_is_visible(const lv_obj_t * obj) +{ + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + + lv_area_t obj_coords; + lv_coord_t ext_size = obj->ext_draw_pad; + lv_area_copy(&obj_coords, &obj->coords); + obj_coords.x1 -= ext_size; + obj_coords.y1 -= ext_size; + obj_coords.x2 += ext_size; + obj_coords.y2 += ext_size; + + return lv_obj_area_is_visible(obj, &obj_coords); + +} + /*===================== * Setter functions *====================*/ @@ -1120,7 +1158,7 @@ void lv_obj_add_style(lv_obj_t * obj, uint8_t part, lv_style_t * style) #if LV_USE_ANIMATION trans_del(obj, part, 0xFF, NULL); #endif - lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(obj, part, LV_STYLE_PROP_ALL); } /** @@ -1144,7 +1182,7 @@ void lv_obj_remove_style(lv_obj_t * obj, uint8_t part, lv_style_t * style) #if LV_USE_ANIMATION trans_del(obj, part, 0xFF, NULL); #endif - lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(obj, part, LV_STYLE_PROP_ALL); } /** @@ -1181,7 +1219,7 @@ void lv_obj_reset_style_list(lv_obj_t * obj, uint8_t part) { lv_obj_clean_style_list(obj, part); - lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(obj, part, LV_STYLE_PROP_ALL); } /** @@ -1203,7 +1241,7 @@ void _lv_obj_set_style_local_int(lv_obj_t * obj, uint8_t part, lv_style_property #if LV_USE_ANIMATION trans_del(obj, part, prop, NULL); #endif - lv_obj_refresh_style(obj, prop & (~LV_STYLE_STATE_MASK)); + lv_obj_refresh_style(obj, part, prop & (~LV_STYLE_STATE_MASK)); } /** @@ -1225,7 +1263,7 @@ void _lv_obj_set_style_local_color(lv_obj_t * obj, uint8_t part, lv_style_proper #if LV_USE_ANIMATION trans_del(obj, part, prop, NULL); #endif - lv_obj_refresh_style(obj, prop & (~LV_STYLE_STATE_MASK)); + lv_obj_refresh_style(obj, part, prop & (~LV_STYLE_STATE_MASK)); } /** @@ -1247,7 +1285,7 @@ void _lv_obj_set_style_local_opa(lv_obj_t * obj, uint8_t part, lv_style_property #if LV_USE_ANIMATION trans_del(obj, part, prop, NULL); #endif - lv_obj_refresh_style(obj, prop & (~LV_STYLE_STATE_MASK)); + lv_obj_refresh_style(obj, part, prop & (~LV_STYLE_STATE_MASK)); } /** @@ -1269,7 +1307,7 @@ void _lv_obj_set_style_local_ptr(lv_obj_t * obj, uint8_t part, lv_style_property #if LV_USE_ANIMATION trans_del(obj, part, prop, NULL); #endif - lv_obj_refresh_style(obj, prop & (~LV_STYLE_STATE_MASK)); + lv_obj_refresh_style(obj, part, prop & (~LV_STYLE_STATE_MASK)); } /** @@ -1296,10 +1334,12 @@ bool lv_obj_remove_style_local_prop(lv_obj_t * obj, uint8_t part, lv_style_prope * @param obj pointer to an object * @param prop `LV_STYLE_PROP_ALL` or an `LV_STYLE_...` property. It is used to optimize what needs to be refreshed. */ -void lv_obj_refresh_style(lv_obj_t * obj, lv_style_property_t prop) +void lv_obj_refresh_style(lv_obj_t * obj, uint8_t part, lv_style_property_t prop) { LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + invalidate_style_cache(obj, part, prop); + /*If a real style refresh is required*/ bool real_refr = false; switch(prop) { @@ -1387,6 +1427,26 @@ void lv_obj_report_style_mod(lv_style_t * style) } } +/** + * Enable/disable the use of style cahche for an object + * @param obj pointer to an object + * @param dis true: disable; false: enable (re-enable) + */ +void _lv_obj_disable_style_caching(lv_obj_t * obj, bool dis) +{ + uint8_t part; + for(part = 0; part < _LV_OBJ_PART_REAL_FIRST; part++) { + lv_style_list_t * list = lv_obj_get_style_list(obj, part); + if(list == NULL) break; + list->ignore_cache = dis; + } + for(part = _LV_OBJ_PART_REAL_FIRST; part < 0xFF; part++) { + lv_style_list_t * list = lv_obj_get_style_list(obj, part); + if(list == NULL) break; + list->ignore_cache = dis; + } +} + /*----------------- * Attribute set *----------------*/ @@ -1609,7 +1669,7 @@ void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state) #if LV_USE_ANIMATION == 0 obj->state = new_state; - lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(obj, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); #else lv_state_t prev_state = obj->state; obj->state = new_state; @@ -1660,10 +1720,10 @@ void lv_obj_set_state(lv_obj_t * obj, lv_state_t new_state) } } + lv_obj_refresh_style(obj, part, LV_STYLE_PROP_ALL); } #endif - lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); } @@ -2449,12 +2509,74 @@ lv_style_int_t _lv_obj_get_style_int(const lv_obj_t * obj, uint8_t part, lv_styl lv_res_t res = LV_RES_INV; const lv_obj_t * parent = obj; while(parent) { - lv_style_list_t * dsc = lv_obj_get_style_list(parent, part); + lv_style_list_t * list = lv_obj_get_style_list(parent, part); + if(!list->ignore_cache && list->style_cnt > 0) { + if(!list->valid_cache) update_style_cache((lv_obj_t*)parent, part, prop & (~LV_STYLE_STATE_MASK)); + + bool def = false; + switch(prop & (~LV_STYLE_STATE_MASK)) { + case LV_STYLE_BG_GRAD_DIR: + if(list->bg_grad_dir_none) def = true; + break; + case LV_STYLE_CLIP_CORNER: + if(list->clip_corner_off) def = true; + break; + case LV_STYLE_TEXT_LETTER_SPACE: + case LV_STYLE_TEXT_LINE_SPACE: + if(list->text_space_zero) def = true; + break; + case LV_STYLE_TRANSFORM_ANGLE: + case LV_STYLE_TRANSFORM_WIDTH: + case LV_STYLE_TRANSFORM_HEIGHT: + case LV_STYLE_TRANSFORM_ZOOM: + if(list->transform_all_zero) def = true; + break; + case LV_STYLE_BORDER_WIDTH: + if(list->border_width_zero) def = true; + break; + case LV_STYLE_BORDER_SIDE: + if(list->border_side_full) def = true; + break; + case LV_STYLE_BORDER_POST: + if(list->border_post_off) def = true; + break; + case LV_STYLE_OUTLINE_WIDTH: + if(list->outline_width_zero) def = true; + break; + case LV_STYLE_RADIUS: + if(list->radius_zero) def = true; + break; + case LV_STYLE_SHADOW_WIDTH: + if(list->shadow_width_zero) def = true; + break; + case LV_STYLE_PAD_TOP: + case LV_STYLE_PAD_BOTTOM: + case LV_STYLE_PAD_LEFT: + case LV_STYLE_PAD_RIGHT: + if(list->pad_all_zero) def = true; + break; + case LV_STYLE_BG_BLEND_MODE: + case LV_STYLE_BORDER_BLEND_MODE: + case LV_STYLE_IMAGE_BLEND_MODE: + case LV_STYLE_LINE_BLEND_MODE: + case LV_STYLE_OUTLINE_BLEND_MODE: + case LV_STYLE_PATTERN_BLEND_MODE: + case LV_STYLE_SHADOW_BLEND_MODE: + case LV_STYLE_TEXT_BLEND_MODE: + case LV_STYLE_VALUE_BLEND_MODE: + if(list->blend_mode_all_normal) def = true; + break; + } + + if(def) { + break; + } + } lv_state_t state = lv_obj_get_state(parent, part); prop = (uint16_t)prop_ori + ((uint16_t)state << LV_STYLE_STATE_POS); - res = _lv_style_list_get_int(dsc, prop, &value_act); + res = _lv_style_list_get_int(list, prop, &value_act); if(res == LV_RES_OK) return value_act; if(LV_STYLE_ATTR_GET_INHERIT(attr) == 0) break; @@ -2512,12 +2634,12 @@ lv_color_t _lv_obj_get_style_color(const lv_obj_t * obj, uint8_t part, lv_style_ lv_res_t res = LV_RES_INV; const lv_obj_t * parent = obj; while(parent) { - lv_style_list_t * dsc = lv_obj_get_style_list(parent, part); + lv_style_list_t * list = lv_obj_get_style_list(parent, part); lv_state_t state = lv_obj_get_state(parent, part); prop = (uint16_t)prop_ori + ((uint16_t)state << LV_STYLE_STATE_POS); - res = _lv_style_list_get_color(dsc, prop, &value_act); + res = _lv_style_list_get_color(list, prop, &value_act); if(res == LV_RES_OK) return value_act; if(LV_STYLE_ATTR_GET_INHERIT(attr) == 0) break; @@ -2568,12 +2690,34 @@ lv_opa_t _lv_obj_get_style_opa(const lv_obj_t * obj, uint8_t part, lv_style_prop lv_res_t res = LV_RES_INV; const lv_obj_t * parent = obj; while(parent) { - lv_style_list_t * dsc = lv_obj_get_style_list(parent, part); + lv_style_list_t * list = lv_obj_get_style_list(parent, part); + + if(!list->ignore_cache && list->style_cnt > 0) { + if(!list->valid_cache) update_style_cache((lv_obj_t*)parent, part, prop & (~LV_STYLE_STATE_MASK)); + bool def = false; + switch(prop & (~LV_STYLE_STATE_MASK)) { + case LV_STYLE_OPA_SCALE: + if(list->opa_scale_cover) def = true; + break; + case LV_STYLE_BG_OPA: + if(list->bg_opa_cover) return LV_OPA_COVER; /*Special case, not the default value is used*/ + if(list->bg_opa_transp) def = true; + break; + case LV_STYLE_IMAGE_RECOLOR_OPA: + if(list->img_recolor_opa_transp) def = true; + break; + } + + if(def) { + break; + } + } + lv_state_t state = lv_obj_get_state(parent, part); prop = (uint16_t)prop_ori + ((uint16_t)state << LV_STYLE_STATE_POS); - res = _lv_style_list_get_opa(dsc, prop, &value_act); + res = _lv_style_list_get_opa(list, prop, &value_act); if(res == LV_RES_OK) return value_act; if(LV_STYLE_ATTR_GET_INHERIT(attr) == 0) break; @@ -2625,12 +2769,32 @@ const void * _lv_obj_get_style_ptr(const lv_obj_t * obj, uint8_t part, lv_style_ lv_res_t res = LV_RES_INV; const lv_obj_t * parent = obj; while(parent) { - lv_style_list_t * dsc = lv_obj_get_style_list(parent, part); + lv_style_list_t * list = lv_obj_get_style_list(parent, part); + + if(!list->ignore_cache && list->style_cnt > 0) { + if(!list->valid_cache) update_style_cache((lv_obj_t*)parent, part, prop & (~LV_STYLE_STATE_MASK)); + bool def = false; + switch(prop & (~LV_STYLE_STATE_MASK)) { + case LV_STYLE_VALUE_STR: + if(list->value_txt_str) def = true; + break; + case LV_STYLE_PATTERN_IMAGE: + if(list->pattern_img_null) def = true; + break; + case LV_STYLE_TEXT_FONT: + if(list->text_font_normal) def = true; + break; + } + + if(def) { + break; + } + } lv_state_t state = lv_obj_get_state(parent, part); prop = (uint16_t)prop_ori + ((uint16_t)state << LV_STYLE_STATE_POS); - res = _lv_style_list_get_ptr(dsc, prop, &value_act); + res = _lv_style_list_get_ptr(list, prop, &value_act); if(res == LV_RES_OK) return value_act; if(LV_STYLE_ATTR_GET_INHERIT(attr) == 0) break; @@ -3144,9 +3308,9 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t } } - if(draw_dsc->border_opa != LV_OPA_TRANSP) { - draw_dsc->border_width = lv_obj_get_style_border_width(obj, part); - if(draw_dsc->border_width) { + draw_dsc->border_width = lv_obj_get_style_border_width(obj, part); + if(draw_dsc->border_width) { + if(draw_dsc->border_opa != LV_OPA_TRANSP) { draw_dsc->border_opa = lv_obj_get_style_border_opa(obj, part); if(draw_dsc->border_opa > LV_OPA_MIN) { draw_dsc->border_side = lv_obj_get_style_border_side(obj, part); @@ -3159,9 +3323,9 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t } #if LV_USE_OUTLINE - if(draw_dsc->outline_opa != LV_OPA_TRANSP) { - draw_dsc->outline_width = lv_obj_get_style_outline_width(obj, part); - if(draw_dsc->outline_width) { + draw_dsc->outline_width = lv_obj_get_style_outline_width(obj, part); + if(draw_dsc->outline_width) { + if(draw_dsc->outline_opa != LV_OPA_TRANSP) { draw_dsc->outline_opa = lv_obj_get_style_outline_opa(obj, part); if(draw_dsc->outline_opa > LV_OPA_MIN) { draw_dsc->outline_pad = lv_obj_get_style_outline_pad(obj, part); @@ -3175,9 +3339,9 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t #endif #if LV_USE_PATTERN - if(draw_dsc->pattern_opa != LV_OPA_TRANSP) { - draw_dsc->pattern_image = lv_obj_get_style_pattern_image(obj, part); - if(draw_dsc->pattern_image) { + draw_dsc->pattern_image = lv_obj_get_style_pattern_image(obj, part); + if(draw_dsc->pattern_image) { + if(draw_dsc->pattern_opa != LV_OPA_TRANSP) { draw_dsc->pattern_opa = lv_obj_get_style_pattern_opa(obj, part); if(draw_dsc->pattern_opa > LV_OPA_MIN) { draw_dsc->pattern_recolor_opa = lv_obj_get_style_pattern_recolor_opa(obj, part); @@ -3198,9 +3362,9 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t #endif #if LV_USE_SHADOW - if(draw_dsc->shadow_opa > LV_OPA_MIN) { - draw_dsc->shadow_width = lv_obj_get_style_shadow_width(obj, part); - if(draw_dsc->shadow_width) { + draw_dsc->shadow_width = lv_obj_get_style_shadow_width(obj, part); + if(draw_dsc->shadow_width) { + if(draw_dsc->shadow_opa > LV_OPA_MIN) { draw_dsc->shadow_opa = lv_obj_get_style_shadow_opa(obj, part); if(draw_dsc->shadow_opa > LV_OPA_MIN) { draw_dsc->shadow_ofs_x = lv_obj_get_style_shadow_ofs_x(obj, part); @@ -3216,9 +3380,9 @@ void lv_obj_init_draw_rect_dsc(lv_obj_t * obj, uint8_t part, lv_draw_rect_dsc_t #endif #if LV_USE_VALUE_STR - if(draw_dsc->value_opa > LV_OPA_MIN) { - draw_dsc->value_str = lv_obj_get_style_value_str(obj, part); - if(draw_dsc->value_str) { + draw_dsc->value_str = lv_obj_get_style_value_str(obj, part); + if(draw_dsc->value_str) { + if(draw_dsc->value_opa > LV_OPA_MIN) { draw_dsc->value_opa = lv_obj_get_style_value_opa(obj, part); if(draw_dsc->value_opa > LV_OPA_MIN) { draw_dsc->value_ofs_x = lv_obj_get_style_value_ofs_x(obj, part); @@ -3308,6 +3472,9 @@ void lv_obj_init_draw_img_dsc(lv_obj_t * obj, uint8_t part, lv_draw_img_dsc_t * void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint8_t part, lv_draw_line_dsc_t * draw_dsc) { + draw_dsc->width = lv_obj_get_style_line_width(obj, part); + if(draw_dsc->width == 0) return; + draw_dsc->opa = lv_obj_get_style_line_opa(obj, part); if(draw_dsc->opa <= LV_OPA_MIN) return; @@ -3319,9 +3486,6 @@ void lv_obj_init_draw_line_dsc(lv_obj_t * obj, uint8_t part, lv_draw_line_dsc_t if(draw_dsc->opa <= LV_OPA_MIN) return; #endif - draw_dsc->width = lv_obj_get_style_line_width(obj, part); - if(draw_dsc->width == 0) return; - draw_dsc->color = lv_obj_get_style_line_color(obj, part); draw_dsc->dash_width = lv_obj_get_style_line_dash_width(obj, part); @@ -3817,16 +3981,16 @@ static void refresh_children_position(lv_obj_t * obj, lv_coord_t x_diff, lv_coor */ static void report_style_mod_core(void * style, lv_obj_t * obj) { - uint8_t part_sub; - for(part_sub = 0; part_sub != _LV_OBJ_PART_REAL_LAST; part_sub++) { - lv_style_list_t * dsc = lv_obj_get_style_list(obj, part_sub); - if(dsc == NULL) break; + uint8_t part; + for(part = 0; part != _LV_OBJ_PART_REAL_LAST; part++) { + lv_style_list_t * list = lv_obj_get_style_list(obj, part); + if(list == NULL) break; uint8_t ci; - for(ci = 0; ci < dsc->style_cnt; ci++) { - lv_style_t * class = lv_style_list_get_style(dsc, ci); + for(ci = 0; ci < list->style_cnt; ci++) { + lv_style_t * class = lv_style_list_get_style(list, ci); if(class == style || style == NULL) { - lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(obj, part, LV_STYLE_PROP_ALL); break; } } @@ -4207,7 +4371,7 @@ static void trans_anim_cb(lv_style_trans_t * tr, lv_anim_value_t v) else x = tr->end_value._ptr; _lv_style_set_ptr(style, tr->prop, x); } - lv_obj_refresh_style(tr->obj, tr->prop); + lv_obj_refresh_style(tr->obj, tr->part, tr->prop); } @@ -4302,3 +4466,204 @@ static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_fin return false; } + +static bool style_prop_is_cacheble(lv_style_property_t prop) +{ + + switch(prop) { + case LV_STYLE_PROP_ALL: + case LV_STYLE_BG_GRAD_DIR: + case LV_STYLE_CLIP_CORNER: + case LV_STYLE_TEXT_LETTER_SPACE: + case LV_STYLE_TEXT_LINE_SPACE: + case LV_STYLE_TEXT_FONT: + case LV_STYLE_TRANSFORM_ANGLE: + case LV_STYLE_TRANSFORM_WIDTH: + case LV_STYLE_TRANSFORM_HEIGHT: + case LV_STYLE_TRANSFORM_ZOOM: + case LV_STYLE_BORDER_WIDTH: + case LV_STYLE_OUTLINE_WIDTH: + case LV_STYLE_RADIUS: + case LV_STYLE_SHADOW_WIDTH: + case LV_STYLE_OPA_SCALE: + case LV_STYLE_BG_OPA: + case LV_STYLE_BORDER_SIDE: + case LV_STYLE_BORDER_POST: + case LV_STYLE_IMAGE_RECOLOR_OPA: + case LV_STYLE_VALUE_STR: + case LV_STYLE_PATTERN_IMAGE: + case LV_STYLE_PAD_TOP: + case LV_STYLE_PAD_BOTTOM: + case LV_STYLE_PAD_LEFT: + case LV_STYLE_PAD_RIGHT: + case LV_STYLE_BG_BLEND_MODE: + case LV_STYLE_BORDER_BLEND_MODE: + case LV_STYLE_IMAGE_BLEND_MODE: + case LV_STYLE_LINE_BLEND_MODE: + case LV_STYLE_OUTLINE_BLEND_MODE: + case LV_STYLE_PATTERN_BLEND_MODE: + case LV_STYLE_SHADOW_BLEND_MODE: + case LV_STYLE_TEXT_BLEND_MODE: + case LV_STYLE_VALUE_BLEND_MODE: + return true; + break; + default: + return false; + } +} + +/** + * Update the cache of style list + * @param obj pointer to an obejct + * @param part the part of the object + * @param prop the property which triggered the update + */ +static void update_style_cache(lv_obj_t * obj, uint8_t part, uint16_t prop) +{ + if(style_prop_is_cacheble(prop) == false) return; + + lv_style_list_t * list = lv_obj_get_style_list(obj, part); + + bool ignore_cache_ori = list->ignore_cache; + list->ignore_cache = 1; + +#if LV_USE_OPA_SCALE + list->opa_scale_cover = lv_obj_get_style_opa_scale(obj, part) == LV_OPA_COVER ? 1 : 0; +#else + list->opa_scale_cover = 1; +#endif + list->text_decor_none = lv_obj_get_style_text_decor(obj, part) == LV_TEXT_DECOR_NONE ? 1 : 0; + list->text_font_normal = lv_obj_get_style_text_font(obj, part) == LV_THEME_DEFAULT_FONT_NORMAL ? 1 : 0; + + list->text_space_zero = 1; + if(lv_obj_get_style_text_letter_space(obj, part) != 0 || + lv_obj_get_style_text_line_space(obj, part) != 0) { + list->text_space_zero = 0; + } + + + lv_opa_t bg_opa = lv_obj_get_style_bg_opa(obj, part); + list->bg_opa_transp = bg_opa == LV_OPA_TRANSP ? 1 : 0; + list->bg_opa_cover = bg_opa == LV_OPA_COVER ? 1 : 0; + + list->bg_grad_dir_none = lv_obj_get_style_bg_grad_dir(obj, part) == LV_GRAD_DIR_NONE ? 1 : 0; + list->border_width_zero = lv_obj_get_style_border_width(obj, part) == 0 ? 1 : 0; + list->border_side_full = lv_obj_get_style_border_side(obj, part) == LV_BORDER_SIDE_FULL ? 1 : 0; + list->border_post_off = lv_obj_get_style_border_post(obj, part) == 0 ? 1 : 0; + list->clip_corner_off = lv_obj_get_style_clip_corner(obj, part) == false ? 1 : 0; + list->img_recolor_opa_transp = lv_obj_get_style_image_recolor_opa(obj, part) == LV_OPA_TRANSP ? 1 : 0; + list->outline_width_zero = lv_obj_get_style_outline_width(obj, part) == 0 ? 1 : 0; + list->pattern_img_null = lv_obj_get_style_pattern_image(obj, part) == NULL ? 1 : 0; + list->radius_zero = lv_obj_get_style_radius(obj, part) == 0 ? 1 : 0; + list->shadow_width_zero = lv_obj_get_style_shadow_width(obj, part) == 0 ? 1 : 0; + list->value_txt_str = lv_obj_get_style_value_str(obj, part) == NULL ? 1 : 0; + + + list->transform_all_zero = 1; + if(lv_obj_get_style_transform_angle(obj, part) != 0 || + lv_obj_get_style_transform_width(obj, part) != 0 || + lv_obj_get_style_transform_height(obj, part) != 0 || + lv_obj_get_style_transform_zoom(obj, part) != LV_IMG_ZOOM_NONE) + { + list->transform_all_zero = 0; + } + + list->pad_all_zero = 1; + if(lv_obj_get_style_pad_top(obj, part) != 0 || + lv_obj_get_style_pad_bottom(obj, part) != 0 || + lv_obj_get_style_pad_left(obj, part) != 0 || + lv_obj_get_style_pad_right(obj, part) != 0) + { + list->pad_all_zero = 0; + } + + list->blend_mode_all_normal = 1; +#if LV_USE_BLEND_MODES + if(lv_obj_get_style_bg_blend_mode(obj, part) != LV_BLEND_MODE_NORMAL || + lv_obj_get_style_border_blend_mode(obj, part) != LV_BLEND_MODE_NORMAL || + lv_obj_get_style_pattern_blend_mode(obj, part) != LV_BLEND_MODE_NORMAL || + lv_obj_get_style_outline_blend_mode(obj, part) != LV_BLEND_MODE_NORMAL || + lv_obj_get_style_value_blend_mode(obj, part) != LV_BLEND_MODE_NORMAL || + lv_obj_get_style_text_blend_mode(obj, part) != LV_BLEND_MODE_NORMAL || + lv_obj_get_style_line_blend_mode(obj, part) != LV_BLEND_MODE_NORMAL || + lv_obj_get_style_image_blend_mode(obj, part) != LV_BLEND_MODE_NORMAL || + lv_obj_get_style_shadow_blend_mode(obj, part) != LV_BLEND_MODE_NORMAL) + { + list->blend_mode_all_normal = 0; + } +#endif + list->ignore_cache = ignore_cache_ori; + list->valid_cache = 1; +} + +/** + * Update the cache of style list + * @param obj pointer to an object + * @param part the part of the object + */ +static void update_style_cache_children(lv_obj_t * obj) +{ + uint8_t part; + for(part = 0; part != _LV_OBJ_PART_REAL_LAST; part++) { + lv_style_list_t * list = lv_obj_get_style_list(obj, part); + if(list == NULL) break; + + bool ignore_cache_ori = list->ignore_cache; + list->ignore_cache = 1; + + list->opa_scale_cover = lv_obj_get_style_opa_scale(obj, part) == LV_OPA_COVER ? 1 : 0; + list->text_decor_none = lv_obj_get_style_text_decor(obj, part) == LV_TEXT_DECOR_NONE ? 1 : 0; + list->text_font_normal = lv_obj_get_style_text_font(obj, part) == lv_theme_get_font_normal() ? 1 : 0; + list->img_recolor_opa_transp = lv_obj_get_style_image_recolor_opa(obj, part) == LV_OPA_TRANSP ? 1 : 0; + + list->text_space_zero = 1; + if(lv_obj_get_style_text_letter_space(obj, part) != 0 || + lv_obj_get_style_text_line_space(obj, part) != 0) { + list->text_space_zero = 0; + } + + list->ignore_cache = ignore_cache_ori; + } + + lv_obj_t * child = lv_obj_get_child(obj, NULL); + while(child) { + update_style_cache_children(child); + child = lv_obj_get_child(obj, child); + } + +} + +/** + * Mark the object and all of it's children's style lists as invalid. + * The cache will be updated when a cached property asked nest time + * @param obj pointer to an object + */ +static void invalidate_style_cache(lv_obj_t * obj, uint8_t part, lv_style_property_t prop) +{ + if(style_prop_is_cacheble(prop) == false) return; + + if(part != LV_OBJ_PART_ALL) { + lv_style_list_t * list = lv_obj_get_style_list(obj, part); + if(list == NULL) return; + list->valid_cache = 0; + } else { + + for(part = 0; part < _LV_OBJ_PART_REAL_FIRST; part++) { + lv_style_list_t * list = lv_obj_get_style_list(obj, part); + if(list == NULL) break; + list->valid_cache = 0; + } + for(part = _LV_OBJ_PART_REAL_FIRST; part < 0xFF; part++) { + lv_style_list_t * list = lv_obj_get_style_list(obj, part); + if(list == NULL) break; + list->valid_cache = 0; + } + } + + lv_obj_t * child = lv_obj_get_child(obj, NULL); + while(child) { + update_style_cache_children(child); + child = lv_obj_get_child(obj, child); + } +} + diff --git a/src/lv_core/lv_obj.h b/src/lv_core/lv_obj.h index 5d10eb3bc..3b97675ac 100644 --- a/src/lv_core/lv_obj.h +++ b/src/lv_core/lv_obj.h @@ -105,6 +105,7 @@ enum { LV_EVENT_APPLY, /**< "Ok", "Apply" or similar specific button has clicked*/ LV_EVENT_CANCEL, /**< "Close", "Cancel" or similar specific button has clicked*/ LV_EVENT_DELETE, /**< Object is being deleted */ + _LV_EVENT_LAST /** Number of events*/ }; typedef uint8_t lv_event_t; /**< Type of event being sent to the object. */ @@ -353,6 +354,22 @@ void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area); */ void lv_obj_invalidate(const lv_obj_t * obj); + +/** + * Tell whether an area of an object is visible (even partially) now or not + * @param obj pointer to an object + * @param area the are to check. The visible part of the area will be written back here. + * @return true: visible; false: not visible (hidden, out of parent, on other screen, etc) + */ +bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area); + +/** + * Tell whether an object is visible (even partially) now or not + * @param obj pointer to an object + * @return true: visible; false: not visible (hidden, out of parent, on other screen, etc) + */ +bool lv_obj_is_visible(const lv_obj_t * obj); + /*===================== * Setter functions *====================*/ @@ -586,7 +603,7 @@ void lv_obj_reset_style_list(lv_obj_t * obj, uint8_t part); * @param obj pointer to an object * @param prop `LV_STYLE_PROP_ALL` or an `LV_STYLE_...` property. It is used to optimize what needs to be refreshed. */ -void lv_obj_refresh_style(lv_obj_t * obj, lv_style_property_t prop); +void lv_obj_refresh_style(lv_obj_t * obj, uint8_t part, lv_style_property_t prop); /** * Notify all object if a style is modified @@ -664,6 +681,13 @@ void _lv_obj_set_style_local_ptr(lv_obj_t * obj, uint8_t type, lv_style_property */ bool lv_obj_remove_style_local_prop(lv_obj_t * obj, uint8_t part, lv_style_property_t prop); +/** + * Enable/disable the use of style cahche for an object + * @param obj pointer to an object + * @param dis true: disable; false: enable (re-enable) + */ +void _lv_obj_disable_style_caching(lv_obj_t * obj, bool dis); + /*----------------- * Attribute set *----------------*/ diff --git a/src/lv_core/lv_style.c b/src/lv_core/lv_style.c index 887c4733b..950275497 100644 --- a/src/lv_core/lv_style.c +++ b/src/lv_core/lv_style.c @@ -1039,7 +1039,6 @@ bool lv_debug_check_style_list(const lv_style_list_t * list) return true; } - /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/lv_core/lv_style.h b/src/lv_core/lv_style.h index d244936b2..7ed69dbc5 100644 --- a/src/lv_core/lv_style.h +++ b/src/lv_core/lv_style.h @@ -221,11 +221,37 @@ typedef struct { #if LV_USE_ASSERT_STYLE uint32_t sentinel; #endif - uint8_t style_cnt; - uint8_t has_local : 1; - uint8_t has_trans : 1; - uint8_t skip_trans : 1; /*1: Temporally skip the transition style if any*/ - uint8_t ignore_trans : 1; /*1: Mark that this style list shouldn't receive transitions at all*/ + uint32_t style_cnt :6; + uint32_t has_local :1; + uint32_t has_trans :1; + uint32_t skip_trans :1; /*1: Temporally skip the transition style if any*/ + uint32_t ignore_trans :1; /*1: Mark that this style list shouldn't receive transitions at all*/ + uint32_t valid_cache :1; /*1: The cache is valid and can be used*/ + uint32_t ignore_cache :1; /*1: Ignore cache while getting value of properties*/ + + uint32_t radius_zero :1; + uint32_t opa_scale_cover :1; + uint32_t clip_corner_off :1; + uint32_t transform_all_zero :1; + uint32_t pad_all_zero :1; + uint32_t blend_mode_all_normal :1; + uint32_t bg_opa_transp :1; + uint32_t bg_opa_cover :1; + uint32_t bg_grad_dir_none :1; + + uint32_t border_width_zero :1; + uint32_t border_side_full :1; + uint32_t border_post_off :1; + + uint32_t outline_width_zero :1; + uint32_t pattern_img_null :1; + uint32_t shadow_width_zero :1; + uint32_t value_txt_str :1; + uint32_t img_recolor_opa_transp :1; + + uint32_t text_space_zero :1; + uint32_t text_decor_none :1; + uint32_t text_font_normal :1; } lv_style_list_t; /********************** diff --git a/src/lv_font/lv_font.mk b/src/lv_font/lv_font.mk index 9f9eabede..5b2f8bc05 100644 --- a/src/lv_font/lv_font.mk +++ b/src/lv_font/lv_font.mk @@ -1,5 +1,6 @@ CSRCS += lv_font.c CSRCS += lv_font_fmt_txt.c +CSRCS += lv_font_loader.c CSRCS += lv_font_montserrat_12.c CSRCS += lv_font_montserrat_14.c CSRCS += lv_font_montserrat_16.c diff --git a/src/lv_font/lv_font_loader.c b/src/lv_font/lv_font_loader.c new file mode 100644 index 000000000..53e7f77f4 --- /dev/null +++ b/src/lv_font/lv_font_loader.c @@ -0,0 +1,694 @@ +/** + * @file lv_font_loader.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include +#include + +#include "../lvgl.h" +#include "../lv_misc/lv_fs.h" +#include "lv_font_loader.h" + +#if LV_USE_FILESYSTEM + + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + lv_fs_file_t * fp; + int8_t bit_pos; + uint8_t byte_value; +} bit_iterator_t; + +typedef struct font_header_bin { + uint32_t version; + uint16_t tables_count; + uint16_t font_size; + uint16_t ascent; + int16_t descent; + uint16_t typo_ascent; + int16_t typo_descent; + uint16_t typo_line_gap; + int16_t min_y; + int16_t max_y; + uint16_t default_advance_width; + uint16_t kerning_scale; + uint8_t index_to_loc_format; + uint8_t glyph_id_format; + uint8_t advance_width_format; + uint8_t bits_per_pixel; + uint8_t xy_bits; + uint8_t wh_bits; + uint8_t advance_width_bits; + uint8_t compression_id; + uint8_t subpixels_mode; + uint8_t padding; +} font_header_bin_t; + +typedef struct cmap_table_bin { + uint32_t data_offset; + uint32_t range_start; + uint16_t range_length; + uint16_t glyph_id_start; + uint16_t data_entries_count; + uint8_t format_type; + uint8_t padding; +} cmap_table_bin_t; + + +/********************** + * STATIC PROTOTYPES + **********************/ +static bit_iterator_t init_bit_iterator(lv_fs_file_t * fp); +static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font); +int32_t load_kern(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint8_t format, uint32_t start); + +static int read_bits_signed(bit_iterator_t * it, int n_bits, lv_fs_res_t * res); +static int read_bits(bit_iterator_t * it, int n_bits, lv_fs_res_t * res); + + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Loads a `lv_font_t` object from a binary font file + * @param font_name filename where the font file is located + * @return a pointer to the font or NULL in case of error + */ +lv_font_t * lv_font_load(const char * font_name) +{ + bool success = false; + + lv_font_t * font = lv_mem_alloc(sizeof(lv_font_t)); + memset(font, 0, sizeof(lv_font_t)); + + lv_fs_file_t file; + lv_fs_res_t res = lv_fs_open(&file, font_name, LV_FS_MODE_RD); + + if(res == LV_FS_RES_OK) { + success = lvgl_load_font(&file, font); + } + + if(!success) { + LV_LOG_WARN("Error loading font file: %s\n", font_name); + /* + * When `lvgl_load_font` fails it can leak some pointers. + * All non-null pointers can be assumed as allocated and + * `lv_font_free` should free them correctly. + */ + lv_font_free(font); + font = NULL; + } + + lv_fs_close(&file); + + return font; +} + + +/** + * Frees the memory allocated by the `lv_font_load()` function + * @param font lv_font_t object created by the lv_font_load function + */ +void lv_font_free(lv_font_t * font) +{ + if(NULL != font) { + lv_font_fmt_txt_dsc_t * dsc = (lv_font_fmt_txt_dsc_t *) font->dsc; + + if(NULL != dsc) { + + if(dsc->kern_classes == 0) { + lv_font_fmt_txt_kern_pair_t * kern_dsc = + (lv_font_fmt_txt_kern_pair_t *) dsc->kern_dsc; + + if(NULL != kern_dsc) { + if(kern_dsc->glyph_ids) + lv_mem_free((void *) kern_dsc->glyph_ids); + + if(kern_dsc->values) + lv_mem_free((void *) kern_dsc->values); + + lv_mem_free((void *) kern_dsc); + } + } + else { + lv_font_fmt_txt_kern_classes_t * kern_dsc = + (lv_font_fmt_txt_kern_classes_t *) dsc->kern_dsc; + + if(NULL != kern_dsc) { + if(kern_dsc->class_pair_values) + lv_mem_free((void *) kern_dsc->class_pair_values); + + if(kern_dsc->left_class_mapping) + lv_mem_free((void *) kern_dsc->left_class_mapping); + + if(kern_dsc->right_class_mapping) + lv_mem_free((void *) kern_dsc->right_class_mapping); + + lv_mem_free((void *) kern_dsc); + } + } + + lv_font_fmt_txt_cmap_t * cmaps = + (lv_font_fmt_txt_cmap_t *) dsc->cmaps; + + if(NULL != cmaps) { + for(int i = 0; i < dsc->cmap_num; ++i) { + if(NULL != cmaps[i].glyph_id_ofs_list) + lv_mem_free((void *) cmaps[i].glyph_id_ofs_list); + if(NULL != cmaps[i].unicode_list) + lv_mem_free((void *) cmaps[i].unicode_list); + } + lv_mem_free(cmaps); + } + + if(NULL != dsc->glyph_bitmap) { + lv_mem_free((void *) dsc->glyph_bitmap); + } + if(NULL != dsc->glyph_dsc) { + lv_mem_free((void *) dsc->glyph_dsc); + } + lv_mem_free(dsc); + } + lv_mem_free(font); + } +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bit_iterator_t init_bit_iterator(lv_fs_file_t * fp) +{ + bit_iterator_t it; + it.fp = fp; + it.bit_pos = -1; + it.byte_value = 0; + return it; +} + +static int read_bits(bit_iterator_t * it, int n_bits, lv_fs_res_t * res) +{ + int value = 0; + while(n_bits--) { + it->byte_value = it->byte_value << 1; + it->bit_pos--; + + if(it->bit_pos < 0) { + it->bit_pos = 7; + *res = lv_fs_read(it->fp, &(it->byte_value), 1, NULL); + if(*res != LV_FS_RES_OK) { + return -1; + } + } + int8_t bit = (it->byte_value & 0x80) ? 1 : 0; + + value |= (bit << n_bits); + } + *res = LV_FS_RES_OK; + return value; +} + +static int read_bits_signed(bit_iterator_t * it, int n_bits, lv_fs_res_t * res) +{ + int value = read_bits(it, n_bits, res); + if(value & (1 << (n_bits - 1))) { + for(int bit = n_bits; bit < 8; ++bit) { + value |= (1 << bit); + } + } + return value; +} + +static int read_label(lv_fs_file_t * fp, int start, const char * label) +{ + lv_fs_seek(fp, start); + + uint32_t length; + char buf[4]; + + if(lv_fs_read(fp, &length, 4, NULL) != LV_FS_RES_OK + || lv_fs_read(fp, buf, 4, NULL) != LV_FS_RES_OK + || memcmp(label, buf, 4) != 0) { + LV_LOG_WARN("Error reading '%s' label.", label); + return -1; + } + + return length; +} + +static bool load_cmaps_tables(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, + uint32_t cmaps_start, cmap_table_bin_t * cmap_table) +{ + for(unsigned int i = 0; i < font_dsc->cmap_num; ++i) { + if(lv_fs_read(fp, &cmap_table[i], sizeof(cmap_table_bin_t), NULL) != LV_FS_RES_OK) { + return false; + } + + lv_font_fmt_txt_cmap_t * cmap = (lv_font_fmt_txt_cmap_t *) & (font_dsc->cmaps[i]); + + cmap->range_start = cmap_table[i].range_start; + cmap->range_length = cmap_table[i].range_length; + cmap->glyph_id_start = cmap_table[i].glyph_id_start; + } + + for(unsigned int i = 0; i < font_dsc->cmap_num; ++i) { + lv_fs_res_t res = lv_fs_seek(fp, cmaps_start + cmap_table[i].data_offset); + if(res != LV_FS_RES_OK) { + return false; + } + + lv_font_fmt_txt_cmap_t * cmap = (lv_font_fmt_txt_cmap_t *) & (font_dsc->cmaps[i]); + + switch(cmap_table[i].format_type) { + case 0: { + uint8_t ids_size = sizeof(uint8_t) * cmap_table[i].data_entries_count; + uint8_t * glyph_id_ofs_list = lv_mem_alloc(ids_size); + + cmap->glyph_id_ofs_list = glyph_id_ofs_list; + + if(lv_fs_read(fp, glyph_id_ofs_list, ids_size, NULL) != LV_FS_RES_OK) { + return false; + } + + cmap->type = LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL; + cmap->list_length = cmap->range_length; + cmap->unicode_list = NULL; + break; + } + case 2: + cmap->type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY; + cmap->list_length = 0; + cmap->unicode_list = NULL; + cmap->glyph_id_ofs_list = NULL; + break; + case 1: + case 3: { + uint32_t list_size = sizeof(uint16_t) * cmap_table[i].data_entries_count; + uint16_t * unicode_list = (uint16_t *) lv_mem_alloc(list_size); + + cmap->unicode_list = unicode_list; + cmap->list_length = cmap_table[i].data_entries_count; + + if(lv_fs_read(fp, unicode_list, list_size, NULL) != LV_FS_RES_OK) { + return false; + } + + if(cmap_table[i].format_type == 1) { + uint16_t * buf = lv_mem_alloc(sizeof(uint16_t) * cmap->list_length); + + cmap->type = LV_FONT_FMT_TXT_CMAP_SPARSE_FULL; + cmap->glyph_id_ofs_list = buf; + + if(lv_fs_read(fp, buf, sizeof(uint16_t) * cmap->list_length, NULL) != LV_FS_RES_OK) { + return false; + } + } + else { + cmap->type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY; + cmap->glyph_id_ofs_list = NULL; + } + break; + } + default: + LV_LOG_WARN("Unknown cmaps format type %d.", cmap_table[i].format_type); + return false; + } + } + return true; +} + +static int32_t load_cmaps(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint32_t cmaps_start) +{ + int32_t cmaps_length = read_label(fp, cmaps_start, "cmap"); + if(cmaps_length < 0) { + return -1; + } + + uint32_t cmaps_subtables_count; + if(lv_fs_read(fp, &cmaps_subtables_count, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + lv_font_fmt_txt_cmap_t * cmaps = + lv_mem_alloc(cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t)); + + memset(cmaps, 0, cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t)); + + font_dsc->cmaps = cmaps; + font_dsc->cmap_num = cmaps_subtables_count; + + cmap_table_bin_t * cmaps_tables = lv_mem_alloc(sizeof(cmap_table_bin_t) * font_dsc->cmap_num); + + bool success = load_cmaps_tables(fp, font_dsc, cmaps_start, cmaps_tables); + + lv_mem_free(cmaps_tables); + + return success ? cmaps_length : -1; +} + +static int32_t load_glyph(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, + uint32_t start, uint32_t * glyph_offset, uint32_t loca_count, font_header_bin_t * header) +{ + int32_t glyph_length = read_label(fp, start, "glyf"); + if(glyph_length < 0) { + return -1; + } + + lv_font_fmt_txt_glyph_dsc_t * glyph_dsc = (lv_font_fmt_txt_glyph_dsc_t *) + lv_mem_alloc(loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t)); + + memset(glyph_dsc, 0, loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t)); + + font_dsc->glyph_dsc = glyph_dsc; + + int cur_bmp_size = 0; + + for(unsigned int i = 0; i < loca_count; ++i) { + lv_font_fmt_txt_glyph_dsc_t * gdsc = &glyph_dsc[i]; + + lv_fs_res_t res = lv_fs_seek(fp, start + glyph_offset[i]); + if(res != LV_FS_RES_OK) { + return -1; + } + + bit_iterator_t bit_it = init_bit_iterator(fp); + + if(header->advance_width_bits == 0) { + gdsc->adv_w = header->default_advance_width; + } + else { + gdsc->adv_w = read_bits(&bit_it, header->advance_width_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + } + + if(header->advance_width_format == 0) { + gdsc->adv_w *= 16; + } + + gdsc->ofs_x = read_bits_signed(&bit_it, header->xy_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + gdsc->ofs_y = read_bits_signed(&bit_it, header->xy_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + gdsc->box_w = read_bits(&bit_it, header->wh_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + gdsc->box_h = read_bits(&bit_it, header->wh_bits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + int nbits = header->advance_width_bits + 2 * header->xy_bits + 2 * header->wh_bits; + int next_offset = (i < loca_count - 1) ? glyph_offset[i + 1] : (uint32_t)(glyph_length - 1); + int bmp_size = next_offset - glyph_offset[i] - nbits / 8; + + if(i == 0) { + gdsc->adv_w = 0; + gdsc->box_w = 0; + gdsc->box_h = 0; + gdsc->ofs_x = 0; + gdsc->ofs_y = 0; + } + + gdsc->bitmap_index = cur_bmp_size; + if(gdsc->box_w * gdsc->box_h != 0) { + cur_bmp_size += bmp_size; + } + } + + uint8_t * glyph_bmp = (uint8_t *) lv_mem_alloc(sizeof(uint8_t) * cur_bmp_size); + + font_dsc->glyph_bitmap = glyph_bmp; + + cur_bmp_size = 0; + + for(unsigned int i = 1; i < loca_count; ++i) { + lv_fs_res_t res = lv_fs_seek(fp, start + glyph_offset[i]); + if(res != LV_FS_RES_OK) { + return -1; + } + bit_iterator_t bit_it = init_bit_iterator(fp); + + int nbits = header->advance_width_bits + 2 * header->xy_bits + 2 * header->wh_bits; + + read_bits(&bit_it, nbits, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + + if(glyph_dsc[i].box_w * glyph_dsc[i].box_h == 0) { + continue; + } + + int next_offset = (i < loca_count - 1) ? glyph_offset[i + 1] : (uint32_t)(glyph_length - 1); + int bmp_size = next_offset - glyph_offset[i] - nbits / 8; + + for(int k = 0; k < bmp_size; ++k) { + glyph_bmp[cur_bmp_size + k] = read_bits(&bit_it, 8, &res); + if(res != LV_FS_RES_OK) { + return -1; + } + } + cur_bmp_size += bmp_size; + } + return glyph_length; +} + +/* + * Loads a `lv_font_t` from a binary file, given a `lv_fs_file_t`. + * + * Memory allocations on `lvgl_load_font` should be immediately zeroed and + * the pointer should be set on the `lv_font_t` data before any possible return. + * + * When something fails, it returns `false` and the memory on the `lv_font_t` + * still needs to be freed using `lv_font_free`. + * + * `lv_font_free` will assume that all non-null pointers are allocated and + * should be freed. + */ +static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font) +{ + lv_font_fmt_txt_dsc_t * font_dsc = (lv_font_fmt_txt_dsc_t *) + lv_mem_alloc(sizeof(lv_font_fmt_txt_dsc_t)); + + memset(font_dsc, 0, sizeof(lv_font_fmt_txt_dsc_t)); + + font->dsc = font_dsc; + + /* header */ + int32_t header_length = read_label(fp, 0, "head"); + if(header_length < 0) { + return false; + } + + font_header_bin_t font_header; + if(lv_fs_read(fp, &font_header, sizeof(font_header_bin_t), NULL) != LV_FS_RES_OK) { + return false; + } + + font->base_line = -font_header.descent; + font->line_height = font_header.ascent - font_header.descent; + font->get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt; + font->get_glyph_bitmap = lv_font_get_bitmap_fmt_txt; + font->subpx = LV_FONT_SUBPX_NONE; + + font_dsc->bpp = font_header.bits_per_pixel; + font_dsc->kern_scale = font_header.kerning_scale; + font_dsc->bitmap_format = font_header.compression_id; + + /* cmaps */ + uint32_t cmaps_start = header_length; + int32_t cmaps_length = load_cmaps(fp, font_dsc, cmaps_start); + if(cmaps_length < 0) { + return false; + } + + /* loca */ + uint32_t loca_start = cmaps_start + cmaps_length; + int32_t loca_length = read_label(fp, loca_start, "loca"); + if(loca_length < 0) { + return false; + } + + uint32_t loca_count; + if(lv_fs_read(fp, &loca_count, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + return false; + } + + bool failed = false; + uint32_t * glyph_offset = lv_mem_alloc(sizeof(uint32_t) * (loca_count + 1)); + + for(unsigned int i = 0; i < loca_count; ++i) { + if(font_header.index_to_loc_format == 0) { + uint16_t offset; + if(lv_fs_read(fp, &offset, sizeof(uint16_t), NULL) != LV_FS_RES_OK) { + failed = true; + break; + } + glyph_offset[i] = offset; + } + else if(font_header.index_to_loc_format == 1) { + uint32_t offset; + if(lv_fs_read(fp, &offset, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + failed = true; + break; + } + glyph_offset[i] = offset; + } + else { + LV_LOG_WARN("Unknown index_to_loc_format: %d.", font_header.index_to_loc_format); + failed = true; + break; + } + } + + if(failed) { + lv_mem_free(glyph_offset); + return false; + } + + /* glyph */ + uint32_t glyph_start = loca_start + loca_length; + int32_t glyph_length = load_glyph( + fp, font_dsc, glyph_start, glyph_offset, loca_count, &font_header); + + lv_mem_free(glyph_offset); + + if(glyph_length < 0) { + return false; + } + + if(font_header.tables_count < 4) { + font_dsc->kern_dsc = NULL; + font_dsc->kern_classes = 0; + font_dsc->kern_scale = 0; + return true; + } + + uint32_t kern_start = glyph_start + glyph_length; + + int32_t kern_length = load_kern(fp, font_dsc, font_header.glyph_id_format, kern_start); + + return kern_length >= 0; +} + +int32_t load_kern(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint8_t format, uint32_t start) +{ + int32_t kern_length = read_label(fp, start, "kern"); + if(kern_length < 0) { + return -1; + } + + uint8_t kern_format_type; + int32_t padding; + if(lv_fs_read(fp, &kern_format_type, sizeof(uint8_t), NULL) != LV_FS_RES_OK || + lv_fs_read(fp, &padding, 3 * sizeof(uint8_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + if(0 == kern_format_type) { /* sorted pairs */ + lv_font_fmt_txt_kern_pair_t * kern_pair = lv_mem_alloc(sizeof(lv_font_fmt_txt_kern_pair_t)); + + memset(kern_pair, 0, sizeof(lv_font_fmt_txt_kern_pair_t)); + + font_dsc->kern_dsc = kern_pair; + font_dsc->kern_classes = 0; + + uint32_t glyph_entries; + if(lv_fs_read(fp, &glyph_entries, sizeof(uint32_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + int ids_size; + if(format == 0) { + ids_size = sizeof(int8_t) * 2 * glyph_entries; + } + else { + ids_size = sizeof(int16_t) * 2 * glyph_entries; + } + + uint8_t * glyph_ids = lv_mem_alloc(ids_size); + int8_t * values = lv_mem_alloc(glyph_entries); + + kern_pair->glyph_ids_size = format; + kern_pair->pair_cnt = glyph_entries; + kern_pair->glyph_ids = glyph_ids; + kern_pair->values = values; + + if(lv_fs_read(fp, glyph_ids, ids_size, NULL) != LV_FS_RES_OK) { + return -1; + } + + if(lv_fs_read(fp, values, glyph_entries, NULL) != LV_FS_RES_OK) { + return -1; + } + } + else if(3 == kern_format_type) { /* array M*N of classes */ + + lv_font_fmt_txt_kern_classes_t * kern_classes = lv_mem_alloc(sizeof(lv_font_fmt_txt_kern_classes_t)); + + memset(kern_classes, 0, sizeof(lv_font_fmt_txt_kern_classes_t)); + + font_dsc->kern_dsc = kern_classes; + font_dsc->kern_classes = 1; + + uint16_t kern_class_mapping_length; + uint8_t kern_table_rows; + uint8_t kern_table_cols; + + if(lv_fs_read(fp, &kern_class_mapping_length, sizeof(uint16_t), NULL) != LV_FS_RES_OK || + lv_fs_read(fp, &kern_table_rows, sizeof(uint8_t), NULL) != LV_FS_RES_OK || + lv_fs_read(fp, &kern_table_cols, sizeof(uint8_t), NULL) != LV_FS_RES_OK) { + return -1; + } + + int kern_values_length = sizeof(int8_t) * kern_table_rows * kern_table_cols; + + uint8_t * kern_left = lv_mem_alloc(kern_class_mapping_length); + uint8_t * kern_right = lv_mem_alloc(kern_class_mapping_length); + int8_t * kern_values = lv_mem_alloc(kern_values_length); + + kern_classes->left_class_mapping = kern_left; + kern_classes->right_class_mapping = kern_right; + kern_classes->left_class_cnt = kern_table_rows; + kern_classes->right_class_cnt = kern_table_cols; + kern_classes->class_pair_values = kern_values; + + if(lv_fs_read(fp, kern_left, kern_class_mapping_length, NULL) != LV_FS_RES_OK || + lv_fs_read(fp, kern_right, kern_class_mapping_length, NULL) != LV_FS_RES_OK || + lv_fs_read(fp, kern_values, kern_values_length, NULL) != LV_FS_RES_OK) { + return -1; + } + } + else { + LV_LOG_WARN("Unknown kern_format_type: %d", kern_format_type); + return -1; + } + + return kern_length; +} + +#endif /*LV_USE_FILESYSTEM*/ + diff --git a/src/lv_font/lv_font_loader.h b/src/lv_font/lv_font_loader.h new file mode 100644 index 000000000..126ae5def --- /dev/null +++ b/src/lv_font/lv_font_loader.h @@ -0,0 +1,44 @@ +/** + * @file lv_font_loader.h + * + */ + +#ifndef LV_FONT_LOADER_H +#define LV_FONT_LOADER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +#if LV_USE_FILESYSTEM + +lv_font_t * lv_font_load(const char * fontName); +void lv_font_free(lv_font_t * font); + +#endif + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_FONT_LOADER_H*/ diff --git a/src/lv_misc/lv_anim.c b/src/lv_misc/lv_anim.c index dbe1b970b..ed3fd7929 100644 --- a/src/lv_misc/lv_anim.c +++ b/src/lv_misc/lv_anim.c @@ -475,8 +475,11 @@ static void anim_task(lv_task_t * param) if(a->path.cb) new_value = a->path.cb(&a->path, a); else new_value = lv_anim_path_linear(&a->path, a); - /*Apply the calculated value*/ - if(a->exec_cb) a->exec_cb(a->var, new_value); + if(new_value != a->current) { + a->current = new_value; + /*Apply the calculated value*/ + if(a->exec_cb) a->exec_cb(a->var, new_value); + } /*If the time is elapsed the animation is ready*/ if(a->act_time >= a->time) { diff --git a/src/lv_misc/lv_anim.h b/src/lv_misc/lv_anim.h index 1a84087b7..e48dae50f 100644 --- a/src/lv_misc/lv_anim.h +++ b/src/lv_misc/lv_anim.h @@ -82,6 +82,7 @@ typedef struct _lv_anim_t { lv_anim_ready_cb_t ready_cb; /**< Call it when the animation is ready*/ lv_anim_path_t path; /**< Describe the path (curve) of animations*/ int32_t start; /**< Start value*/ + int32_t current; /**< Current value */ int32_t end; /**< End value*/ int32_t time; /**< Animation time in ms*/ int32_t act_time; /**< Current time in animation. Set to negative to make delay.*/ @@ -171,6 +172,7 @@ static inline void lv_anim_set_delay(lv_anim_t * a, uint32_t delay) static inline void lv_anim_set_values(lv_anim_t * a, lv_anim_value_t start, lv_anim_value_t end) { a->start = start; + a->current = start; a->end = end; } diff --git a/src/lv_misc/lv_math.c b/src/lv_misc/lv_math.c index 230d79990..b0ecfaad7 100644 --- a/src/lv_misc/lv_math.c +++ b/src/lv_misc/lv_math.c @@ -128,7 +128,6 @@ LV_ATTRIBUTE_FAST_MEM void _lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask q->f = (uint32_t)(root & 0xf) << 4; } - /** * Calculate the atan2 of a vector. * @param x @@ -232,6 +231,32 @@ int64_t _lv_pow(int64_t base, int8_t exp) return result; } +/** + * Get the mapped of a number given an input and output range + * @param x integer which mapped value should be calculated + * @param min_in min input range + * @param max_in max input range + * @param min_out max output range + * @param max_out max output range + * @return the mapped number + */ +int16_t _lv_map(int32_t x, int32_t min_in, int32_t max_in, int32_t min_out, int32_t max_out) +{ + if(x <= min_in) return min_out; + if(x >= max_in) return max_out; + + /* The equation should be: + * ((x - min_in) / delta in) * delta_out + min_out + * To avoid rounding error reorder the operations: + * (((x - min_in) * delta_out) / delta in) + min_out + */ + + int32_t delta_in = max_in - min_in; + int32_t delta_out = max_out - min_out; + + return ((x - min_in) * delta_out) / delta_in + min_out; +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/lv_misc/lv_math.h b/src/lv_misc/lv_math.h index 499176244..d4d626ef9 100644 --- a/src/lv_misc/lv_math.h +++ b/src/lv_misc/lv_math.h @@ -112,6 +112,17 @@ LV_ATTRIBUTE_FAST_MEM void _lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask */ int64_t _lv_pow(int64_t base, int8_t exp); +/** + * Get the mapped of a number given an input and output range + * @param x integer which mapped value should be calculated + * @param min_in min input range + * @param max_in max input range + * @param min_out max output range + * @param max_out max output range + * @return the mapped number + */ +int16_t _lv_map(int32_t x, int32_t min_in, int32_t max_in, int32_t min, int32_t max); + /********************** * MACROS **********************/ diff --git a/src/lv_themes/lv_theme.h b/src/lv_themes/lv_theme.h index 8297b0b53..3647f48f0 100644 --- a/src/lv_themes/lv_theme.h +++ b/src/lv_themes/lv_theme.h @@ -109,6 +109,9 @@ typedef enum { #if LV_USE_ROLLER LV_THEME_ROLLER, #endif +#if LV_USE_ROTARY + LV_THEME_ROTARY, +#endif #if LV_USE_SLIDER LV_THEME_SLIDER, #endif diff --git a/src/lv_themes/lv_theme_material.c b/src/lv_themes/lv_theme_material.c index 128cdd1f0..435cdf49f 100644 --- a/src/lv_themes/lv_theme_material.c +++ b/src/lv_themes/lv_theme_material.c @@ -86,6 +86,7 @@ typedef struct { #if LV_USE_ARC lv_style_t arc_indic; lv_style_t arc_bg; + lv_style_t arc_knob; #endif #if LV_USE_BAR @@ -505,6 +506,14 @@ static void arc_init(void) lv_style_set_line_color(&styles->arc_bg, LV_STATE_DEFAULT, COLOR_BG_SEC); lv_style_set_line_width(&styles->arc_bg, LV_STATE_DEFAULT, LV_DPX(25)); lv_style_set_line_rounded(&styles->arc_bg, LV_STATE_DEFAULT, true); + + style_init_reset(&styles->arc_knob); + lv_style_set_radius(&styles->arc_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE); + lv_style_set_pad_top(&styles->arc_knob, LV_STATE_DEFAULT, LV_DPX(0)); + lv_style_set_pad_bottom(&styles->arc_knob, LV_STATE_DEFAULT, LV_DPX(0)); + lv_style_set_pad_left(&styles->arc_knob, LV_STATE_DEFAULT, LV_DPX(0)); + lv_style_set_pad_right(&styles->arc_knob, LV_STATE_DEFAULT, LV_DPX(0)); + #endif } @@ -620,6 +629,9 @@ static void checkbox_init(void) lv_style_set_radius(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(4)); lv_style_set_pattern_image(&styles->cb_bullet, LV_STATE_CHECKED, LV_SYMBOL_OK); lv_style_set_pattern_recolor(&styles->cb_bullet, LV_STATE_CHECKED, LV_COLOR_WHITE); + lv_style_set_pattern_opa(&styles->cb_bullet, LV_STATE_DEFAULT, LV_OPA_TRANSP); + lv_style_set_pattern_opa(&styles->cb_bullet, LV_STATE_CHECKED, LV_OPA_COVER); + lv_style_set_transition_prop_3(&styles->cb_bullet, LV_STATE_DEFAULT, LV_STYLE_PATTERN_OPA); lv_style_set_text_font(&styles->cb_bullet, LV_STATE_CHECKED, theme.font_small); lv_style_set_pad_left(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); lv_style_set_pad_right(&styles->cb_bullet, LV_STATE_DEFAULT, LV_DPX(3)); @@ -1059,6 +1071,11 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) list = lv_obj_get_style_list(obj, LV_ARC_PART_INDIC); _lv_style_list_add_style(list, &styles->arc_indic); + + list = lv_obj_get_style_list(obj, LV_ARC_PART_KNOB); + _lv_style_list_add_style(list, &styles->bg); + _lv_style_list_add_style(list, &styles->bg_click); + _lv_style_list_add_style(list, &styles->arc_knob); break; #endif @@ -1185,7 +1202,6 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) break; #endif - #if LV_USE_OBJMASK case LV_THEME_OBJMASK: list = lv_obj_get_style_list(obj, LV_OBJMASK_PART_MAIN); @@ -1368,7 +1384,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) break; } - lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(obj, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } /********************** diff --git a/src/lv_themes/lv_theme_mono.c b/src/lv_themes/lv_theme_mono.c index ba5357088..e9f0f9015 100644 --- a/src/lv_themes/lv_theme_mono.c +++ b/src/lv_themes/lv_theme_mono.c @@ -1023,7 +1023,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) } - lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(obj, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } diff --git a/src/lv_themes/lv_theme_template.c b/src/lv_themes/lv_theme_template.c index 2a22fad4e..722e72e07 100644 --- a/src/lv_themes/lv_theme_template.c +++ b/src/lv_themes/lv_theme_template.c @@ -855,7 +855,7 @@ void theme_apply(lv_theme_t * th, lv_obj_t * obj, lv_theme_style_t name) break; } - lv_obj_refresh_style(obj, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(obj, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } /********************** diff --git a/src/lv_widgets/lv_arc.c b/src/lv_widgets/lv_arc.c index 4dd7d9f45..96311fa6d 100644 --- a/src/lv_widgets/lv_arc.c +++ b/src/lv_widgets/lv_arc.c @@ -9,6 +9,8 @@ #include "lv_arc.h" #if LV_USE_ARC != 0 +#include "../lv_core/lv_group.h" +#include "../lv_core/lv_indev.h" #include "../lv_misc/lv_debug.h" #include "../lv_misc/lv_math.h" #include "../lv_draw/lv_draw_arc.h" @@ -29,7 +31,9 @@ static lv_design_res_t lv_arc_design(lv_obj_t * arc, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_arc_signal(lv_obj_t * arc, lv_signal_t sign, void * param); static lv_style_list_t * lv_arc_get_style(lv_obj_t * arc, uint8_t part); -static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angle); +static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angle, lv_arc_part_t part); +static void get_center(lv_obj_t * arc, lv_point_t * center, lv_coord_t * arc_r); +static void get_knob_area(lv_obj_t * arc, const lv_point_t * center, lv_coord_t r, lv_area_t * knob_area); /********************** * STATIC VARIABLES @@ -78,7 +82,16 @@ lv_obj_t * lv_arc_create(lv_obj_t * par, const lv_obj_t * copy) ext->bg_angle_end = 45; ext->arc_angle_start = 135; ext->arc_angle_end = 270; + ext->type = LV_ARC_TYPE_NORMAL; + ext->cur_value = -1; + ext->min_value = 0; + ext->max_value = 100; + ext->dragging = false; + ext->chg_rate = 540; + ext->last_tick = lv_tick_get(); + ext->last_angle = ext->arc_angle_end; lv_style_list_init(&ext->style_arc); + lv_style_list_init(&ext->style_knob); lv_obj_set_size(arc, LV_DPI, LV_DPI); @@ -88,6 +101,10 @@ lv_obj_t * lv_arc_create(lv_obj_t * par, const lv_obj_t * copy) /*Init the new arc arc*/ if(copy == NULL) { + lv_obj_set_click(arc, true); + lv_obj_add_protect(arc, LV_PROTECT_PRESS_LOST); + lv_obj_set_ext_click_area(arc, LV_DPI / 10, LV_DPI / 10, LV_DPI / 10, LV_DPI / 10); + lv_arc_set_value(arc, ext->min_value); lv_theme_apply(arc, LV_THEME_ARC); } /*Copy an existing arc*/ @@ -97,11 +114,19 @@ lv_obj_t * lv_arc_create(lv_obj_t * par, const lv_obj_t * copy) ext->arc_angle_end = copy_ext->arc_angle_end; ext->bg_angle_start = copy_ext->bg_angle_start; ext->bg_angle_end = copy_ext->bg_angle_end; - + ext->type = copy_ext->type; + ext->cur_value = copy_ext->cur_value; + ext->min_value = copy_ext->min_value; + ext->max_value = copy_ext->max_value; + ext->dragging = copy_ext->dragging; + ext->chg_rate = copy_ext->chg_rate; + ext->last_tick = copy_ext->last_tick; + ext->last_angle = copy_ext->last_angle; + lv_style_list_copy(&ext->style_knob, ©_ext->style_knob); lv_style_list_copy(&ext->style_arc, ©_ext->style_arc); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(arc, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(arc, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("arc created"); @@ -140,11 +165,11 @@ void lv_arc_set_start_angle(lv_obj_t * arc, uint16_t start) } /*Only a smaller incremental move*/ else if(ext->arc_angle_start > ext->arc_angle_end && start > ext->arc_angle_end) { - inv_arc_area(arc, LV_MATH_MIN(ext->arc_angle_start, start), LV_MATH_MAX(ext->arc_angle_start, start)); + inv_arc_area(arc, LV_MATH_MIN(ext->arc_angle_start, start), LV_MATH_MAX(ext->arc_angle_start, start), LV_ARC_PART_INDIC); } /*Only a smaller incremental move*/ else if(ext->arc_angle_start < ext->arc_angle_end && start < ext->arc_angle_end) { - inv_arc_area(arc, LV_MATH_MIN(ext->arc_angle_start, start), LV_MATH_MAX(ext->arc_angle_start, start)); + inv_arc_area(arc, LV_MATH_MIN(ext->arc_angle_start, start), LV_MATH_MAX(ext->arc_angle_start, start), LV_ARC_PART_INDIC); } /*Crossing the start angle makes the whole arc change*/ else { @@ -173,11 +198,11 @@ void lv_arc_set_end_angle(lv_obj_t * arc, uint16_t end) } /*Only a smaller incremental move*/ else if(ext->arc_angle_end > ext->arc_angle_start && end > ext->arc_angle_start) { - inv_arc_area(arc, LV_MATH_MIN(ext->arc_angle_end, end), LV_MATH_MAX(ext->arc_angle_end, end)); + inv_arc_area(arc, LV_MATH_MIN(ext->arc_angle_end, end), LV_MATH_MAX(ext->arc_angle_end, end), LV_ARC_PART_INDIC); } /*Only a smaller incremental move*/ else if(ext->arc_angle_end < ext->arc_angle_start && end < ext->arc_angle_start) { - inv_arc_area(arc, LV_MATH_MIN(ext->arc_angle_end, end), LV_MATH_MAX(ext->arc_angle_end, end)); + inv_arc_area(arc, LV_MATH_MIN(ext->arc_angle_end, end), LV_MATH_MAX(ext->arc_angle_end, end), LV_ARC_PART_INDIC); } /*Crossing the end angle makes the whole arc change*/ else { @@ -203,12 +228,12 @@ void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end) if(start > 360) start -= 360; if(end > (start + 360)) end = start + 360; - inv_arc_area(arc, ext->arc_angle_start, ext->arc_angle_end); + inv_arc_area(arc, ext->arc_angle_start, ext->arc_angle_end, LV_ARC_PART_INDIC); ext->arc_angle_start = start; ext->arc_angle_end = end; - inv_arc_area(arc, ext->arc_angle_start, ext->arc_angle_end); + inv_arc_area(arc, ext->arc_angle_start, ext->arc_angle_end, LV_ARC_PART_INDIC); } /** @@ -230,11 +255,11 @@ void lv_arc_set_bg_start_angle(lv_obj_t * arc, uint16_t start) } /*Only a smaller incremental move*/ else if(ext->bg_angle_start > ext->bg_angle_end && start > ext->bg_angle_end) { - inv_arc_area(arc, LV_MATH_MIN(ext->bg_angle_start, start), LV_MATH_MAX(ext->bg_angle_start, start)); + inv_arc_area(arc, LV_MATH_MIN(ext->bg_angle_start, start), LV_MATH_MAX(ext->bg_angle_start, start), LV_ARC_PART_BG); } /*Only a smaller incremental move*/ else if(ext->bg_angle_start < ext->bg_angle_end && start < ext->bg_angle_end) { - inv_arc_area(arc, LV_MATH_MIN(ext->bg_angle_start, start), LV_MATH_MAX(ext->bg_angle_start, start)); + inv_arc_area(arc, LV_MATH_MIN(ext->bg_angle_start, start), LV_MATH_MAX(ext->bg_angle_start, start), LV_ARC_PART_BG); } /*Crossing the start angle makes the whole arc change*/ else { @@ -263,11 +288,11 @@ void lv_arc_set_bg_end_angle(lv_obj_t * arc, uint16_t end) } /*Only a smaller incremental move*/ else if(ext->bg_angle_end > ext->bg_angle_start && end > ext->bg_angle_start) { - inv_arc_area(arc, LV_MATH_MIN(ext->bg_angle_end, end), LV_MATH_MAX(ext->bg_angle_end, end)); + inv_arc_area(arc, LV_MATH_MIN(ext->bg_angle_end, end), LV_MATH_MAX(ext->bg_angle_end, end), LV_ARC_PART_BG); } /*Only a smaller incremental move*/ else if(ext->bg_angle_end < ext->bg_angle_start && end < ext->bg_angle_start) { - inv_arc_area(arc, LV_MATH_MIN(ext->bg_angle_end, end), LV_MATH_MAX(ext->bg_angle_end, end)); + inv_arc_area(arc, LV_MATH_MIN(ext->bg_angle_end, end), LV_MATH_MAX(ext->bg_angle_end, end), LV_ARC_PART_BG); } /*Crossing the end angle makes the whole arc change*/ else { @@ -292,12 +317,12 @@ void lv_arc_set_bg_angles(lv_obj_t * arc, uint16_t start, uint16_t end) if(start > 360) start -= 360; if(end > (start + 360)) end = start + 360; - inv_arc_area(arc, ext->bg_angle_start, ext->bg_angle_end); + inv_arc_area(arc, ext->bg_angle_start, ext->bg_angle_end, LV_ARC_PART_BG); ext->bg_angle_start = start; ext->bg_angle_end = end; - inv_arc_area(arc, ext->bg_angle_start, ext->bg_angle_end); + inv_arc_area(arc, ext->bg_angle_start, ext->bg_angle_end, LV_ARC_PART_BG); } /** @@ -316,6 +341,131 @@ void lv_arc_set_rotation(lv_obj_t * arc, uint16_t rotation_angle) lv_obj_invalidate(arc); } + +/** + * Set the type of arc. + * @param arc pointer to arc object + * @param type arc type + */ +void lv_arc_set_type(lv_obj_t * arc, lv_arc_type_t type) +{ + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + + lv_arc_ext_t *ext = (lv_arc_ext_t *)lv_obj_get_ext_attr(arc); + int16_t val = ext->cur_value; + + ext->type = type; + ext->cur_value = -1; /** Force set_value handling*/ + + int16_t bg_midpoint, bg_end = ext->bg_angle_end; + if (ext->bg_angle_end < ext->bg_angle_start) bg_end = ext->bg_angle_end + 360; + + switch(ext->type) { + case LV_ARC_TYPE_SYMMETRIC: + bg_midpoint = (ext->bg_angle_start + bg_end) / 2; + lv_arc_set_start_angle(arc, bg_midpoint); + lv_arc_set_end_angle(arc, bg_midpoint); + break; + case LV_ARC_TYPE_REVERSE: + lv_arc_set_end_angle(arc, ext->bg_angle_end); + break; + default: /** LV_ARC_TYPE_NORMAL*/ + lv_arc_set_start_angle(arc, ext->bg_angle_start); + } + + lv_arc_set_value(arc, val); +} + +/** + * Set a new value on the arc + * @param arc pointer to a arc object + * @param value new value + */ +void lv_arc_set_value(lv_obj_t * arc, int16_t value) +{ + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + + lv_arc_ext_t * ext = (lv_arc_ext_t *)lv_obj_get_ext_attr(arc); + if(ext->cur_value == value) return; + + int16_t new_value; + new_value = value > ext->max_value ? ext->max_value : value; + new_value = new_value < ext->min_value ? ext->min_value : new_value; + + if(ext->cur_value == new_value) return; + ext->cur_value = new_value; + + int16_t bg_midpoint, range_midpoint, bg_end = ext->bg_angle_end; + if (ext->bg_angle_end < ext->bg_angle_start) bg_end = ext->bg_angle_end + 360; + + int16_t angle; + switch(ext->type) { + case LV_ARC_TYPE_SYMMETRIC: + bg_midpoint = (ext->bg_angle_start + bg_end) / 2; + range_midpoint = (int32_t)(ext->min_value + ext->max_value) / 2; + + if (ext->cur_value < range_midpoint) { + angle = _lv_map(ext->cur_value, ext->min_value, range_midpoint, ext->bg_angle_start, bg_midpoint); + lv_arc_set_start_angle(arc, angle); + lv_arc_set_end_angle(arc, bg_midpoint); + } else { + angle = _lv_map(ext->cur_value, range_midpoint, ext->max_value, bg_midpoint, bg_end); + lv_arc_set_start_angle(arc, bg_midpoint); + lv_arc_set_end_angle(arc, angle); + } + break; + case LV_ARC_TYPE_REVERSE: + angle = _lv_map(ext->cur_value, ext->min_value, ext->max_value, ext->bg_angle_start, bg_end); + lv_arc_set_start_angle(arc, angle); + break; + default: /** LV_ARC_TYPE_NORMAL*/ + angle = _lv_map(ext->cur_value, ext->min_value, ext->max_value, ext->bg_angle_start, bg_end); + lv_arc_set_end_angle(arc, angle); + } + ext->last_angle = angle; /*Cache angle for slew rate limiting*/ +} + +/** + * Set minimum and the maximum values of a arc + * @param arc pointer to the arc object + * @param min minimum value + * @param max maximum value + */ +void lv_arc_set_range(lv_obj_t * arc, int16_t min, int16_t max) +{ + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + + lv_arc_ext_t * ext = (lv_arc_ext_t *)lv_obj_get_ext_attr(arc); + if(ext->min_value == min && ext->max_value == max) return; + + ext->min_value = min; + ext->max_value = max; + + if(ext->cur_value < min) { + ext->cur_value = min; + } + if(ext->cur_value > max) { + ext->cur_value = max; + } + + lv_arc_set_value(arc, ext->cur_value); +} + +/** + * Set the threshold of arc knob increments + * position. + * @param arc pointer to a arc object + * @param threshold increment threshold + */ +void lv_arc_set_chg_rate(lv_obj_t * arc, uint16_t rate) +{ + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + + lv_arc_ext_t *ext = (lv_arc_ext_t *)lv_obj_get_ext_attr(arc); + ext->chg_rate = rate; +} + + /*===================== * Getter functions *====================*/ @@ -376,6 +526,72 @@ uint16_t lv_arc_get_bg_angle_end(lv_obj_t * arc) return ext->bg_angle_end; } + +/** + * Get the value of a arc + * @param arc pointer to a arc object + * @return the value of the arc + */ +int16_t lv_arc_get_value(const lv_obj_t * arc) +{ + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + + lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); + return ext->cur_value; +} + +/** + * Get the minimum value of a arc + * @param arc pointer to a arc object + * @return the minimum value of the arc + */ +int16_t lv_arc_get_min_value(const lv_obj_t * arc) +{ + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + + lv_arc_ext_t *ext = (lv_arc_ext_t *)lv_obj_get_ext_attr(arc); + return ext->min_value; +} + +/** + * Get the maximum value of a arc + * @param arc pointer to a arc object + * @return the maximum value of the arc + */ +int16_t lv_arc_get_max_value(const lv_obj_t * arc) +{ + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + + lv_arc_ext_t *ext = (lv_arc_ext_t *)lv_obj_get_ext_attr(arc); + return ext->max_value; +} + +/** + * Give the arc is being dragged or not + * @param arc pointer to a arc object + * @return true: drag in progress false: not dragged + */ +bool lv_arc_is_dragged(const lv_obj_t * arc) +{ + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + + lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); + return ext->dragging; +} + +/** + * Get whether the arc is type or not. + * @param arc pointer to a arc object + * @return arc type + */ +lv_arc_type_t lv_arc_get_type(const lv_obj_t * arc) +{ + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + + lv_arc_ext_t * ext = (lv_arc_ext_t *)lv_obj_get_ext_attr(arc); + return ext->type; +} + /*===================== * Other functions *====================*/ @@ -414,21 +630,17 @@ static lv_design_res_t lv_arc_design(lv_obj_t * arc, const lv_area_t * clip_area lv_draw_rect(&arc->coords, clip_area, &bg_dsc); - lv_coord_t left_bg = lv_obj_get_style_pad_left(arc, LV_ARC_PART_BG); - lv_coord_t right_bg = lv_obj_get_style_pad_right(arc, LV_ARC_PART_BG); - lv_coord_t top_bg = lv_obj_get_style_pad_top(arc, LV_ARC_PART_BG); - lv_coord_t bottom_bg = lv_obj_get_style_pad_bottom(arc, LV_ARC_PART_BG); - lv_coord_t r = (LV_MATH_MIN(lv_obj_get_width(arc) - left_bg - right_bg, - lv_obj_get_height(arc) - top_bg - bottom_bg)) / 2; - lv_draw_line_dsc_t arc_dsc; - lv_coord_t x = arc->coords.x1 + r + left_bg; - lv_coord_t y = arc->coords.y1 + r + top_bg; + lv_point_t center; + lv_coord_t arc_r; + get_center(arc, ¢er, &arc_r); - if(r > 0) { + /*Draw the background arc*/ + lv_draw_line_dsc_t arc_dsc; + if(arc_r > 0) { lv_draw_line_dsc_init(&arc_dsc); lv_obj_init_draw_line_dsc(arc, LV_ARC_PART_BG, &arc_dsc); - lv_draw_arc(x, y, r, ext->bg_angle_start + ext->rotation_angle, ext->bg_angle_end + ext->rotation_angle, clip_area, + lv_draw_arc(center.x, center.y, arc_r, ext->bg_angle_start + ext->rotation_angle, ext->bg_angle_end + ext->rotation_angle, clip_area, &arc_dsc); } @@ -438,15 +650,25 @@ static lv_design_res_t lv_arc_design(lv_obj_t * arc, const lv_area_t * clip_area lv_coord_t right_indic = lv_obj_get_style_pad_right(arc, LV_ARC_PART_INDIC); lv_coord_t top_indic = lv_obj_get_style_pad_top(arc, LV_ARC_PART_INDIC); lv_coord_t bottom_indic = lv_obj_get_style_pad_bottom(arc, LV_ARC_PART_INDIC); - r -= LV_MATH_MAX4(left_indic, right_indic, top_indic, bottom_indic); + lv_coord_t indic_r = arc_r - LV_MATH_MAX4(left_indic, right_indic, top_indic, bottom_indic); - if(r > 0) { + if(indic_r > 0) { lv_draw_line_dsc_init(&arc_dsc); lv_obj_init_draw_line_dsc(arc, LV_ARC_PART_INDIC, &arc_dsc); - lv_draw_arc(x, y, r, ext->arc_angle_start + ext->rotation_angle, ext->arc_angle_end + ext->rotation_angle, clip_area, + lv_draw_arc(center.x, center.y, indic_r, ext->arc_angle_start + ext->rotation_angle, ext->arc_angle_end + ext->rotation_angle, clip_area, &arc_dsc); } + + lv_area_t knob_area; + get_knob_area(arc, ¢er, arc_r, &knob_area); + + lv_draw_rect_dsc_t knob_rect_dsc; + lv_draw_rect_dsc_init(&knob_rect_dsc); + lv_obj_init_draw_rect_dsc(arc, LV_ARC_PART_KNOB, &knob_rect_dsc); + + lv_draw_rect(&knob_area, clip_area, &knob_rect_dsc); + } /*Post draw when the children are drawn*/ else if(mode == LV_DESIGN_DRAW_POST) { @@ -478,7 +700,119 @@ static lv_res_t lv_arc_signal(lv_obj_t * arc, lv_signal_t sign, void * param) if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); - if(sign == LV_SIGNAL_CLEANUP) { + lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); + + if(sign == LV_SIGNAL_PRESSING) { + lv_indev_t * indev = lv_indev_get_act(); + if(indev == NULL) return res; + + /*Handle only pointers here*/ + lv_indev_type_t indev_type = lv_indev_get_type(indev); + if(indev_type != LV_INDEV_TYPE_POINTER) return res; + + lv_point_t p; + lv_indev_get_point(indev, &p); + + /*Make point relative to the arc's center*/ + lv_point_t center; + lv_coord_t r; + get_center(arc, ¢er, &r); + + p.x -= center.x; + p.y -= center.y; + + /*Enter dragging mode if pressed out of the knob*/ + if(ext->dragging == false) { + lv_coord_t indic_width = lv_obj_get_style_line_width(arc, LV_ARC_PART_INDIC); + r -= indic_width; + r -= r / 2; /*Add some more sensitive area*/ + if(p.x * p.x + p.y * p.y > r * r) { + ext->dragging = true; + ext->last_tick = lv_tick_get(); /*Capture timestamp at dragging start*/ + } + } + + /*It must be in "dragging" mode to turn the arc*/ + if(ext->dragging == false) return res; + + /*Calculate the angle of the pressed point*/ + int16_t angle; + int16_t bg_end = ext->bg_angle_end; + if (ext->bg_angle_end < ext->bg_angle_start) { + bg_end = ext->bg_angle_end + 360; + } + + angle = 360 - _lv_atan2(p.x, p.y) + 90; /*Some transformation is required*/ + if(angle < ext->bg_angle_start) angle = ext->bg_angle_start; + if(angle > bg_end) angle = bg_end; + + /*Calculate the slew rate limited angle based on change rate (degrees/sec)*/ + int16_t delta_angle = angle - ext->last_angle; + uint32_t delta_tick = lv_tick_elaps(ext->last_tick); + int16_t delta_angle_max = (ext->chg_rate * delta_tick) / 1000; + + if (delta_angle > delta_angle_max) { + delta_angle = delta_angle_max; + } else if (delta_angle < -delta_angle_max) { + delta_angle = -delta_angle_max; + } + + angle = ext->last_angle + delta_angle; /*Apply the limited angle change*/ + + /*Rounding for symmetry*/ + int32_t round = ((bg_end - ext->bg_angle_start) * 8) / (ext->max_value - ext->min_value); + round = (round + 4) >> 4; + angle += round; + + /*Set the new value*/ + int16_t old_value = ext->cur_value; + int16_t new_value = _lv_map(angle, ext->bg_angle_start, bg_end, ext->min_value, ext->max_value); + if(new_value != lv_arc_get_value(arc)) { + ext->last_tick = lv_tick_get(); /*Cache timestamp for the next iteration*/ + lv_arc_set_value(arc, new_value); /*set_value caches the last_angle for the next iteration*/ + if(new_value != old_value) { + res = lv_event_send(arc, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return res; + } + } + + /*Don1't let the elapsed time to big while sitting on an end point*/ + if(new_value == ext->min_value || new_value == ext->max_value) { + ext->last_tick = lv_tick_get(); /*Cache timestamp for the next iteration*/ + } + } + else if(sign == LV_SIGNAL_RELEASED || sign == LV_SIGNAL_PRESS_LOST) { + ext->dragging = false; + +#if LV_USE_GROUP + /*Leave edit mode if released. (No need to wait for LONG_PRESS) */ + lv_group_t * g = lv_obj_get_group(arc); + bool editing = lv_group_get_editing(g); + lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); + if(indev_type == LV_INDEV_TYPE_ENCODER) { + if(editing) lv_group_set_editing(g, false); + } +#endif + + } + else if(sign == LV_SIGNAL_CONTROL) { + char c = *((char *)param); + + int16_t old_value = ext->cur_value; + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { + lv_arc_set_value(arc, lv_arc_get_value(arc) + 1); + } + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + lv_arc_set_value(arc, lv_arc_get_value(arc) - 1); + } + + if (old_value != ext->cur_value) { + res = lv_event_send(arc, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return res; + } + } + else if(sign == LV_SIGNAL_CLEANUP) { + lv_obj_clean_style_list(arc, LV_ARC_PART_KNOB); lv_obj_clean_style_list(arc, LV_ARC_PART_INDIC); } @@ -506,6 +840,9 @@ static lv_style_list_t * lv_arc_get_style(lv_obj_t * arc, uint8_t part) case LV_ARC_PART_INDIC: style_dsc_p = &ext->style_arc; break; + case LV_ARC_PART_KNOB: + style_dsc_p = &ext->style_knob; + break; default: style_dsc_p = NULL; } @@ -513,8 +850,11 @@ static lv_style_list_t * lv_arc_get_style(lv_obj_t * arc, uint8_t part) return style_dsc_p; } -static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angle) +static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angle, lv_arc_part_t part) { + /*Skip this complicated invalidation if the arc is not visible*/ + if(lv_obj_is_visible(arc) == false) return; + lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); start_angle += ext->rotation_angle; @@ -533,10 +873,26 @@ static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angl lv_coord_t rout = (LV_MATH_MIN(lv_obj_get_width(arc) - left - right, lv_obj_get_height(arc) - top - bottom)) / 2; lv_coord_t x = arc->coords.x1 + rout + left; lv_coord_t y = arc->coords.y1 + rout + top; - lv_style_int_t w = lv_obj_get_style_line_width(arc, LV_ARC_PART_INDIC); - lv_style_int_t rounded = lv_obj_get_style_line_rounded(arc, LV_ARC_PART_INDIC); + lv_style_int_t w = lv_obj_get_style_line_width(arc, part); + lv_style_int_t rounded = lv_obj_get_style_line_rounded(arc, part); lv_coord_t rin = rout - w; - lv_coord_t extra_area = rounded ? w / 2 + 2 : 0; + lv_coord_t extra_area = 0; + + extra_area = rounded ? w / 2 + 2 : 0; + + if(part == LV_ARC_PART_INDIC && lv_style_list_get_style(&ext->style_knob, 0) != NULL) { + lv_coord_t knob_extra_size = lv_obj_get_draw_rect_ext_pad_size(arc, LV_ARC_PART_KNOB); + + lv_coord_t knob_left = lv_obj_get_style_pad_left(arc, LV_ARC_PART_KNOB); + lv_coord_t knob_right = lv_obj_get_style_pad_right(arc, LV_ARC_PART_KNOB); + lv_coord_t knob_top = lv_obj_get_style_pad_top(arc, LV_ARC_PART_KNOB); + lv_coord_t knob_bottom = lv_obj_get_style_pad_bottom(arc, LV_ARC_PART_KNOB); + + knob_extra_size += LV_MATH_MAX4(knob_left, knob_right, knob_top, knob_bottom); + + extra_area = LV_MATH_MAX(extra_area, w / 2 + 2 + knob_extra_size); + + } lv_area_t inv_area; @@ -617,4 +973,56 @@ static void inv_arc_area(lv_obj_t * arc, uint16_t start_angle, uint16_t end_angl lv_obj_invalidate(arc); } } + +static void get_center(lv_obj_t * arc, lv_point_t * center, lv_coord_t * arc_r) +{ + lv_coord_t left_bg = lv_obj_get_style_pad_left(arc, LV_ARC_PART_BG); + lv_coord_t right_bg = lv_obj_get_style_pad_right(arc, LV_ARC_PART_BG); + lv_coord_t top_bg = lv_obj_get_style_pad_top(arc, LV_ARC_PART_BG); + lv_coord_t bottom_bg = lv_obj_get_style_pad_bottom(arc, LV_ARC_PART_BG); + + lv_coord_t r = (LV_MATH_MIN(lv_obj_get_width(arc) - left_bg - right_bg, + lv_obj_get_height(arc) - top_bg - bottom_bg)) / 2; + + *arc_r = r; + center->x = arc->coords.x1 + r + left_bg; + center->y = arc->coords.y1 + r + top_bg; + + + lv_coord_t indic_width = lv_obj_get_style_line_width(arc, LV_ARC_PART_INDIC); + r -= indic_width; +} + +static void get_knob_area(lv_obj_t * arc, const lv_point_t * center, lv_coord_t r, lv_area_t * knob_area) +{ + lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); + + lv_coord_t indic_width = lv_obj_get_style_line_width(arc, LV_ARC_PART_INDIC); + lv_coord_t indic_width_half = indic_width / 2; + r -= indic_width_half; + + uint16_t angle = ext->rotation_angle; + if(ext->type == LV_ARC_TYPE_NORMAL) { + angle += ext->arc_angle_end; + } else if(ext->type == LV_ARC_TYPE_REVERSE) { + angle += ext->arc_angle_start; + } else if(ext->type == LV_ARC_TYPE_SYMMETRIC) { + int32_t range_midpoint = (int32_t)(ext->min_value + ext->max_value) / 2; + if(ext->cur_value < range_midpoint) angle += ext->arc_angle_start; + else angle += ext->arc_angle_end; + } + lv_coord_t knob_x = (r * _lv_trigo_sin(angle + 90)) >> LV_TRIGO_SHIFT; + lv_coord_t knob_y = (r * _lv_trigo_sin(angle)) >> LV_TRIGO_SHIFT; + + lv_coord_t left_knob = lv_obj_get_style_pad_left(arc, LV_ARC_PART_KNOB); + lv_coord_t right_knob = lv_obj_get_style_pad_right(arc, LV_ARC_PART_KNOB); + lv_coord_t top_knob = lv_obj_get_style_pad_top(arc, LV_ARC_PART_KNOB); + lv_coord_t bottom_knob = lv_obj_get_style_pad_bottom(arc, LV_ARC_PART_KNOB); + + knob_area->x1 = center->x + knob_x - left_knob - indic_width_half; + knob_area->x2 = center->x + knob_x + right_knob + indic_width_half; + knob_area->y1 = center->y + knob_y - top_knob - indic_width_half; + knob_area->y2 = center->y + knob_y + bottom_knob + indic_width_half; +} + #endif diff --git a/src/lv_widgets/lv_arc.h b/src/lv_widgets/lv_arc.h index 10481f405..94f711661 100644 --- a/src/lv_widgets/lv_arc.h +++ b/src/lv_widgets/lv_arc.h @@ -26,6 +26,14 @@ extern "C" { /********************** * TYPEDEFS **********************/ + +enum { + LV_ARC_TYPE_NORMAL, + LV_ARC_TYPE_SYMMETRIC, + LV_ARC_TYPE_REVERSE +}; +typedef uint8_t lv_arc_type_t; + /*Data of arc*/ typedef struct { /*New data for this type */ @@ -35,14 +43,24 @@ typedef struct { uint16_t bg_angle_start; uint16_t bg_angle_end; lv_style_list_t style_arc; + lv_style_list_t style_knob; /* Style of the knob */ + + int16_t cur_value; /*Current value of the arc*/ + int16_t min_value; /*Minimum value of the arc*/ + int16_t max_value; /*Maximum value of the arc*/ + uint16_t dragging :1; + uint16_t type :2; + uint16_t chg_rate; /*Drag angle rate of change of the arc (degrees/sec)*/ + uint32_t last_tick; /*Last dragging event timestamp of the arc*/ + int16_t last_angle; /*Last dragging angle of the arc*/ } lv_arc_ext_t; /*Parts of the arc*/ enum { LV_ARC_PART_BG = LV_OBJ_PART_MAIN, LV_ARC_PART_INDIC, + LV_ARC_PART_KNOB, _LV_ARC_PART_VIRTUAL_LAST, - _LV_ARC_PART_REAL_LAST = _LV_OBJ_PART_REAL_LAST, }; typedef uint8_t lv_arc_part_t; @@ -118,6 +136,45 @@ void lv_arc_set_bg_angles(lv_obj_t * arc, uint16_t start, uint16_t end); */ void lv_arc_set_rotation(lv_obj_t * arc, uint16_t rotation_angle); + +/** + * Set the type of arc. + * @param arc pointer to arc object + * @param type arc type + */ +void lv_arc_set_type(lv_obj_t * arc, lv_arc_type_t type); + +/** + * Set a new value on the arc + * @param arc pointer to a arc object + * @param value new value + */ +void lv_arc_set_value(lv_obj_t * arc, int16_t value); + +/** + * Set minimum and the maximum values of a arc + * @param arc pointer to the arc object + * @param min minimum value + * @param max maximum value + */ +void lv_arc_set_range(lv_obj_t * arc, int16_t min, int16_t max); + +/** + * Reverse arc behavior. The indicator will grow from arc end instead of arc start. + * position. + * @param arc pointer to a arc object + * @param reverse true: enable disable reverse behavior; false: disable + */ +void lv_arc_set_reverse(lv_obj_t * arc, bool reverse); + +/** + * Set the threshold of arc knob increments + * position. + * @param arc pointer to a arc object + * @param threshold increment threshold + */ +void lv_arc_set_chg_rate(lv_obj_t * arc, uint16_t threshold); + /*===================== * Getter functions *====================*/ @@ -150,6 +207,41 @@ uint16_t lv_arc_get_bg_angle_start(lv_obj_t * arc); */ uint16_t lv_arc_get_bg_angle_end(lv_obj_t * arc); +/** + * Get whether the arc is type or not. + * @param arc pointer to a arc object + * @return arc type + */ +lv_arc_type_t lv_arc_get_type(const lv_obj_t * arc); + +/** + * Get the value of the of a arc + * @param arc pointer to a arc object + * @return the value of the of the arc + */ +int16_t lv_arc_get_value(const lv_obj_t * arc); + +/** + * Get the minimum value of a arc + * @param arc pointer to a arc object + * @return the minimum value of the arc + */ +int16_t lv_arc_get_min_value(const lv_obj_t * arc); + +/** + * Get the maximum value of a arc + * @param arc pointer to a arc object + * @return the maximum value of the arc + */ +int16_t lv_arc_get_max_value(const lv_obj_t * arc); + +/** + * Give the arc is being dragged or not + * @param arc pointer to a arc object + * @return true: drag in progress false: not dragged + */ +bool lv_arc_is_dragged(const lv_obj_t * arc); + /*===================== * Other functions *====================*/ diff --git a/src/lv_widgets/lv_bar.c b/src/lv_widgets/lv_bar.c index c30da9f01..acd90fdb2 100644 --- a/src/lv_widgets/lv_bar.c +++ b/src/lv_widgets/lv_bar.c @@ -130,7 +130,7 @@ lv_obj_t * lv_bar_create(lv_obj_t * par, const lv_obj_t * copy) lv_style_list_copy(&ext->style_indic, &ext_copy->style_indic); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(bar, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(bar, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); lv_bar_set_value(bar, ext->cur_value, LV_ANIM_OFF); } diff --git a/src/lv_widgets/lv_btn.c b/src/lv_widgets/lv_btn.c index fa327bd6e..3d5556083 100644 --- a/src/lv_widgets/lv_btn.c +++ b/src/lv_widgets/lv_btn.c @@ -100,7 +100,7 @@ lv_obj_t * lv_btn_create(lv_obj_t * par, const lv_obj_t * copy) ext->checkable = copy_ext->checkable; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(btn, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(btn, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("button created"); diff --git a/src/lv_widgets/lv_btnmatrix.c b/src/lv_widgets/lv_btnmatrix.c index 651281233..8f334225d 100644 --- a/src/lv_widgets/lv_btnmatrix.c +++ b/src/lv_widgets/lv_btnmatrix.c @@ -660,6 +660,7 @@ static lv_design_res_t lv_btnmatrix_design(lv_obj_t * btnm, const lv_area_t * cl lv_draw_label_dsc_t draw_label_tmp_dsc; lv_state_t state_ori = btnm->state; + _lv_obj_disable_style_caching(btnm, true); btnm->state = LV_STATE_DEFAULT; lv_draw_rect_dsc_init(&draw_rect_rel_dsc); lv_draw_label_dsc_init(&draw_label_rel_dsc); @@ -667,6 +668,7 @@ static lv_design_res_t lv_btnmatrix_design(lv_obj_t * btnm, const lv_area_t * cl lv_obj_init_draw_label_dsc(btnm, LV_BTNMATRIX_PART_BTN, &draw_label_rel_dsc); draw_label_rel_dsc.flag = txt_flag; btnm->state = state_ori; + _lv_obj_disable_style_caching(btnm, false); bool chk_inited = false; bool disabled_inited = false; @@ -711,12 +713,14 @@ static lv_design_res_t lv_btnmatrix_design(lv_obj_t * btnm, const lv_area_t * cl else if(btn_state == LV_STATE_CHECKED) { if(!chk_inited) { btnm->state = LV_STATE_CHECKED; + _lv_obj_disable_style_caching(btnm, true); lv_draw_rect_dsc_init(&draw_rect_chk_dsc); lv_draw_label_dsc_init(&draw_label_chk_dsc); lv_obj_init_draw_rect_dsc(btnm, LV_BTNMATRIX_PART_BTN, &draw_rect_chk_dsc); lv_obj_init_draw_label_dsc(btnm, LV_BTNMATRIX_PART_BTN, &draw_label_chk_dsc); draw_label_chk_dsc.flag = txt_flag; btnm->state = state_ori; + _lv_obj_disable_style_caching(btnm, false); chk_inited = true; } draw_rect_dsc_act = &draw_rect_chk_dsc; @@ -725,12 +729,14 @@ static lv_design_res_t lv_btnmatrix_design(lv_obj_t * btnm, const lv_area_t * cl else if(btn_state == LV_STATE_CHECKED) { if(!disabled_inited) { btnm->state = LV_STATE_DISABLED; + _lv_obj_disable_style_caching(btnm, true); lv_draw_rect_dsc_init(&draw_rect_ina_dsc); lv_draw_label_dsc_init(&draw_label_ina_dsc); lv_obj_init_draw_rect_dsc(btnm, LV_BTNMATRIX_PART_BTN, &draw_rect_ina_dsc); lv_obj_init_draw_label_dsc(btnm, LV_BTNMATRIX_PART_BTN, &draw_label_ina_dsc); draw_label_ina_dsc.flag = txt_flag; btnm->state = state_ori; + _lv_obj_disable_style_caching(btnm, false); disabled_inited = true; } draw_rect_dsc_act = &draw_rect_ina_dsc; @@ -912,7 +918,7 @@ static lv_res_t lv_btnmatrix_signal(lv_obj_t * btnm, lv_signal_t sign, void * pa /*Toggle the button if enabled*/ if(button_is_tgl_enabled(ext->ctrl_bits[ext->btn_id_pr]) && !button_is_inactive(ext->ctrl_bits[ext->btn_id_pr])) { - if(button_get_tgl_state(ext->ctrl_bits[ext->btn_id_pr])) { + if(button_get_tgl_state(ext->ctrl_bits[ext->btn_id_pr]) && !ext->one_check) { ext->ctrl_bits[ext->btn_id_pr] &= (~LV_BTNMATRIX_CTRL_CHECK_STATE); } else { diff --git a/src/lv_widgets/lv_calendar.c b/src/lv_widgets/lv_calendar.c index 9936b624b..a95e08c2d 100644 --- a/src/lv_widgets/lv_calendar.c +++ b/src/lv_widgets/lv_calendar.c @@ -705,6 +705,7 @@ static void draw_header(lv_obj_t * calendar, const lv_area_t * mask) strcpy(&txt_buf[5], get_month_name(calendar, ext->showed_date.month)); calendar->state = LV_STATE_DEFAULT; + _lv_obj_disable_style_caching(calendar, true); lv_draw_label_dsc_t label_dsc; lv_draw_label_dsc_init(&label_dsc); @@ -738,6 +739,7 @@ static void draw_header(lv_obj_t * calendar, const lv_area_t * mask) lv_draw_label(&header_area, mask, &label_dsc, LV_SYMBOL_RIGHT, NULL); calendar->state = state_ori; /*Restore the state*/ + _lv_obj_disable_style_caching(calendar, false); } /** @@ -810,6 +812,7 @@ static void draw_dates(lv_obj_t * calendar, const lv_area_t * clip_area) /*The state changes without re-caching the styles, disable the use of cache*/ lv_state_t state_ori = calendar->state; calendar->state = LV_STATE_DEFAULT; + _lv_obj_disable_style_caching(calendar, true); lv_state_t month_state = LV_STATE_DISABLED; @@ -856,6 +859,7 @@ static void draw_dates(lv_obj_t * calendar, const lv_area_t * clip_area) if(box_area.y1 > clip_area->y2) { calendar->state = state_ori; + _lv_obj_disable_style_caching(calendar, false); return; } @@ -926,6 +930,7 @@ static void draw_dates(lv_obj_t * calendar, const lv_area_t * clip_area) } } calendar->state = state_ori; + _lv_obj_disable_style_caching(calendar, false); } diff --git a/src/lv_widgets/lv_chart.c b/src/lv_widgets/lv_chart.c index c77ecd858..86cf13b03 100644 --- a/src/lv_widgets/lv_chart.c +++ b/src/lv_widgets/lv_chart.c @@ -152,7 +152,7 @@ lv_obj_t * lv_chart_create(lv_obj_t * par, const lv_obj_t * copy) _lv_memcpy(&ext->secondary_y_axis, &ext_copy->secondary_y_axis, sizeof(lv_chart_axis_cfg_t)); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(chart, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(chart, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("chart created"); diff --git a/src/lv_widgets/lv_cont.c b/src/lv_widgets/lv_cont.c index ffb716832..04a81343e 100644 --- a/src/lv_widgets/lv_cont.c +++ b/src/lv_widgets/lv_cont.c @@ -112,7 +112,7 @@ lv_obj_t * lv_cont_create(lv_obj_t * par, const lv_obj_t * copy) ext->layout = copy_ext->layout; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(cont, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(cont, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("container created"); diff --git a/src/lv_widgets/lv_cpicker.c b/src/lv_widgets/lv_cpicker.c index 3325fcf9f..49efb9bd5 100644 --- a/src/lv_widgets/lv_cpicker.c +++ b/src/lv_widgets/lv_cpicker.c @@ -151,7 +151,7 @@ lv_obj_t * lv_cpicker_create(lv_obj_t * par, const lv_obj_t * copy) lv_style_list_copy(&ext->knob.style_list, ©_ext->knob.style_list); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(cpicker, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(cpicker, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } refr_knob_pos(cpicker); diff --git a/src/lv_widgets/lv_dropdown.c b/src/lv_widgets/lv_dropdown.c index c7bbd8746..6d53b2f3b 100644 --- a/src/lv_widgets/lv_dropdown.c +++ b/src/lv_widgets/lv_dropdown.c @@ -609,7 +609,7 @@ void lv_dropdown_open(lv_obj_t * ddlist) lv_style_list_copy(lv_obj_get_style_list(ext->page, LV_PAGE_PART_BG), &ext->style_page); lv_style_list_copy(lv_obj_get_style_list(ext->page, LV_PAGE_PART_SCROLLBAR), &ext->style_scrlbar); lv_obj_clean_style_list(ext->page, LV_PAGE_PART_SCROLLABLE); - lv_obj_refresh_style(ext->page, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(ext->page, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); lv_obj_t * label = lv_label_create(ext->page, NULL); lv_label_set_text_static(label, ext->options); @@ -965,7 +965,7 @@ static lv_res_t lv_dropdown_signal(lv_obj_t * ddlist, lv_signal_t sign, void * p const lv_font_t * font = lv_obj_get_style_text_font(ddlist, LV_DROPDOWN_PART_MAIN); lv_obj_set_height(ddlist, top + bottom + lv_font_get_line_height(font)); - if(ext->page) lv_obj_refresh_style(ext->page, LV_STYLE_PROP_ALL); + if(ext->page) lv_obj_refresh_style(ext->page, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } else if(sign == LV_SIGNAL_CONTROL) { #if LV_USE_GROUP @@ -1134,8 +1134,10 @@ static void draw_box(lv_obj_t * ddlist, const lv_area_t * clip_area, uint16_t id lv_obj_t * page = ext->page; lv_state_t state_orig = page->state; - page->state = LV_STATE_DEFAULT; - page->state |= state; + if(state != page->state) { + _lv_obj_disable_style_caching(ddlist, true); + page->state = state; + } /*Draw a rectangle under the selected item*/ const lv_font_t * font = lv_obj_get_style_text_font(ddlist, LV_DROPDOWN_PART_LIST); @@ -1159,6 +1161,7 @@ static void draw_box(lv_obj_t * ddlist, const lv_area_t * clip_area, uint16_t id lv_draw_rect(&rect_area, clip_area, &sel_rect); page->state = state_orig; + _lv_obj_disable_style_caching(ddlist, false); } @@ -1169,8 +1172,10 @@ static void draw_box_label(lv_obj_t * ddlist, const lv_area_t * clip_area, uint1 lv_obj_t * page = ext->page; lv_state_t state_orig = page->state; - page->state = LV_STATE_DEFAULT; - page->state |= state; + if(state != page->state) { + page->state = state; + _lv_obj_disable_style_caching(ddlist, true); + } lv_draw_label_dsc_t label_dsc; lv_draw_label_dsc_init(&label_dsc); @@ -1204,6 +1209,7 @@ static void draw_box_label(lv_obj_t * ddlist, const lv_area_t * clip_area, uint1 lv_draw_label(&label->coords, &mask_sel, &label_dsc, lv_label_get_text(label), NULL); } page->state = state_orig; + _lv_obj_disable_style_caching(ddlist, false); } /** diff --git a/src/lv_widgets/lv_gauge.c b/src/lv_widgets/lv_gauge.c index df2d5c0ea..f7f47dc40 100644 --- a/src/lv_widgets/lv_gauge.c +++ b/src/lv_widgets/lv_gauge.c @@ -124,7 +124,7 @@ lv_obj_t * lv_gauge_create(lv_obj_t * par, const lv_obj_t * copy) ext->format_cb = copy_ext->format_cb; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(gauge, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(gauge, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("gauge created"); diff --git a/src/lv_widgets/lv_img.c b/src/lv_widgets/lv_img.c index aaeb59d5c..99fa31ae6 100644 --- a/src/lv_widgets/lv_img.c +++ b/src/lv_widgets/lv_img.c @@ -121,7 +121,7 @@ lv_obj_t * lv_img_create(lv_obj_t * par, const lv_obj_t * copy) lv_img_set_src(img, copy_ext->src); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(img, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(img, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("image created"); diff --git a/src/lv_widgets/lv_imgbtn.c b/src/lv_widgets/lv_imgbtn.c index 5cdc8e15a..6caa98f19 100644 --- a/src/lv_widgets/lv_imgbtn.c +++ b/src/lv_widgets/lv_imgbtn.c @@ -100,7 +100,7 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy) #endif ext->tiled = copy_ext->tiled; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(imgbtn, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(imgbtn, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("image button created"); diff --git a/src/lv_widgets/lv_label.c b/src/lv_widgets/lv_label.c index 1113a6b10..65e6397f6 100644 --- a/src/lv_widgets/lv_label.c +++ b/src/lv_widgets/lv_label.c @@ -161,7 +161,7 @@ lv_obj_t * lv_label_create(lv_obj_t * par, const lv_obj_t * copy) ext->dot_end = copy_ext->dot_end; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_label, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(new_label, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("label created"); diff --git a/src/lv_widgets/lv_led.c b/src/lv_widgets/lv_led.c index 53c679c2f..dea778d7d 100644 --- a/src/lv_widgets/lv_led.c +++ b/src/lv_widgets/lv_led.c @@ -88,7 +88,7 @@ lv_obj_t * lv_led_create(lv_obj_t * par, const lv_obj_t * copy) ext->bright = copy_ext->bright; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(led, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(led, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("led created"); diff --git a/src/lv_widgets/lv_line.c b/src/lv_widgets/lv_line.c index e2c53e925..c54a0ecf5 100644 --- a/src/lv_widgets/lv_line.c +++ b/src/lv_widgets/lv_line.c @@ -95,7 +95,7 @@ lv_obj_t * lv_line_create(lv_obj_t * par, const lv_obj_t * copy) lv_line_set_points(line, copy_ext->point_array, copy_ext->point_num); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(line, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(line, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("line created"); diff --git a/src/lv_widgets/lv_linemeter.c b/src/lv_widgets/lv_linemeter.c index 75019ba46..cd7f291c0 100644 --- a/src/lv_widgets/lv_linemeter.c +++ b/src/lv_widgets/lv_linemeter.c @@ -96,7 +96,7 @@ lv_obj_t * lv_linemeter_create(lv_obj_t * par, const lv_obj_t * copy) ext->cur_value = copy_ext->cur_value; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(linemeter, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(linemeter, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("line meter created"); diff --git a/src/lv_widgets/lv_list.c b/src/lv_widgets/lv_list.c index ecda79c9b..e67135ba9 100644 --- a/src/lv_widgets/lv_list.c +++ b/src/lv_widgets/lv_list.c @@ -115,7 +115,7 @@ lv_obj_t * lv_list_create(lv_obj_t * par, const lv_obj_t * copy) } /*Refresh the style with new signal function*/ - lv_obj_refresh_style(list, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(list, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("list created"); diff --git a/src/lv_widgets/lv_msgbox.c b/src/lv_widgets/lv_msgbox.c index 60f4cdc9c..9448bec58 100644 --- a/src/lv_widgets/lv_msgbox.c +++ b/src/lv_widgets/lv_msgbox.c @@ -127,7 +127,7 @@ lv_obj_t * lv_msgbox_create(lv_obj_t * par, const lv_obj_t * copy) if(copy_ext->btnm) ext->btnm = lv_btnmatrix_create(mbox, copy_ext->btnm); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(mbox, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(mbox, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("message box created"); diff --git a/src/lv_widgets/lv_objmask.c b/src/lv_widgets/lv_objmask.c index 2c817fb17..ed22bb30b 100644 --- a/src/lv_widgets/lv_objmask.c +++ b/src/lv_widgets/lv_objmask.c @@ -86,7 +86,7 @@ lv_obj_t * lv_objmask_create(lv_obj_t * par, const lv_obj_t * copy) /* lv_objmask_ext_t * copy_ext = lv_obj_get_ext_attr(copy); */ /*Refresh the style with new signal function*/ - lv_obj_refresh_style(objmask, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(objmask, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("object mask created"); diff --git a/src/lv_widgets/lv_roller.c b/src/lv_widgets/lv_roller.c index 7c67fcb68..8b6818edc 100644 --- a/src/lv_widgets/lv_roller.c +++ b/src/lv_widgets/lv_roller.c @@ -135,7 +135,7 @@ lv_obj_t * lv_roller_create(lv_obj_t * par, const lv_obj_t * copy) lv_obj_set_signal_cb(scrl, lv_roller_scrl_signal); lv_style_list_copy(&ext->style_sel, ©_ext->style_sel); - lv_obj_refresh_style(roller, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(roller, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("roller created"); diff --git a/src/lv_widgets/lv_slider.c b/src/lv_widgets/lv_slider.c index bb83f9298..7e658226d 100644 --- a/src/lv_widgets/lv_slider.c +++ b/src/lv_widgets/lv_slider.c @@ -103,7 +103,7 @@ lv_obj_t * lv_slider_create(lv_obj_t * par, const lv_obj_t * copy) lv_area_copy(&ext->left_knob_area, ©_ext->left_knob_area); lv_area_copy(&ext->right_knob_area, ©_ext->right_knob_area); - lv_obj_refresh_style(slider, LV_OBJ_PART_ALL); + lv_obj_refresh_style(slider, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("slider created"); diff --git a/src/lv_widgets/lv_spinbox.c b/src/lv_widgets/lv_spinbox.c index 669c72d38..1fac9de80 100644 --- a/src/lv_widgets/lv_spinbox.c +++ b/src/lv_widgets/lv_spinbox.c @@ -106,7 +106,7 @@ lv_obj_t * lv_spinbox_create(lv_obj_t * par, const lv_obj_t * copy) lv_spinbox_set_rollover(spinbox, copy_ext->rollover); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(spinbox, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(spinbox, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } lv_spinbox_updatevalue(spinbox); diff --git a/src/lv_widgets/lv_spinner.c b/src/lv_widgets/lv_spinner.c index 16c0e570b..8e0e2dcd0 100644 --- a/src/lv_widgets/lv_spinner.c +++ b/src/lv_widgets/lv_spinner.c @@ -106,7 +106,7 @@ lv_obj_t * lv_spinner_create(lv_obj_t * par, const lv_obj_t * copy) ext->time = copy_ext->time; ext->anim_dir = copy_ext->anim_dir; /*Refresh the style with new signal function*/ - lv_obj_refresh_style(spinner, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(spinner, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } lv_spinner_set_type(spinner, ext->anim_type); diff --git a/src/lv_widgets/lv_switch.c b/src/lv_widgets/lv_switch.c index dfc1aa964..9340f1efa 100644 --- a/src/lv_widgets/lv_switch.c +++ b/src/lv_widgets/lv_switch.c @@ -100,7 +100,7 @@ lv_obj_t * lv_switch_create(lv_obj_t * par, const lv_obj_t * copy) lv_switch_ext_t * copy_ext = lv_obj_get_ext_attr(copy); lv_style_list_copy(&ext->style_knob, ©_ext->style_knob); - lv_obj_refresh_style(sw, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(sw, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } /*Refresh the style with new signal function*/ diff --git a/src/lv_widgets/lv_table.c b/src/lv_widgets/lv_table.c index 7bd8e4c8b..b71135176 100644 --- a/src/lv_widgets/lv_table.c +++ b/src/lv_widgets/lv_table.c @@ -110,7 +110,7 @@ lv_obj_t * lv_table_create(lv_obj_t * par, const lv_obj_t * copy) lv_table_set_col_cnt(table, copy_ext->col_cnt); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(table, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(table, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("table created"); diff --git a/src/lv_widgets/lv_tabview.c b/src/lv_widgets/lv_tabview.c index 0e35e3798..4b5cd0f6e 100644 --- a/src/lv_widgets/lv_tabview.c +++ b/src/lv_widgets/lv_tabview.c @@ -180,11 +180,11 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) LV_PAGE_PART_SCROLLABLE)); lv_style_list_copy(lv_obj_get_style_list(new_tab, LV_PAGE_PART_SCROLLBAR), lv_obj_get_style_list(copy_tab, LV_PAGE_PART_SCROLLBAR)); - lv_obj_refresh_style(new_tab, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(new_tab, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } /*Refresh the style with new signal function*/ - lv_obj_refresh_style(tabview, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(tabview, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } tabview_realign(tabview); diff --git a/src/lv_widgets/lv_textarea.c b/src/lv_widgets/lv_textarea.c index da622df65..545cfaf2c 100644 --- a/src/lv_widgets/lv_textarea.c +++ b/src/lv_widgets/lv_textarea.c @@ -188,7 +188,7 @@ lv_obj_t * lv_textarea_create(lv_obj_t * par, const lv_obj_t * copy) if(copy_ext->one_line) lv_textarea_set_one_line(ta, true); /*Refresh the style with new signal function*/ - lv_obj_refresh_style(ta, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(ta, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } #if LV_USE_ANIMATION diff --git a/src/lv_widgets/lv_tileview.c b/src/lv_widgets/lv_tileview.c index 0ea0f8133..3fa01503c 100644 --- a/src/lv_widgets/lv_tileview.c +++ b/src/lv_widgets/lv_tileview.c @@ -133,7 +133,7 @@ lv_obj_t * lv_tileview_create(lv_obj_t * par, const lv_obj_t * copy) #endif /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_tileview, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(new_tileview, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); } LV_LOG_INFO("tileview created"); diff --git a/src/lv_widgets/lv_win.c b/src/lv_widgets/lv_win.c index 20fbb7426..0e122976d 100644 --- a/src/lv_widgets/lv_win.c +++ b/src/lv_widgets/lv_win.c @@ -156,7 +156,7 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy) } /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_win, LV_STYLE_PROP_ALL); + lv_obj_refresh_style(new_win, LV_OBJ_PART_ALL, LV_STYLE_PROP_ALL); lv_win_realign(new_win); diff --git a/tests/Makefile b/tests/Makefile index 839ee92d0..429862de6 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -30,6 +30,10 @@ CSRCS += lv_test_assert.c CSRCS += lv_test_core/lv_test_core.c CSRCS += lv_test_core/lv_test_obj.c CSRCS += lv_test_core/lv_test_style.c +CSRCS += lv_test_core/lv_test_font_loader.c +CSRCS += lv_test_fonts/font_1.c +CSRCS += lv_test_fonts/font_2.c +CSRCS += lv_test_fonts/font_3.c OBJEXT ?= .o diff --git a/tests/build.py b/tests/build.py index 73a06148f..f014027c7 100755 --- a/tests/build.py +++ b/tests/build.py @@ -120,6 +120,7 @@ minimal_monochrome = { "LV_USE_PAGE":0, "LV_USE_SPINNER":0, "LV_USE_ROLLER":0, + "LV_USE_ROTARY":0, "LV_USE_SLIDER":0, "LV_USE_SPINBOX":0, "LV_USE_SWITCH":0, @@ -196,6 +197,7 @@ all_obj_minimal_features = { "LV_USE_PAGE":1, "LV_USE_SPINNER":0, #Disabled beacsue needs anim "LV_USE_ROLLER":1, + "LV_USE_ROTARY":1, "LV_USE_SLIDER":1, "LV_USE_SPINBOX":1, "LV_USE_SWITCH":1, @@ -274,6 +276,7 @@ all_obj_all_features = { "LV_USE_PAGE":1, "LV_USE_SPINNER":1, "LV_USE_ROLLER":1, + "LV_USE_ROTARY":1, "LV_USE_SLIDER":1, "LV_USE_SPINBOX":1, "LV_USE_SWITCH":1, @@ -365,6 +368,7 @@ advanced_features = { "LV_USE_PAGE":1, "LV_USE_SPINNER":1, "LV_USE_ROLLER":1, + "LV_USE_ROTARY":1, "LV_USE_SLIDER":1, "LV_USE_SPINBOX":1, "LV_USE_SWITCH":1, diff --git a/tests/font_1.fnt b/tests/font_1.fnt new file mode 100644 index 000000000..bc701d5f9 Binary files /dev/null and b/tests/font_1.fnt differ diff --git a/tests/font_2.fnt b/tests/font_2.fnt new file mode 100644 index 000000000..3b648e9d0 Binary files /dev/null and b/tests/font_2.fnt differ diff --git a/tests/font_3.fnt b/tests/font_3.fnt new file mode 100644 index 000000000..43c074d76 Binary files /dev/null and b/tests/font_3.fnt differ diff --git a/tests/lv_test_assert.c b/tests/lv_test_assert.c index a72ac16f3..c4edc0d37 100644 --- a/tests/lv_test_assert.c +++ b/tests/lv_test_assert.c @@ -97,6 +97,15 @@ void lv_test_error(const char * s, ...) exit(1); } +void lv_test_assert_true(int32_t expression, const char * s) +{ + if(!expression) { + lv_test_error(" FAIL: %s. (Expected: not zero)", s, expression); + } else { + lv_test_print(" PASS: %s. (Expected: not zero)", s, expression); + } +} + void lv_test_assert_int_eq(int32_t n_ref, int32_t n_act, const char * s) { if(n_ref != n_act) { @@ -134,6 +143,17 @@ void lv_test_assert_str_eq(const char * s_ref, const char * s_act, const char * } } + +void lv_test_assert_array_eq(const uint8_t *p_ref, const uint8_t *p_act, int32_t size, const char * s) +{ + if(memcmp(p_ref, p_act, size) != 0) { + lv_test_error(" FAIL: %s. (Expected: all %d bytes should be equal)", s, size); + } else { + lv_test_print(" PASS: %s. (Expected: all %d bytes should be equal)", s, size); + } +} + + void lv_test_assert_ptr_eq(const void * p_ref, const void * p_act, const char * s) { if(p_ref != p_act) { diff --git a/tests/lv_test_assert.h b/tests/lv_test_assert.h index 866a6159e..8d006ecf4 100644 --- a/tests/lv_test_assert.h +++ b/tests/lv_test_assert.h @@ -32,6 +32,7 @@ extern "C" { void lv_test_print(const char * s, ...); void lv_test_exit(const char * s, ...); void lv_test_error(const char * s, ...); +void lv_test_assert_true(int32_t expression, const char * s); void lv_test_assert_int_eq(int32_t n1, int32_t n2, const char * s); void lv_test_assert_int_gt(int32_t n_ref, int32_t n_act, const char * s); void lv_test_assert_int_lt(int32_t n_ref, int32_t n_act, const char * s); @@ -39,6 +40,7 @@ void lv_test_assert_str_eq(const char * str1, const char * str2, const char * s) void lv_test_assert_ptr_eq(const void * p_ref, const void * p_act, const char * s); void lv_test_assert_color_eq(lv_color_t c_ref, lv_color_t c_act, const char * s); void lv_test_assert_img_eq(const char * ref_img_fn, const char * s); +void lv_test_assert_array_eq(const uint8_t *p_ref, const uint8_t *p_act, int32_t size, const char * s); /********************** * MACROS diff --git a/tests/lv_test_core/lv_test_core.c b/tests/lv_test_core/lv_test_core.c index f74f81611..37f65464b 100644 --- a/tests/lv_test_core/lv_test_core.c +++ b/tests/lv_test_core/lv_test_core.c @@ -12,6 +12,7 @@ #include "lv_test_core.h" #include "lv_test_obj.h" #include "lv_test_style.h" +#include "lv_test_font_loader.h" /********************* * DEFINES @@ -46,6 +47,7 @@ void lv_test_core(void) lv_test_obj(); lv_test_style(); + lv_test_font_loader(); } diff --git a/tests/lv_test_core/lv_test_font_loader.c b/tests/lv_test_core/lv_test_font_loader.c new file mode 100644 index 000000000..ea0fc2753 --- /dev/null +++ b/tests/lv_test_core/lv_test_font_loader.c @@ -0,0 +1,213 @@ +/** + * @file lv_test_font_loader.c + * + */ + +/********************* + * INCLUDES + *********************/ + +#include "../lv_test_assert.h" +#if LV_BUILD_TEST +#include "../lvgl.h" +#include "../src/lv_font/lv_font_fmt_txt.h" +#include "../src/lv_font/lv_font.h" +#include "../src/lv_font/lv_font_loader.h" + +#include "lv_test_font_loader.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +#if LV_USE_FILESYSTEM +static int compare_fonts(lv_font_t * f1, lv_font_t * f2); +#endif + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +extern lv_font_t font_1; +extern lv_font_t font_2; +extern lv_font_t font_3; + +void lv_test_font_loader(void) +{ +#if LV_USE_FILESYSTEM + lv_font_t * font_1_bin = lv_font_load("f:font_1.fnt"); + lv_font_t * font_2_bin = lv_font_load("f:font_2.fnt"); + lv_font_t * font_3_bin = lv_font_load("f:font_3.fnt"); + + compare_fonts(&font_1, font_1_bin); + compare_fonts(&font_2, font_2_bin); + compare_fonts(&font_3, font_3_bin); + + lv_font_free(font_1_bin); + lv_font_free(font_2_bin); + lv_font_free(font_3_bin); +#endif +} + +#if LV_USE_FILESYSTEM +static int compare_fonts(lv_font_t * f1, lv_font_t * f2) +{ + lv_test_assert_true(f1 != NULL && f2 != NULL, "font not null"); + + lv_test_assert_ptr_eq(f1->get_glyph_dsc, f2->get_glyph_dsc, "glyph_dsc"); + lv_test_assert_ptr_eq(f1->get_glyph_bitmap, f2->get_glyph_bitmap, "glyph_bitmap"); + lv_test_assert_int_eq(f1->line_height, f2->line_height, "line_height"); + lv_test_assert_int_eq(f1->base_line, f2->base_line, "base_line"); +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + lv_test_assert_int_eq(f1->subpx, f2->subpx, "subpx"); +#endif + lv_font_fmt_txt_dsc_t * dsc1 = (lv_font_fmt_txt_dsc_t *) f1->dsc; + lv_font_fmt_txt_dsc_t * dsc2 = (lv_font_fmt_txt_dsc_t *) f2->dsc; + + lv_test_assert_int_eq(dsc1->kern_scale, dsc2->kern_scale, "kern_scale"); + lv_test_assert_int_eq(dsc1->cmap_num, dsc2->cmap_num, "cmap_num"); + lv_test_assert_int_eq(dsc1->bpp, dsc2->bpp, "bpp"); + lv_test_assert_int_eq(dsc1->kern_classes, dsc2->kern_classes, "kern_classes"); + lv_test_assert_int_eq(dsc1->bitmap_format, dsc2->bitmap_format, "bitmap_format"); + + // cmaps + int total_glyphs = 0; + for(int i = 0; i < dsc1->cmap_num; ++i) { + lv_font_fmt_txt_cmap_t * cmaps1 = (lv_font_fmt_txt_cmap_t *) &dsc1->cmaps[i]; + lv_font_fmt_txt_cmap_t * cmaps2 = (lv_font_fmt_txt_cmap_t *) &dsc2->cmaps[i]; + + lv_test_assert_int_eq(cmaps1->range_start, cmaps2->range_start, "range_start"); + lv_test_assert_int_eq(cmaps1->range_length, cmaps2->range_length, "range_length"); + lv_test_assert_int_eq(cmaps1->glyph_id_start, cmaps2->glyph_id_start, "glyph_id_start"); + lv_test_assert_int_eq(cmaps1->type, cmaps2->type, "type"); + lv_test_assert_int_eq(cmaps1->list_length, cmaps2->list_length, "list_length"); + + if(cmaps1->unicode_list != NULL && cmaps2->unicode_list != NULL) { + lv_test_assert_true(cmaps1->unicode_list && cmaps2->unicode_list, "unicode_list"); + + lv_test_assert_array_eq( + (uint8_t *) cmaps1->unicode_list, + (uint8_t *) cmaps2->unicode_list, + sizeof(uint16_t) * cmaps1->list_length, + "unicode_list"); + total_glyphs += cmaps1->list_length; + } + else { + total_glyphs += cmaps1->range_length; + lv_test_assert_ptr_eq(cmaps1->unicode_list, cmaps2->unicode_list, "unicode_list"); + } + + if(cmaps1->glyph_id_ofs_list != NULL && cmaps2->glyph_id_ofs_list != NULL) { + uint8_t * ids1 = (uint8_t *) cmaps1->glyph_id_ofs_list; + uint8_t * ids2 = (uint8_t *) cmaps2->glyph_id_ofs_list; + + lv_test_assert_array_eq(ids1, ids2, cmaps1->list_length, "glyph_id_ofs_list"); + } + else { + lv_test_assert_ptr_eq(cmaps1->glyph_id_ofs_list, cmaps2->glyph_id_ofs_list, "glyph_id_ofs_list"); + } + } + + // kern_dsc + if (dsc1->kern_classes == 1 && dsc2->kern_classes == 1) { + lv_font_fmt_txt_kern_classes_t * kern1 = (lv_font_fmt_txt_kern_classes_t *) dsc1->kern_dsc; + lv_font_fmt_txt_kern_classes_t * kern2 = (lv_font_fmt_txt_kern_classes_t *) dsc2->kern_dsc; + if (kern1 != NULL && kern2 != NULL) { + lv_test_assert_int_eq(kern1->right_class_cnt, kern2->right_class_cnt, "right_class_cnt"); + lv_test_assert_int_eq(kern1->left_class_cnt, kern2->left_class_cnt, "left_class_cnt"); + + lv_test_assert_array_eq( + (uint8_t *) kern1->left_class_mapping, + (uint8_t *) kern2->left_class_mapping, + kern1->left_class_cnt, + "left_class_mapping"); + + lv_test_assert_array_eq( + (uint8_t *) kern1->right_class_mapping, + (uint8_t *) kern2->right_class_mapping, + kern1->right_class_cnt, + "right_class_mapping"); + + lv_test_assert_array_eq( + (uint8_t *) kern1->class_pair_values, + (uint8_t *) kern2->class_pair_values, + kern1->right_class_cnt * kern1->left_class_cnt, + "class_pair_values"); + } + else { + lv_test_assert_ptr_eq(kern1, kern2, "kern"); + } + } + else if (dsc1->kern_classes == 0 && dsc2->kern_classes == 0) { + lv_font_fmt_txt_kern_pair_t * kern1 = (lv_font_fmt_txt_kern_pair_t *) dsc1->kern_dsc; + lv_font_fmt_txt_kern_pair_t * kern2 = (lv_font_fmt_txt_kern_pair_t *) dsc2->kern_dsc; + if (kern1 != NULL && kern2 != NULL) { + lv_test_assert_int_eq(kern1->glyph_ids_size, kern2->glyph_ids_size, "glyph_ids_size"); + lv_test_assert_int_eq(kern1->pair_cnt, kern2->pair_cnt, "pair_cnt"); + + int ids_size; + + if (kern1->glyph_ids_size == 0) { + ids_size = sizeof(int8_t) * 2 * kern1->pair_cnt; + } + else { + ids_size = sizeof(int16_t) * 2 * kern1->pair_cnt; + } + + lv_test_assert_array_eq(kern1->glyph_ids, kern2->glyph_ids, ids_size, "glyph_ids"); + lv_test_assert_array_eq( + (uint8_t * ) kern1->values, + (uint8_t * ) kern2->values, + kern1->pair_cnt, + "glyph_values"); + } + } + + lv_font_fmt_txt_glyph_dsc_t * glyph_dsc1 = (lv_font_fmt_txt_glyph_dsc_t *) dsc1->glyph_dsc; + lv_font_fmt_txt_glyph_dsc_t * glyph_dsc2 = (lv_font_fmt_txt_glyph_dsc_t *) dsc2->glyph_dsc; + + for(int i = 0; i < total_glyphs; ++i) { + if (i < total_glyphs - 1) { + int size1 = glyph_dsc1[i+1].bitmap_index - glyph_dsc1[i].bitmap_index; + + if (size1 > 0) { + lv_test_assert_array_eq( + dsc1->glyph_bitmap + glyph_dsc1[i].bitmap_index, + dsc2->glyph_bitmap + glyph_dsc2[i].bitmap_index, + size1 - 1, "glyph_bitmap"); + } + } + lv_test_assert_int_eq(glyph_dsc1[i].adv_w, glyph_dsc2[i].adv_w, "adv_w"); + lv_test_assert_int_eq(glyph_dsc1[i].box_w, glyph_dsc2[i].box_w, "box_w"); + lv_test_assert_int_eq(glyph_dsc1[i].box_h, glyph_dsc2[i].box_h, "box_h"); + lv_test_assert_int_eq(glyph_dsc1[i].ofs_x, glyph_dsc2[i].ofs_x, "ofs_x"); + lv_test_assert_int_eq(glyph_dsc1[i].ofs_y, glyph_dsc2[i].ofs_y, "ofs_y"); + } + + LV_LOG_INFO("No differences found!"); + return 0; +} +#endif + +/********************** + * STATIC FUNCTIONS + **********************/ + +#endif // LV_BUILD_TEST + diff --git a/tests/lv_test_core/lv_test_font_loader.h b/tests/lv_test_core/lv_test_font_loader.h new file mode 100644 index 000000000..fe29926bf --- /dev/null +++ b/tests/lv_test_core/lv_test_font_loader.h @@ -0,0 +1,39 @@ +/** + * @file lv_font_loader.h + * + */ + +#ifndef LV_TEST_FONT_LOADER_H +#define LV_TEST_FONT_LOADER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_test_font_loader(void); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_TEST_FONT_LOADER_H*/ + diff --git a/tests/lv_test_fonts/font_1.c b/tests/lv_test_fonts/font_1.c new file mode 100644 index 000000000..e94b63ff3 --- /dev/null +++ b/tests/lv_test_fonts/font_1.c @@ -0,0 +1,1383 @@ +#include "lvgl/lvgl.h" + +/******************************************************************************* + * Size: 8 px + * Bpp: 4 + * Opts: --bpp 4 --size 8 --font ../Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font ../FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format lvgl -o ..\generated_fonts/font_1.c + ******************************************************************************/ + +#ifndef FONT_1 +#define FONT_1 1 +#endif + +#if FONT_1 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { + /* U+20 " " */ + + /* U+21 "!" */ + 0x58, 0xf, 0x11, 0x32, 0xb2, 0x80, + + /* U+22 "\"" */ + 0x73, 0x90, 0x10, 0x72, 0x90, + + /* U+23 "#" */ + 0x4, 0x52, 0x60, 0x4f, 0xc9, 0xc3, 0x43, 0x9c, + 0x83, 0x64, 0x8b, 0xa1, 0x65, 0x85, 0x81, + + /* U+24 "$" */ + 0x0, 0x40, 0x0, 0xad, 0x68, 0x97, 0x56, 0x89, + 0xf9, 0x60, 0x42, 0x17, 0x21, 0x69, 0x7e, 0x96, + 0x96, 0xcc, + + /* U+25 "%" */ + 0x58, 0x70, 0x63, 0xd, 0x8f, 0x30, 0x30, 0xa7, + 0xdb, 0x7, 0x12, 0x7d, 0xa1, 0x57, 0x6, 0xa2, + 0xfa, 0x40, + + /* U+26 "&" */ + 0x9, 0x98, 0x2, 0x2a, 0x30, 0x0, 0x97, 0xc1, + 0x4, 0xd6, 0xc4, 0x2, 0xe6, 0xc, 0xc4, 0x75, + 0x33, 0x10, + + /* U+27 "'" */ + 0x72, 0x0, 0x39, 0x0, + + /* U+28 "(" */ + 0x8, 0x20, 0x32, 0x11, 0x1, 0x10, 0x8, 0x80, + 0x22, 0x0, 0x19, 0x0, + + /* U+29 ")" */ + 0x73, 0x6a, 0x12, 0x7, 0x7, 0x12, 0x6a, + + /* U+2A "*" */ + 0x48, 0x40, 0x26, 0xc0, 0x7b, 0x90, + + /* U+2B "+" */ + 0x0, 0x10, 0x6, 0x80, 0x2, 0x4b, 0xc8, 0xa4, + 0xbc, 0x88, + + /* U+2C "," */ + 0x0, 0x3a, 0x82, 0x0, + + /* U+2D "-" */ + 0x5a, 0x60, + + /* U+2E "." */ + 0x0, 0x3a, 0x0, + + /* U+2F "/" */ + 0x0, 0xa8, 0x2, 0x22, 0x0, 0x55, 0x40, 0x8, + 0x88, 0x0, 0x4c, 0x0, 0xb5, 0xc0, 0x2, 0x2, + 0x0, + + /* U+30 "0" */ + 0xa, 0xbb, 0x13, 0x65, 0xd4, 0xfa, 0x80, 0xbf, + 0xa8, 0xb, 0xb6, 0x5d, 0x48, + + /* U+31 "1" */ + 0x9e, 0x29, 0x40, 0xf, 0xf0, + + /* U+32 "2" */ + 0x6a, 0xb9, 0x6, 0xab, 0x50, 0x9, 0x50, 0x1, + 0x5, 0x1, 0x2d, 0xb4, 0x60, + + /* U+33 "3" */ + 0x7a, 0xbe, 0x7, 0xa1, 0xc0, 0x2, 0x5, 0x80, + 0x12, 0x8c, 0xa2, 0xa8, 0x64, + + /* U+34 "4" */ + 0x0, 0x24, 0x80, 0x47, 0xd2, 0x0, 0x18, 0xa8, + 0x20, 0x90, 0xa5, 0x92, 0x8b, 0xa4, 0x82, + + /* U+35 "5" */ + 0x3d, 0xaa, 0x3, 0x5d, 0x50, 0x1, 0xb5, 0x0, + 0xb7, 0x42, 0x6f, 0x54, 0x33, 0x0, + + /* U+36 "6" */ + 0x9, 0xaa, 0x1b, 0x75, 0x50, 0xff, 0xd3, 0x45, + 0xe1, 0x31, 0x6, 0x19, 0x8e, + + /* U+37 "7" */ + 0xca, 0xa6, 0xb5, 0xd5, 0x5, 0x9c, 0x1a, 0xc0, + 0x2a, 0x70, 0x3, 0x58, 0x0, + + /* U+38 "8" */ + 0x1a, 0xa5, 0x92, 0x65, 0x7d, 0x25, 0xd4, 0xdc, + 0xca, 0xb2, 0x2f, 0xa6, 0xfc, + + /* U+39 "9" */ + 0x4a, 0x99, 0x7, 0xdc, 0x82, 0xc5, 0xc8, 0x69, + 0xd4, 0x86, 0x9d, 0x58, 0xa8, + + /* U+3A ":" */ + 0x74, 0x74, 0x0, 0x3a, 0x0, + + /* U+3B ";" */ + 0x74, 0x74, 0x0, 0x3a, 0x8b, 0xb1, 0x0, + + /* U+3C "<" */ + 0x0, 0x84, 0x0, 0x93, 0x20, 0x58, 0xa8, 0x5, + 0xd5, 0x91, 0x1, 0x69, 0x10, + + /* U+3D "=" */ + 0x49, 0x98, 0x52, 0x66, 0x14, 0x99, 0x84, + + /* U+3E ">" */ + 0x10, 0xc, 0x53, 0x4, 0x7, 0x3d, 0xe2, 0x92, + 0x5a, 0x29, 0x28, 0x0, + + /* U+3F "?" */ + 0x6a, 0xb9, 0x6, 0xab, 0x50, 0xa, 0xa0, 0x2, + 0x94, 0x0, 0x15, 0x80, 0x0, + + /* U+40 "@" */ + 0x3, 0x87, 0x74, 0x28, 0x15, 0xe6, 0xf2, 0x12, + 0xd4, 0x7d, 0x4b, 0x2e, 0x80, 0x7e, 0xa8, 0xf9, + 0x91, 0xc7, 0x15, 0xe0, 0xf6, 0x53, 0x0, + + /* U+41 "A" */ + 0x0, 0xae, 0x40, 0x31, 0x9c, 0x20, 0x14, 0x4c, + 0xa0, 0x0, 0x8d, 0x14, 0x82, 0x1f, 0x93, 0x2e, + 0x80, + + /* U+42 "B" */ + 0x2d, 0x99, 0x58, 0x83, 0xcc, 0x8d, 0x41, 0xe6, + 0x95, 0x40, 0xf3, 0x5d, 0x0, 0xf3, 0x28, 0xd0, + + /* U+43 "C" */ + 0x7, 0xba, 0xa1, 0x2f, 0x5d, 0x50, 0xb2, 0x80, + 0x36, 0x50, 0x6, 0x5e, 0xba, 0xa1, 0x0, + + /* U+44 "D" */ + 0x2e, 0xab, 0xb1, 0x80, 0x12, 0xae, 0xbc, 0x3, + 0x85, 0x48, 0x3, 0xa, 0x90, 0x25, 0x5d, 0x78, + 0x0, + + /* U+45 "E" */ + 0x2e, 0xaa, 0x40, 0x25, 0x52, 0x1, 0xea, 0x88, + 0xf, 0x54, 0x40, 0x4a, 0xa4, 0x80, + + /* U+46 "F" */ + 0x2e, 0xaa, 0x40, 0x25, 0x52, 0x1, 0x2a, 0x88, + 0x9, 0x54, 0x40, 0xe, + + /* U+47 "G" */ + 0x7, 0xba, 0xa1, 0x2f, 0x5d, 0x50, 0xb2, 0x80, + 0x4, 0x79, 0x40, 0x6, 0x45, 0xeb, 0xae, 0x40, + + /* U+48 "H" */ + 0x2a, 0x0, 0x15, 0x0, 0x7c, 0x95, 0x49, 0x0, + 0x25, 0x52, 0x40, 0x3e, + + /* U+49 "I" */ + 0x2a, 0x0, 0xfc, + + /* U+4A "J" */ + 0x5, 0xad, 0x50, 0x5a, 0xa0, 0x7, 0xf7, 0x88, + 0x4d, 0x1a, 0x0, + + /* U+4B "K" */ + 0x2a, 0x1, 0xa2, 0x0, 0xd, 0x41, 0x3, 0x6e, + 0x10, 0x0, 0x77, 0x94, 0x0, 0xe3, 0x3e, 0x80, + + /* U+4C "L" */ + 0x2a, 0x0, 0xff, 0xe3, 0xa5, 0x51, 0xc0, + + /* U+4D "M" */ + 0x2c, 0x0, 0x8f, 0x0, 0x5c, 0x1, 0x0, 0x4, + 0xe2, 0x8f, 0x0, 0xa2, 0x45, 0x0, 0x21, 0x89, + 0x0, 0x0, + + /* U+4E "N" */ + 0x2d, 0x10, 0x2a, 0x1, 0xa0, 0xc, 0xdf, 0x60, + 0x19, 0x3b, 0x80, 0x19, 0x6c, 0x0, + + /* U+4F "O" */ + 0x7, 0xbb, 0x8c, 0x17, 0xae, 0xd5, 0xe3, 0x94, + 0x0, 0x14, 0x5c, 0xa0, 0x0, 0xa2, 0xab, 0xae, + 0xd5, 0xe2, + + /* U+50 "P" */ + 0x2e, 0xaa, 0x48, 0x1, 0x2a, 0x82, 0x80, 0x18, + 0x9c, 0x12, 0xa9, 0x86, 0x9, 0x54, 0x60, + + /* U+51 "Q" */ + 0x7, 0xbb, 0x8c, 0x17, 0xae, 0xd5, 0xe3, 0x94, + 0x0, 0x14, 0x5c, 0xa0, 0x9, 0x15, 0x5d, 0x77, + 0x78, 0x83, 0xdc, 0x15, 0x18, + + /* U+52 "R" */ + 0x2e, 0xaa, 0x48, 0x1, 0x2a, 0x82, 0x80, 0x18, + 0x9c, 0x1e, 0xb0, 0x8c, 0x1e, 0xb4, 0x84, + + /* U+53 "S" */ + 0x2a, 0xa8, 0x97, 0x2a, 0x84, 0xfd, 0x30, 0x21, + 0x13, 0x90, 0xb5, 0x4e, 0xa0, + + /* U+54 "T" */ + 0xaa, 0x75, 0x35, 0x50, 0xa9, 0x80, 0x3f, 0xf8, + 0x60, + + /* U+55 "U" */ + 0x39, 0x0, 0x24, 0x0, 0x7f, 0xf0, 0x9, 0x40, + 0x5, 0xc3, 0x57, 0x58, 0xc0, + + /* U+56 "V" */ + 0xb, 0x10, 0x2, 0xb8, 0x7c, 0x0, 0x39, 0xc1, + 0x14, 0x57, 0x0, 0x28, 0x84, 0xb8, 0x4, 0x8b, + 0x60, 0x0, + + /* U+57 "W" */ + 0x94, 0x0, 0x78, 0x81, 0xcd, 0x70, 0x33, 0x41, + 0x54, 0x36, 0xd, 0x9c, 0x2, 0x30, 0xb9, 0x30, + 0x39, 0xc0, 0x3, 0x32, 0x82, 0x99, 0x80, + + /* U+58 "X" */ + 0x58, 0x2, 0xa0, 0x50, 0x79, 0xb0, 0x4, 0x43, + 0x84, 0x1, 0x57, 0xc2, 0xf, 0x89, 0x34, 0x0, + + /* U+59 "Y" */ + 0xa, 0x20, 0x5, 0x80, 0x2e, 0x42, 0x60, 0x0, + 0x3d, 0x62, 0x60, 0x12, 0xb4, 0x0, 0x70, 0x80, + 0x40, + + /* U+5A "Z" */ + 0x6a, 0xa6, 0x68, 0x35, 0x5b, 0xe0, 0x5, 0x52, + 0x20, 0xb, 0x82, 0x0, 0x43, 0x4d, 0x50, 0x0, + + /* U+5B "[" */ + 0x2d, 0x40, 0x44, 0x0, 0x7f, 0xf0, 0x51, 0x0, + + /* U+5C "\\" */ + 0x19, 0x0, 0x84, 0xc0, 0x37, 0xa8, 0x4, 0xbe, + 0x1, 0x8c, 0x40, 0x2a, 0x60, 0x8, 0xf4, 0x0, + + /* U+5D "]" */ + 0x8c, 0x80, 0xf, 0xe8, 0x0, + + /* U+5E "^" */ + 0x3, 0xc0, 0xa, 0xa1, 0x40, 0xb9, 0x30, 0x0, + + /* U+5F "_" */ + 0x77, 0xc0, + + /* U+60 "`" */ + 0x6, 0x60, + + /* U+61 "a" */ + 0x29, 0x94, 0x0, 0x42, 0xa1, 0x5b, 0x2, 0x2b, + 0xf9, 0x10, + + /* U+62 "b" */ + 0x48, 0x0, 0xff, 0x92, 0xad, 0x40, 0xd, 0x57, + 0x20, 0x1f, 0x9a, 0xa9, 0x20, + + /* U+63 "c" */ + 0x1a, 0xa8, 0x67, 0xaa, 0x82, 0x1, 0xd3, 0xd5, + 0x41, + + /* U+64 "d" */ + 0x0, 0xd6, 0x1, 0xc3, 0x55, 0x4, 0x75, 0x48, + 0x6, 0x10, 0x8e, 0x9b, 0x0, + + /* U+65 "e" */ + 0x19, 0x98, 0x60, 0x4, 0x4e, 0x39, 0x12, 0xd3, + 0xf5, 0x41, + + /* U+66 "f" */ + 0xa, 0xa0, 0x10, 0x50, 0x5b, 0xb8, 0x2d, 0x1c, + 0x3, 0xf8, + + /* U+67 "g" */ + 0x1a, 0x99, 0x5c, 0x74, 0xc3, 0x80, 0x46, 0x11, + 0xd5, 0xe, 0x4, 0x61, 0x0, + + /* U+68 "h" */ + 0x48, 0x0, 0xfe, 0x49, 0xb4, 0x5, 0x9a, 0xf0, + 0x10, 0x17, 0x0, 0xe0, + + /* U+69 "i" */ + 0x37, 0x37, 0x48, 0x0, 0xf0, + + /* U+6A "j" */ + 0x3, 0x70, 0x37, 0x3, 0x80, 0xf, 0xe6, 0x8c, + + /* U+6B "k" */ + 0x48, 0x0, 0xff, 0xa9, 0x0, 0x72, 0x50, 0x12, + 0xa4, 0x0, 0xad, 0xae, + + /* U+6C "l" */ + 0x48, 0x0, 0xff, 0x0, + + /* U+6D "m" */ + 0x4c, 0x9b, 0x89, 0xb4, 0x5, 0x98, 0x39, 0xbf, + 0x1, 0x1, 0x10, 0x1, 0xc0, 0x3f, 0x0, + + /* U+6E "n" */ + 0x4c, 0x9b, 0x40, 0x59, 0xaf, 0x1, 0x1, 0x70, + 0xe, + + /* U+6F "o" */ + 0x1a, 0xa8, 0x67, 0xaa, 0x6c, 0x3, 0xa7, 0xaa, + 0x6c, + + /* U+70 "p" */ + 0x4c, 0xab, 0x50, 0x3, 0x55, 0xc8, 0x7, 0xe6, + 0xaa, 0x48, 0x1, 0x2a, 0x8a, 0x0, + + /* U+71 "q" */ + 0x1a, 0xa4, 0xdc, 0x75, 0x50, 0x3, 0xd1, 0xd5, + 0x40, 0x1a, 0xa4, 0x80, + + /* U+72 "r" */ + 0x4b, 0xa0, 0x0, 0xd0, 0x0, 0x80, 0x3c, + + /* U+73 "s" */ + 0x5b, 0x95, 0xdc, 0xa5, 0x84, 0x44, 0xbc, 0xef, + 0x80, + + /* U+74 "t" */ + 0x29, 0x0, 0x5a, 0x38, 0x5a, 0x38, 0x7, 0x11, + 0x24, 0x0, + + /* U+75 "u" */ + 0x57, 0x1, 0xb0, 0xe, 0x1f, 0x2, 0x4, 0x29, + 0xa0, + + /* U+76 "v" */ + 0xb, 0x0, 0x42, 0x7, 0x38, 0x1a, 0x2, 0xe3, + 0xf0, 0x5, 0xb4, 0xa0, + + /* U+77 "w" */ + 0xb0, 0x7, 0x10, 0x50, 0x72, 0xa9, 0xe8, 0x88, + 0xb, 0xfe, 0x92, 0xaa, 0x0, 0xc, 0x83, 0xc, + 0x80, + + /* U+78 "x" */ + 0x67, 0x1b, 0x6, 0xea, 0xa0, 0x0, 0xc0, 0xc1, + 0xfe, 0xa4, 0x0, + + /* U+79 "y" */ + 0xb, 0x10, 0x83, 0x8, 0x91, 0x23, 0x3, 0x2b, + 0x90, 0xb, 0x80, 0xc0, 0x15, 0xf0, 0x0, + + /* U+7A "z" */ + 0x59, 0xbb, 0x2c, 0x5, 0x5, 0x48, 0xcb, 0xdc, + 0x0, + + /* U+7B "{" */ + 0xa, 0x60, 0x66, 0x0, 0x4a, 0xe0, 0xae, 0x1, + 0xcc, 0xc0, + + /* U+7C "|" */ + 0x28, 0x0, 0xff, 0xe0, 0x0, + + /* U+7D "}" */ + 0x97, 0x9, 0xc0, 0xe, 0x63, 0x6, 0x30, 0xa, + 0x70, 0x0, + + /* U+7E "~" */ + 0x29, 0x35, 0x17, 0x95, 0xd1, + + /* U+B0 "°" */ + 0x26, 0x45, 0x63, 0x57, 0x20, + + /* U+2022 "•" */ + 0x0, 0x2e, 0xaf, 0x80, + + /* U+F001 "" */ + 0x0, 0xff, 0xe0, 0x13, 0x5f, 0x0, 0x23, 0x75, + 0x28, 0x20, 0x7, 0x21, 0x6a, 0x0, 0xd9, 0xd2, + 0xa0, 0x18, 0xc0, 0x3f, 0xab, 0xc2, 0xbc, 0x3, + 0x94, 0x0, 0xa0, 0xa, 0xfa, + + /* U+F008 "" */ + 0xbd, 0xcc, 0xba, 0xac, 0xdb, 0x32, 0x9f, 0x34, + 0x66, 0xdb, 0xe8, 0x1, 0xf9, 0x19, 0xb6, 0xfa, + 0x1b, 0x66, 0x53, 0xe6, + + /* U+F00B "" */ + 0x34, 0x14, 0x4c, 0x79, 0x6d, 0x77, 0xb1, 0x50, + 0xd1, 0x32, 0x8b, 0x8b, 0xbe, 0x14, 0x32, 0x33, + 0xc9, 0x30, 0xd0, 0xef, 0x4c, 0xa1, 0xa1, 0xde, + 0x95, 0x43, 0x44, 0xca, + + /* U+F00C "" */ + 0x0, 0xf4, 0xd0, 0x7, 0x4b, 0x5, 0x48, 0x2, + 0x59, 0x68, 0x1a, 0x64, 0xcb, 0x41, 0x4a, 0xcc, + 0x5a, 0x0, 0xa9, 0x99, 0x40, 0x10, + + /* U+F00D "" */ + 0x63, 0x0, 0x41, 0x56, 0x25, 0x3b, 0x69, 0x5a, + 0xca, 0xb, 0x80, 0x14, 0x29, 0x60, 0xb0, 0xc2, + 0x5f, 0x10, 0x0, + + /* U+F011 "" */ + 0x0, 0xb1, 0x44, 0x0, 0x3a, 0xe2, 0x7e, 0xe1, + 0x20, 0xe0, 0xb, 0x81, 0x4a, 0x0, 0x94, 0x5c, + 0x40, 0x16, 0x80, 0x12, 0x50, 0x31, 0x20, 0xa4, + 0x1e, 0x3c, 0x5b, 0x90, 0xfa, 0xd2, 0x4c, 0x0, + + /* U+F013 "" */ + 0x0, 0xb3, 0x0, 0x10, 0xc4, 0xc, 0xd1, 0x1, + 0x97, 0x70, 0x89, 0xdd, 0x34, 0x3, 0xdc, 0x10, + 0xa0, 0xf, 0xd4, 0x3, 0xdc, 0x10, 0xa9, 0x77, + 0x8, 0x9d, 0xd2, 0x31, 0x3, 0x34, 0x40, 0x40, + + /* U+F015 "" */ + 0x0, 0xc6, 0x4, 0x40, 0xd, 0x59, 0x51, 0x0, + 0x0, 0xe8, 0x48, 0x28, 0x0, 0xfd, 0x46, 0x45, + 0xd0, 0xe2, 0xa, 0x80, 0x8b, 0x10, 0xbe, 0x20, + 0x40, 0x2e, 0xb0, 0x8, 0xec, 0xc0, 0x36, 0xa2, + 0x1, 0x11, 0xa0, + + /* U+F019 "" */ + 0x0, 0xbf, 0xc0, 0x1f, 0xfc, 0x87, 0xf0, 0x7, + 0xb8, 0x1, 0xd8, 0x0, 0xce, 0xf, 0x1c, 0xaa, + 0xe8, 0x78, 0x78, 0x11, 0x43, 0xc0, 0x4, 0x89, + 0x80, + + /* U+F01C "" */ + 0x5, 0xff, 0xe5, 0x1, 0xbc, 0xff, 0xb2, 0xc6, + 0xd8, 0xc0, 0x23, 0x6b, 0x57, 0xf6, 0x6, 0xf7, + 0x50, 0xa, 0x7e, 0x40, 0x22, 0x0, 0xf8, 0x80, + + /* U+F021 "" */ + 0x0, 0xf8, 0xc0, 0xaf, 0xfd, 0x67, 0x85, 0x85, + 0xdc, 0x3c, 0xb, 0x49, 0x17, 0x40, 0x5, 0x58, + 0x1, 0x22, 0xec, 0xea, 0x84, 0x44, 0x57, 0xbb, + 0x42, 0x0, 0x2a, 0x80, 0x2c, 0x6b, 0x6d, 0x1, + 0x85, 0x32, 0x3c, 0x1c, 0x28, 0xcc, 0x40, 0x80, + + /* U+F026 "" */ + 0x0, 0xa4, 0xd3, 0x1b, 0x2c, 0xc0, 0x39, 0x50, + 0x1, 0x57, 0x60, 0x9, 0x38, + + /* U+F027 "" */ + 0x0, 0xa4, 0x0, 0x69, 0x8c, 0x3, 0x96, 0x60, + 0x34, 0x1, 0xe4, 0x40, 0x0, 0x6a, 0xee, 0x0, + 0x8, 0x1, 0x38, 0x0, + + /* U+F028 "" */ + 0x0, 0xf2, 0xa0, 0x6, 0x90, 0x26, 0xf3, 0x32, + 0x63, 0x0, 0x3e, 0x21, 0x96, 0x60, 0x33, 0x25, + 0x70, 0xf, 0xe5, 0x40, 0x0, 0xcc, 0x95, 0xaa, + 0xec, 0x1, 0x7c, 0x48, 0x1, 0x38, 0x9, 0xbc, + 0xc0, + + /* U+F03E "" */ + 0xdf, 0xff, 0x69, 0x7c, 0x0, 0x62, 0x8, 0xb0, + 0x4e, 0x40, 0x1, 0xca, 0x58, 0xd8, 0x2, 0xd6, + 0xc0, 0x31, 0x7f, 0xf8, 0x80, + + /* U+F048 "" */ + 0x40, 0x8, 0xac, 0x82, 0x34, 0x1, 0x2e, 0x0, + 0xe6, 0x0, 0x8c, 0x3, 0x50, 0x80, 0x4f, 0x82, + 0x8, 0x65, 0xec, + + /* U+F04B "" */ + 0x0, 0xfb, 0x68, 0x40, 0x31, 0x2f, 0x38, 0x7, + 0xa3, 0x50, 0x3, 0x8a, 0xe8, 0x3, 0xfe, 0x2b, + 0xa0, 0xa, 0x35, 0x0, 0x97, 0x9c, 0x2, 0xda, + 0x10, 0xc, + + /* U+F04C "" */ + 0x9b, 0x90, 0x9b, 0x96, 0x46, 0x6, 0x46, 0x0, + 0xff, 0xeb, 0xed, 0xe8, 0x6d, 0xe8, + + /* U+F04D "" */ + 0x24, 0x4e, 0x2d, 0xbb, 0xed, 0x0, 0xff, 0xeb, + 0xba, 0x27, 0x38, + + /* U+F051 "" */ + 0x20, 0x9, 0x36, 0x0, 0xac, 0x1e, 0x40, 0x33, + 0x70, 0x6, 0x30, 0x8, 0x68, 0x0, 0x58, 0xe0, + 0xd8, 0x46, 0x80, + + /* U+F052 "" */ + 0x0, 0xc4, 0x1, 0xf4, 0x6c, 0x0, 0x73, 0xb8, + 0x1d, 0xc0, 0x12, 0xc0, 0x5, 0xa, 0x0, 0xb0, + 0xe, 0xb0, 0x5, 0xbb, 0xf5, 0x80, 0x29, 0xdf, + 0xa8, 0x0, 0xa8, 0x9c, 0xa0, + + /* U+F053 "" */ + 0x0, 0x98, 0x80, 0xf, 0x2c, 0xf, 0x14, 0x8b, + 0x12, 0xa0, 0x83, 0xa0, 0x1, 0xc5, 0xb0, 0x1, + 0x62, 0xb0, 0x0, 0xbd, 0x80, + + /* U+F054 "" */ + 0x26, 0x0, 0x9a, 0x5c, 0x0, 0x95, 0xe, 0x0, + 0x59, 0x85, 0x0, 0x68, 0xa0, 0x5a, 0xe0, 0xb2, + 0xe1, 0x3, 0x79, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x90, 0x3, 0x8e, 0xcc, 0x3, 0x38, 0x38, + 0x1, 0xe3, 0x83, 0xa1, 0xe5, 0xd4, 0x15, 0xe7, + 0xbe, 0xc2, 0xff, 0x80, 0x3f, 0x95, 0x14, 0x0, + + /* U+F068 "" */ + 0x78, 0x8e, 0x79, 0x77, 0xe9, + + /* U+F06E "" */ + 0x0, 0x46, 0x65, 0x0, 0x1, 0xd5, 0xda, 0xf5, + 0xd1, 0xd2, 0x84, 0x8e, 0x82, 0xd7, 0x0, 0x40, + 0x80, 0x6a, 0x28, 0xe8, 0xe8, 0x2d, 0x1d, 0x5e, + 0xbf, 0x5c, 0x10, + + /* U+F070 "" */ + 0x1d, 0x30, 0xf, 0xc3, 0x1b, 0x19, 0x95, 0x10, + 0x4, 0xb8, 0xaf, 0x10, 0x3d, 0x40, 0x3, 0xc6, + 0xd, 0xda, 0x82, 0x84, 0x0, 0xb7, 0x52, 0x8, + 0x2, 0x0, 0x75, 0x51, 0xb6, 0x48, 0x58, 0x80, + 0x2a, 0x7f, 0x13, 0xd3, 0xc4, 0x2, 0x6c, 0xc3, + 0x8d, 0x9c, 0x0, + + /* U+F071 "" */ + 0x0, 0xc7, 0xc6, 0x1, 0xfb, 0xc7, 0xc0, 0x3e, + 0x63, 0x39, 0x80, 0x3d, 0x5, 0x85, 0x0, 0x1d, + 0x2, 0x60, 0x63, 0x0, 0x11, 0x38, 0xb, 0x8, + 0x39, 0x0, 0x24, 0x0, 0x28, 0x20, 0x8, 0x0, + 0x30, 0x0, 0x74, 0x40, 0xe, 0x0, + + /* U+F074 "" */ + 0x0, 0xf1, 0x2, 0x20, 0x2, 0x4d, 0x5a, 0xbb, + 0xe, 0x58, 0x47, 0x70, 0xf4, 0x78, 0xf0, 0x0, + 0xa0, 0xa0, 0x17, 0x70, 0x74, 0xf8, 0xf2, 0xaf, + 0x6, 0xec, 0x10, 0x88, 0x0, 0x93, 0x54, + + /* U+F077 "" */ + 0x0, 0xfe, 0x4e, 0x40, 0x9, 0x2c, 0xad, 0x1, + 0x2d, 0xf1, 0xed, 0x3d, 0xe0, 0x21, 0xfe, 0xe0, + 0x2, 0x8b, + + /* U+F078 "" */ + 0x0, 0xfa, 0xe0, 0x2, 0x8b, 0xf7, 0x80, 0x87, + 0xf4, 0xb7, 0xc7, 0xb4, 0x4, 0xb2, 0xb4, 0x0, + 0x93, 0x90, 0x0, + + /* U+F079 "" */ + 0x0, 0x4a, 0xa, 0x26, 0x0, 0xad, 0xae, 0x7f, + 0xeb, 0x10, 0x1, 0xa4, 0x75, 0xdc, 0x20, 0x14, + 0x1, 0xb0, 0x0, 0x40, 0xc0, 0x31, 0xa2, 0x17, + 0xc7, 0xd4, 0x1, 0x98, 0xff, 0x6d, 0x82, 0xa8, + 0x0, 0xf7, 0x74, 0x2e, 0xc0, 0x0, + + /* U+F07B "" */ + 0xdf, 0xf5, 0x80, 0x62, 0x0, 0x27, 0xfd, 0xa0, + 0x1f, 0x10, 0x7, 0xff, 0x10, 0x80, 0x3c, 0x40, + + /* U+F093 "" */ + 0x0, 0xa6, 0x40, 0x1d, 0x2c, 0xc9, 0x0, 0x9d, + 0x80, 0xc, 0xe0, 0x7, 0xf0, 0x7, 0xb8, 0x7, + 0xf3, 0xc2, 0x0, 0x12, 0x1e, 0x1e, 0x9d, 0xd4, + 0xf0, 0x0, 0x17, 0x72, 0xa0, 0x0, + + /* U+F095 "" */ + 0x0, 0xff, 0xe1, 0xbf, 0x50, 0x7, 0xa4, 0x50, + 0x3, 0xc4, 0x4, 0x1, 0xe8, 0xb, 0x0, 0xe1, + 0x91, 0x70, 0x7d, 0xc4, 0xc2, 0xd0, 0x4, 0x91, + 0xd9, 0xe1, 0x80, 0x10, 0x4e, 0x38, 0xc0, 0x0, + + /* U+F0C4 "" */ + 0x3, 0x0, 0xf6, 0x76, 0x1, 0x6e, 0x1, 0x51, + 0x96, 0x1f, 0x5, 0x60, 0x68, 0x61, 0x2, 0x78, + 0x1, 0x8, 0x1, 0x92, 0xc, 0xb2, 0x0, 0x2a, + 0x19, 0x86, 0x90, 0xad, 0xa0, 0x7b, 0xc0, + + /* U+F0C5 "" */ + 0x0, 0x7f, 0xce, 0x8e, 0x80, 0x11, 0x9a, 0x30, + 0x2, 0xb8, 0x0, 0xff, 0xe5, 0x1c, 0x3b, 0xd0, + 0x9, 0xe, 0xe8, 0x70, + + /* U+F0C7 "" */ + 0x24, 0x4c, 0x21, 0xbf, 0xfc, 0x41, 0x77, 0x87, + 0xc1, 0x13, 0x1, 0x5, 0xda, 0x2c, 0x3, 0x36, + 0x30, 0x6, 0x45, 0x40, 0x3, 0xa3, 0x73, 0x23, + 0x80, + + /* U+F0E7 "" */ + 0x7, 0xff, 0x30, 0x5, 0xa0, 0x4, 0x0, 0x98, + 0x1, 0x4e, 0x0, 0x20, 0x3, 0xe0, 0x2, 0x5c, + 0x42, 0x40, 0xf, 0x2, 0xe4, 0x1, 0x18, 0xc0, + 0x6, 0x5b, 0x0, 0x80, + + /* U+F0EA "" */ + 0x79, 0xb9, 0x70, 0x4, 0x33, 0xb4, 0x0, 0x6a, + 0x77, 0x18, 0x5, 0xce, 0xeb, 0xb0, 0x7, 0x8c, + 0x3, 0x9d, 0xd0, 0xe0, 0x1c, 0xf1, 0xe0, 0x18, + + /* U+F0F3 "" */ + 0x0, 0xb4, 0x3, 0x27, 0x17, 0x18, 0x2, 0x44, + 0x7, 0x80, 0x4, 0x1, 0x10, 0x18, 0x7, 0x1c, + 0x0, 0x74, 0x63, 0xbf, 0x6b, 0xc6, 0x3e, 0x43, + 0x0, + + /* U+F11C "" */ + 0xdf, 0xff, 0xb4, 0xb9, 0xdd, 0xce, 0xee, 0x20, + 0xf2, 0x26, 0x91, 0x3c, 0x3, 0xfe, 0xf2, 0xac, + 0xa2, 0xf0, 0x2e, 0x7f, 0xf9, 0xf8, 0x80, + + /* U+F124 "" */ + 0x0, 0xff, 0xe2, 0x25, 0xe0, 0x7, 0x2e, 0x5a, + 0x38, 0x4, 0xdd, 0x46, 0x0, 0xf0, 0x6, 0xc8, + 0x80, 0x46, 0x80, 0xb, 0x77, 0x18, 0x2, 0x40, + 0x26, 0x88, 0x20, 0xa, 0x80, 0x7e, 0x80, 0xf, + 0xb4, 0x98, 0x3, 0xe5, 0xd0, 0xc, + + /* U+F15B "" */ + 0xff, 0xa2, 0xc0, 0x39, 0x2c, 0x2, 0x47, 0x30, + 0x8, 0xdd, 0xc0, 0x1f, 0xfc, 0xc0, + + /* U+F1EB "" */ + 0x0, 0x91, 0xdc, 0x80, 0x1a, 0x7e, 0xef, 0x7c, + 0x86, 0x25, 0xfe, 0x63, 0xed, 0x33, 0xb4, 0x2f, + 0xfd, 0x61, 0xbc, 0x43, 0x63, 0x54, 0x1b, 0x12, + 0x1, 0xfa, 0x74, 0xaf, 0x10, 0xe, 0xcf, 0x0, + 0xfc, 0xd2, 0x1, 0x80, + + /* U+F240 "" */ + 0x24, 0x4f, 0xc1, 0xbf, 0xff, 0x4d, 0x6, 0x2a, + 0xfa, 0x14, 0x3c, 0x47, 0xce, 0x0, 0xd9, 0x9f, + 0x42, 0x3f, 0x6e, 0xf8, 0x60, + + /* U+F241 "" */ + 0x24, 0x4f, 0xc1, 0xbf, 0xff, 0x4d, 0x6, 0x2a, + 0xec, 0xb8, 0x50, 0xf1, 0x1d, 0xe0, 0xe0, 0xd, + 0x99, 0xda, 0x90, 0x8f, 0xdb, 0xbb, 0xbc, 0x60, + + /* U+F242 "" */ + 0x24, 0x4f, 0xc1, 0xbf, 0xff, 0x4d, 0x6, 0x2a, + 0xd7, 0x74, 0x28, 0x78, 0x8c, 0x1, 0x38, 0x3, + 0x66, 0x64, 0x4a, 0x11, 0xfb, 0x76, 0xff, 0x86, + 0x0, + + /* U+F243 "" */ + 0x24, 0x4f, 0xc1, 0xbf, 0xff, 0x4d, 0x6, 0x2e, + 0x5d, 0xe8, 0x50, 0xf1, 0xf0, 0xc, 0xe0, 0xd, + 0x9d, 0x44, 0xd0, 0x8f, 0xdb, 0xdf, 0xf8, 0x60, + + /* U+F244 "" */ + 0x24, 0x4f, 0xc1, 0xbf, 0xff, 0x4c, 0x5, 0xdf, + 0xd0, 0xe0, 0x1f, 0x9c, 0x0, 0x89, 0xf4, 0x13, + 0xff, 0xfc, 0x3c, + + /* U+F287 "" */ + 0x0, 0xff, 0xe1, 0xbe, 0xc0, 0x7, 0xce, 0x97, + 0x80, 0x1a, 0x6c, 0x78, 0x9d, 0x45, 0xc8, 0x1d, + 0x24, 0x72, 0x66, 0xab, 0xc, 0xd8, 0x85, 0xe0, + 0x7e, 0xc8, 0x11, 0x0, 0xc, 0x4d, 0x60, 0x1f, + 0x9b, 0xb0, 0x2, + + /* U+F293 "" */ + 0x6, 0xdd, 0x61, 0x82, 0x49, 0x71, 0x70, 0x69, + 0xa3, 0x59, 0x14, 0x78, 0x9e, 0xc, 0x0, 0xf0, + 0x10, 0x72, 0x31, 0x7f, 0x1, 0xd3, 0x65, 0x91, + 0x24, 0x92, 0xd0, 0xd0, + + /* U+F2ED "" */ + 0x78, 0xdf, 0xd8, 0x70, 0x2, 0xba, 0x80, 0x3d, + 0xdf, 0xbc, 0xc, 0xce, 0x66, 0x0, 0xff, 0xe5, + 0x69, 0x99, 0xcc, 0xda, + + /* U+F304 "" */ + 0x0, 0xf3, 0xf1, 0x80, 0x72, 0x60, 0xe8, 0x6, + 0x8b, 0x24, 0x90, 0xa, 0x1c, 0x1b, 0xdc, 0x1, + 0xe, 0x0, 0x74, 0x0, 0x3b, 0x80, 0xf, 0x0, + 0x14, 0x80, 0x1e, 0x0, 0x38, 0x62, 0x0, 0x1d, + 0xdc, 0x70, 0xe, + + /* U+F55A "" */ + 0x0, 0x57, 0xff, 0xb0, 0x2d, 0x41, 0x8c, 0xcc, + 0x7, 0x48, 0x0, 0x5d, 0xd2, 0x80, 0x7f, 0xf0, + 0x29, 0x0, 0xb, 0xba, 0x50, 0xa, 0xd4, 0x18, + 0xcc, 0xc0, 0x60, + + /* U+F7C2 "" */ + 0x7, 0xff, 0xb8, 0x5f, 0x27, 0x60, 0x89, 0xb, + 0xb7, 0x84, 0x0, 0x14, 0x64, 0x10, 0xf, 0xfe, + 0x51, 0x80, 0x61, 0x20, + + /* U+F8A2 "" */ + 0x0, 0xf8, 0xc0, 0x4, 0x60, 0x11, 0x60, 0x16, + 0x51, 0x14, 0xe0, 0xf, 0x16, 0xdd, 0xa8, 0x1, + 0xe2, 0xdb, 0xbb, 0x80, 0xb2, 0x88, 0xb0, 0x80 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 34, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 34, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6, .adv_w = 50, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 11, .adv_w = 90, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 26, .adv_w = 79, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 44, .adv_w = 108, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 62, .adv_w = 88, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 80, .adv_w = 27, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 84, .adv_w = 43, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 103, .adv_w = 51, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 109, .adv_w = 74, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 119, .adv_w = 29, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 123, .adv_w = 49, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 125, .adv_w = 29, .box_w = 2, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 128, .adv_w = 45, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 145, .adv_w = 85, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 158, .adv_w = 47, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 163, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 176, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 189, .adv_w = 86, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 204, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 218, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 231, .adv_w = 77, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 244, .adv_w = 82, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 257, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 270, .adv_w = 29, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 275, .adv_w = 29, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 282, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 295, .adv_w = 74, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 302, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 314, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 327, .adv_w = 132, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 350, .adv_w = 94, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 367, .adv_w = 97, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 383, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 398, .adv_w = 106, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 415, .adv_w = 86, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 429, .adv_w = 81, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 441, .adv_w = 99, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 457, .adv_w = 104, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 469, .adv_w = 40, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 472, .adv_w = 66, .box_w = 5, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 483, .adv_w = 92, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 499, .adv_w = 76, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 506, .adv_w = 122, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 524, .adv_w = 104, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 538, .adv_w = 108, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 556, .adv_w = 92, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 571, .adv_w = 108, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 592, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 607, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 620, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 629, .adv_w = 101, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 642, .adv_w = 91, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 660, .adv_w = 144, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 683, .adv_w = 86, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 699, .adv_w = 83, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 716, .adv_w = 84, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 732, .adv_w = 43, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 740, .adv_w = 45, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 756, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 761, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 769, .adv_w = 64, .box_w = 4, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 771, .adv_w = 77, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 773, .adv_w = 77, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 783, .adv_w = 87, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 796, .adv_w = 73, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 805, .adv_w = 87, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 818, .adv_w = 78, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 828, .adv_w = 45, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 838, .adv_w = 88, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 851, .adv_w = 87, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 863, .adv_w = 36, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 868, .adv_w = 36, .box_w = 3, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 876, .adv_w = 79, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 888, .adv_w = 36, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 892, .adv_w = 135, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 907, .adv_w = 87, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 916, .adv_w = 81, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 925, .adv_w = 87, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 939, .adv_w = 87, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 951, .adv_w = 52, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 958, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 967, .adv_w = 53, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 977, .adv_w = 87, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 986, .adv_w = 72, .box_w = 6, .box_h = 4, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 998, .adv_w = 115, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1015, .adv_w = 71, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1026, .adv_w = 72, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1041, .adv_w = 67, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1050, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1060, .adv_w = 38, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1065, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1075, .adv_w = 74, .box_w = 5, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1080, .adv_w = 54, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 1085, .adv_w = 40, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 1089, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1118, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1138, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1166, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1188, .adv_w = 88, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1207, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1239, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1271, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1306, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1331, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1355, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1395, .adv_w = 64, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1408, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1428, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1461, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1482, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1501, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1527, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1541, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1552, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1571, .adv_w = 112, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1600, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1621, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1642, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1666, .adv_w = 112, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1671, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1698, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1741, .adv_w = 144, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1779, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1810, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1828, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1847, .adv_w = 160, .box_w = 11, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1885, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1901, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1931, .adv_w = 128, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1963, .adv_w = 112, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1994, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2014, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2039, .adv_w = 80, .box_w = 7, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2067, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2091, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2116, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2139, .adv_w = 128, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 2177, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2191, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2227, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2248, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2272, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2297, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2321, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2340, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2375, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2403, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2423, .adv_w = 128, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 2458, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2485, .adv_w = 96, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2505, .adv_w = 129, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, 0xefa3, + 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, 0xefc7, + 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, 0xf017, + 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, 0xf0ab, 0xf13b, 0xf190, + 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, 0xf1e3, 0xf23d, 0xf254, + 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 59, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = +{ + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = +{ + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 3, -3, 0, 0, + 0, 0, -7, -8, 1, 6, 3, 2, + -5, 1, 6, 0, 5, 1, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 1, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, -4, 0, 0, 0, 0, + 0, -3, 2, 3, 0, 0, -1, 0, + -1, 1, 0, -1, 0, -1, -1, -3, + 0, 0, 0, 0, -1, 0, 0, -2, + -2, 0, 0, -1, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + -1, 0, -2, 0, -3, 0, -15, 0, + 0, -3, 0, 3, 4, 0, 0, -3, + 1, 1, 4, 3, -2, 3, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -2, -6, 0, -5, + -1, 0, 0, 0, 0, 0, 5, 0, + -4, -1, 0, 0, 0, -2, 0, 0, + -1, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, -1, 5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 1, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 3, 1, 4, -1, 0, 0, 3, -1, + -4, -18, 1, 3, 3, 0, -2, 0, + 5, 0, 4, 0, 4, 0, -12, 0, + -2, 4, 0, 4, -1, 3, 1, 0, + 0, 0, -1, 0, 0, -2, 10, 0, + 10, 0, 4, 0, 5, 2, 2, 4, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, -1, 0, 1, -2, -2, -3, 1, + 0, -1, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, 0, -8, 0, 0, 0, + 0, -1, 0, 13, -2, -2, 1, 1, + -1, 0, -2, 1, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -12, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 8, 0, 0, -5, 0, + 4, 0, -9, -12, -9, -3, 4, 0, + 0, -9, 0, 2, -3, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 4, -16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 1, 0, 0, 0, + 0, 0, 1, 1, -2, -3, 0, 0, + 0, -1, 0, 0, -1, 0, 0, 0, + -3, 0, -1, 0, -3, -3, 0, -3, + -4, -4, -2, 0, -3, 0, -3, 0, + 0, 0, 0, -1, 0, 0, 1, 0, + 1, -1, 0, 0, 0, 0, 0, 1, + -1, 0, 0, 0, -1, 1, 1, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -1, 0, + -2, 0, -2, 0, 0, -1, 0, 4, + 0, 0, -1, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, 0, -1, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -1, -1, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -1, -2, 0, -2, 0, -4, + -1, -4, 3, 0, 0, -3, 1, 3, + 3, 0, -3, 0, -2, 0, 0, -6, + 1, -1, 1, -7, 1, 0, 0, 0, + -7, 0, -7, -1, -11, -1, 0, -6, + 0, 3, 4, 0, 2, 0, 0, 0, + 0, 0, 0, -2, -2, 0, -4, 0, + 0, 0, -1, 0, 0, 0, -1, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + -1, -1, 0, -1, -2, -1, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, -1, 0, -3, 1, 0, 0, -2, + 1, 1, 1, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -1, 0, -1, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + -1, 0, 0, 0, 0, -1, -2, 0, + -2, 0, 4, -1, 0, -4, 0, 0, + 3, -6, -7, -5, -3, 1, 0, -1, + -8, -2, 0, -2, 0, -3, 2, -2, + -8, 0, -3, 0, 0, 1, 0, 1, + -1, 0, 1, 0, -4, -5, 0, -6, + -3, -3, -3, -4, -2, -3, 0, -2, + -3, 1, 0, 0, 0, -1, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -1, 0, 0, -1, 0, -2, -3, + -3, 0, 0, -4, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + -2, 0, 0, 0, 0, -6, -4, 0, + 0, 0, -2, -6, 0, 0, -1, 1, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, -2, 0, + 0, 0, 0, 2, 0, 1, -3, -3, + 0, -1, -1, -2, 0, 0, 0, 0, + 0, 0, -4, 0, -1, 0, -2, -1, + 0, -3, -3, -4, -1, 0, -3, 0, + -4, 0, 0, 0, 0, 10, 0, 0, + 1, 0, 0, -2, 0, 1, 0, -6, + 0, 0, 0, 0, 0, -12, -2, 4, + 4, -1, -5, 0, 1, -2, 0, -6, + -1, -2, 1, -9, -1, 2, 0, 2, + -4, -2, -5, -4, -5, 0, 0, -8, + 0, 7, 0, 0, -1, 0, 0, 0, + -1, -1, -1, -3, -4, 0, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, -1, -1, -2, 0, 0, + -3, 0, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 3, + 0, 2, 0, -3, 1, -1, 0, -3, + -1, 0, -2, -1, -1, 0, -2, -2, + 0, 0, -1, 0, -1, -2, -2, 0, + 0, -1, 0, 1, -1, 0, -3, 0, + 0, 0, -3, 0, -2, 0, -2, -2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 1, 0, -2, 0, -1, -2, + -4, -1, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, -1, -1, -1, + 0, 0, 0, 0, 2, -1, 0, -1, + 0, 0, 0, -1, -2, -1, -1, -2, + -1, 0, 1, 5, 0, 0, -3, 0, + -1, 3, 0, -1, -5, -2, 2, 0, + 0, -6, -2, 1, -2, 1, 0, -1, + -1, -4, 0, -2, 1, 0, 0, -2, + 0, 0, 0, 1, 1, -3, -2, 0, + -2, -1, -2, -1, -1, 0, -2, 1, + -2, -2, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, -1, -1, 0, 0, 0, 0, + -1, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + -2, 0, -3, 0, 0, 0, -4, 0, + 1, -3, 3, 0, -1, -6, 0, 0, + -3, -1, 0, -5, -3, -4, 0, 0, + -6, -1, -5, -5, -6, 0, -3, 0, + 1, 9, -2, 0, -3, -1, 0, -1, + -2, -3, -2, -5, -5, -3, -1, 0, + 0, -1, 0, 0, 0, 0, -9, -1, + 4, 3, -3, -5, 0, 0, -4, 0, + -6, -1, -1, 3, -12, -2, 0, 0, + 0, -8, -2, -7, -1, -9, 0, 0, + -9, 0, 8, 0, 0, -1, 0, 0, + 0, 0, -1, -1, -5, -1, 0, -8, + 0, 0, 0, 0, -4, 0, -1, 0, + 0, -4, -6, 0, 0, -1, -2, -4, + -1, 0, -1, 0, 0, 0, 0, -6, + -1, -4, -4, -1, -2, -3, -1, -2, + 0, -3, -1, -4, -2, 0, -2, -2, + -1, -2, 0, 1, 0, -1, -4, 0, + 3, 0, -2, 0, 0, 0, 0, 2, + 0, 1, -3, 5, 0, -1, -1, -2, + 0, 0, 0, 0, 0, 0, -4, 0, + -1, 0, -2, -1, 0, -3, -3, -4, + -1, 0, -3, 1, 5, 0, 0, 0, + 0, 10, 0, 0, 1, 0, 0, -2, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, -3, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -1, -1, 0, 0, -3, + -1, 0, 0, -3, 0, 2, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 2, 3, 1, -1, 0, -4, + -2, 0, 4, -4, -4, -3, -3, 5, + 2, 1, -11, -1, 3, -1, 0, -1, + 1, -1, -4, 0, -1, 1, -2, -1, + -4, -1, 0, 0, 4, 3, 0, -4, + 0, -7, -2, 4, -2, -5, 0, -2, + -4, -4, -1, 5, 1, 0, -2, 0, + -3, 0, 1, 4, -3, -5, -5, -3, + 4, 0, 0, -9, -1, 1, -2, -1, + -3, 0, -3, -5, -2, -2, -1, 0, + 0, -3, -3, -1, 0, 4, 3, -1, + -7, 0, -7, -2, 0, -4, -7, 0, + -4, -2, -4, -4, 3, 0, 0, -2, + 0, -3, -1, 0, -1, -2, 0, 2, + -4, 1, 0, 0, -7, 0, -1, -3, + -2, -1, -4, -3, -4, -3, 0, -4, + -1, -3, -2, -4, -1, 0, 0, 0, + 6, -2, 0, -4, -1, 0, -1, -3, + -3, -3, -4, -5, -2, -3, 3, 0, + -2, 0, -6, -2, 1, 3, -4, -5, + -3, -4, 4, -1, 1, -12, -2, 3, + -3, -2, -5, 0, -4, -5, -2, -1, + -1, -1, -3, -4, 0, 0, 0, 4, + 4, -1, -8, 0, -8, -3, 3, -5, + -9, -3, -4, -5, -6, -4, 3, 0, + 0, 0, 0, -2, 0, 0, 1, -2, + 3, 1, -2, 3, 0, 0, -4, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + 0, 1, 4, 0, 0, -2, 0, 0, + 0, 0, -1, -1, -2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, + -1, 0, 5, 0, 2, 0, 0, -2, + 0, 3, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, 0, -1, 2, 0, 4, + 0, 0, 13, 2, -3, -3, 1, 1, + -1, 0, -6, 0, 0, 6, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 5, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, -3, 0, + 0, 0, 0, 0, 1, 17, -3, -1, + 4, 3, -3, 1, 0, 0, 1, 1, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -3, 0, 0, 0, 0, + -3, -1, 0, 0, 0, -3, 0, -2, + 0, -6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, -2, 0, -2, 0, + -3, 0, 0, 0, -2, 1, -2, 0, + 0, -3, -1, -3, 0, 0, -3, 0, + -1, 0, -6, 0, -1, 0, 0, -10, + -2, -5, -1, -5, 0, 0, -9, 0, + -3, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, -1, -2, 0, 0, + 0, 0, -3, 0, -3, 2, -1, 3, + 0, -1, -3, -1, -2, -2, 0, -2, + -1, -1, 1, -3, 0, 0, 0, 0, + -11, -1, -2, 0, -3, 0, -1, -6, + -1, 0, 0, -1, -1, 0, 0, 0, + 0, 1, 0, -1, -2, -1, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -3, 0, -1, 0, 0, 0, -3, + 1, 0, 0, 0, -3, -1, -3, 0, + 0, -4, 0, -1, 0, -6, 0, 0, + 0, 0, -12, 0, -3, -5, -6, 0, + 0, -9, 0, -1, -2, 0, 0, 0, + 0, 0, 0, 0, 0, -1, -2, -1, + -2, 0, 0, 0, 2, -2, 0, 4, + 6, -1, -1, -4, 2, 6, 2, 3, + -3, 2, 5, 2, 4, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 6, -2, -1, 0, -1, + 10, 6, 10, 0, 0, 0, 1, 0, + 0, 5, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, -11, -2, -1, -5, + -6, 0, 0, -9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, -11, -2, -1, + -5, -6, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, -3, 1, 0, -1, + 1, 2, 1, -4, 0, 0, -1, 1, + 0, 1, 0, 0, 0, 0, -3, 0, + -1, -1, -3, 0, -1, -5, 0, 8, + -1, 0, -3, -1, 0, -1, -2, 0, + -1, -4, -3, -2, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, -11, + -2, -1, -5, -6, 0, 0, -9, 0, + 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, -4, -2, -1, 4, -1, -1, + -5, 0, -1, 0, -1, -3, 0, 3, + 0, 1, 0, 1, -3, -5, -2, 0, + -5, -2, -3, -5, -5, 0, -2, -3, + -2, -2, -1, -1, -2, -1, 0, -1, + 0, 2, 0, 2, -1, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -1, -1, 0, 0, + -3, 0, -1, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, 0, 0, 0, -1, 0, 0, -2, + -1, 1, 0, -2, -2, -1, 0, -4, + -1, -3, -1, -2, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, 4, 0, 0, -2, 0, + 0, 0, 0, -2, 0, -1, 0, 0, + -1, 0, 0, -1, 0, -3, 0, 0, + 5, -2, -4, -4, 1, 1, 1, 0, + -4, 1, 2, 1, 4, 1, 4, -1, + -3, 0, 0, -5, 0, 0, -4, -3, + 0, 0, -3, 0, -2, -2, 0, -2, + 0, -2, 0, -1, 2, 0, -1, -4, + -1, 5, 0, 0, -1, 0, -3, 0, + 0, 2, -3, 0, 1, -1, 1, 0, + 0, -4, 0, -1, 0, 0, -1, 1, + -1, 0, 0, 0, -5, -2, -3, 0, + -4, 0, 0, -6, 0, 5, -1, 0, + -2, 0, 1, 0, -1, 0, -1, -4, + 0, -1, 1, 0, 0, 0, 0, -1, + 0, 0, 1, -2, 0, 0, 0, -2, + -1, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 3, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + -1, -1, 0, 0, 0, 3, 0, 3, + 0, 0, 0, 0, 0, -8, -7, 0, + 6, 4, 2, -5, 1, 5, 0, 5, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = +{ + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_dsc_t font_dsc = { + .glyph_bitmap = gylph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 1 +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +lv_font_t font_1 = { + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 10, /*The maximum line height required by the font*/ + .base_line = 2, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if FONT_1*/ + diff --git a/tests/lv_test_fonts/font_2.c b/tests/lv_test_fonts/font_2.c new file mode 100644 index 000000000..cf2a7b70b --- /dev/null +++ b/tests/lv_test_fonts/font_2.c @@ -0,0 +1,1413 @@ +#include "lvgl/lvgl.h" + +/******************************************************************************* + * Size: 8 px + * Bpp: 4 + * Opts: --bpp 4 --size 8 --font ../Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font ../FontAwesome5-Solid+Brands+Regular.woff -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --no-compress --no-prefilter --force-fast-kern-format --format lvgl -o ..\generated_fonts/font_2.c + ******************************************************************************/ + +#ifndef FONT_2 +#define FONT_2 1 +#endif + +#if FONT_2 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { + /* U+20 " " */ + + /* U+21 "!" */ + 0x58, 0x57, 0x46, 0x23, 0x46, + + /* U+22 "\"" */ + 0x73, 0x97, 0x29, 0x0, 0x0, + + /* U+23 "#" */ + 0x4, 0x52, 0x60, 0x4b, 0x9b, 0xa3, 0x8, 0x7, + 0x20, 0x6c, 0x8c, 0x81, 0x9, 0x9, 0x0, + + /* U+24 "$" */ + 0x0, 0x80, 0x2, 0xbd, 0xa2, 0x76, 0x80, 0x0, + 0x8d, 0x81, 0x0, 0x84, 0x95, 0xad, 0xb3, 0x0, + 0x80, 0x0, + + /* U+25 "%" */ + 0x58, 0x70, 0x63, 0x8, 0x8, 0x36, 0x0, 0x27, + 0x58, 0x67, 0x10, 0x8, 0x27, 0x26, 0x6, 0x20, + 0x88, 0x20, + + /* U+26 "&" */ + 0x9, 0x99, 0x0, 0xb, 0x3a, 0x0, 0x19, 0xc2, + 0x20, 0x83, 0x1a, 0xa0, 0x3a, 0x99, 0x92, 0x0, + 0x0, 0x0, + + /* U+27 "'" */ + 0x72, 0x72, 0x0, + + /* U+28 "(" */ + 0x8, 0x20, 0xb0, 0x1a, 0x3, 0x80, 0x1a, 0x0, + 0xb0, 0x8, 0x20, + + /* U+29 ")" */ + 0x73, 0x19, 0xb, 0xc, 0xb, 0x19, 0x73, + + /* U+2A "*" */ + 0x48, 0x40, 0x6e, 0x80, 0x15, 0x10, + + /* U+2B "+" */ + 0x0, 0x20, 0x0, 0xa, 0x0, 0x49, 0xd9, 0x10, + 0xa, 0x0, + + /* U+2C "," */ + 0x0, 0x75, 0x71, + + /* U+2D "-" */ + 0x5a, 0x60, + + /* U+2E "." */ + 0x0, 0x74, + + /* U+2F "/" */ + 0x0, 0xa, 0x0, 0x2, 0x80, 0x0, 0x82, 0x0, + 0xa, 0x0, 0x4, 0x60, 0x0, 0x91, 0x0, 0x19, + 0x0, 0x0, + + /* U+30 "0" */ + 0xa, 0xbb, 0x26, 0x60, 0x1b, 0x93, 0x0, 0xc6, + 0x60, 0x1b, 0xa, 0xbb, 0x20, + + /* U+31 "1" */ + 0x9e, 0x20, 0xa2, 0xa, 0x20, 0xa2, 0xa, 0x20, + + /* U+32 "2" */ + 0x6a, 0xb9, 0x0, 0x0, 0xc0, 0x0, 0x58, 0x0, + 0x87, 0x0, 0x9e, 0xaa, 0x30, + + /* U+33 "3" */ + 0x7a, 0xbe, 0x0, 0xa, 0x20, 0x4, 0xa9, 0x0, + 0x0, 0xa2, 0x8a, 0xa9, 0x0, + + /* U+34 "4" */ + 0x0, 0x49, 0x0, 0x3, 0xa0, 0x0, 0x1b, 0x8, + 0x20, 0x8b, 0xad, 0xb2, 0x0, 0x9, 0x30, + + /* U+35 "5" */ + 0x3d, 0xaa, 0x5, 0x60, 0x0, 0x5b, 0xa8, 0x0, + 0x0, 0x93, 0x7a, 0xaa, 0x0, + + /* U+36 "6" */ + 0x9, 0xaa, 0x36, 0x70, 0x0, 0x98, 0x9a, 0x26, + 0x80, 0x2a, 0x9, 0x9a, 0x40, + + /* U+37 "7" */ + 0xca, 0xad, 0x67, 0x0, 0xc0, 0x0, 0x67, 0x0, + 0xc, 0x0, 0x6, 0x70, 0x0, + + /* U+38 "8" */ + 0x1a, 0xab, 0x25, 0x60, 0x48, 0x1d, 0xad, 0x38, + 0x40, 0x1b, 0x3a, 0x9a, 0x40, + + /* U+39 "9" */ + 0x4a, 0x99, 0xb, 0x10, 0x95, 0x3a, 0x99, 0x80, + 0x0, 0x95, 0x3a, 0xb8, 0x0, + + /* U+3A ":" */ + 0x74, 0x0, 0x0, 0x74, + + /* U+3B ";" */ + 0x74, 0x0, 0x0, 0x75, 0x62, 0x0, + + /* U+3C "<" */ + 0x0, 0x1, 0x0, 0x49, 0x80, 0x5c, 0x30, 0x0, + 0x16, 0x91, 0x0, 0x0, 0x0, + + /* U+3D "=" */ + 0x49, 0x99, 0x10, 0x0, 0x0, 0x49, 0x99, 0x10, + + /* U+3E ">" */ + 0x10, 0x0, 0x3, 0x98, 0x20, 0x0, 0x6d, 0x14, + 0x94, 0x0, 0x0, 0x0, 0x0, + + /* U+3F "?" */ + 0x6a, 0xb9, 0x0, 0x0, 0xc0, 0x0, 0xa4, 0x0, + 0x3, 0x0, 0x2, 0x80, 0x0, + + /* U+40 "@" */ + 0x3, 0x87, 0x78, 0x50, 0x28, 0x4a, 0x9c, 0x75, + 0x80, 0xb0, 0xa, 0x28, 0x80, 0xb0, 0xa, 0x28, + 0x28, 0x49, 0x99, 0xa6, 0x3, 0x88, 0x75, 0x0, + + /* U+41 "A" */ + 0x0, 0xb, 0x90, 0x0, 0x3, 0x8a, 0x10, 0x0, + 0xb1, 0x39, 0x0, 0x4d, 0x99, 0xd1, 0xb, 0x10, + 0x3, 0x90, + + /* U+42 "B" */ + 0x2d, 0x99, 0xb1, 0x2a, 0x0, 0x84, 0x2d, 0x9a, + 0xd1, 0x2a, 0x0, 0x39, 0x2d, 0x99, 0xb4, + + /* U+43 "C" */ + 0x7, 0xba, 0xa2, 0x59, 0x0, 0x0, 0x93, 0x0, + 0x0, 0x59, 0x0, 0x0, 0x7, 0xba, 0xa2, + + /* U+44 "D" */ + 0x2e, 0xab, 0xb3, 0x2, 0xa0, 0x1, 0xc0, 0x2a, + 0x0, 0x9, 0x22, 0xa0, 0x1, 0xc0, 0x2e, 0xab, + 0xb3, 0x0, + + /* U+45 "E" */ + 0x2e, 0xaa, 0x82, 0xa0, 0x0, 0x2d, 0xaa, 0x42, + 0xa0, 0x0, 0x2e, 0xaa, 0x90, + + /* U+46 "F" */ + 0x2e, 0xaa, 0x82, 0xa0, 0x0, 0x2e, 0xaa, 0x42, + 0xa0, 0x0, 0x2a, 0x0, 0x0, + + /* U+47 "G" */ + 0x7, 0xba, 0xa2, 0x59, 0x0, 0x0, 0x93, 0x0, + 0x23, 0x59, 0x0, 0x47, 0x7, 0xba, 0xa3, + + /* U+48 "H" */ + 0x2a, 0x0, 0x2a, 0x2a, 0x0, 0x2a, 0x2e, 0xaa, + 0xba, 0x2a, 0x0, 0x2a, 0x2a, 0x0, 0x2a, + + /* U+49 "I" */ + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + + /* U+4A "J" */ + 0x5, 0xad, 0x50, 0x0, 0x75, 0x0, 0x7, 0x50, + 0x0, 0x84, 0x9, 0xab, 0x0, + + /* U+4B "K" */ + 0x2a, 0x1, 0xa2, 0x2a, 0x1b, 0x20, 0x2c, 0xc7, + 0x0, 0x2d, 0x19, 0x50, 0x2a, 0x0, 0xa4, + + /* U+4C "L" */ + 0x2a, 0x0, 0x2, 0xa0, 0x0, 0x2a, 0x0, 0x2, + 0xa0, 0x0, 0x2e, 0xaa, 0x70, + + /* U+4D "M" */ + 0x2c, 0x0, 0x3, 0xc2, 0xd7, 0x0, 0xbc, 0x29, + 0x92, 0x84, 0xc2, 0x91, 0xb9, 0xc, 0x29, 0x3, + 0x0, 0xc0, + + /* U+4E "N" */ + 0x2d, 0x10, 0x2a, 0x2c, 0xb0, 0x2a, 0x2a, 0x4b, + 0x2a, 0x2a, 0x5, 0xca, 0x2a, 0x0, 0x7a, + + /* U+4F "O" */ + 0x7, 0xbb, 0xb3, 0x5, 0x90, 0x1, 0xc1, 0x93, + 0x0, 0x8, 0x45, 0x90, 0x1, 0xc1, 0x7, 0xbb, + 0xb3, 0x0, + + /* U+50 "P" */ + 0x2e, 0xaa, 0x90, 0x2a, 0x0, 0x84, 0x2a, 0x0, + 0xa3, 0x2e, 0xaa, 0x60, 0x2a, 0x0, 0x0, + + /* U+51 "Q" */ + 0x7, 0xbb, 0xb3, 0x5, 0x90, 0x1, 0xc1, 0x93, + 0x0, 0x8, 0x45, 0x90, 0x0, 0xc1, 0x7, 0xbb, + 0xb3, 0x0, 0x0, 0x39, 0x93, + + /* U+52 "R" */ + 0x2e, 0xaa, 0x90, 0x2a, 0x0, 0x84, 0x2a, 0x0, + 0xa3, 0x2d, 0xac, 0x80, 0x2a, 0x1, 0xa1, + + /* U+53 "S" */ + 0x2a, 0xaa, 0x27, 0x60, 0x0, 0x8, 0x98, 0x10, + 0x0, 0x49, 0x5a, 0xaa, 0x30, + + /* U+54 "T" */ + 0xaa, 0xea, 0x60, 0xc, 0x0, 0x0, 0xc0, 0x0, + 0xc, 0x0, 0x0, 0xc0, 0x0, + + /* U+55 "U" */ + 0x39, 0x0, 0x48, 0x39, 0x0, 0x48, 0x39, 0x0, + 0x48, 0x1c, 0x0, 0x66, 0x6, 0xba, 0xa0, + + /* U+56 "V" */ + 0xb, 0x10, 0x5, 0x70, 0x49, 0x0, 0xb0, 0x0, + 0xc1, 0x57, 0x0, 0x4, 0x9c, 0x0, 0x0, 0xc, + 0x70, 0x0, + + /* U+57 "W" */ + 0x94, 0x0, 0xf1, 0x3, 0x93, 0xa0, 0x69, 0x70, + 0x93, 0xc, 0xb, 0xb, 0xb, 0x0, 0x79, 0x80, + 0x89, 0x70, 0x1, 0xf2, 0x2, 0xf1, 0x0, + + /* U+58 "X" */ + 0x58, 0x2, 0xa0, 0x8, 0x7b, 0x10, 0x0, 0xf5, + 0x0, 0xa, 0x4b, 0x10, 0x76, 0x2, 0xb0, + + /* U+59 "Y" */ + 0xa, 0x20, 0xb, 0x0, 0x1b, 0x9, 0x30, 0x0, + 0x5b, 0x80, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, + 0x0, 0x0, + + /* U+5A "Z" */ + 0x6a, 0xac, 0xd0, 0x0, 0x1b, 0x10, 0x0, 0xb2, + 0x0, 0xb, 0x30, 0x0, 0x8d, 0xaa, 0xa0, + + /* U+5B "[" */ + 0x2d, 0x42, 0x90, 0x29, 0x2, 0x90, 0x29, 0x2, + 0x90, 0x2d, 0x40, + + /* U+5C "\\" */ + 0x19, 0x0, 0x0, 0xa0, 0x0, 0x5, 0x50, 0x0, + 0xa, 0x0, 0x0, 0x91, 0x0, 0x3, 0x70, 0x0, + 0xa, 0x0, + + /* U+5D "]" */ + 0x8c, 0xc, 0xc, 0xc, 0xc, 0xc, 0x8c, + + /* U+5E "^" */ + 0x3, 0xc0, 0x0, 0x94, 0x50, 0x27, 0x9, 0x0, + + /* U+5F "_" */ + 0x77, 0x77, + + /* U+60 "`" */ + 0x6, 0x60, + + /* U+61 "a" */ + 0x29, 0x98, 0x2, 0x98, 0xd0, 0x84, 0xc, 0x13, + 0xb9, 0xd1, + + /* U+62 "b" */ + 0x48, 0x0, 0x0, 0x48, 0x0, 0x0, 0x4c, 0xab, + 0x50, 0x4a, 0x0, 0xc0, 0x4a, 0x0, 0xc0, 0x4c, + 0xaa, 0x50, + + /* U+63 "c" */ + 0x1a, 0xaa, 0x18, 0x40, 0x0, 0x84, 0x0, 0x1, + 0xaa, 0xa1, + + /* U+64 "d" */ + 0x0, 0x0, 0xb0, 0x0, 0xb, 0x1a, 0xaa, 0xb9, + 0x40, 0x3b, 0x94, 0x2, 0xb1, 0xa9, 0x9b, + + /* U+65 "e" */ + 0x19, 0x99, 0x19, 0x98, 0x86, 0x85, 0x1, 0x1, + 0xaa, 0xb1, + + /* U+66 "f" */ + 0xa, 0xa0, 0x2a, 0x0, 0x9d, 0x70, 0x29, 0x0, + 0x29, 0x0, 0x29, 0x0, + + /* U+67 "g" */ + 0x1a, 0x99, 0xb9, 0x40, 0x1c, 0x94, 0x2, 0xc1, + 0xaa, 0xab, 0x18, 0x9a, 0x30, + + /* U+68 "h" */ + 0x48, 0x0, 0x4, 0x80, 0x0, 0x4c, 0x9b, 0x44, + 0x90, 0x1b, 0x48, 0x0, 0xc4, 0x80, 0xc, + + /* U+69 "i" */ + 0x37, 0x0, 0x48, 0x48, 0x48, 0x48, + + /* U+6A "j" */ + 0x3, 0x70, 0x0, 0x3, 0x80, 0x38, 0x3, 0x80, + 0x38, 0x6b, 0x40, + + /* U+6B "k" */ + 0x48, 0x0, 0x4, 0x80, 0x0, 0x48, 0xa, 0x44, + 0x9c, 0x30, 0x4d, 0x6a, 0x4, 0x80, 0x77, + + /* U+6C "l" */ + 0x48, 0x48, 0x48, 0x48, 0x48, 0x48, + + /* U+6D "m" */ + 0x4c, 0x9b, 0x89, 0xb4, 0x49, 0x3, 0xb0, 0xb, + 0x48, 0x2, 0xa0, 0xc, 0x48, 0x2, 0xa0, 0xc, + + /* U+6E "n" */ + 0x4c, 0x9b, 0x44, 0x90, 0x1b, 0x48, 0x0, 0xc4, + 0x80, 0xc, + + /* U+6F "o" */ + 0x1a, 0xaa, 0x18, 0x40, 0x3a, 0x84, 0x3, 0xa1, + 0xaa, 0xa1, + + /* U+70 "p" */ + 0x4c, 0xab, 0x50, 0x4a, 0x0, 0xc0, 0x4a, 0x0, + 0xc0, 0x4c, 0xaa, 0x50, 0x48, 0x0, 0x0, + + /* U+71 "q" */ + 0x1a, 0xa9, 0xb9, 0x40, 0x3b, 0x94, 0x3, 0xb1, + 0xaa, 0x9b, 0x0, 0x0, 0xb0, + + /* U+72 "r" */ + 0x4b, 0xa0, 0x4a, 0x0, 0x48, 0x0, 0x48, 0x0, + + /* U+73 "s" */ + 0x5b, 0x95, 0x87, 0x30, 0x3, 0x79, 0x7a, 0xa6, + + /* U+74 "t" */ + 0x29, 0x0, 0x9d, 0x70, 0x29, 0x0, 0x29, 0x0, + 0xb, 0x90, + + /* U+75 "u" */ + 0x57, 0x1, 0xb5, 0x70, 0x1b, 0x48, 0x3, 0xb0, + 0xa9, 0x9b, + + /* U+76 "v" */ + 0xb, 0x0, 0x84, 0x5, 0x70, 0xb0, 0x0, 0xb7, + 0x50, 0x0, 0x6d, 0x0, + + /* U+77 "w" */ + 0xb0, 0xe, 0x20, 0xa0, 0x55, 0x59, 0x82, 0x80, + 0xa, 0xa0, 0xa8, 0x20, 0x9, 0x80, 0x6b, 0x0, + + /* U+78 "x" */ + 0x67, 0x1b, 0x0, 0x9b, 0x10, 0xa, 0xb2, 0x7, + 0x51, 0xb0, + + /* U+79 "y" */ + 0xb, 0x10, 0x83, 0x3, 0x81, 0xa0, 0x0, 0xaa, + 0x30, 0x0, 0x4a, 0x0, 0xa, 0xb2, 0x0, + + /* U+7A "z" */ + 0x59, 0xbb, 0x1, 0xb1, 0xb, 0x20, 0x9c, 0x98, + + /* U+7B "{" */ + 0xa, 0x60, 0xc0, 0xc, 0x5, 0xb0, 0xc, 0x0, + 0xc0, 0xa, 0x60, + + /* U+7C "|" */ + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + + /* U+7D "}" */ + 0x97, 0x0, 0xb0, 0xb, 0x0, 0xd3, 0xb, 0x0, + 0xb0, 0x97, 0x0, + + /* U+7E "~" */ + 0x29, 0x35, 0x15, 0x6, 0x80, + + /* U+B0 "°" */ + 0x26, 0x47, 0x7, 0x27, 0x50, + + /* U+2022 "•" */ + 0x0, 0x5d, 0x2, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbe, + 0x0, 0x8d, 0xff, 0xff, 0x0, 0xff, 0xe9, 0x5f, + 0x0, 0xf3, 0x0, 0xf, 0x0, 0xf0, 0x0, 0xf, + 0x0, 0xf0, 0xa, 0xff, 0xaf, 0xf0, 0xa, 0xfa, + 0xaf, 0xa0, 0x0, 0x0, + + /* U+F008 "" */ + 0xbd, 0xcc, 0xce, 0xab, 0x8b, 0x0, 0x7, 0x58, + 0xcd, 0x66, 0x6a, 0xac, 0xcd, 0x66, 0x6a, 0xac, + 0x8b, 0x0, 0x7, 0x58, 0xbd, 0xcc, 0xce, 0xab, + + /* U+F00B "" */ + 0x34, 0x14, 0x44, 0x43, 0xff, 0x7f, 0xff, 0xff, + 0xab, 0x4b, 0xbb, 0xba, 0xbc, 0x5c, 0xcc, 0xcb, + 0xff, 0x7f, 0xff, 0xff, 0x67, 0x17, 0x88, 0x86, + 0xff, 0x7f, 0xff, 0xff, 0xab, 0x4b, 0xbb, 0xba, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x9a, 0x0, 0x0, 0x9, 0xfa, + 0xa9, 0x0, 0x9f, 0xa0, 0xaf, 0x99, 0xfa, 0x0, + 0xa, 0xff, 0xa0, 0x0, 0x0, 0x99, 0x0, 0x0, + + /* U+F00D "" */ + 0x63, 0x0, 0x82, 0xcf, 0x4a, 0xf4, 0x1d, 0xff, + 0x60, 0xa, 0xff, 0x30, 0xaf, 0x7d, 0xf3, 0xa6, + 0x1, 0xb3, + + /* U+F011 "" */ + 0x0, 0xc, 0x51, 0x0, 0x1d, 0x7d, 0x6e, 0x70, + 0x8d, 0xd, 0x65, 0xf1, 0xc7, 0xd, 0x60, 0xe6, + 0xd7, 0x6, 0x20, 0xe6, 0x9d, 0x0, 0x4, 0xf2, + 0x1e, 0xc7, 0x8f, 0x80, 0x1, 0x9d, 0xc6, 0x0, + + /* U+F013 "" */ + 0x0, 0xc, 0xc0, 0x0, 0x18, 0x8f, 0xf8, 0x81, + 0x8f, 0xfe, 0xef, 0xf8, 0x2f, 0xe0, 0xe, 0xf2, + 0x2f, 0xe0, 0xe, 0xf2, 0x8f, 0xfe, 0xef, 0xf8, + 0x18, 0x8f, 0xf8, 0x81, 0x0, 0xc, 0xc0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x30, 0x22, 0x0, 0x0, 0xaf, 0xaa, + 0xa0, 0x1, 0xda, 0x6a, 0xfa, 0x3, 0xe8, 0xbf, + 0xb8, 0xe3, 0xb6, 0xdf, 0xff, 0xd6, 0xb0, 0x8f, + 0xfb, 0xff, 0x80, 0x8, 0xfc, 0xc, 0xf8, 0x0, + 0x5b, 0x80, 0x8b, 0x50, + + /* U+F019 "" */ + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x7, 0xff, 0xff, 0x70, + 0x0, 0x9f, 0xf9, 0x0, 0x78, 0x7a, 0xa7, 0x87, + 0xff, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xbf, + + /* U+F01C "" */ + 0x5, 0xff, 0xff, 0xf5, 0x1, 0xe3, 0x0, 0x3, + 0xe1, 0xa8, 0x0, 0x0, 0x8, 0xaf, 0xff, 0x60, + 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xfd, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x3, 0x2, 0xbf, 0xfb, 0x3f, + 0x2e, 0x91, 0x18, 0xff, 0x9a, 0x0, 0x6c, 0xff, + 0x31, 0x0, 0x24, 0x44, 0x44, 0x42, 0x0, 0x13, + 0xff, 0xc6, 0x0, 0xb9, 0xfe, 0xa5, 0x5b, 0xd1, + 0xf2, 0x8c, 0xc8, 0x10, 0x30, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x9, 0x34, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xab, 0xff, 0x0, 0x4f, 0x0, 0x1, + + /* U+F027 "" */ + 0x0, 0x9, 0x0, 0x34, 0xcf, 0x1, 0xff, 0xff, + 0x1b, 0xff, 0xff, 0x1b, 0xbb, 0xff, 0x1, 0x0, + 0x4f, 0x0, 0x0, 0x1, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x54, 0x0, 0x0, 0x90, 0x23, + 0xb3, 0x34, 0xcf, 0x2, 0xc3, 0xbf, 0xff, 0xf1, + 0xb5, 0x6c, 0xff, 0xff, 0x1b, 0x56, 0xca, 0xbf, + 0xf0, 0x2c, 0x3a, 0x0, 0x4f, 0x2, 0x3b, 0x30, + 0x0, 0x10, 0x5, 0x40, + + /* U+F03E "" */ + 0xdf, 0xff, 0xff, 0xfd, 0xf0, 0x7f, 0xff, 0xff, + 0xf8, 0xcf, 0xb1, 0xbf, 0xfb, 0x5b, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0xf, 0xdf, 0xff, 0xff, 0xfd, + + /* U+F048 "" */ + 0x40, 0x0, 0x2f, 0x20, 0x8f, 0xf2, 0x9f, 0xff, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0x5e, 0xff, 0xf2, + 0x2e, 0xfb, 0x10, 0x19, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0xd, 0xa1, 0x0, 0x0, 0xff, + 0xf7, 0x0, 0xf, 0xff, 0xfd, 0x40, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xd4, + 0xf, 0xff, 0x70, 0x0, 0xda, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x9b, 0x90, 0x9b, 0x9f, 0xff, 0xf, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf0, 0xff, + 0xf2, 0x42, 0x2, 0x42, + + /* U+F04D "" */ + 0x24, 0x44, 0x44, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xbb, 0xbb, 0xb8, + + /* U+F051 "" */ + 0x20, 0x0, 0x4f, 0x80, 0x2f, 0xff, 0x92, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x5f, 0xfd, + 0x22, 0xf9, 0x10, 0x1b, + + /* U+F052 "" */ + 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x8f, 0x80, + 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, 0x5f, 0xff, + 0xff, 0x50, 0xe, 0xff, 0xff, 0xfe, 0x0, 0x58, + 0x88, 0x88, 0x50, 0xf, 0xff, 0xff, 0xff, 0x0, + 0xab, 0xbb, 0xbb, 0xa0, + + /* U+F053 "" */ + 0x0, 0x6, 0x20, 0x7, 0xf4, 0x7, 0xf5, 0x5, + 0xf6, 0x0, 0x1e, 0xb0, 0x0, 0x2e, 0xb0, 0x0, + 0x2e, 0x60, 0x0, 0x10, + + /* U+F054 "" */ + 0x26, 0x0, 0x4, 0xf7, 0x0, 0x5, 0xf7, 0x0, + 0x6, 0xf5, 0x0, 0xbe, 0x10, 0xbe, 0x20, 0x6e, + 0x20, 0x0, 0x10, 0x0, + + /* U+F067 "" */ + 0x0, 0x4, 0x0, 0x0, 0x3, 0xf3, 0x0, 0x0, + 0x4f, 0x40, 0x7, 0x8a, 0xfa, 0x87, 0xef, 0xff, + 0xff, 0xe0, 0x4, 0xf4, 0x0, 0x0, 0x4f, 0x40, + 0x0, 0x1, 0xb1, 0x0, + + /* U+F068 "" */ + 0x78, 0x88, 0x88, 0x7e, 0xff, 0xff, 0xfe, + + /* U+F06E "" */ + 0x0, 0x8c, 0xcc, 0x80, 0x1, 0xdd, 0x16, 0x3d, + 0xd1, 0xcf, 0x55, 0xed, 0x5f, 0xcb, 0xf5, 0xdf, + 0xd5, 0xfc, 0x1d, 0xd3, 0x73, 0xdd, 0x10, 0x8, + 0xdc, 0xc8, 0x10, + + /* U+F070 "" */ + 0x1d, 0x30, 0x0, 0x0, 0x0, 0x0, 0x5e, 0x8c, + 0xcc, 0xa2, 0x0, 0x0, 0x2d, 0xb4, 0x49, 0xf4, + 0x0, 0x7a, 0x1a, 0xff, 0x3f, 0xe1, 0x7, 0xfa, + 0x6, 0xf7, 0xff, 0x10, 0xa, 0xf3, 0x3, 0xef, + 0x40, 0x0, 0x6, 0xcc, 0x71, 0xbb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x89, + + /* U+F071 "" */ + 0x0, 0x0, 0x3e, 0x30, 0x0, 0x0, 0x0, 0xc, + 0xfc, 0x0, 0x0, 0x0, 0x6, 0xfc, 0xf6, 0x0, + 0x0, 0x0, 0xed, 0xd, 0xe0, 0x0, 0x0, 0x8f, + 0xe0, 0xef, 0x80, 0x0, 0x2f, 0xff, 0x6f, 0xff, + 0x20, 0xb, 0xff, 0xe2, 0xef, 0xfa, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0xd0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x20, 0x44, 0x0, 0x4, 0xf5, + 0xef, 0xb1, 0xcf, 0xfd, 0x1, 0x8c, 0xd1, 0xc1, + 0x1, 0xdc, 0x81, 0xc1, 0xef, 0xc1, 0xbf, 0xfd, + 0x44, 0x0, 0x4, 0xf5, 0x0, 0x0, 0x0, 0x20, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x4, 0xe4, 0x0, 0x4, + 0xfc, 0xf4, 0x4, 0xf8, 0x8, 0xf4, 0xb8, 0x0, + 0x8, 0xb0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0xb, 0x80, 0x0, 0x8b, 0x4f, + 0x80, 0x8f, 0x40, 0x4f, 0xcf, 0x40, 0x0, 0x4e, + 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x94, 0x14, 0x44, 0x40, 0x0, 0xbf, 0xf8, + 0xbb, 0xbf, 0x10, 0x8, 0xb7, 0x60, 0x0, 0xe1, + 0x0, 0xb, 0x40, 0x0, 0x1e, 0x20, 0x0, 0xb7, + 0x44, 0x5e, 0xfd, 0x50, 0x7, 0xbb, 0xb8, 0x5f, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+F07B "" */ + 0xdf, 0xfb, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, + + /* U+F093 "" */ + 0x0, 0x9, 0x90, 0x0, 0x0, 0x9f, 0xf9, 0x0, + 0x7, 0xff, 0xff, 0x70, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x78, 0x4f, 0xf4, 0x87, + 0xff, 0xe8, 0x8e, 0xff, 0xff, 0xff, 0xfb, 0xbf, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xea, 0x0, 0x0, 0x0, 0xef, 0xe0, 0x0, 0x0, + 0xc, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, + 0x0, 0x1d, 0xe0, 0x7, 0xdc, 0x4d, 0xf3, 0x0, + 0xef, 0xff, 0xe3, 0x0, 0xa, 0xec, 0x70, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x3, 0x0, 0x0, 0x0, 0xcd, 0xc0, 0x2d, 0xc0, + 0xe7, 0xf2, 0xee, 0x20, 0x4b, 0xff, 0xe2, 0x0, + 0x4, 0xff, 0xa0, 0x0, 0xcd, 0xf9, 0xf9, 0x0, + 0xe7, 0xe0, 0x7f, 0x90, 0x4a, 0x40, 0x4, 0x50, + + /* U+F0C5 "" */ + 0x0, 0xff, 0xf7, 0x47, 0x4f, 0xff, 0x47, 0xf8, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xfb, 0x78, 0x88, + 0x7f, 0xff, 0xff, 0x0, + + /* U+F0C7 "" */ + 0x24, 0x44, 0x41, 0xf, 0xbb, 0xbb, 0xe2, 0xf0, + 0x0, 0xf, 0xdf, 0x44, 0x44, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xf9, 0x9, 0xff, 0xff, 0xd5, 0xdf, + 0xf8, 0xbb, 0xbb, 0xb8, + + /* U+F0E7 "" */ + 0x7, 0xff, 0x60, 0x0, 0xaf, 0xf2, 0x0, 0xc, + 0xff, 0x87, 0x0, 0xef, 0xff, 0xb0, 0x7, 0x8e, + 0xf2, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x3e, 0x0, + 0x0, 0x6, 0x50, 0x0, + + /* U+F0EA "" */ + 0x79, 0xb9, 0x70, 0xf, 0xfc, 0xff, 0x0, 0xff, + 0x68, 0x83, 0xf, 0xf8, 0xff, 0x8b, 0xff, 0x8f, + 0xf8, 0x8f, 0xf8, 0xff, 0xff, 0x78, 0x8f, 0xff, + 0xf0, 0x7, 0xff, 0xff, + + /* U+F0F3 "" */ + 0x0, 0xd, 0x0, 0x0, 0x4e, 0xfe, 0x30, 0xd, + 0xff, 0xfd, 0x0, 0xff, 0xff, 0xf0, 0x3f, 0xff, + 0xff, 0x3b, 0xff, 0xff, 0xfb, 0x78, 0x88, 0x88, + 0x60, 0x4, 0xf4, 0x0, + + /* U+F11C "" */ + 0xdf, 0xff, 0xff, 0xff, 0xdf, 0x18, 0x81, 0x88, + 0x1f, 0xfe, 0xaa, 0xca, 0xae, 0xff, 0xea, 0xac, + 0xaa, 0xef, 0xf1, 0x80, 0x0, 0x81, 0xfd, 0xff, + 0xff, 0xff, 0xfd, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xc0, 0x0, 0x0, 0x5c, 0xff, 0xb0, 0x0, + 0x6e, 0xff, 0xff, 0x40, 0xd, 0xff, 0xff, 0xfc, + 0x0, 0x6, 0x88, 0xcf, 0xf5, 0x0, 0x0, 0x0, + 0x8f, 0xe0, 0x0, 0x0, 0x0, 0x8f, 0x60, 0x0, + 0x0, 0x0, 0x5d, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0xff, 0xf8, 0xb0, 0xff, 0xf8, 0xfb, 0xff, 0xfc, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + + /* U+F1EB "" */ + 0x0, 0x4, 0x77, 0x40, 0x0, 0x9, 0xff, 0xcc, + 0xff, 0x90, 0xcd, 0x40, 0x0, 0x4, 0xdc, 0x20, + 0x4b, 0xff, 0xb4, 0x2, 0x1, 0xfa, 0x55, 0xaf, + 0x10, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0xee, 0x0, 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, + + /* U+F240 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xee, 0xee, 0xee, 0x5f, 0xf8, + 0xff, 0xff, 0xff, 0x2f, 0xf5, 0x66, 0x66, 0x66, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F241 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xee, 0xee, 0x70, 0x5f, 0xf8, + 0xff, 0xff, 0x80, 0x2f, 0xf5, 0x66, 0x66, 0x54, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F242 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xee, 0xe0, 0x0, 0x5f, 0xf8, + 0xff, 0xf0, 0x0, 0x2f, 0xf5, 0x66, 0x64, 0x44, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F243 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xda, 0xf7, 0xe7, 0x0, 0x0, 0x5f, 0xf8, + 0xf8, 0x0, 0x0, 0x2f, 0xf5, 0x65, 0x44, 0x44, + 0xab, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F244 "" */ + 0x24, 0x44, 0x44, 0x44, 0x40, 0xfb, 0xbb, 0xbb, + 0xbb, 0xd8, 0xf0, 0x0, 0x0, 0x0, 0x5f, 0xf0, + 0x0, 0x0, 0x0, 0x2f, 0xf4, 0x44, 0x44, 0x44, + 0xad, 0x8b, 0xbb, 0xbb, 0xbb, 0xb3, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xd8, 0x0, 0x0, 0x0, 0x7, 0x36, 0x40, 0x0, + 0x9, 0xb1, 0x91, 0x11, 0x17, 0x20, 0xef, 0x88, + 0xd8, 0x88, 0xd9, 0x2, 0x20, 0x6, 0x48, 0x70, + 0x0, 0x0, 0x0, 0x6, 0xec, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x6, 0xdd, 0xc3, 0x4, 0xff, 0x3e, 0xd0, 0x9c, + 0xb5, 0x5f, 0x2b, 0xf7, 0x1a, 0xf4, 0xbf, 0x81, + 0xbf, 0x39, 0xc9, 0x64, 0xf2, 0x4f, 0xf3, 0xde, + 0x0, 0x6d, 0xed, 0x30, + + /* U+F2ED "" */ + 0x78, 0xdf, 0xd8, 0x77, 0x88, 0x88, 0x87, 0x8f, + 0xff, 0xff, 0x88, 0xcc, 0x8c, 0xc8, 0x8c, 0xc8, + 0xcc, 0x88, 0xcc, 0x8c, 0xc8, 0x8c, 0xc8, 0xcc, + 0x85, 0xff, 0xff, 0xf5, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x7e, 0x30, 0x0, 0x0, 0x4b, + 0xfe, 0x0, 0x0, 0x8f, 0x9b, 0x70, 0x0, 0x8f, + 0xff, 0x40, 0x0, 0x8f, 0xff, 0x80, 0x0, 0x7f, + 0xff, 0x80, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, + 0xee, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0xaf, 0xff, 0xff, 0xfc, 0xb, 0xff, 0x9c, + 0xc9, 0xff, 0xaf, 0xff, 0xc1, 0x1c, 0xff, 0xaf, + 0xff, 0xc1, 0x1c, 0xff, 0xb, 0xff, 0x9c, 0xc9, + 0xff, 0x0, 0xaf, 0xff, 0xff, 0xfc, + + /* U+F7C2 "" */ + 0x7, 0xff, 0xfe, 0x17, 0xb6, 0x27, 0xc3, 0xfe, + 0xb9, 0xbe, 0x3f, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0x3f, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0x3c, 0xff, 0xff, 0xe1, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x3, 0x0, 0x23, 0x0, 0x2, + 0xf0, 0x2e, 0x92, 0x22, 0x5f, 0xd, 0xff, 0xff, + 0xff, 0xf0, 0x2e, 0x92, 0x22, 0x21, 0x0, 0x23, + 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 34, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 34, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5, .adv_w = 50, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 10, .adv_w = 90, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 25, .adv_w = 79, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 43, .adv_w = 108, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 61, .adv_w = 88, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 79, .adv_w = 27, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 82, .adv_w = 43, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 93, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 100, .adv_w = 51, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 106, .adv_w = 74, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 116, .adv_w = 29, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 119, .adv_w = 49, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 121, .adv_w = 29, .box_w = 2, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 123, .adv_w = 45, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 141, .adv_w = 85, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 154, .adv_w = 47, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 162, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 175, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 188, .adv_w = 86, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 203, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 216, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 229, .adv_w = 77, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 242, .adv_w = 82, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 255, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 268, .adv_w = 29, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 272, .adv_w = 29, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 278, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 291, .adv_w = 74, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 299, .adv_w = 74, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 312, .adv_w = 73, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 325, .adv_w = 132, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 349, .adv_w = 94, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 367, .adv_w = 97, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 382, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 397, .adv_w = 106, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 415, .adv_w = 86, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 428, .adv_w = 81, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 441, .adv_w = 99, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 456, .adv_w = 104, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 471, .adv_w = 40, .box_w = 2, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 476, .adv_w = 66, .box_w = 5, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 489, .adv_w = 92, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 504, .adv_w = 76, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 517, .adv_w = 122, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 535, .adv_w = 104, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 550, .adv_w = 108, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 568, .adv_w = 92, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 583, .adv_w = 108, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 604, .adv_w = 93, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 619, .adv_w = 79, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 632, .adv_w = 75, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 645, .adv_w = 101, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 660, .adv_w = 91, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 678, .adv_w = 144, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 701, .adv_w = 86, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 716, .adv_w = 83, .box_w = 7, .box_h = 5, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 734, .adv_w = 84, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 749, .adv_w = 43, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 760, .adv_w = 45, .box_w = 5, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 778, .adv_w = 43, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 785, .adv_w = 75, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 793, .adv_w = 64, .box_w = 4, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 795, .adv_w = 77, .box_w = 3, .box_h = 1, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 797, .adv_w = 77, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 807, .adv_w = 87, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 825, .adv_w = 73, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 835, .adv_w = 87, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 850, .adv_w = 78, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 860, .adv_w = 45, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 872, .adv_w = 88, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 885, .adv_w = 87, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 900, .adv_w = 36, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 906, .adv_w = 36, .box_w = 3, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 917, .adv_w = 79, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 932, .adv_w = 36, .box_w = 2, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 938, .adv_w = 135, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 954, .adv_w = 87, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 964, .adv_w = 81, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 974, .adv_w = 87, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 989, .adv_w = 87, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1002, .adv_w = 52, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1010, .adv_w = 64, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1018, .adv_w = 53, .box_w = 4, .box_h = 5, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1028, .adv_w = 87, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1038, .adv_w = 72, .box_w = 6, .box_h = 4, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1050, .adv_w = 115, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1066, .adv_w = 71, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1076, .adv_w = 72, .box_w = 6, .box_h = 5, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1091, .adv_w = 67, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1099, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1110, .adv_w = 38, .box_w = 2, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1117, .adv_w = 45, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1128, .adv_w = 74, .box_w = 5, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1133, .adv_w = 54, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 1138, .adv_w = 40, .box_w = 2, .box_h = 3, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 1141, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1177, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1201, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1233, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1257, .adv_w = 88, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1275, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1307, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1339, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1375, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1407, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1434, .adv_w = 128, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1474, .adv_w = 64, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1488, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1509, .adv_w = 144, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1545, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1569, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1589, .adv_w = 112, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1624, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1652, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1680, .adv_w = 112, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1700, .adv_w = 112, .box_w = 9, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1736, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1756, .adv_w = 80, .box_w = 5, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1776, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1804, .adv_w = 112, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1811, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1838, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1882, .adv_w = 144, .box_w = 11, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1926, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1958, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1979, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2000, .adv_w = 160, .box_w = 11, .box_h = 7, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2039, .adv_w = 128, .box_w = 8, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2063, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2095, .adv_w = 128, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2136, .adv_w = 112, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2168, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2196, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2224, .adv_w = 80, .box_w = 7, .box_h = 8, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 2252, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2280, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2308, .adv_w = 144, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2335, .adv_w = 128, .box_w = 10, .box_h = 10, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 2385, .adv_w = 96, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2409, .adv_w = 160, .box_w = 10, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2449, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2479, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2509, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2539, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2569, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2599, .adv_w = 160, .box_w = 11, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2643, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2671, .adv_w = 112, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2699, .adv_w = 128, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 2740, .adv_w = 160, .box_w = 10, .box_h = 6, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2770, .adv_w = 96, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2798, .adv_w = 129, .box_w = 9, .box_h = 6, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1f72, 0xef51, 0xef58, 0xef5b, 0xef5c, 0xef5d, 0xef61, + 0xef63, 0xef65, 0xef69, 0xef6c, 0xef71, 0xef76, 0xef77, 0xef78, + 0xef8e, 0xef98, 0xef9b, 0xef9c, 0xef9d, 0xefa1, 0xefa2, 0xefa3, + 0xefa4, 0xefb7, 0xefb8, 0xefbe, 0xefc0, 0xefc1, 0xefc4, 0xefc7, + 0xefc8, 0xefc9, 0xefcb, 0xefe3, 0xefe5, 0xf014, 0xf015, 0xf017, + 0xf037, 0xf03a, 0xf043, 0xf06c, 0xf074, 0xf0ab, 0xf13b, 0xf190, + 0xf191, 0xf192, 0xf193, 0xf194, 0xf1d7, 0xf1e3, 0xf23d, 0xf254, + 0xf4aa, 0xf712, 0xf7f2 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 176, .range_length = 63475, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 59, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = +{ + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 0, 13, 14, 15, 16, 17, + 18, 19, 12, 20, 20, 0, 0, 0, + 21, 22, 23, 24, 25, 22, 26, 27, + 28, 29, 29, 30, 31, 32, 29, 29, + 22, 33, 34, 35, 3, 36, 30, 37, + 37, 38, 39, 40, 41, 42, 43, 0, + 44, 0, 45, 46, 47, 48, 49, 50, + 51, 45, 52, 52, 53, 48, 45, 45, + 46, 46, 54, 55, 56, 57, 51, 58, + 58, 59, 58, 60, 41, 0, 0, 9, + 61, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = +{ + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 10, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 12, + 18, 19, 20, 21, 21, 0, 0, 0, + 22, 23, 24, 25, 23, 25, 25, 25, + 23, 25, 25, 26, 25, 25, 25, 25, + 23, 25, 23, 25, 3, 27, 28, 29, + 29, 30, 31, 32, 33, 34, 35, 0, + 36, 0, 37, 38, 39, 39, 39, 0, + 39, 38, 40, 41, 38, 38, 42, 42, + 39, 42, 39, 42, 43, 44, 45, 46, + 46, 47, 46, 48, 0, 0, 35, 9, + 49, 9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 3, -3, 0, 0, + 0, 0, -7, -8, 1, 6, 3, 2, + -5, 1, 6, 0, 5, 1, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 1, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, -4, 0, 0, 0, 0, + 0, -3, 2, 3, 0, 0, -1, 0, + -1, 1, 0, -1, 0, -1, -1, -3, + 0, 0, 0, 0, -1, 0, 0, -2, + -2, 0, 0, -1, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + -1, 0, -2, 0, -3, 0, -15, 0, + 0, -3, 0, 3, 4, 0, 0, -3, + 1, 1, 4, 3, -2, 3, 0, 0, + -7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, -2, -6, 0, -5, + -1, 0, 0, 0, 0, 0, 5, 0, + -4, -1, 0, 0, 0, -2, 0, 0, + -1, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -10, -1, 5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 4, + 0, 1, 0, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, + 3, 1, 4, -1, 0, 0, 3, -1, + -4, -18, 1, 3, 3, 0, -2, 0, + 5, 0, 4, 0, 4, 0, -12, 0, + -2, 4, 0, 4, -1, 3, 1, 0, + 0, 0, -1, 0, 0, -2, 10, 0, + 10, 0, 4, 0, 5, 2, 2, 4, + 0, 0, 0, -5, 0, 0, 0, 0, + 0, -1, 0, 1, -2, -2, -3, 1, + 0, -1, 0, 0, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, 0, -8, 0, 0, 0, + 0, -1, 0, 13, -2, -2, 1, 1, + -1, 0, -2, 1, 0, 0, -7, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -12, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 8, 0, 0, -5, 0, + 4, 0, -9, -12, -9, -3, 4, 0, + 0, -9, 0, 2, -3, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 4, -16, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 1, 0, 0, 0, + 0, 0, 1, 1, -2, -3, 0, 0, + 0, -1, 0, 0, -1, 0, 0, 0, + -3, 0, -1, 0, -3, -3, 0, -3, + -4, -4, -2, 0, -3, 0, -3, 0, + 0, 0, 0, -1, 0, 0, 1, 0, + 1, -1, 0, 0, 0, 0, 0, 1, + -1, 0, 0, 0, -1, 1, 1, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -1, 0, + -2, 0, -2, 0, 0, -1, 0, 4, + 0, 0, -1, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, 0, -1, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -1, -1, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, -1, -2, 0, -2, 0, -4, + -1, -4, 3, 0, 0, -3, 1, 3, + 3, 0, -3, 0, -2, 0, 0, -6, + 1, -1, 1, -7, 1, 0, 0, 0, + -7, 0, -7, -1, -11, -1, 0, -6, + 0, 3, 4, 0, 2, 0, 0, 0, + 0, 0, 0, -2, -2, 0, -4, 0, + 0, 0, -1, 0, 0, 0, -1, 0, + 0, 0, 0, 0, -1, -1, 0, -1, + -2, 0, 0, 0, 0, 0, 0, 0, + -1, -1, 0, -1, -2, -1, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, -1, 0, -3, 1, 0, 0, -2, + 1, 1, 1, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -1, 0, -1, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 1, 0, + -1, 0, 0, 0, 0, -1, -2, 0, + -2, 0, 4, -1, 0, -4, 0, 0, + 3, -6, -7, -5, -3, 1, 0, -1, + -8, -2, 0, -2, 0, -3, 2, -2, + -8, 0, -3, 0, 0, 1, 0, 1, + -1, 0, 1, 0, -4, -5, 0, -6, + -3, -3, -3, -4, -2, -3, 0, -2, + -3, 1, 0, 0, 0, -1, 0, 0, + 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, -1, 0, 0, -1, 0, -2, -3, + -3, 0, 0, -4, 0, 0, 0, 0, + 0, 0, -1, 0, 0, 0, 0, 1, + -1, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + -2, 0, 0, 0, 0, -6, -4, 0, + 0, 0, -2, -6, 0, 0, -1, 1, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, -2, 0, + 0, 0, 0, 2, 0, 1, -3, -3, + 0, -1, -1, -2, 0, 0, 0, 0, + 0, 0, -4, 0, -1, 0, -2, -1, + 0, -3, -3, -4, -1, 0, -3, 0, + -4, 0, 0, 0, 0, 10, 0, 0, + 1, 0, 0, -2, 0, 1, 0, -6, + 0, 0, 0, 0, 0, -12, -2, 4, + 4, -1, -5, 0, 1, -2, 0, -6, + -1, -2, 1, -9, -1, 2, 0, 2, + -4, -2, -5, -4, -5, 0, 0, -8, + 0, 7, 0, 0, -1, 0, 0, 0, + -1, -1, -1, -3, -4, 0, -12, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, -1, -1, -2, 0, 0, + -3, 0, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -3, 0, 0, 3, + 0, 2, 0, -3, 1, -1, 0, -3, + -1, 0, -2, -1, -1, 0, -2, -2, + 0, 0, -1, 0, -1, -2, -2, 0, + 0, -1, 0, 1, -1, 0, -3, 0, + 0, 0, -3, 0, -2, 0, -2, -2, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 1, 0, -2, 0, -1, -2, + -4, -1, -1, -1, 0, -1, -2, 0, + 0, 0, 0, 0, 0, -1, -1, -1, + 0, 0, 0, 0, 2, -1, 0, -1, + 0, 0, 0, -1, -2, -1, -1, -2, + -1, 0, 1, 5, 0, 0, -3, 0, + -1, 3, 0, -1, -5, -2, 2, 0, + 0, -6, -2, 1, -2, 1, 0, -1, + -1, -4, 0, -2, 1, 0, 0, -2, + 0, 0, 0, 1, 1, -3, -2, 0, + -2, -1, -2, -1, -1, 0, -2, 1, + -2, -2, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + 0, 0, -1, -1, 0, 0, 0, 0, + -1, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, -1, 0, 0, 0, 0, + -2, 0, -3, 0, 0, 0, -4, 0, + 1, -3, 3, 0, -1, -6, 0, 0, + -3, -1, 0, -5, -3, -4, 0, 0, + -6, -1, -5, -5, -6, 0, -3, 0, + 1, 9, -2, 0, -3, -1, 0, -1, + -2, -3, -2, -5, -5, -3, -1, 0, + 0, -1, 0, 0, 0, 0, -9, -1, + 4, 3, -3, -5, 0, 0, -4, 0, + -6, -1, -1, 3, -12, -2, 0, 0, + 0, -8, -2, -7, -1, -9, 0, 0, + -9, 0, 8, 0, 0, -1, 0, 0, + 0, 0, -1, -1, -5, -1, 0, -8, + 0, 0, 0, 0, -4, 0, -1, 0, + 0, -4, -6, 0, 0, -1, -2, -4, + -1, 0, -1, 0, 0, 0, 0, -6, + -1, -4, -4, -1, -2, -3, -1, -2, + 0, -3, -1, -4, -2, 0, -2, -2, + -1, -2, 0, 1, 0, -1, -4, 0, + 3, 0, -2, 0, 0, 0, 0, 2, + 0, 1, -3, 5, 0, -1, -1, -2, + 0, 0, 0, 0, 0, 0, -4, 0, + -1, 0, -2, -1, 0, -3, -3, -4, + -1, 0, -3, 1, 5, 0, 0, 0, + 0, 10, 0, 0, 1, 0, 0, -2, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, -3, 0, 0, 0, 0, 0, -1, + 0, 0, 0, -1, -1, 0, 0, -3, + -1, 0, 0, -3, 0, 2, -1, 0, + 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 2, 3, 1, -1, 0, -4, + -2, 0, 4, -4, -4, -3, -3, 5, + 2, 1, -11, -1, 3, -1, 0, -1, + 1, -1, -4, 0, -1, 1, -2, -1, + -4, -1, 0, 0, 4, 3, 0, -4, + 0, -7, -2, 4, -2, -5, 0, -2, + -4, -4, -1, 5, 1, 0, -2, 0, + -3, 0, 1, 4, -3, -5, -5, -3, + 4, 0, 0, -9, -1, 1, -2, -1, + -3, 0, -3, -5, -2, -2, -1, 0, + 0, -3, -3, -1, 0, 4, 3, -1, + -7, 0, -7, -2, 0, -4, -7, 0, + -4, -2, -4, -4, 3, 0, 0, -2, + 0, -3, -1, 0, -1, -2, 0, 2, + -4, 1, 0, 0, -7, 0, -1, -3, + -2, -1, -4, -3, -4, -3, 0, -4, + -1, -3, -2, -4, -1, 0, 0, 0, + 6, -2, 0, -4, -1, 0, -1, -3, + -3, -3, -4, -5, -2, -3, 3, 0, + -2, 0, -6, -2, 1, 3, -4, -5, + -3, -4, 4, -1, 1, -12, -2, 3, + -3, -2, -5, 0, -4, -5, -2, -1, + -1, -1, -3, -4, 0, 0, 0, 4, + 4, -1, -8, 0, -8, -3, 3, -5, + -9, -3, -4, -5, -6, -4, 3, 0, + 0, 0, 0, -2, 0, 0, 1, -2, + 3, 1, -2, 3, 0, 0, -4, 0, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + 0, 1, 4, 0, 0, -2, 0, 0, + 0, 0, -1, -1, -2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 1, 0, + -1, 0, 5, 0, 2, 0, 0, -2, + 0, 3, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -8, 0, -1, 2, 0, 4, + 0, 0, 13, 2, -3, -3, 1, 1, + -1, 0, -6, 0, 0, 6, -8, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 5, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, -2, + -1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, -3, 0, + 0, 0, 0, 0, 1, 17, -3, -1, + 4, 3, -3, 1, 0, 0, 1, 1, + -2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -17, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, -3, 0, 0, 0, 0, + -3, -1, 0, 0, 0, -3, 0, -2, + 0, -6, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, -2, 0, -2, 0, + -3, 0, 0, 0, -2, 1, -2, 0, + 0, -3, -1, -3, 0, 0, -3, 0, + -1, 0, -6, 0, -1, 0, 0, -10, + -2, -5, -1, -5, 0, 0, -9, 0, + -3, -1, 0, 0, 0, 0, 0, 0, + 0, 0, -2, -2, -1, -2, 0, 0, + 0, 0, -3, 0, -3, 2, -1, 3, + 0, -1, -3, -1, -2, -2, 0, -2, + -1, -1, 1, -3, 0, 0, 0, 0, + -11, -1, -2, 0, -3, 0, -1, -6, + -1, 0, 0, -1, -1, 0, 0, 0, + 0, 1, 0, -1, -2, -1, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, -3, 0, -1, 0, 0, 0, -3, + 1, 0, 0, 0, -3, -1, -3, 0, + 0, -4, 0, -1, 0, -6, 0, 0, + 0, 0, -12, 0, -3, -5, -6, 0, + 0, -9, 0, -1, -2, 0, 0, 0, + 0, 0, 0, 0, 0, -1, -2, -1, + -2, 0, 0, 0, 2, -2, 0, 4, + 6, -1, -1, -4, 2, 6, 2, 3, + -3, 2, 5, 2, 4, 3, 3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 6, -2, -1, 0, -1, + 10, 6, 10, 0, 0, 0, 1, 0, + 0, 5, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, -11, -2, -1, -5, + -6, 0, 0, -9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, -11, -2, -1, + -5, -6, 0, 0, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, -3, 1, 0, -1, + 1, 2, 1, -4, 0, 0, -1, 1, + 0, 1, 0, 0, 0, 0, -3, 0, + -1, -1, -3, 0, -1, -5, 0, 8, + -1, 0, -3, -1, 0, -1, -2, 0, + -1, -4, -3, -2, 0, 0, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, -11, + -2, -1, -5, -6, 0, 0, -9, 0, + 0, 0, 0, 0, 0, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, -4, -2, -1, 4, -1, -1, + -5, 0, -1, 0, -1, -3, 0, 3, + 0, 1, 0, 1, -3, -5, -2, 0, + -5, -2, -3, -5, -5, 0, -2, -3, + -2, -2, -1, -1, -2, -1, 0, -1, + 0, 2, 0, 2, -1, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, -1, -1, 0, 0, + -3, 0, -1, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -1, 0, -2, + 0, 0, 0, 0, -1, 0, 0, -2, + -1, 1, 0, -2, -2, -1, 0, -4, + -1, -3, -1, -2, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, 4, 0, 0, -2, 0, + 0, 0, 0, -2, 0, -1, 0, 0, + -1, 0, 0, -1, 0, -3, 0, 0, + 5, -2, -4, -4, 1, 1, 1, 0, + -4, 1, 2, 1, 4, 1, 4, -1, + -3, 0, 0, -5, 0, 0, -4, -3, + 0, 0, -3, 0, -2, -2, 0, -2, + 0, -2, 0, -1, 2, 0, -1, -4, + -1, 5, 0, 0, -1, 0, -3, 0, + 0, 2, -3, 0, 1, -1, 1, 0, + 0, -4, 0, -1, 0, 0, -1, 1, + -1, 0, 0, 0, -5, -2, -3, 0, + -4, 0, 0, -6, 0, 5, -1, 0, + -2, 0, 1, 0, -1, 0, -1, -4, + 0, -1, 1, 0, 0, 0, 0, -1, + 0, 0, 1, -2, 0, 0, 0, -2, + -1, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -8, 0, 3, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + -1, -1, 0, 0, 0, 3, 0, 3, + 0, 0, 0, 0, 0, -8, -7, 0, + 6, 4, 2, -5, 1, 5, 0, 5, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = +{ + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 61, + .right_class_cnt = 49, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_dsc_t font_dsc = { + .glyph_bitmap = gylph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 2, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0 +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +lv_font_t font_2 = { + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 10, /*The maximum line height required by the font*/ + .base_line = 2, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if FONT_2*/ + diff --git a/tests/lv_test_fonts/font_3.c b/tests/lv_test_fonts/font_3.c new file mode 100644 index 000000000..923affa1d --- /dev/null +++ b/tests/lv_test_fonts/font_3.c @@ -0,0 +1,953 @@ +#include "lvgl/lvgl.h" + +/******************************************************************************* + * Size: 20 px + * Bpp: 4 + * Opts: --bpp 4 --size 20 --font ../RobotoMono-Regular.ttf -r 0x20-0x7f --format lvgl -o ..\generated_fonts/font_3.c + ******************************************************************************/ + +#ifndef FONT_3 +#define FONT_3 1 +#endif + +#if FONT_3 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { + /* U+20 " " */ + + /* U+21 "!" */ + 0x1f, 0xb0, 0xf, 0xfe, 0x69, 0x10, 0x76, 0x40, + 0x30, 0x81, 0x76, 0x98, 0xb0, + + /* U+22 "\"" */ + 0x8e, 0x0, 0x7b, 0x0, 0x7c, 0x60, 0x11, 0x80, + 0x80, 0x43, 0xca, 0x0, 0x37, + + /* U+23 "#" */ + 0x0, 0xc5, 0xe6, 0x7, 0xe6, 0x1, 0xc8, 0x6, + 0xa, 0x6, 0x1, 0xde, 0x40, 0xf, 0x30, 0xf, + 0x2a, 0x0, 0x15, 0x40, 0x15, 0x7f, 0x8d, 0xbf, + 0xc6, 0xde, 0xe1, 0xd2, 0xe0, 0xf2, 0xe0, 0xf2, + 0x80, 0x8d, 0x81, 0x2d, 0xa1, 0x2c, 0x60, 0x11, + 0x88, 0x80, 0x84, 0x40, 0x1d, 0xc4, 0x0, 0xd2, + 0x0, 0xc2, 0x25, 0x61, 0x13, 0x30, 0x40, 0xd, + 0xdc, 0x35, 0xee, 0x1a, 0xf6, 0x3, 0xdd, 0x4, + 0x5c, 0x84, 0xdf, 0x80, 0xa0, 0x1, 0x90, 0xc1, + 0x90, 0xc0, 0x2d, 0x21, 0xd, 0x20, 0xf, 0x1b, + 0x80, 0x11, 0x0, 0x18, + + /* U+24 "$" */ + 0x0, 0xcb, 0xe2, 0x1, 0xff, 0xc4, 0x78, 0xb, + 0x40, 0xd, 0xb0, 0x64, 0xb6, 0xe0, 0x8, 0x27, + 0xed, 0xd0, 0xc0, 0x82, 0x4, 0x0, 0xa, 0x41, + 0xc0, 0x40, 0x38, 0xc8, 0x0, 0xe0, 0xe0, 0x12, + 0x6b, 0x5, 0x84, 0x5a, 0x0, 0x70, 0xe9, 0xa5, + 0xea, 0x80, 0x62, 0xcc, 0x29, 0x54, 0x80, 0x71, + 0xd6, 0x93, 0x21, 0x29, 0x0, 0x45, 0x21, 0xaf, + 0x4a, 0x1, 0x9c, 0xd, 0x2, 0x44, 0x2, 0xa0, + 0xd1, 0x71, 0xf8, 0x86, 0x31, 0x38, 0x44, 0x9b, + 0xb8, 0x97, 0x0, 0x26, 0xd6, 0x1e, 0xa1, 0x0, + 0xe1, 0x0, 0xe0, + + /* U+25 "%" */ + 0x7, 0xee, 0x40, 0x7, 0xc9, 0x10, 0xb7, 0x50, + 0xf, 0x61, 0x32, 0xa7, 0x80, 0xf1, 0x80, 0x42, + 0x1, 0xd2, 0x66, 0x0, 0x69, 0x98, 0x97, 0x45, + 0xe0, 0x2, 0x55, 0x66, 0xab, 0xc1, 0x28, 0x6, + 0xae, 0xe5, 0x8b, 0x48, 0x7, 0x84, 0x41, 0x6, + 0x80, 0x1f, 0x89, 0xa0, 0x3, 0xfa, 0x11, 0x13, + 0xdc, 0x70, 0xc, 0x6b, 0xc, 0xca, 0x88, 0x20, + 0x5, 0x8, 0x78, 0xa8, 0xc5, 0x80, 0x13, 0x40, + 0x7, 0xfb, 0x4c, 0x31, 0x51, 0x8b, 0x0, 0x3c, + 0xcc, 0xa8, 0x82, 0x0, + + /* U+26 "&" */ + 0x0, 0x26, 0x7e, 0xb0, 0x7, 0x15, 0x9b, 0xc, + 0xa8, 0x6, 0xa0, 0xa9, 0xc1, 0xe0, 0xc, 0x40, + 0xe0, 0x13, 0x80, 0x63, 0x7, 0x6, 0x1b, 0x0, + 0xd4, 0x12, 0xf2, 0xae, 0x1, 0x8d, 0x8e, 0x1a, + 0x80, 0x38, 0x90, 0x1, 0x40, 0x1c, 0x38, 0x50, + 0x1a, 0x20, 0xbc, 0x70, 0x32, 0xf2, 0x34, 0x1a, + 0x22, 0x40, 0x60, 0x65, 0x47, 0x51, 0x23, 0x10, + 0xa, 0x8a, 0xa, 0x41, 0x5, 0x0, 0x2a, 0x0, + 0x30, 0x40, 0x5d, 0x45, 0xc0, 0x84, 0x1, 0x6a, + 0xa3, 0xb4, 0x71, 0xb2, 0x0, + + /* U+27 "'" */ + 0x2f, 0x50, 0xe, 0x10, 0x3, 0x81, 0x88, + + /* U+28 "(" */ + 0x0, 0xe1, 0x0, 0xd9, 0x20, 0x15, 0x8c, 0x80, + 0x1d, 0x38, 0x40, 0x10, 0xa6, 0x0, 0x70, 0x90, + 0xa, 0xc4, 0xc0, 0x2, 0x68, 0x1, 0x28, 0x68, + 0x4, 0x40, 0x20, 0x10, 0x81, 0x80, 0x70, 0x80, + 0x42, 0x2, 0x1, 0x18, 0x18, 0x4, 0xe1, 0xe0, + 0x11, 0xa, 0x80, 0x67, 0x31, 0x0, 0xac, 0x24, + 0x2, 0x25, 0x60, 0xd, 0x61, 0x40, 0x10, 0xea, + 0xb8, 0x4, 0x7a, 0x80, + + /* U+29 ")" */ + 0x20, 0xe, 0xe9, 0x0, 0xde, 0xd0, 0x1, 0x1c, + 0x39, 0x80, 0x4e, 0x5e, 0x1, 0xa8, 0xcc, 0x1, + 0x28, 0x50, 0x4, 0x42, 0x80, 0x19, 0x48, 0x40, + 0x21, 0x2, 0x0, 0x8c, 0x1c, 0x2, 0x10, 0xe, + 0x10, 0x70, 0x8, 0xc0, 0x80, 0x27, 0x11, 0x0, + 0x44, 0x80, 0x12, 0x87, 0x80, 0x5c, 0x2a, 0x0, + 0x34, 0x80, 0xb, 0x8d, 0x80, 0x14, 0x1a, 0x1, + 0x7e, 0x8, 0x4, + + /* U+2A "*" */ + 0x0, 0xd3, 0xe2, 0x1, 0xf0, 0x80, 0x80, 0x61, + 0x0, 0x78, 0x6, 0x12, 0xeb, 0x41, 0x10, 0x36, + 0xc0, 0xaa, 0xae, 0x47, 0xe4, 0xc0, 0xeb, 0xb0, + 0x0, 0xdb, 0xd2, 0x1, 0x50, 0xab, 0x98, 0x6, + 0x66, 0x45, 0x8d, 0x0, 0x43, 0x24, 0xc3, 0x8, + 0xe0, 0x1, 0xbe, 0x0, 0x3b, 0xc0, + + /* U+2B "+" */ + 0x0, 0xd1, 0x0, 0xf, 0xca, 0xc0, 0x1f, 0xfd, + 0x6d, 0xff, 0x88, 0x7f, 0xee, 0x62, 0x28, 0x0, + 0x45, 0xaf, 0x76, 0x21, 0xdd, 0xb0, 0x3, 0xff, + 0xa4, + + /* U+2C "," */ + 0xa, 0xf4, 0x1, 0x0, 0x9c, 0x18, 0x8, 0x49, + 0x46, 0x1, 0x69, 0x80, + + /* U+2D "-" */ + 0x78, 0x8f, 0x25, 0x3b, 0xfb, 0x40, + + /* U+2E "." */ + 0x8, 0xc3, 0x17, 0x39, 0x14, 0xf, + + /* U+2F "/" */ + 0x0, 0xf6, 0x68, 0x7, 0x88, 0xe8, 0x3, 0xd4, + 0xc, 0x1, 0xe6, 0x41, 0x0, 0xe4, 0x1e, 0x0, + 0xf7, 0x2, 0x80, 0x79, 0x58, 0x3, 0xcc, 0x14, + 0x1, 0xed, 0x23, 0x0, 0xe1, 0x4a, 0x0, 0xf3, + 0x2, 0x80, 0x7a, 0x90, 0x80, 0x38, 0xcb, 0x40, + 0x3d, 0x40, 0xc0, 0x1e, 0x65, 0x0, 0xf2, 0x87, + 0x0, 0x78, + + /* U+30 "0" */ + 0x0, 0x25, 0xff, 0xb1, 0x0, 0x25, 0xb5, 0x66, + 0x15, 0xa8, 0x2, 0xc7, 0xe6, 0x5e, 0x34, 0x8, + 0x32, 0x20, 0x1, 0x90, 0x53, 0x2, 0x0, 0xc2, + 0x1b, 0xe0, 0xc0, 0x14, 0x48, 0x8, 0x80, 0x21, + 0xb7, 0x50, 0xe, 0x3c, 0x4b, 0x80, 0xd, 0x58, + 0x1a, 0x80, 0x10, 0x83, 0x2e, 0x90, 0x8, 0x3, + 0xc1, 0xe8, 0x3, 0x84, 0xc3, 0xc0, 0x32, 0x86, + 0xa0, 0xc8, 0x80, 0x56, 0xa, 0x16, 0x3f, 0x32, + 0xe2, 0x90, 0x2, 0xda, 0xb3, 0xa, 0xd8, 0x0, + + /* U+31 "1" */ + 0x0, 0xc4, 0x80, 0x6, 0xcd, 0xc9, 0xf9, 0x30, + 0x3, 0x25, 0xd8, 0x1, 0xd6, 0x8e, 0x0, 0x10, + 0xf, 0xff, 0x78, + + /* U+32 "2" */ + 0x0, 0xc, 0xf7, 0xf4, 0x0, 0x62, 0xf6, 0x56, + 0x27, 0xd0, 0xa, 0x46, 0xed, 0x38, 0xa4, 0xe0, + 0x4, 0x34, 0x0, 0xa0, 0x30, 0x5, 0xe4, 0x3, + 0x18, 0x4, 0x30, 0xa0, 0x19, 0x3, 0x0, 0x3f, + 0x40, 0x30, 0x7, 0xd2, 0x52, 0x20, 0x1e, 0x76, + 0x56, 0x0, 0xf2, 0x41, 0xd0, 0x7, 0x8e, 0xcb, + 0x40, 0x3c, 0x3a, 0x3e, 0x20, 0x1e, 0xc1, 0xd2, + 0x0, 0xf5, 0x91, 0xa3, 0xbf, 0x18, 0x28, 0x1c, + 0x47, 0x94, + + /* U+33 "3" */ + 0x0, 0xc, 0xf7, 0xf4, 0x0, 0x43, 0xec, 0xae, + 0xaf, 0xa0, 0xb, 0x1a, 0xb8, 0xb7, 0x26, 0x4, + 0x15, 0x0, 0xa8, 0x30, 0x3b, 0x80, 0x1f, 0xfc, + 0x2b, 0xf, 0x0, 0x85, 0xe7, 0x59, 0xd4, 0x2, + 0x38, 0x62, 0x1c, 0x0, 0xc5, 0xfe, 0xb3, 0xb4, + 0x0, 0xf2, 0x78, 0x78, 0x8, 0x80, 0x31, 0xa, + 0x87, 0x60, 0x7, 0x9, 0x81, 0x92, 0x0, 0x4c, + 0x8, 0x1c, 0x17, 0x68, 0xb9, 0x28, 0x2, 0xe6, + 0x57, 0x57, 0xd1, + + /* U+34 "4" */ + 0x0, 0xf1, 0xff, 0x80, 0x3f, 0x78, 0x7, 0xf3, + 0x18, 0x7, 0xe1, 0x94, 0x30, 0xf, 0xac, 0x28, + 0x3, 0xe4, 0x58, 0x10, 0xf, 0xa4, 0x9c, 0x3, + 0xe7, 0x29, 0x0, 0xf8, 0xa1, 0x50, 0x3, 0xe9, + 0xb, 0x0, 0xf8, 0xd0, 0x3b, 0xfe, 0x30, 0xff, + 0xc, 0x47, 0x84, 0x1e, 0x9, 0xdf, 0xc4, 0x10, + 0xe0, 0x1f, 0xfc, 0xa0, + + /* U+35 "5" */ + 0x0, 0x7f, 0xfc, 0xa0, 0x20, 0x26, 0x7c, 0x20, + 0x60, 0xd9, 0x9c, 0x80, 0xc1, 0xc0, 0x1f, 0x8, + 0x18, 0x7, 0xc4, 0x7, 0x15, 0x6, 0x1, 0x78, + 0x4b, 0xab, 0xe3, 0x80, 0x38, 0xa7, 0xb9, 0x21, + 0x4, 0xd, 0xac, 0x22, 0x68, 0xa, 0x0, 0xf9, + 0x40, 0xc0, 0x3e, 0x30, 0x0, 0xfd, 0x80, 0x62, + 0x2, 0x13, 0x43, 0x0, 0xa0, 0x30, 0x38, 0x32, + 0xa7, 0x51, 0xa, 0x5, 0xaa, 0x8c, 0xf, 0x60, + + /* U+36 "6" */ + 0x0, 0x86, 0x37, 0xd4, 0x3, 0x27, 0x39, 0xa3, + 0x0, 0x45, 0x61, 0x5d, 0x66, 0x1, 0x48, 0x52, + 0x80, 0x70, 0xa1, 0xa8, 0x7, 0x90, 0x2c, 0x59, + 0xd4, 0x2, 0x20, 0xde, 0x98, 0xad, 0x10, 0xe0, + 0x58, 0xee, 0x31, 0x50, 0x5, 0xe, 0x22, 0x92, + 0x41, 0x0, 0x20, 0x6, 0x50, 0x51, 0x6, 0x0, + 0xde, 0x3, 0x81, 0xa0, 0x1b, 0x41, 0x90, 0x9c, + 0x80, 0x4, 0xa2, 0x61, 0xc1, 0xb5, 0x4d, 0xa, + 0x0, 0x1e, 0x22, 0xa9, 0x31, 0x0, + + /* U+37 "7" */ + 0xef, 0xff, 0xd6, 0xec, 0xde, 0x40, 0x39, 0x9f, + 0x88, 0x24, 0x3, 0xc2, 0xca, 0x20, 0x1e, 0x60, + 0x90, 0xf, 0xa4, 0x8c, 0x3, 0xca, 0x36, 0x1, + 0xf4, 0x8b, 0x0, 0x78, 0xcc, 0xc0, 0x1f, 0x48, + 0x50, 0x7, 0x85, 0x50, 0x80, 0x3d, 0x21, 0xe0, + 0x1f, 0x31, 0x20, 0x7, 0x98, 0x68, 0x3, 0xeb, + 0x6, 0x0, 0xe0, + + /* U+38 "8" */ + 0x0, 0x15, 0x77, 0xea, 0x80, 0x43, 0xaa, 0x8c, + 0x15, 0x20, 0xb, 0xa, 0xa4, 0xe9, 0x31, 0x2, + 0x2, 0x80, 0x54, 0x8, 0x6, 0x1, 0xf1, 0x82, + 0x2, 0x80, 0x54, 0x8, 0x12, 0x75, 0x49, 0xd2, + 0xa1, 0x0, 0x50, 0x2b, 0x11, 0xa0, 0x1, 0xe5, + 0x77, 0xe8, 0xb0, 0x42, 0xa, 0x88, 0x16, 0xc9, + 0x8c, 0x10, 0x3, 0x20, 0x60, 0x0, 0xc0, 0x31, + 0x80, 0xc, 0x54, 0x80, 0x2b, 0xd, 0xa, 0xd, + 0xa8, 0xc6, 0x36, 0x4, 0xc4, 0x57, 0x17, 0xc0, + + /* U+39 "9" */ + 0x0, 0x26, 0x7f, 0x51, 0x0, 0x4d, 0x64, 0xca, + 0xac, 0x10, 0x4, 0x8f, 0xcd, 0xc8, 0xd8, 0x28, + 0x48, 0x80, 0x18, 0x94, 0x34, 0xc, 0x3, 0x28, + 0x27, 0x80, 0x7b, 0x80, 0x48, 0xc, 0x3, 0x70, + 0x1a, 0x4, 0x88, 0x0, 0xdc, 0xc, 0x5c, 0x7e, + 0x6b, 0x4, 0x4, 0x22, 0x4d, 0x9e, 0x1c, 0x18, + 0x0, 0xdb, 0xfa, 0xea, 0x24, 0x1, 0xe3, 0x33, + 0x80, 0x79, 0x34, 0x60, 0x2, 0x5b, 0xeb, 0xd, + 0x10, 0xb, 0x54, 0x9f, 0xcc, 0x0, + + /* U+3A ":" */ + 0x5f, 0xb0, 0xf0, 0x42, 0x93, 0x62, 0x3c, 0x90, + 0xf, 0xfe, 0x29, 0xe4, 0x4, 0x9b, 0x97, 0x81, + 0x90, + + /* U+3B ";" */ + 0x6, 0xfa, 0x0, 0x68, 0x28, 0x3, 0xcd, 0xc0, + 0x9, 0x90, 0x1, 0xff, 0xcf, 0x4a, 0x60, 0x1, + 0x2f, 0x0, 0x4, 0x3, 0x70, 0x60, 0x1, 0x9, + 0x0, 0xf, 0xc0, 0x0, + + /* U+3C "<" */ + 0x0, 0xf9, 0x2c, 0x3, 0x9b, 0x6d, 0x40, 0x2, + 0xfd, 0x26, 0xd8, 0x33, 0xd0, 0x55, 0xd2, 0x48, + 0xc3, 0x78, 0xa0, 0x12, 0x28, 0xdd, 0x20, 0x4, + 0x35, 0xac, 0xb7, 0xae, 0x20, 0x2, 0x9e, 0x83, + 0x8f, 0x0, 0xc2, 0xfd, 0x24, 0x1, 0xf3, 0x60, + + /* U+3D "=" */ + 0x39, 0x9f, 0xc6, 0xec, 0xdf, 0x95, 0x3f, 0xff, + 0x30, 0x7, 0xf8, 0xa6, 0x7f, 0x1b, 0x37, 0xf2, + 0x80, + + /* U+3E ">" */ + 0x3a, 0x30, 0xf, 0x9d, 0x73, 0xa, 0x1, 0xc9, + 0x8c, 0x75, 0xae, 0x1, 0x8e, 0x7e, 0x9a, 0x3e, + 0x44, 0x3, 0x2d, 0xe1, 0x32, 0x0, 0x65, 0xbc, + 0x25, 0x40, 0x28, 0xea, 0x57, 0xea, 0x13, 0xd7, + 0x39, 0xe8, 0x10, 0x3, 0xa5, 0xeb, 0x0, 0x72, + 0x5a, 0x0, 0x7c, + + /* U+3F "?" */ + 0x0, 0x1d, 0xf7, 0xea, 0x80, 0x4b, 0x88, 0xaa, + 0x3a, 0x80, 0x5, 0x86, 0xdd, 0x78, 0xb8, 0x89, + 0xe0, 0x80, 0x2, 0xe0, 0x43, 0x2e, 0x1, 0x8c, + 0x4, 0x3, 0xc4, 0xa4, 0x40, 0xf, 0x70, 0x48, + 0x7, 0xb0, 0xe1, 0x0, 0x3a, 0x4d, 0xdc, 0x1, + 0xe7, 0x18, 0x0, 0xf8, 0x9c, 0x3, 0xf6, 0x48, + 0x7, 0xe1, 0x10, 0x7, 0xc3, 0xde, 0x1, 0xf8, + 0x48, 0x3, 0x0, + + /* U+40 "@" */ + 0x0, 0xd1, 0xbf, 0xae, 0x1, 0xc3, 0xab, 0x76, + 0xa9, 0xb0, 0xd, 0x4d, 0xac, 0x8f, 0xea, 0xc0, + 0x4, 0x5b, 0x9, 0xfd, 0x3b, 0xb0, 0x3, 0xe4, + 0x25, 0x2d, 0x95, 0x44, 0x20, 0x8a, 0x2d, 0xc8, + 0x2, 0x4, 0x43, 0x2, 0x41, 0x30, 0x72, 0x1, + 0x77, 0x8, 0x12, 0x80, 0x5, 0xc0, 0x21, 0x30, + 0xe2, 0x0, 0x10, 0x80, 0xb0, 0x98, 0x0, 0xc0, + 0x40, 0xc4, 0xc9, 0x44, 0x5e, 0x88, 0xa0, 0x29, + 0x40, 0x12, 0x67, 0xb, 0x26, 0xc5, 0xb0, 0x5, + 0xc9, 0xf7, 0x26, 0x5d, 0xa2, 0x0, 0x64, 0xd8, + 0x44, 0x3a, 0x80, 0x75, 0x4a, 0x55, 0xd9, 0xc0, + 0x20, + + /* U+41 "A" */ + 0x0, 0xec, 0xf0, 0xf, 0xe1, 0x30, 0x50, 0xf, + 0xce, 0x0, 0xf0, 0xf, 0xda, 0x8, 0x80, 0xf, + 0xc8, 0xba, 0x26, 0x1, 0xe4, 0xc, 0x70, 0xb0, + 0xf, 0x68, 0x38, 0x92, 0x80, 0x79, 0xcc, 0x41, + 0x48, 0x80, 0x18, 0xc6, 0xc0, 0x16, 0xa, 0x1, + 0xac, 0x32, 0x66, 0xc, 0x0, 0xca, 0x8, 0xcc, + 0x50, 0x41, 0x0, 0x11, 0x1b, 0xff, 0x50, 0x20, + 0x1, 0x43, 0x40, 0x32, 0x7, 0x80, 0x30, 0x10, + 0x3, 0x9, 0xa0, 0xa, 0x20, 0x3, 0xc8, 0x28, + + /* U+42 "B" */ + 0x4f, 0xfd, 0xd8, 0xa0, 0x18, 0xd9, 0x88, 0x55, + 0x40, 0xa, 0xe6, 0x55, 0xc6, 0xa8, 0x1, 0xf4, + 0x86, 0x0, 0x7c, 0x61, 0xe0, 0x1e, 0x1b, 0x5, + 0x0, 0x5c, 0x42, 0x7c, 0xa8, 0x80, 0x6, 0xee, + 0x61, 0x36, 0x0, 0xa3, 0xfe, 0xb1, 0xc3, 0x0, + 0xf2, 0x70, 0x40, 0x7, 0xc6, 0xa, 0x1, 0xf0, + 0x81, 0x80, 0x7d, 0x0, 0xa0, 0xb, 0x88, 0x4e, + 0xb1, 0xc0, 0x0, 0xdd, 0xcc, 0x11, 0x80, + + /* U+43 "C" */ + 0x0, 0x15, 0xff, 0xb1, 0x80, 0x24, 0xd5, 0x53, + 0x14, 0xc8, 0x1, 0x43, 0xf5, 0x3c, 0x6c, 0x6c, + 0x30, 0x20, 0x17, 0x84, 0xe8, 0x38, 0x6, 0x35, + 0x36, 0x11, 0x0, 0x75, 0x49, 0x18, 0x7, 0xff, + 0x40, 0x8c, 0x3, 0xf3, 0x8, 0x80, 0x3a, 0x63, + 0x41, 0xc0, 0x31, 0xb1, 0x30, 0xc0, 0x80, 0x50, + 0x12, 0x14, 0x3f, 0x32, 0xd4, 0x73, 0x4, 0xc5, + 0x76, 0x19, 0x80, + + /* U+44 "D" */ + 0x7f, 0xfb, 0xb1, 0x80, 0x3c, 0xae, 0xe1, 0x9d, + 0x10, 0xd, 0xf1, 0x3b, 0x25, 0x80, 0x1f, 0x99, + 0x84, 0xc0, 0x1f, 0xa0, 0x34, 0x3, 0xf0, 0x92, + 0x0, 0x7f, 0x8, 0x7, 0xf9, 0xc0, 0x40, 0x3f, + 0x38, 0x8, 0x7, 0xe1, 0x0, 0xfe, 0x12, 0x40, + 0xf, 0xd0, 0x1a, 0x1, 0xf3, 0xb1, 0xb0, 0x5, + 0xf1, 0x3b, 0x5, 0xa0, 0x19, 0x5d, 0xc3, 0x3a, + 0x20, 0x0, + + /* U+45 "E" */ + 0x3f, 0xff, 0xcc, 0x0, 0x26, 0x6f, 0x28, 0x1, + 0x26, 0x7c, 0x60, 0x1f, 0xfd, 0xe6, 0xff, 0xe8, + 0x0, 0x89, 0xdf, 0xb0, 0x2, 0x48, 0x8e, 0x40, + 0xf, 0xfe, 0xaa, 0x44, 0x79, 0x0, 0x4, 0xef, + 0xec, + + /* U+46 "F" */ + 0x2f, 0xff, 0xd2, 0x0, 0x26, 0x6f, 0x60, 0x1, + 0xe6, 0x7c, 0xa0, 0x1f, 0xfd, 0xe5, 0xff, 0xe9, + 0x0, 0x89, 0xdf, 0xb0, 0x2, 0x78, 0x8e, 0x50, + 0xf, 0xff, 0x38, + + /* U+47 "G" */ + 0x0, 0x8a, 0xff, 0xd8, 0xa0, 0x19, 0x35, 0x10, + 0xa5, 0x52, 0x1, 0x50, 0xed, 0xd7, 0x1b, 0x20, + 0x38, 0xc1, 0x0, 0x5e, 0x1e, 0x18, 0xe, 0x1, + 0x8e, 0x78, 0x14, 0x44, 0x1, 0xcc, 0xa0, 0x24, + 0x1, 0xff, 0xc2, 0x68, 0x89, 0xc0, 0x3d, 0xae, + 0xf4, 0x80, 0x90, 0x5, 0x7f, 0xe2, 0x0, 0x28, + 0x88, 0x3, 0xf6, 0x84, 0x80, 0x7e, 0x62, 0x74, + 0x0, 0x88, 0x80, 0x17, 0x8d, 0xda, 0x6f, 0x42, + 0x80, 0x5, 0xec, 0xac, 0xc7, 0xd4, + + /* U+48 "H" */ + 0x9f, 0x10, 0xc, 0x3f, 0x20, 0x1f, 0xff, 0x2e, + 0xff, 0xdc, 0x1, 0x99, 0xdf, 0x30, 0x6, 0x88, + 0xf0, 0x7, 0xff, 0xa0, + + /* U+49 "I" */ + 0x4f, 0xff, 0xc8, 0xcd, 0x80, 0xc, 0xd8, 0xa6, + 0x60, 0x19, 0x98, 0x80, 0x3f, 0xff, 0xe0, 0x1f, + 0xfc, 0xd2, 0x99, 0x80, 0x66, 0x62, 0x66, 0xc0, + 0x6, 0x6c, + + /* U+4A "J" */ + 0x0, 0xfd, 0x3e, 0x60, 0x1f, 0xff, 0xf0, 0xf, + 0xfe, 0x6b, 0xb0, 0x7, 0x18, 0x5, 0x52, 0x1, + 0xce, 0x6, 0x14, 0x12, 0x1, 0x39, 0x28, 0x1, + 0xcd, 0xb6, 0x72, 0xa, 0xc0, 0x2c, 0x80, 0x62, + 0x6c, 0x10, + + /* U+4B "K" */ + 0x4f, 0x80, 0xc, 0x9f, 0xa0, 0x1f, 0x15, 0x7, + 0x80, 0x7d, 0xc3, 0x44, 0x1, 0xe9, 0x36, 0x50, + 0xf, 0x2b, 0x14, 0x80, 0x78, 0xa8, 0x3c, 0x3, + 0xc3, 0xc1, 0x4, 0x1, 0xe6, 0x30, 0xa0, 0xf, + 0xc8, 0xa5, 0x0, 0x1e, 0x2a, 0xb1, 0x72, 0x0, + 0xe5, 0x11, 0x40, 0x70, 0x7, 0xe6, 0x33, 0x30, + 0x7, 0xee, 0x8, 0x10, 0xf, 0x89, 0xc6, 0xc0, + 0x3f, 0x41, 0x2a, 0x0, + + /* U+4C "L" */ + 0xf, 0xb0, 0xf, 0xff, 0xf8, 0x7, 0xff, 0xa9, + 0x62, 0x3c, 0xc0, 0x1, 0x77, 0xf6, 0x0, + + /* U+4D "M" */ + 0x8f, 0xd0, 0xd, 0x5f, 0x60, 0x2, 0x20, 0x4, + 0xa0, 0x1c, 0xa0, 0x5, 0x0, 0xe2, 0xb0, 0x7, + 0x88, 0x80, 0x24, 0x31, 0x5, 0x60, 0xd, 0xa0, + 0xea, 0x16, 0x1, 0x98, 0xb7, 0xc4, 0xc4, 0x3, + 0x2a, 0x2b, 0x80, 0x7a, 0xc0, 0x1a, 0x1, 0xc2, + 0x62, 0x24, 0x0, 0xf9, 0x98, 0x1, 0xfa, 0x20, + 0x1, 0xff, 0xd6, + + /* U+4E "N" */ + 0x9f, 0x70, 0xc, 0x7f, 0x20, 0x9, 0x0, 0xfe, + 0x17, 0x0, 0xfe, 0x90, 0xf, 0xca, 0x2e, 0x1, + 0xf7, 0xc, 0x80, 0x7c, 0xf0, 0x2c, 0x1, 0xf3, + 0xc, 0x0, 0x7e, 0x81, 0x60, 0xf, 0x98, 0x61, + 0xc0, 0x3e, 0x91, 0xe0, 0xf, 0x9c, 0x54, 0x3, + 0xf4, 0x80, 0x7f, 0x38, 0x80, 0x7f, 0x48, 0x0, + + /* U+4F "O" */ + 0x0, 0x1d, 0xff, 0xac, 0x80, 0x24, 0xc4, 0x33, + 0x26, 0x98, 0x2, 0x87, 0x73, 0x20, 0xd0, 0x61, + 0x92, 0x0, 0x1c, 0xb, 0x60, 0x30, 0x6, 0x60, + 0xc7, 0x11, 0x0, 0x61, 0x13, 0x91, 0x80, 0x78, + 0xcc, 0x2, 0x1, 0xf0, 0x80, 0x80, 0x7c, 0x24, + 0x60, 0x1e, 0x33, 0x38, 0x88, 0x3, 0x8, 0x9f, + 0x1, 0x80, 0x33, 0x6, 0x30, 0xc1, 0x80, 0xa, + 0x45, 0x82, 0x83, 0x2e, 0xda, 0x34, 0x0, 0x4d, + 0x44, 0xd8, 0x80, + + /* U+50 "P" */ + 0x2f, 0xfe, 0xe9, 0x10, 0xc, 0x4e, 0xf2, 0xb7, + 0x90, 0x4, 0xf1, 0x15, 0xc8, 0xc8, 0x7, 0xe6, + 0x24, 0x10, 0xf, 0xce, 0x6, 0x1, 0xf9, 0x80, + 0xc0, 0x3e, 0x53, 0x41, 0x0, 0x3c, 0x45, 0x74, + 0x32, 0x1, 0x13, 0xbc, 0xad, 0xe4, 0x1, 0x2f, + 0xfd, 0xd2, 0x20, 0x1f, 0xfe, 0xd0, + + /* U+51 "Q" */ + 0x0, 0x8e, 0xff, 0xd6, 0x60, 0x1c, 0x98, 0x86, + 0x64, 0xc4, 0x0, 0x86, 0xc7, 0x73, 0x1a, 0x36, + 0x20, 0x6, 0x8, 0x20, 0x1, 0x58, 0x30, 0x2, + 0xc1, 0x80, 0x32, 0x85, 0x80, 0xc, 0x80, 0x3c, + 0x46, 0x1, 0x30, 0x7, 0x98, 0x0, 0x20, 0x1f, + 0xe1, 0x10, 0x7, 0xf8, 0x40, 0xc, 0x1, 0xe6, + 0x0, 0x8c, 0x80, 0x3c, 0x46, 0x0, 0xb0, 0x50, + 0xc, 0xa1, 0x60, 0x6, 0xb, 0x20, 0x1, 0x58, + 0x30, 0x0, 0x6c, 0x76, 0xed, 0xa3, 0x42, 0x1, + 0x26, 0x22, 0x42, 0x1a, 0x1, 0xc7, 0x7f, 0xf1, + 0xbd, 0x0, 0x7e, 0x1c, 0x47, 0x10, 0xf, 0xeb, + 0xd1, + + /* U+52 "R" */ + 0x3f, 0xfe, 0xc6, 0x0, 0xe3, 0x77, 0x31, 0x4d, + 0x0, 0x64, 0x88, 0x4f, 0x1a, 0xa8, 0x3, 0xf7, + 0x87, 0x80, 0x7e, 0x20, 0x10, 0xf, 0xc4, 0x2, + 0x1, 0xfb, 0xc3, 0x80, 0x24, 0x88, 0x4f, 0x1b, + 0x20, 0x4, 0x6e, 0xe6, 0x19, 0x90, 0x6, 0x7f, + 0xf5, 0x7, 0x0, 0x7e, 0x51, 0x71, 0x0, 0xfd, + 0x0, 0xc0, 0x1f, 0x98, 0x64, 0x3, 0xfa, 0x45, + 0xc0, 0x3f, 0x30, 0x48, 0x0, + + /* U+53 "S" */ + 0x0, 0x1d, 0xf7, 0xe2, 0x80, 0x65, 0xc4, 0x55, + 0x15, 0x58, 0x0, 0x68, 0x76, 0xeb, 0x91, 0xe, + 0x8, 0xc, 0x40, 0x14, 0x85, 0x0, 0x42, 0x1, + 0x8a, 0x6c, 0x10, 0x19, 0x40, 0x33, 0x30, 0x6, + 0xc2, 0xb1, 0x84, 0x3, 0x93, 0x50, 0xe7, 0xa0, + 0x3, 0x8a, 0xfa, 0x5, 0xf4, 0x3, 0xc2, 0xfc, + 0xa5, 0x40, 0xac, 0x1, 0xd4, 0xa, 0x1d, 0x28, + 0x1, 0xfb, 0xc2, 0x44, 0x2, 0x70, 0x40, 0x47, + 0x2e, 0xa9, 0xc8, 0x19, 0x0, 0x45, 0xa2, 0x18, + 0x63, 0xc8, 0x0, + + /* U+54 "T" */ + 0x3f, 0xff, 0xf2, 0xb, 0x36, 0x0, 0x33, 0x71, + 0x4c, 0xe2, 0x19, 0x9c, 0x40, 0x1f, 0xff, 0xf0, + 0xf, 0xff, 0xc8, + + /* U+55 "U" */ + 0xaf, 0x10, 0xc, 0x5f, 0x20, 0x1f, 0xfc, 0x73, + 0x0, 0xff, 0xef, 0x18, 0x7, 0xff, 0x3c, 0xc0, + 0x40, 0x30, 0x81, 0xf8, 0x20, 0x6, 0x40, 0xf7, + 0x9, 0x20, 0x1, 0x48, 0x38, 0xd0, 0xed, 0x53, + 0x46, 0x84, 0x17, 0x11, 0x54, 0x98, 0xa0, + + /* U+56 "V" */ + 0x2f, 0xc0, 0xf, 0x6f, 0x89, 0x10, 0xc0, 0x38, + 0x48, 0xc4, 0x10, 0x14, 0x3, 0x38, 0x58, 0x3, + 0x43, 0x0, 0x36, 0x2, 0x0, 0x10, 0x1c, 0x3, + 0x20, 0x98, 0x4, 0xa2, 0x40, 0x3, 0x17, 0x0, + 0xde, 0x8, 0x0, 0xb0, 0xd0, 0xc, 0x81, 0xa0, + 0x4, 0x4, 0x0, 0xc2, 0x68, 0x2, 0x68, 0x1, + 0xeb, 0x4, 0x40, 0x68, 0x7, 0x94, 0x33, 0xc1, + 0xc0, 0x3c, 0x44, 0x54, 0x31, 0x0, 0xf9, 0x8, + 0x50, 0x3, 0xf6, 0x80, 0x2c, 0x3, 0xf2, 0x0, + 0x98, 0x6, + + /* U+57 "W" */ + 0x3f, 0x70, 0x5, 0xf8, 0x0, 0xfd, 0xc8, 0x38, + 0x0, 0xa0, 0x40, 0xc0, 0x42, 0x6, 0x2, 0x20, + 0x70, 0x30, 0x10, 0x16, 0x2, 0x0, 0x68, 0x70, + 0x30, 0x11, 0x1, 0x40, 0xc8, 0x4, 0x8, 0x18, + 0x43, 0xc9, 0x5c, 0x8, 0x40, 0x4, 0x2, 0x4f, + 0xe4, 0xc, 0x40, 0xe, 0x3, 0x52, 0x20, 0x11, + 0xb0, 0x0, 0x81, 0xc7, 0x54, 0x1c, 0x48, 0x0, + 0xe1, 0x80, 0xc2, 0x2c, 0xf, 0x0, 0x10, 0x38, + 0x18, 0x13, 0x81, 0x0, 0x4, 0x4, 0x80, 0xa, + 0x20, 0xc0, 0x11, 0x3, 0x0, 0x38, 0x0, 0x40, + 0x13, 0x1, 0x80, 0xc, 0x0, 0x20, 0x11, 0x7, + 0x0, 0x14, 0x8, 0x0, + + /* U+58 "X" */ + 0xc, 0xf5, 0x0, 0xc3, 0xfe, 0x10, 0xf0, 0x80, + 0xd, 0x61, 0x2, 0x6, 0xa4, 0xc0, 0x2, 0x51, + 0x70, 0xa, 0x2, 0x0, 0x12, 0x16, 0x1, 0x89, + 0xc5, 0xcd, 0xd, 0x40, 0x3a, 0x46, 0x7c, 0x3c, + 0x3, 0xc3, 0x2, 0x68, 0x60, 0x1f, 0x38, 0x3, + 0x80, 0x3f, 0x48, 0x2, 0x40, 0x3e, 0x17, 0x26, + 0x35, 0x0, 0xf5, 0x84, 0x40, 0x20, 0x3, 0x8d, + 0x49, 0x45, 0xc9, 0x80, 0x37, 0x84, 0x80, 0x24, + 0x20, 0x40, 0xa, 0x66, 0x40, 0x0, 0xb8, 0xc8, + 0x2, 0x3, 0xc0, 0x34, 0xb, 0x90, + + /* U+59 "Y" */ + 0x2f, 0xd0, 0xe, 0x1f, 0xe0, 0x24, 0x25, 0x0, + 0xd2, 0x12, 0x0, 0x80, 0x90, 0xc, 0xc0, 0xc0, + 0x3, 0x3c, 0x0, 0x61, 0x71, 0x0, 0xa0, 0x24, + 0x1, 0x61, 0x20, 0x19, 0x9, 0x45, 0x49, 0x84, + 0x3, 0xa0, 0x26, 0x41, 0x60, 0x1e, 0x52, 0x73, + 0x52, 0x0, 0xfa, 0xc0, 0x12, 0x1, 0xf9, 0x80, + 0xcc, 0x1, 0xff, 0xd6, 0x70, 0xf, 0xfe, 0x88, + + /* U+5A "Z" */ + 0xcf, 0xff, 0xc9, 0x6c, 0xde, 0x0, 0x33, 0xcc, + 0xf6, 0x2, 0x90, 0x7, 0xac, 0x2c, 0x3, 0xd0, + 0x30, 0x20, 0x1c, 0x4e, 0x4e, 0x1, 0xe9, 0x9, + 0x0, 0xf2, 0x21, 0x50, 0x3, 0xd2, 0x16, 0x1, + 0xe7, 0x28, 0x10, 0xe, 0x18, 0x27, 0x0, 0xf5, + 0x84, 0x0, 0x79, 0x15, 0x14, 0x3, 0xd0, 0x0, + 0x88, 0xf2, 0x8, 0x23, 0xbf, 0xb0, + + /* U+5B "[" */ + 0x68, 0x88, 0x2d, 0xde, 0x0, 0x17, 0xf8, 0x3, + 0xff, 0xfe, 0x0, 0x28, 0x80, 0x4, 0xee, 0x0, + + /* U+5C "\\" */ + 0x9f, 0x10, 0xe, 0xa0, 0x60, 0xe, 0x32, 0xa0, + 0xf, 0x51, 0x18, 0x7, 0x30, 0x58, 0x7, 0xa, + 0x30, 0x7, 0xb8, 0x50, 0x3, 0x94, 0x78, 0x3, + 0xce, 0xa2, 0x1, 0xd4, 0xe, 0x1, 0xc6, 0x54, + 0x1, 0xea, 0x32, 0x0, 0xe6, 0xa, 0x0, 0xe1, + 0x46, 0x0, 0xf7, 0xa, 0x0, 0x72, 0x87, 0x0, + + /* U+5D "]" */ + 0x8, 0x89, 0x81, 0xde, 0xb0, 0xff, 0x10, 0x7, + 0xff, 0xfc, 0x1, 0x10, 0x20, 0x3, 0xb8, 0x0, + + /* U+5E "^" */ + 0x0, 0xb7, 0x40, 0x1c, 0x64, 0x43, 0x0, 0xd4, + 0x0, 0xa0, 0xc, 0xca, 0xa6, 0x0, 0x98, 0x3b, + 0x80, 0xa0, 0xa, 0x14, 0x40, 0xc8, 0x11, 0xb0, + 0x1, 0x8c, 0xa8, 0x28, 0x1, 0x41, 0x40, + + /* U+5F "_" */ + 0x37, 0x7f, 0xc6, 0x91, 0x1f, 0x90, + + /* U+60 "`" */ + 0x57, 0x30, 0x4a, 0xe0, 0x1f, 0x39, + + /* U+61 "a" */ + 0x0, 0x26, 0x7f, 0x62, 0x80, 0x4d, 0x62, 0xee, + 0x3a, 0x60, 0x19, 0x2d, 0x89, 0xd0, 0x90, 0x4, + 0x48, 0x4, 0x48, 0x4, 0x2e, 0x80, 0x18, 0x40, + 0x21, 0x9d, 0xff, 0x94, 0x2, 0xc6, 0x4a, 0xbc, + 0x40, 0x3, 0x14, 0x4a, 0xa1, 0x88, 0x7, 0xe1, + 0x70, 0x3, 0x8c, 0x4b, 0xcf, 0x90, 0x8, 0xb1, + 0x5e, 0x16, 0x1c, 0x14, + + /* U+62 "b" */ + 0x4f, 0x80, 0xf, 0xfe, 0xe3, 0xef, 0xeb, 0x0, + 0x67, 0x87, 0x53, 0x97, 0x0, 0x87, 0x6a, 0x98, + 0x30, 0x20, 0x6, 0x20, 0x1, 0x48, 0x38, 0x7, + 0xc8, 0x1e, 0x1, 0xf0, 0x81, 0x80, 0x7c, 0x20, + 0x60, 0x1f, 0x28, 0x78, 0x1, 0x40, 0x35, 0x83, + 0x80, 0xb, 0x5d, 0xb0, 0xa0, 0x40, 0x10, 0xb3, + 0x21, 0x97, 0x0, + + /* U+63 "c" */ + 0x0, 0x1d, 0xf7, 0xea, 0x80, 0x49, 0x88, 0xec, + 0x15, 0x20, 0xa, 0xc, 0x99, 0x6a, 0x31, 0xa8, + 0xb9, 0x80, 0x5e, 0x4b, 0xa1, 0x80, 0x19, 0x35, + 0x84, 0x1c, 0x3, 0xe1, 0x7, 0x0, 0xfb, 0x43, + 0x0, 0x31, 0x42, 0x28, 0xb9, 0x0, 0x50, 0xee, + 0xa, 0xd, 0x98, 0xd5, 0x73, 0x4, 0xc4, 0x77, + 0xd, 0xc0, 0x0, + + /* U+64 "d" */ + 0x0, 0xfa, 0x3d, 0x0, 0x3f, 0xfa, 0x8b, 0xbf, + 0xce, 0x1, 0x9a, 0x89, 0x52, 0x1c, 0x0, 0x32, + 0x3b, 0x54, 0xd1, 0x0, 0x38, 0x31, 0x0, 0x9, + 0x80, 0x1e, 0x18, 0x1, 0xf1, 0x83, 0x80, 0x7c, + 0x60, 0xe0, 0x1f, 0x78, 0x60, 0x7, 0xce, 0xc, + 0x40, 0x1, 0x50, 0x0, 0xc8, 0xed, 0x53, 0xc8, + 0x2, 0x6a, 0x25, 0x46, 0x80, 0x0, + + /* U+65 "e" */ + 0x0, 0x15, 0x77, 0xe2, 0x80, 0x47, 0xaa, 0x8e, + 0x55, 0x0, 0xd, 0x1d, 0xa8, 0xe3, 0x72, 0x61, + 0x92, 0x0, 0xa4, 0x17, 0xc3, 0x26, 0x77, 0x87, + 0x18, 0x23, 0x36, 0x50, 0x30, 0x6, 0x7f, 0xfa, + 0xb4, 0x2c, 0x3, 0xe6, 0x7, 0x40, 0x8, 0xac, + 0x86, 0xc2, 0xea, 0x2b, 0x54, 0xc1, 0x35, 0x51, + 0xde, 0xf1, + + /* U+66 "f" */ + 0x0, 0xe2, 0x68, 0x74, 0x0, 0xe7, 0xd9, 0x78, + 0xb0, 0xc, 0x70, 0x57, 0xfe, 0xd0, 0xd, 0x61, + 0x8, 0x0, 0x20, 0xc, 0x20, 0xc0, 0x1d, 0x1f, + 0xe6, 0xc, 0xff, 0x90, 0x2e, 0x64, 0x60, 0xf3, + 0x32, 0x81, 0xb3, 0x14, 0x2d, 0x9a, 0x10, 0xf, + 0xff, 0xf8, 0x7, 0xff, 0x8, + + /* U+67 "g" */ + 0x0, 0x36, 0xff, 0x43, 0xfa, 0x3, 0xc8, 0x44, + 0xa4, 0x0, 0x6, 0x7, 0x1d, 0xd8, 0x60, 0x7, + 0x9, 0x10, 0x9, 0x0, 0x1e, 0x6, 0x1, 0xfc, + 0xe0, 0x1f, 0xce, 0x1, 0xf7, 0x86, 0x0, 0x7c, + 0xe0, 0xc4, 0x0, 0x16, 0x0, 0xc, 0x8e, 0xd5, + 0x3c, 0x40, 0x26, 0xa2, 0x57, 0x67, 0x0, 0xcb, + 0xbf, 0xb0, 0x40, 0xc1, 0xa, 0x1, 0x12, 0x91, + 0x0, 0xea, 0xe2, 0xb4, 0x24, 0x1, 0x72, 0xee, + 0x54, 0xc4, 0x0, + + /* U+68 "h" */ + 0x4f, 0x70, 0xf, 0xfe, 0xe1, 0xdf, 0xf4, 0x88, + 0x5, 0x78, 0xc, 0x6d, 0xa0, 0x11, 0x6d, 0xce, + 0x91, 0x98, 0x0, 0xc4, 0x1, 0x50, 0x28, 0x3, + 0xc0, 0x30, 0x80, 0x7f, 0x18, 0x7, 0xff, 0xa0, + + /* U+69 "i" */ + 0x0, 0xcd, 0xe8, 0x1, 0xf7, 0x1, 0x0, 0x7d, + 0x1c, 0xc0, 0x1f, 0x84, 0x3, 0xbf, 0xf9, 0x80, + 0x33, 0x34, 0x60, 0x1e, 0x99, 0xa8, 0x3, 0xff, + 0xed, 0x33, 0x50, 0x54, 0xc9, 0xc1, 0x9a, 0x30, + 0x36, 0x65, 0x0, + + /* U+6A "j" */ + 0x0, 0xd3, 0xc4, 0x1, 0x8c, 0x44, 0x1, 0xab, + 0x8c, 0x3, 0x84, 0x7, 0xff, 0x8c, 0x59, 0xa2, + 0x0, 0xa6, 0x65, 0x0, 0xff, 0xf9, 0x10, 0x7, + 0xa, 0x81, 0xc4, 0x27, 0xc2, 0x1, 0x5d, 0x8a, + 0x9c, 0x0, + + /* U+6B "k" */ + 0x4f, 0x80, 0xf, 0xff, 0x1a, 0xfe, 0x88, 0x7, + 0x92, 0x8b, 0x4, 0x3, 0x92, 0xc7, 0xc4, 0x3, + 0x8e, 0xc7, 0x8, 0x3, 0x8b, 0x42, 0xc8, 0x3, + 0xca, 0x21, 0x20, 0x1f, 0xad, 0x4e, 0x40, 0x3c, + 0xe9, 0x64, 0xca, 0x1, 0xf0, 0xf0, 0x51, 0x0, + 0x7c, 0x72, 0x1e, 0x1, 0xf9, 0x94, 0xa8, 0x0, + + /* U+6C "l" */ + 0xf, 0xfe, 0x60, 0xc, 0xcd, 0x18, 0x7, 0xa6, + 0x6a, 0x0, 0xff, 0xff, 0x80, 0x7f, 0xf4, 0xe6, + 0x6a, 0xa, 0x99, 0x38, 0x33, 0x46, 0x6, 0xcc, + 0xa0, + + /* U+6D "m" */ + 0x1f, 0x9b, 0xfd, 0x5b, 0xfd, 0x30, 0x9, 0xb1, + 0xca, 0x8a, 0xb, 0x80, 0x25, 0x78, 0x11, 0x4b, + 0xa9, 0x0, 0x46, 0x0, 0x33, 0x0, 0xc, 0x4, + 0x3, 0xff, 0xfe, 0x1, 0xfc, + + /* U+6E "n" */ + 0x4f, 0x54, 0xcf, 0xd9, 0x10, 0xb, 0xad, 0x98, + 0xd, 0xa0, 0x12, 0xed, 0x4e, 0x99, 0x88, 0x0, + 0xc4, 0x1, 0x58, 0x38, 0x3, 0xc0, 0x30, 0x81, + 0x80, 0x7f, 0xfc, 0x0, + + /* U+6F "o" */ + 0x0, 0x25, 0xff, 0xad, 0x0, 0x26, 0xb5, 0x66, + 0x2d, 0xb0, 0x14, 0x97, 0xcc, 0xbc, 0xa4, 0xa8, + 0x2c, 0x40, 0x3, 0x61, 0x46, 0xe, 0x1, 0x90, + 0xd, 0xc0, 0x40, 0x31, 0x3, 0xb8, 0x4, 0x3, + 0x8, 0x39, 0x82, 0x0, 0x64, 0x3, 0xa0, 0x81, + 0x0, 0xc, 0x5, 0x14, 0x97, 0xcc, 0xbc, 0xa4, + 0x81, 0xac, 0x99, 0x85, 0x6c, 0x0, + + /* U+70 "p" */ + 0x4f, 0x67, 0xdf, 0xd6, 0x0, 0xd1, 0x2e, 0xa5, + 0x2e, 0x1, 0x1f, 0xd5, 0x30, 0x20, 0x40, 0xa, + 0x20, 0x3, 0x70, 0x70, 0x7, 0x80, 0x6c, 0xe, + 0x0, 0xf9, 0xc0, 0x40, 0x3e, 0x70, 0x10, 0xf, + 0xb0, 0x34, 0x1, 0x60, 0x11, 0x30, 0x20, 0x0, + 0xf6, 0x65, 0xa3, 0x2, 0x0, 0x75, 0x76, 0x29, + 0x70, 0xb, 0xe3, 0xbf, 0x58, 0x3, 0xff, 0xa8, + + /* U+71 "q" */ + 0x0, 0x2e, 0xff, 0x4c, 0x7a, 0x3, 0xd0, 0x4c, + 0x2b, 0x80, 0x6, 0x7, 0x19, 0x98, 0x80, 0x7, + 0x9, 0x10, 0x8, 0xc0, 0x1e, 0x6, 0x1, 0xfc, + 0xe0, 0x1f, 0xce, 0x1, 0xf7, 0x86, 0x0, 0x7c, + 0xe0, 0xc4, 0x0, 0x15, 0x0, 0xc, 0xe, 0x4c, + 0xbc, 0x80, 0x27, 0xa3, 0x67, 0x67, 0x0, 0xcb, + 0xbf, 0xd0, 0x1, 0xff, 0xd5, + + /* U+72 "r" */ + 0xcf, 0x6, 0xdf, 0xe5, 0x0, 0x4c, 0x88, 0x82, + 0x20, 0x3, 0xdf, 0xef, 0xa0, 0x2, 0xd0, 0x3, + 0xca, 0x1, 0xff, 0xe9, + + /* U+73 "s" */ + 0x0, 0x1d, 0xf7, 0xeb, 0x80, 0x49, 0x8a, 0xec, + 0x11, 0x60, 0x9, 0xf, 0x99, 0x6a, 0x24, 0x1, + 0x8, 0x5, 0x34, 0xc1, 0x61, 0xce, 0x60, 0x4a, + 0x40, 0xd6, 0xb1, 0x9f, 0x44, 0x1, 0x25, 0xfd, + 0xb2, 0xe0, 0x93, 0xa0, 0x1, 0x26, 0x42, 0xc7, + 0x12, 0x20, 0x10, 0x80, 0x8a, 0xb, 0xe6, 0x2e, + 0x9, 0x81, 0xe9, 0x59, 0xd9, 0xf0, 0x0, + + /* U+74 "t" */ + 0x0, 0x99, 0xc0, 0x3f, 0x5c, 0x0, 0x7f, 0xf0, + 0xe7, 0xfc, 0x41, 0xff, 0x83, 0x66, 0x42, 0x13, + 0x38, 0x11, 0x98, 0x60, 0xcd, 0x80, 0x3f, 0xfd, + 0x4c, 0x8, 0x1, 0xf7, 0x5, 0xd4, 0xd9, 0x80, + 0x4b, 0x44, 0xac, 0xe0, + + /* U+75 "u" */ + 0x3f, 0x80, 0xd, 0x1e, 0x80, 0x1f, 0xfe, 0x81, + 0x0, 0xf8, 0x40, 0x3f, 0x88, 0x1c, 0x3, 0x28, + 0x4, 0xe3, 0x6c, 0xfa, 0x60, 0x14, 0x41, 0x66, + 0xae, 0x0, 0x0, + + /* U+76 "v" */ + 0xd, 0xf0, 0xe, 0x1f, 0xc0, 0xa0, 0x50, 0xc, + 0xe1, 0x40, 0xc1, 0xc0, 0x1a, 0x81, 0x80, 0x55, + 0x4, 0x0, 0x26, 0xc0, 0x17, 0x3, 0x0, 0x18, + 0x28, 0x2, 0x42, 0xa0, 0x5, 0x11, 0x80, 0x6a, + 0x22, 0xd4, 0x1, 0xcc, 0x15, 0x40, 0x60, 0xe, + 0x14, 0x65, 0x50, 0x80, 0x7b, 0xc4, 0xb8, 0x3, + 0xe4, 0x11, 0x20, 0x4, + + /* U+77 "w" */ + 0x6f, 0x20, 0x5, 0x58, 0x5, 0xf0, 0xa0, 0xe0, + 0x4, 0x40, 0x0, 0xc3, 0x4c, 0x34, 0x8, 0x40, + 0xc1, 0x41, 0x0, 0x88, 0xe, 0x24, 0x81, 0xc2, + 0x20, 0x47, 0xc, 0x57, 0xc0, 0x35, 0x0, 0x79, + 0x2, 0x66, 0x14, 0x14, 0xc0, 0xa, 0x8, 0x48, + 0x81, 0x31, 0xc0, 0x1, 0x87, 0x1, 0x90, 0xd0, + 0x28, 0x4, 0x6a, 0x80, 0x4, 0x71, 0x10, 0x4, + 0xa1, 0x80, 0xc, 0x15, 0x0, 0xde, 0x6, 0x0, + 0x40, 0xc0, 0x0, + + /* U+78 "x" */ + 0x7f, 0x90, 0xc, 0xff, 0x40, 0xe8, 0xca, 0x0, + 0x38, 0x2a, 0x0, 0x50, 0xd8, 0x87, 0x7, 0x0, + 0x43, 0x43, 0x52, 0x50, 0x60, 0x19, 0x1d, 0x19, + 0x1c, 0x3, 0xd2, 0x0, 0xf0, 0xf, 0xac, 0x1, + 0x20, 0x1e, 0x65, 0x54, 0x94, 0x80, 0x62, 0x91, + 0xa6, 0x46, 0x40, 0xb, 0x83, 0x40, 0x14, 0x34, + 0x21, 0x6, 0xe6, 0x0, 0x1b, 0x1a, 0x0, + + /* U+79 "y" */ + 0x1f, 0xe0, 0xf, 0x77, 0x88, 0x94, 0x54, 0x3, + 0x28, 0xa8, 0x84, 0x87, 0x0, 0x6e, 0x9, 0x0, + 0x19, 0x90, 0x80, 0x2, 0x86, 0x60, 0xa, 0x42, + 0xc0, 0xc, 0x12, 0x1, 0x94, 0x98, 0x1, 0x22, + 0xa0, 0x1d, 0x60, 0xc8, 0x32, 0x1, 0xe6, 0x1b, + 0xe0, 0x60, 0xf, 0x98, 0x95, 0x84, 0x3, 0xe9, + 0x0, 0x58, 0x7, 0xe1, 0x12, 0x10, 0x7, 0xe7, + 0x1f, 0x0, 0xfc, 0x50, 0x48, 0x1, 0xe3, 0xac, + 0xe, 0x0, 0xf9, 0x54, 0x76, 0x60, 0x1e, + + /* U+7A "z" */ + 0x5f, 0xff, 0xc6, 0xef, 0xe5, 0x0, 0x11, 0x22, + 0x39, 0xc2, 0x84, 0x3, 0xa8, 0x9d, 0x40, 0x39, + 0x94, 0xe0, 0x3, 0x8e, 0x47, 0x40, 0x38, 0x74, + 0x34, 0x40, 0x3a, 0x86, 0x4c, 0x3, 0xa1, 0x15, + 0x80, 0x39, 0x1c, 0x9, 0xdf, 0x90, 0x80, 0xf, + 0x11, 0xda, + + /* U+7B "{" */ + 0x0, 0xc9, 0x92, 0x1, 0x1d, 0xb5, 0x80, 0x50, + 0x14, 0x40, 0x12, 0x20, 0x3, 0x8, 0x7, 0xe1, + 0x0, 0xc6, 0x1, 0xe4, 0xd, 0x0, 0x13, 0x41, + 0x30, 0x3, 0xe4, 0xf0, 0x40, 0x12, 0xc5, 0x40, + 0x12, 0x4c, 0x22, 0x80, 0x64, 0xc, 0x0, 0xc4, + 0x6, 0x1, 0xe1, 0x0, 0xc2, 0xe, 0x1, 0xc6, + 0x60, 0xe, 0x80, 0x90, 0xc, 0x94, 0xd4, 0x1, + 0x97, 0xec, + + /* U+7C "|" */ + 0xbb, 0x0, 0x7f, 0xf6, 0x0, + + /* U+7D "}" */ + 0xac, 0x30, 0xd, 0xf, 0x86, 0x1, 0x15, 0x4, + 0x80, 0x61, 0x24, 0x0, 0xe1, 0x10, 0x7, 0xff, + 0x1, 0xc0, 0x40, 0x31, 0x82, 0x80, 0x69, 0x1a, + 0x52, 0x0, 0xe, 0x5, 0x48, 0x5, 0xc2, 0xfe, + 0x0, 0x73, 0x98, 0x40, 0x6, 0x3, 0x80, 0x67, + 0x1, 0x0, 0xff, 0x84, 0x40, 0x18, 0x49, 0x40, + 0x35, 0x4, 0x0, 0x58, 0xb6, 0x60, 0x16, 0xf2, + 0x0, 0x60, + + /* U+7E "~" */ + 0x3, 0xdf, 0xd5, 0x0, 0xcc, 0x63, 0xa6, 0xa7, + 0x52, 0x0, 0x29, 0x57, 0x1f, 0xae, 0x56, 0xea, + 0xc1, 0x64, 0xa1, 0x0, 0x54, 0x9a, 0x96, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 192, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 192, .box_w = 3, .box_h = 15, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 13, .adv_w = 192, .box_w = 6, .box_h = 5, .ofs_x = 3, .ofs_y = 10}, + {.bitmap_index = 26, .adv_w = 192, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 110, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 193, .adv_w = 192, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 269, .adv_w = 192, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 346, .adv_w = 192, .box_w = 3, .box_h = 5, .ofs_x = 4, .ofs_y = 10}, + {.bitmap_index = 353, .adv_w = 192, .box_w = 6, .box_h = 22, .ofs_x = 3, .ofs_y = -5}, + {.bitmap_index = 413, .adv_w = 192, .box_w = 6, .box_h = 22, .ofs_x = 3, .ofs_y = -5}, + {.bitmap_index = 472, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 518, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 543, .adv_w = 192, .box_w = 4, .box_h = 6, .ofs_x = 3, .ofs_y = -4}, + {.bitmap_index = 555, .adv_w = 192, .box_w = 8, .box_h = 2, .ofs_x = 2, .ofs_y = 6}, + {.bitmap_index = 561, .adv_w = 192, .box_w = 4, .box_h = 3, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 567, .adv_w = 192, .box_w = 9, .box_h = 16, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 617, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 689, .adv_w = 192, .box_w = 6, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 708, .adv_w = 192, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 774, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 841, .adv_w = 192, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 893, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 957, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1027, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1078, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1150, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1220, .adv_w = 192, .box_w = 4, .box_h = 11, .ofs_x = 5, .ofs_y = 0}, + {.bitmap_index = 1237, .adv_w = 192, .box_w = 5, .box_h = 15, .ofs_x = 4, .ofs_y = -4}, + {.bitmap_index = 1265, .adv_w = 192, .box_w = 9, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 1305, .adv_w = 192, .box_w = 10, .box_h = 6, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 1322, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 1365, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1424, .adv_w = 192, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1513, .adv_w = 192, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1585, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1648, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1707, .adv_w = 192, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1765, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1798, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1825, .adv_w = 192, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1895, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1915, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1941, .adv_w = 192, .box_w = 11, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1975, .adv_w = 192, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2035, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2050, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2101, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2149, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2216, .adv_w = 192, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2262, .adv_w = 192, .box_w = 12, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2351, .adv_w = 192, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2412, .adv_w = 192, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2487, .adv_w = 192, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2506, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2545, .adv_w = 192, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2619, .adv_w = 192, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2711, .adv_w = 192, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2789, .adv_w = 192, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2845, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2899, .adv_w = 192, .box_w = 5, .box_h = 20, .ofs_x = 4, .ofs_y = -3}, + {.bitmap_index = 2915, .adv_w = 192, .box_w = 8, .box_h = 16, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 2963, .adv_w = 192, .box_w = 5, .box_h = 20, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 2979, .adv_w = 192, .box_w = 8, .box_h = 8, .ofs_x = 2, .ofs_y = 7}, + {.bitmap_index = 3010, .adv_w = 192, .box_w = 10, .box_h = 2, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3016, .adv_w = 192, .box_w = 4, .box_h = 3, .ofs_x = 4, .ofs_y = 12}, + {.bitmap_index = 3022, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3074, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3125, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3176, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3230, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3280, .adv_w = 192, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3325, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3392, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3424, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3459, .adv_w = 192, .box_w = 7, .box_h = 19, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 3493, .adv_w = 192, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3541, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3566, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3595, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3623, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3677, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3733, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3786, .adv_w = 192, .box_w = 8, .box_h = 11, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 3806, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3861, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3897, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3924, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3976, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4043, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4098, .adv_w = 192, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 4169, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4211, .adv_w = 192, .box_w = 7, .box_h = 20, .ofs_x = 3, .ofs_y = -4}, + {.bitmap_index = 4269, .adv_w = 192, .box_w = 2, .box_h = 19, .ofs_x = 5, .ofs_y = -4}, + {.bitmap_index = 4274, .adv_w = 192, .box_w = 7, .box_h = 20, .ofs_x = 3, .ofs_y = -4}, + {.bitmap_index = 4332, .adv_w = 192, .box_w = 12, .box_h = 4, .ofs_x = 0, .ofs_y = 4} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + + + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + } +}; + + + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_dsc_t font_dsc = { + .glyph_bitmap = gylph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 1, + .bpp = 4, + .kern_classes = 0, + .bitmap_format = 1 +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +lv_font_t font_3 = { + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 22, /*The maximum line height required by the font*/ + .base_line = 5, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if FONT_3*/ + diff --git a/tests/lv_test_main.c b/tests/lv_test_main.c index 8c69a98df..13d8f14eb 100644 --- a/tests/lv_test_main.c +++ b/tests/lv_test_main.c @@ -23,6 +23,63 @@ int main(void) } +#if LV_USE_FILESYSTEM +static lv_fs_res_t open_cb(struct _lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode) +{ + (void) drv; + (void) mode; + + FILE * fp = fopen(path, "rb"); // only reading is supported + + *((FILE **)file_p) = fp; + return NULL == fp ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +static lv_fs_res_t close_cb(struct _lv_fs_drv_t * drv, void * file_p) +{ + (void) drv; + + FILE * fp = *((FILE **) file_p); + fclose(fp); + return LV_FS_RES_OK; +} + +static lv_fs_res_t read_cb(struct _lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) +{ + (void) drv; + + FILE * fp = *((FILE **) file_p); + *br = fread(buf, 1, btr, fp); + return (*br <= 0) ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK; +} + +static lv_fs_res_t seek_cb(struct _lv_fs_drv_t * drv, void * file_p, uint32_t pos) +{ + (void) drv; + + FILE * fp = *((FILE **) file_p); + fseek (fp, pos, SEEK_SET); + + return LV_FS_RES_OK; +} + +static lv_fs_res_t tell_cb(struct _lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) +{ + (void) drv; + + FILE * fp = *((FILE **) file_p); + *pos_p = ftell(fp); + + return LV_FS_RES_OK; +} + +static bool ready_cb(struct _lv_fs_drv_t * drv) +{ + (void) drv; + return true; +} +#endif + static void hal_init(void) { static lv_disp_buf_t disp_buf; @@ -35,8 +92,23 @@ static void hal_init(void) disp_drv.buffer = &disp_buf; disp_drv.flush_cb = dummy_flush_cb; lv_disp_drv_register(&disp_drv); -} +#if LV_USE_FILESYSTEM + lv_fs_drv_t drv; + lv_fs_drv_init(&drv); /*Basic initialization*/ + + drv.letter = 'f'; /*An uppercase letter to identify the drive */ + drv.file_size = sizeof(FILE *); /*Size required to store a file object*/ + drv.ready_cb = ready_cb; /*Callback to tell if the drive is ready to use */ + drv.open_cb = open_cb; /*Callback to open a file */ + drv.close_cb = close_cb; /*Callback to close a file */ + drv.read_cb = read_cb; /*Callback to read a file */ + drv.seek_cb = seek_cb; /*Callback to seek in a file (Move cursor) */ + drv.tell_cb = tell_cb; /*Callback to tell the cursor position */ + + lv_fs_drv_register(&drv); /*Finally register the drive*/ +#endif +} static void dummy_flush_cb(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) {