diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..9c6d3af73 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +custom: ["https://littlevgl.com/donate"] diff --git a/README.md b/README.md index 2881caf85..9d1708875 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ Choose a project with your favourite IDE: | Eclipse | CodeBlocks | Visual Studio | PlatformIO | Qt Creator | |-------------|-------------|---------------|-----------|------------| | [![Eclipse](https://littlevgl.com/logo/ide/eclipse.jpg)](https://github.com/littlevgl/pc_simulator_sdl_eclipse) | [![CodeBlocks](https://littlevgl.com/logo/ide/codeblocks.jpg)](https://github.com/littlevgl/pc_simulator_win_codeblocks) | [![VisualStudio](https://littlevgl.com/logo/ide/visualstudio.jpg)](https://github.com/littlevgl/visual_studio_2017_sdl_x64) | [![PlatformIO](https://littlevgl.com/logo/ide/platformio.jpg)](https://github.com/littlevgl/pc_simulator_sdl_platformio) | [![QtCreator](https://littlevgl.com/logo/ide/qtcreator.jpg)](https://blog.littlevgl.com/2019-01-03/qt-creator) | -| Cross-platform
with SDL | Native Windows | Cross-platform
with SDL | Cross-platform
with SDL | Cross-platform
with SDL | +| Cross-platform
with SDL
(Recommended on
Linux and Mac) | Native Windows | Windows
with SDL | Cross-platform
with SDL | Cross-platform
with SDL | ## Add LittlevGL to your project @@ -188,8 +188,8 @@ Styles can be assigned to the objects to changed their appearance. A style descr You can create a new style like this: ```c -static lv_style_t style1; /*Declare a new style. Should be `static`*/ -lv_style_copy(&style1, &lv_style_plain); /*Copy a buil-in style*/ +static lv_style_t style1; /*Declare a new style. Should be `static`*/ +lv_style_copy(&style1, &lv_style_plain); /*Copy a built-in style*/ style1.body.main_color = LV_COLOR_RED; /*Main color*/ style1.body.grad_color = lv_color_hex(0xffd83c) /*Gradient color (orange)*/ style1.body.radius = 3; diff --git a/a.txt b/a.txt new file mode 100644 index 000000000..5644f9f94 --- /dev/null +++ b/a.txt @@ -0,0 +1,127 @@ +diff --git a/src/lv_draw/lv_draw_img.c b/src/lv_draw/lv_draw_img.c +index f28c47eb..74f73686 100644 +--- a/src/lv_draw/lv_draw_img.c ++++ b/src/lv_draw/lv_draw_img.c +@@ -406,7 +406,7 @@ static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area, + trans_dsc.cfg.pivot_x = map_w / 2; + trans_dsc.cfg.pivot_y = map_h / 2; + trans_dsc.cfg.color = style->image.color; +- trans_dsc.cfg.antialias = antialaias; ++ trans_dsc.cfg.antialias = true; + + lv_img_buf_transform_init(&trans_dsc); + } +diff --git a/src/lv_draw/lv_img_buf.c b/src/lv_draw/lv_img_buf.c +index 2b79c7b1..89a57708 100644 +--- a/src/lv_draw/lv_img_buf.c ++++ b/src/lv_draw/lv_img_buf.c +@@ -161,6 +161,68 @@ lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y) + return LV_OPA_COVER; + } + ++/** ++ * Set the color of a pixel of an image. The alpha channel won't be affected. ++ * @param dsc pointer to an image descriptor ++ * @param x x coordinate of the point to set ++ * @param y x coordinate of the point to set ++ * @param c color of the point ++ * @param safe true: check out of bounds ++ */ ++void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c) ++{ ++ uint8_t * buf_u8 = (uint8_t *)dsc->data; ++ ++ if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR || dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { ++ uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf) >> 3; ++ uint32_t px = dsc->header.w * y * px_size + x * px_size; ++ memcpy(&buf_u8[px], &c, px_size); ++ } else if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { ++ uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf) >> 3; ++ uint32_t px = dsc->header.w * y * px_size + x * px_size; ++ memcpy(&buf_u8[px], &c, px_size - 1); /*-1 to not overwrite the alpha value*/ ++ } else if(dsc->header.cf == LV_IMG_CF_INDEXED_1BIT) { ++ buf_u8 += sizeof(lv_color32_t) * 2; /*Skip the palette*/ ++ ++ uint8_t bit = x & 0x7; ++ x = x >> 3; ++ ++ /* Get the current pixel. ++ * dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned ++ * so the possible real width are 8 ,16, 24 ...*/ ++ uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; ++ buf_u8[px] = buf_u8[px] & ~(1 << (7 - bit)); ++ buf_u8[px] = buf_u8[px] | ((c.full & 0x1) << (7 - bit)); ++ } else if(dsc->header.cf == LV_IMG_CF_INDEXED_2BIT) { ++ buf_u8 += sizeof(lv_color32_t) * 4; /*Skip the palette*/ ++ uint8_t bit = (x & 0x3) * 2; ++ x = x >> 2; ++ ++ /* Get the current pixel. ++ * dsc->header.w + 3 means rounding up to 4 because the lines are byte aligned ++ * so the possible real width are 4, 8 ,12 ...*/ ++ uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; ++ ++ buf_u8[px] = buf_u8[px] & ~(3 << (6 - bit)); ++ buf_u8[px] = buf_u8[px] | ((c.full & 0x3) << (6 - bit)); ++ } else if(dsc->header.cf == LV_IMG_CF_INDEXED_4BIT) { ++ buf_u8 += sizeof(lv_color32_t) * 16; /*Skip the palette*/ ++ uint8_t bit = (x & 0x1) * 4; ++ x = x >> 1; ++ ++ /* Get the current pixel. ++ * dsc->header.w + 1 means rounding up to 2 because the lines are byte aligned ++ * so the possible real width are 2 ,4, 6 ...*/ ++ uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; ++ buf_u8[px] = buf_u8[px] & ~(0xF << (4 - bit)); ++ buf_u8[px] = buf_u8[px] | ((c.full & 0xF) << (4 - bit)); ++ } else if(dsc->header.cf == LV_IMG_CF_INDEXED_8BIT) { ++ buf_u8 += sizeof(lv_color32_t) * 256; /*Skip the palette*/ ++ uint32_t px = dsc->header.w * y + x; ++ buf_u8[px] = c.full; ++ } ++} ++ + /** + * Set the alpha value of a pixel of an image. The color won't be affected + * @param dsc pointer to an image descriptor +diff --git a/src/lv_draw/lv_img_buf.h b/src/lv_draw/lv_img_buf.h +index 2629b465..3c1d8273 100644 +--- a/src/lv_draw/lv_img_buf.h ++++ b/src/lv_draw/lv_img_buf.h +@@ -205,6 +205,7 @@ lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t + */ + lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y); + ++ + /** + * Set the color of a pixel of an image. The alpha channel won't be affected. + * @param dsc pointer to an image descriptor +diff --git a/src/lv_objx/lv_img.c b/src/lv_objx/lv_img.c +index 982bb8d9..f792867a 100644 +--- a/src/lv_objx/lv_img.c ++++ b/src/lv_objx/lv_img.c +@@ -273,7 +273,6 @@ void lv_img_set_angle(lv_obj_t * img, int16_t angle) + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); + if(angle == ext->angle) return; + +- lv_obj_invalidate(img); + ext->angle = angle; + lv_obj_refresh_ext_draw_pad(img); + lv_obj_invalidate(img); +@@ -296,7 +295,6 @@ void lv_img_set_zoom(lv_obj_t * img, uint16_t zoom) + + if(zoom == 0) zoom = 1; + +- lv_obj_invalidate(img); + ext->zoom = zoom; + lv_obj_refresh_ext_draw_pad(img); + lv_obj_invalidate(img); +@@ -533,7 +531,7 @@ static lv_res_t lv_img_signal(lv_obj_t * img, lv_signal_t sign, void * param) + } + } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { + /*If the image has angle provide enough room for the rotated corners */ +- if(ext->angle || ext->zoom != LV_IMG_ZOOM_NONE) { ++ if(ext->angle && ext->zoom) { + lv_sqrt_res_t ds; + lv_sqrt(ext->w * ext->w + ext->h * ext->h, &ds); + ds.i = (ds.i * ext->zoom + 0) >> 8; /*+10 to be sure anything won't be clipped*/ diff --git a/lv_conf_template.h b/lv_conf_template.h index 08e9beb9e..3580da53b 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -43,6 +43,9 @@ /*Images pixels with this color will not be drawn (with chroma keying)*/ #define LV_COLOR_TRANSP LV_COLOR_LIME /*LV_COLOR_LIME: pure green*/ +/* Enable chroma keying for indexed images. */ +#define LV_INDEXED_CHROMA 1 + /* Enable anti-aliasing (lines, and radiuses will be smoothed) */ #define LV_ANTIALIAS 1 @@ -193,6 +196,14 @@ typedef void * lv_img_decoder_user_data_t; * font's bitmaps */ #define LV_ATTRIBUTE_LARGE_CONST +/* Export integer constant to binding. + * This macro is used with constants in the form of LV_ that + * should also appear on lvgl binding API such as Micropython + * + * The default value just prevents a GCC warning. + */ +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning + /*=================== * HAL settings *==================*/ @@ -225,10 +236,46 @@ typedef void * lv_indev_drv_user_data_t; /*Type of user data in the i # define LV_LOG_LEVEL LV_LOG_LEVEL_WARN /* 1: Print the log with 'printf'; - * 0: user need to register a callback with `lv_log_register_print`*/ + * 0: user need to register a callback with `lv_log_register_print_cb`*/ # define LV_LOG_PRINTF 0 #endif /*LV_USE_LOG*/ +/*================= + * Debug settings + *================*/ + +/* If Debug is enabled LittelvGL validates the parameters of the functions. + * If an invalid parameter is found an error log message is printed and + * the MCU halts at the error. (`LV_USE_LOG` should be enabled) + * If you are debugging the MCU you can pause + * the debugger to see exactly where the issue is. + * + * The behavior of asserts can be overwritten by redefining them here. + * E.g. #define LV_ASSERT_MEM(p) + */ +#define LV_USE_DEBUG 1 +#if LV_USE_DEBUG + +/*Check if the parameter is NULL. (Quite fast) */ +#define LV_USE_ASSERT_NULL 1 + +/*Checks is the memory is successfully allocated or no. (Quite fast)*/ +#define LV_USE_ASSERT_MEM 1 + +/* Check the strings. + * Search for NULL, very long strings, invalid characters, and unnatural repetitions. (Slow) + * If disabled `LV_USE_ASSERT_NULL` will be performed instead (if it's enabled) */ +#define LV_USE_ASSERT_STR 0 + +/* Check NULL, the object's type and existence (e.g. not deleted). (Quite slow) + * If disabled `LV_USE_ASSERT_NULL` will be performed instead (if it's enabled) */ +#define LV_USE_ASSERT_OBJ 0 + +/*Check if the styles are properly initialized. (Fast)*/ +#define LV_USE_ASSERT_STYLE 1 + +#endif /*LV_USE_DEBUG*/ + /*================ * THEME USAGE *================*/ @@ -260,6 +307,10 @@ typedef void * lv_indev_drv_user_data_t; /*Type of user data in the i #define LV_FONT_ROBOTO_22 0 #define LV_FONT_ROBOTO_28 0 +/* Demonstrate special features */ +#define LV_FONT_ROBOTO_12_SUBPX 1 +#define LV_FONT_ROBOTO_28_COMPRESSED 1 /*bpp = 3*/ + /*Pixel perfect monospace font * http://pelulamu.net/unscii/ */ #define LV_FONT_UNSCII_8 0 @@ -280,6 +331,12 @@ typedef void * lv_indev_drv_user_data_t; /*Type of user data in the i * but with > 10,000 characters if you see issues probably you need to enable it.*/ #define LV_FONT_FMT_TXT_LARGE 0 +/* Set the pixel order of the display. + * Important only if "subpx fonts" are used. + * With "normal" font it doesn't matter. + */ +#define LV_FONT_SUBPX_BGR 0 + /*Declare the type of the user data of fonts (can be e.g. `void *`, `int`, `struct`)*/ typedef void * lv_font_user_data_t; @@ -297,6 +354,42 @@ typedef void * lv_font_user_data_t; /*Can break (wrap) texts on these chars*/ #define LV_TXT_BREAK_CHARS " ,.;:-_" +/* If a word is at least this long, will break wherever "prettiest" + * To disable, set to a value <= 0 */ +#define LV_TXT_LINE_BREAK_LONG_LEN 12 + +/* Minimum number of characters in a long word to put on a line before a break. + * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */ +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 + +/* Minimum number of characters in a long word to put on a line after a break. + * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */ +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 + +/* The control character to use for signalling text recoloring. */ +#define LV_TXT_COLOR_CMD "#" + +/* Support bidirectional texts. + * Allows mixing Left-to-Right and Right-to-Left texts. + * The direction will be processed according to the Unicode Bidirectioanl Algorithm: + * https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#define LV_USE_BIDI 0 +#if LV_USE_BIDI +/* Set the default direction. Supported values: + * `LV_BIDI_DIR_LTR` Left-to-Right + * `LV_BIDI_DIR_RTL` Right-to-Left + * `LV_BIDI_DIR_AUTO` detect texts base direction */ +#define LV_BIDI_BASE_DIR_DEF LV_BIDI_DIR_AUTO +#endif + +/*Change the built in (v)snprintf functions*/ +#define LV_SPRINTF_CUSTOM 0 +#if LV_SPRINTF_CUSTOM +# define LV_SPRINTF_INCLUDE +# define lv_snprintf snprintf +# define lv_vsnprintf vsnprintf +#endif /*LV_SPRINTF_CUSTOM*/ + /*=================== * LV_OBJ SETTINGS *==================*/ @@ -355,6 +448,9 @@ typedef void * lv_obj_user_data_t; /*Container (dependencies: -*/ #define LV_USE_CONT 1 +/*Color picker (dependencies: -*/ +#define LV_USE_CPICKER 1 + /*Drop down list (dependencies: lv_page, lv_label, lv_symbol_def.h)*/ #define LV_USE_DDLIST 1 #if LV_USE_DDLIST != 0 @@ -410,6 +506,9 @@ typedef void * lv_obj_user_data_t; /*Line meter (dependencies: *;)*/ #define LV_USE_LMETER 1 +/*Mask (dependencies: -)*/ +#define LV_USE_OBJMASK 0 + /*Message box (dependencies: lv_rect, lv_btnm, lv_label)*/ #define LV_USE_MBOX 1 diff --git a/lvgl.h b/lvgl.h index b6e29b61b..761951154 100644 --- a/lvgl.h +++ b/lvgl.h @@ -14,8 +14,6 @@ extern "C" { * INCLUDES *********************/ -#include "src/lv_version.h" - #include "src/lv_misc/lv_log.h" #include "src/lv_misc/lv_task.h" #include "src/lv_misc/lv_math.h" @@ -25,14 +23,18 @@ extern "C" { #include "src/lv_core/lv_obj.h" #include "src/lv_core/lv_group.h" +#include "src/lv_core/lv_indev.h" #include "src/lv_core/lv_refr.h" #include "src/lv_core/lv_disp.h" +#include "src/lv_core/lv_debug.h" #include "src/lv_themes/lv_theme.h" #include "src/lv_font/lv_font.h" #include "src/lv_font/lv_font_fmt_txt.h" +#include "src/lv_misc/lv_bidi.h" +#include "src/lv_misc/lv_printf.h" #include "src/lv_objx/lv_btn.h" #include "src/lv_objx/lv_imgbtn.h" @@ -45,6 +47,7 @@ extern "C" { #include "src/lv_objx/lv_chart.h" #include "src/lv_objx/lv_table.h" #include "src/lv_objx/lv_cb.h" +#include "src/lv_objx/lv_cpicker.h" #include "src/lv_objx/lv_bar.h" #include "src/lv_objx/lv_slider.h" #include "src/lv_objx/lv_led.h" @@ -58,6 +61,7 @@ extern "C" { #include "src/lv_objx/lv_tabview.h" #include "src/lv_objx/lv_tileview.h" #include "src/lv_objx/lv_mbox.h" +#include "src/lv_objx/lv_objmask.h" #include "src/lv_objx/lv_gauge.h" #include "src/lv_objx/lv_lmeter.h" #include "src/lv_objx/lv_sw.h" @@ -69,9 +73,16 @@ extern "C" { #include "src/lv_draw/lv_img_cache.h" +#include "src/lv_api_map.h" + /********************* * DEFINES *********************/ +/*Current version of LittlevGL*/ +#define LVGL_VERSION_MAJOR 7 +#define LVGL_VERSION_MINOR 0 +#define LVGL_VERSION_PATCH 0 +#define LVGL_VERSION_INFO "dev" /********************** * TYPEDEFS @@ -85,6 +96,30 @@ extern "C" { * MACROS **********************/ +/** Gives 1 if the x.y.z version is supported in the current version + * Usage: + * + * - Require v6 + * #if LV_VERSION_CHECK(6,0,0) + * new_func_in_v6(); + * #endif + * + * + * - Require at least v5.3 + * #if LV_VERSION_CHECK(5,3,0) + * new_feature_from_v5_3(); + * #endif + * + * + * - Require v5.3.2 bugfixes + * #if LV_VERSION_CHECK(5,3,2) + * bugfix_in_v5_3_2(); + * #endif + * + * */ +#define LV_VERSION_CHECK(x,y,z) (x == LVGL_VERSION_MAJOR && (y < LVGL_VERSION_MINOR || (y == LVGL_VERSION_MINOR && z <= LVGL_VERSION_PATCH))) + + #ifdef __cplusplus } #endif diff --git a/scripts/built_in_font/FontAwesome.ttf b/scripts/built_in_font/FontAwesome.ttf deleted file mode 100644 index 35acda2fa..000000000 Binary files a/scripts/built_in_font/FontAwesome.ttf and /dev/null differ diff --git a/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff b/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff new file mode 100644 index 000000000..791b41013 Binary files /dev/null and b/scripts/built_in_font/FontAwesome5-Solid+Brands+Regular.woff differ diff --git a/scripts/built_in_font/built_in_font_gen.py b/scripts/built_in_font/built_in_font_gen.py index 1f5d64b1b..db8e88c13 100644 --- a/scripts/built_in_font/built_in_font_gen.py +++ b/scripts/built_in_font/built_in_font_gen.py @@ -40,8 +40,8 @@ else: compr = "" #Built in symbols -syms = "61441,61448,61451,61452,61453,61457,61459,61460,61461,61465,61468,61473,61478,61479,61480,61502,61504,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61671,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62099" +syms = "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" #Run the command -cmd = "lv_font_conv {} --bpp {} --size {} --font ./Roboto-Regular.woff -r {} --font FontAwesome.ttf -r {} --format lvgl -o {} --force-fast-kern-format".format(compr, args.bpp, args.size, args.range[0], syms, args.output) +cmd = "lv_font_conv {} --bpp {} --size {} --font Roboto-Regular.woff -r {} --font FontAwesome5-Solid+Brands+Regular.woff -r {} --format lvgl -o {} --force-fast-kern-format".format(compr, args.bpp, args.size, args.range[0], syms, args.output) os.system(cmd) diff --git a/scripts/lv_conf_checker.py b/scripts/lv_conf_checker.py old mode 100644 new mode 100755 index 7929dcf52..c2171ff8a --- a/scripts/lv_conf_checker.py +++ b/scripts/lv_conf_checker.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python3.6 + ''' Generates a checker file for lv_conf.h from lv_conf_templ.h define all the not defined values ''' @@ -34,9 +36,11 @@ for i in fin.read().splitlines(): if '/*--END OF LV_CONF_H--*/' in i: break r = re.search(r'^ *# *define ([^\s]+).*$', i) + if r: + line = re.sub('\(.*?\)', '', r[1], 1) #remove parentheses from macros fout.write( - f'#ifndef {r[1]}\n' + f'#ifndef {line}\n' f'{i}\n' '#endif\n' ) diff --git a/src/lv_api_map.h b/src/lv_api_map.h new file mode 100644 index 000000000..18164398e --- /dev/null +++ b/src/lv_api_map.h @@ -0,0 +1,132 @@ +/** + * @file lv_api_map.h + * + */ + +#ifndef LV_API_MAP_H +#define LV_API_MAP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lvgl/lvgl.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/*--------------------- + * V6.0 COMPATIBILITY + *--------------------*/ + + +#if LV_USE_ARC + + +static inline void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end) +{ + lv_arc_set_start_angle(arc, start); + lv_arc_set_end_angle(arc, end); +} + +#endif + +#if LV_USE_CHART + +#define lv_chart_get_point_cnt lv_chart_get_point_count + +#endif + + +#if LV_USE_DDLIST + +static inline void lv_ddlist_set_draw_arrow(lv_obj_t * ddlist, bool en) +{ + if(en) lv_ddlist_set_symbol(ddlist, LV_SYMBOL_DOWN); + else lv_ddlist_set_symbol(ddlist, NULL); +} + +static inline bool lv_ddlist_get_draw_arrow(lv_obj_t * ddlist) +{ + if(lv_ddlist_get_symbol(ddlist)) return true; + else return false; +} + +#endif + +#if LV_USE_BAR + +/** + * Make the bar symmetric to zero. The indicator will grow from zero instead of the minimum + * position. + * @param bar pointer to a bar object + * @param en true: enable disable symmetric behavior; false: disable + * @deprecated As of v7.0, you should use `lv_bar_set_type` instead. + */ +static inline void lv_bar_set_sym(lv_obj_t * bar, bool en) +{ + if(en) + lv_bar_set_type(bar, LV_BAR_TYPE_SYM); + else + lv_bar_set_type(bar, LV_BAR_TYPE_NORMAL); +} + +/** + * Get whether the bar is symmetric or not. + * @param bar pointer to a bar object + * @return true: symmetric is enabled; false: disable + * @deprecated As of v7.0, you should use `lv_bar_get_type` instead. + */ +static inline bool lv_bar_get_sym(lv_obj_t * bar) { + return lv_bar_get_type(bar) == LV_BAR_TYPE_SYM; +} + +#endif + +#if LV_USE_SLIDER + +/** + * Make the slider symmetric to zero. The indicator will grow from zero instead of the minimum + * position. + * @param slider pointer to a bar object + * @param en true: enable disable symmetric behavior; false: disable + * @deprecated As of v7.0, you should use `lv_slider_set_type` instead. + */ +static inline void lv_slider_set_sym(lv_obj_t * slider, bool en) +{ + lv_bar_set_sym(slider, en); +} + +/** + * Get whether the slider is symmetric or not. + * @param slider pointer to a slider object + * @return true: symmetric is enabled; false: disable + * @deprecated As of v7.0, you should use `lv_slider_get_type` instead. + */ +static inline bool lv_slider_get_sym(lv_obj_t * slider) { + return lv_bar_get_sym(slider); +} + +#endif + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_API_MAP_H*/ diff --git a/src/lv_conf_checker.h b/src/lv_conf_checker.h index ff7ac05df..4b0d9a67d 100644 --- a/src/lv_conf_checker.h +++ b/src/lv_conf_checker.h @@ -50,6 +50,11 @@ #define LV_COLOR_TRANSP LV_COLOR_LIME /*LV_COLOR_LIME: pure green*/ #endif +/* Enable chroma keying for indexed images. */ +#ifndef LV_INDEXED_CHROMA +#define LV_INDEXED_CHROMA 1 +#endif + /* Enable anti-aliasing (lines, and radiuses will be smoothed) */ #ifndef LV_ANTIALIAS #define LV_ANTIALIAS 1 @@ -261,6 +266,16 @@ #define LV_ATTRIBUTE_LARGE_CONST #endif +/* Export integer constant to binding. + * This macro is used with constants in the form of LV_ that + * should also appear on lvgl binding API such as Micropython + * + * The default value just prevents a GCC warning. + */ +#ifndef LV_EXPORT_CONST_INT +#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning +#endif + /*=================== * HAL settings *==================*/ @@ -301,12 +316,60 @@ #endif /* 1: Print the log with 'printf'; - * 0: user need to register a callback with `lv_log_register_print`*/ + * 0: user need to register a callback with `lv_log_register_print_cb`*/ #ifndef LV_LOG_PRINTF # define LV_LOG_PRINTF 0 #endif #endif /*LV_USE_LOG*/ +/*================= + * Debug settings + *================*/ + +/* If Debug is enabled LittelvGL validates the parameters of the functions. + * If an invalid parameter is found an error log message is printed and + * the MCU halts at the error. (`LV_USE_LOG` should be enabled) + * If you are debugging the MCU you can pause + * the debugger to see exactly where the issue is. + * + * The behavior of asserts can be overwritten by redefining them here. + * E.g. #define LV_ASSERT_MEM(p) + */ +#ifndef LV_USE_DEBUG +#define LV_USE_DEBUG 1 +#endif +#if LV_USE_DEBUG + +/*Check if the parameter is NULL. (Quite fast) */ +#ifndef LV_USE_ASSERT_NULL +#define LV_USE_ASSERT_NULL 1 +#endif + +/*Checks is the memory is successfully allocated or no. (Quite fast)*/ +#ifndef LV_USE_ASSERT_MEM +#define LV_USE_ASSERT_MEM 1 +#endif + +/* Check the strings. + * Search for NULL, very long strings, invalid characters, and unnatural repetitions. (Slow) + * If disabled `LV_USE_ASSERT_NULL` will be performed instead (if it's enabled) */ +#ifndef LV_USE_ASSERT_STR +#define LV_USE_ASSERT_STR 0 +#endif + +/* Check NULL, the object's type and existence (e.g. not deleted). (Quite slow) + * If disabled `LV_USE_ASSERT_NULL` will be performed instead (if it's enabled) */ +#ifndef LV_USE_ASSERT_OBJ +#define LV_USE_ASSERT_OBJ 0 +#endif + +/*Check if the styles are properly initialized. (Fast)*/ +#ifndef LV_USE_ASSERT_STYLE +#define LV_USE_ASSERT_STYLE 1 +#endif + +#endif /*LV_USE_DEBUG*/ + /*================ * THEME USAGE *================*/ @@ -364,6 +427,14 @@ #define LV_FONT_ROBOTO_28 0 #endif +/* Demonstrate special features */ +#ifndef LV_FONT_ROBOTO_12_SUBPX +#define LV_FONT_ROBOTO_12_SUBPX 1 +#endif +#ifndef LV_FONT_ROBOTO_28_COMPRESSED +#define LV_FONT_ROBOTO_28_COMPRESSED 1 /*bpp = 3*/ +#endif + /*Pixel perfect monospace font * http://pelulamu.net/unscii/ */ #ifndef LV_FONT_UNSCII_8 @@ -392,6 +463,14 @@ #define LV_FONT_FMT_TXT_LARGE 0 #endif +/* Set the pixel order of the display. + * Important only if "subpx fonts" are used. + * With "normal" font it doesn't matter. + */ +#ifndef LV_FONT_SUBPX_BGR +#define LV_FONT_SUBPX_BGR 0 +#endif + /*Declare the type of the user data of fonts (can be e.g. `void *`, `int`, `struct`)*/ /*================= @@ -412,6 +491,62 @@ #define LV_TXT_BREAK_CHARS " ,.;:-_" #endif +/* If a word is at least this long, will break wherever "prettiest" + * To disable, set to a value <= 0 */ +#ifndef LV_TXT_LINE_BREAK_LONG_LEN +#define LV_TXT_LINE_BREAK_LONG_LEN 12 +#endif + +/* Minimum number of characters in a long word to put on a line before a break. + * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */ +#ifndef LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN +#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN 3 +#endif + +/* Minimum number of characters in a long word to put on a line after a break. + * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */ +#ifndef LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN +#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3 +#endif + +/* The control character to use for signalling text recoloring. */ +#ifndef LV_TXT_COLOR_CMD +#define LV_TXT_COLOR_CMD "#" +#endif + +/* Support bidirectional texts. + * Allows mixing Left-to-Right and Right-to-Left texts. + * The direction will be processed according to the Unicode Bidirectioanl Algorithm: + * https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/ +#ifndef LV_USE_BIDI +#define LV_USE_BIDI 0 +#endif +#if LV_USE_BIDI +/* Set the default direction. Supported values: + * `LV_BIDI_DIR_LTR` Left-to-Right + * `LV_BIDI_DIR_RTL` Right-to-Left + * `LV_BIDI_DIR_AUTO` detect texts base direction */ +#ifndef LV_BIDI_BASE_DIR_DEF +#define LV_BIDI_BASE_DIR_DEF LV_BIDI_DIR_AUTO +#endif +#endif + +/*Change the built in (v)snprintf functions*/ +#ifndef LV_SPRINTF_CUSTOM +#define LV_SPRINTF_CUSTOM 0 +#endif +#if LV_SPRINTF_CUSTOM +#ifndef LV_SPRINTF_INCLUDE +# define LV_SPRINTF_INCLUDE +#endif +#ifndef lv_snprintf +# define lv_snprintf snprintf +#endif +#ifndef lv_vsnprintf +# define lv_vsnprintf vsnprintf +#endif +#endif /*LV_SPRINTF_CUSTOM*/ + /*=================== * LV_OBJ SETTINGS *==================*/ @@ -495,6 +630,11 @@ #define LV_USE_CONT 1 #endif +/*Color picker (dependencies: -*/ +#ifndef LV_USE_CPICKER +#define LV_USE_CPICKER 1 +#endif + /*Drop down list (dependencies: lv_page, lv_label, lv_symbol_def.h)*/ #ifndef LV_USE_DDLIST #define LV_USE_DDLIST 1 diff --git a/src/lv_core/lv_core.mk b/src/lv_core/lv_core.mk index 5cd51bfb5..eb1c5e0ca 100644 --- a/src/lv_core/lv_core.mk +++ b/src/lv_core/lv_core.mk @@ -4,6 +4,7 @@ CSRCS += lv_disp.c CSRCS += lv_obj.c CSRCS += lv_refr.c CSRCS += lv_style.c +CSRCS += lv_debug.c DEPPATH += --dep-path $(LVGL_DIR)/lvgl/src/lv_core VPATH += :$(LVGL_DIR)/lvgl/src/lv_core diff --git a/src/lv_core/lv_debug.c b/src/lv_core/lv_debug.c new file mode 100644 index 000000000..83071af53 --- /dev/null +++ b/src/lv_core/lv_debug.c @@ -0,0 +1,193 @@ +/** + * @file lv_debug.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" +#include "lv_debug.h" + +#if LV_USE_DEBUG + +/********************* + * DEFINES + *********************/ +#ifndef LV_DEBUG_STR_MAX_LENGTH +#define LV_DEBUG_STR_MAX_LENGTH (1024 * 8) +#endif + +#ifndef LV_DEBUG_STR_MAX_REPEAT +#define LV_DEBUG_STR_MAX_REPEAT 8 +#endif +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +bool lv_debug_check_null(const void * p) +{ + if(p) return true; + + return false; +} + +bool lv_debug_check_obj_type(const lv_obj_t * obj, const char * obj_type) +{ + if(obj_type[0] == '\0') return true; + + lv_obj_type_t types; + lv_obj_get_type((lv_obj_t *)obj, &types); + + uint8_t i; + for(i = 0; i < LV_MAX_ANCESTOR_NUM; i++) { + if(strcmp(types.type[i], obj_type) == 0) return true; + } + + return false; +} + +bool lv_debug_check_obj_valid(const lv_obj_t * obj) +{ + lv_disp_t * disp = lv_disp_get_next(NULL); + while(disp) { + lv_obj_t * scr; + LV_LL_READ(disp->scr_ll, scr) { + + if(scr == obj) return true; + bool found = obj_valid_child(scr, obj); + if(found) return true; + } + + disp = lv_disp_get_next(disp); + } + + return false; +} + +bool lv_debug_check_style(const lv_style_t * style) +{ + if(style == NULL) return true; /*NULL style is still valid*/ + +#if LV_USE_ASSERT_STYLE + if(style->debug_sentinel != LV_STYLE_DEGUG_SENTINEL_VALUE) { + LV_LOG_WARN("Invalid style (local variable or not initialized?)"); + return false; + } +#endif + + return true; +} + +bool lv_debug_check_str(const void * str) +{ + const uint8_t * s = (const uint8_t *)str; + uint8_t last_byte = 0; + uint32_t rep = 0; + uint32_t i; + + for(i = 0; s[i] != '\0' && i < LV_DEBUG_STR_MAX_LENGTH; i++) { + if(s[i] != last_byte) { + last_byte = s[i]; + rep = 1; + } else if(s[i] > 0x7F){ + rep++; + if(rep > LV_DEBUG_STR_MAX_REPEAT) { + LV_LOG_WARN("lv_debug_check_str: a non-ASCII char has repeated more than LV_DEBUG_STR_MAX_REPEAT times)"); + return false; + } + } + + if(s[i] < 10) { + LV_LOG_WARN("lv_debug_check_str: invalid char in the string (< 10 value)"); + return false; /*Shouldn't occur in strings*/ + } + } + + if(s[i] == '\0') return true; + + LV_LOG_WARN("lv_debug_check_str: string is longer than LV_DEBUG_STR_MAX_LENGTH"); + return false; +} + +void lv_debug_log_error(const char * msg, uint64_t value) +{ + static const char hex[] = "0123456789ABCDEF"; + + size_t msg_len = strlen(msg); + uint32_t value_len = sizeof(unsigned long int); + + if(msg_len < 230) { + char buf[255]; + char * bufp = buf; + + /*Add the function name*/ + memcpy(bufp, msg, msg_len); + bufp += msg_len; + + /*Add value in hey*/ + *bufp = ' '; + bufp ++; + *bufp = '('; + bufp ++; + *bufp = '0'; + bufp ++; + *bufp = 'x'; + bufp ++; + + int8_t i; + for(i = value_len * 2 - 1; i >= 0; i--) { + uint8_t x = (unsigned long int)((unsigned long int)value >> (i * 4)) & 0xF; + + *bufp = hex[x]; + bufp++; + } + + *bufp = ')'; + bufp ++; + + *bufp = '\0'; + LV_LOG_ERROR(buf); + } else { + LV_LOG_ERROR(msg); + } +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static bool obj_valid_child(const lv_obj_t * parent, const lv_obj_t * obj_to_find) +{ + /*Check all children of `parent`*/ + lv_obj_t * child; + LV_LL_READ(parent->child_ll, child) { + if(child == obj_to_find) return true; + + /*Check the children*/ + bool found = obj_valid_child(child, obj_to_find); + if(found) return true; + } + + return false; +} + +#endif /*LV_USE_DEBUG*/ + diff --git a/src/lv_core/lv_debug.h b/src/lv_core/lv_debug.h new file mode 100644 index 000000000..9c5888cb0 --- /dev/null +++ b/src/lv_core/lv_debug.h @@ -0,0 +1,154 @@ +/** + * @file lv_debug.h + * + */ + +#ifndef LV_DEBUG_H +#define LV_DEBUG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "lv_obj.h" + +#if LV_USE_DEBUG + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * GLOBAL PROTOTYPES + **********************/ +bool lv_debug_check_null(const void * p); + +bool lv_debug_check_obj_type(const lv_obj_t * obj, const char * obj_type); + +bool lv_debug_check_obj_valid(const lv_obj_t * obj); + +bool lv_debug_check_style(const lv_style_t * style); + +bool lv_debug_check_str(const void * str); + +void lv_debug_log_error(const char * msg, uint64_t value); + +/********************** + * MACROS + **********************/ + +#ifndef LV_DEBUG_ASSERT +#define LV_DEBUG_ASSERT(expr, msg, value) \ +do { \ + if(!(expr)) { \ + LV_LOG_ERROR(__func__); \ + lv_debug_log_error(msg, (uint64_t)((uintptr_t)value)); \ + while(1); \ + } \ +} while(0) +#endif + +/*---------------- + * CHECKS + *----------------*/ + +#ifndef LV_DEBUG_IS_NULL +#define LV_DEBUG_IS_NULL(p) (lv_debug_check_null(p)) +#endif + +#ifndef LV_DEBUG_IS_STR +#define LV_DEBUG_IS_STR(str) (lv_debug_check_null(str) && \ + lv_debug_check_str(str)) +#endif + +#ifndef LV_DEBUG_IS_OBJ +#define LV_DEBUG_IS_OBJ(obj_p, obj_type) (lv_debug_check_null(obj_p) && \ + lv_debug_check_obj_valid(obj_p) && \ + lv_debug_check_obj_type(obj_p, obj_type)) +#endif + +#ifndef LV_DEBUG_IS_STYLE +#define LV_DEBUG_IS_STYLE(style_p) (lv_debug_check_style(style_p)) +#endif + +/*----------------- + * ASSERTS + *-----------------*/ + +/*clang-format off*/ + +#if LV_USE_ASSERT_NULL +# ifndef LV_ASSERT_NULL +# define LV_ASSERT_NULL(p) LV_DEBUG_ASSERT(LV_DEBUG_IS_NULL(p), "NULL pointer", p); +# endif +#else +# define LV_ASSERT_NULL(p) true +#endif + +#if LV_USE_ASSERT_MEM +# ifndef LV_ASSERT_MEM +# define LV_ASSERT_MEM(p) LV_DEBUG_ASSERT(LV_DEBUG_IS_NULL(p), "Out of memory", p); +# endif +#else +# define LV_ASSERT_MEM(p) true +#endif + +#if LV_USE_ASSERT_STR +# ifndef LV_ASSERT_STR +# define LV_ASSERT_STR(str) LV_DEBUG_ASSERT(LV_DEBUG_IS_STR(str), "Strange or invalid string", str); +# endif +#else /* LV_USE_ASSERT_OBJ == 0 */ +# if LV_USE_ASSERT_NULL /*Use at least LV_ASSERT_NULL if enabled*/ +# define LV_ASSERT_STR(str) LV_ASSERT_NULL(str) +# else +# define LV_ASSERT_STR(str) true +# endif +#endif + + +#if LV_USE_ASSERT_OBJ +# ifndef LV_ASSERT_OBJ +# define LV_ASSERT_OBJ(obj_p, obj_type) LV_DEBUG_ASSERT(LV_DEBUG_IS_OBJ(obj_p, obj_type), "Invalid object", obj_p); +# endif +#else /* LV_USE_ASSERT_OBJ == 0 */ +# if LV_USE_ASSERT_NULL /*Use at least LV_ASSERT_NULL if enabled*/ +# define LV_ASSERT_OBJ(obj_p, obj_type) LV_ASSERT_NULL(obj_p) +# else +# define LV_ASSERT_OBJ(obj_p, obj_type) true +# endif +#endif + + +#if LV_USE_ASSERT_STYLE +# ifndef LV_ASSERT_STYLE +# define LV_ASSERT_STYLE(style_p) LV_DEBUG_ASSERT(LV_DEBUG_IS_STYLE(style_p), "Invalid style", style_p); +# endif +#else +# define LV_ASSERT_STYLE(style) true +#endif + +#else /* LV_USE_DEBUG == 0 */ + +#define LV_DEBUG_ASSERT(expr, msg, value) do{}while(0) + +#define LV_ASSERT_NULL(p) true +#define LV_ASSERT_MEM(p) true +#define LV_ASSERT_STR(p) true +#define LV_ASSERT_OBJ(obj, obj_type) true +#define LV_ASSERT_STYLE(p) true + +#endif /* LV_USE_DEBUG */ +/*clang-format on*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_DEBUG_H*/ diff --git a/src/lv_core/lv_disp.h b/src/lv_core/lv_disp.h index 8f8f512c8..304715435 100644 --- a/src/lv_core/lv_disp.h +++ b/src/lv_core/lv_disp.h @@ -109,7 +109,7 @@ static inline lv_obj_t * lv_layer_top(void) } /** - * Get the active screen of the deafult display + * Get the active screen of the default display * @return pointer to the sys layer */ static inline lv_obj_t * lv_layer_sys(void) diff --git a/src/lv_core/lv_group.c b/src/lv_core/lv_group.c index d04de3eb3..fc8bfda49 100644 --- a/src/lv_core/lv_group.c +++ b/src/lv_core/lv_group.c @@ -8,8 +8,9 @@ *********************/ #include "lv_group.h" #if LV_USE_GROUP != 0 -#include "../lv_themes/lv_theme.h" #include +#include "../lv_core/lv_debug.h" +#include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_gc.h" #if defined(LV_GC_INCLUDE) @@ -62,7 +63,7 @@ void lv_group_init(void) lv_group_t * lv_group_create(void) { lv_group_t * group = lv_ll_ins_head(&LV_GC_ROOT(_lv_group_ll)); - lv_mem_assert(group); + LV_ASSERT_MEM(group); if(group == NULL) return NULL; lv_ll_init(&group->obj_ll, sizeof(lv_obj_t *)); @@ -104,7 +105,7 @@ void lv_group_del(lv_group_t * group) } lv_ll_clear(&(group->obj_ll)); - lv_ll_rem(&LV_GC_ROOT(_lv_group_ll), group); + lv_ll_remove(&LV_GC_ROOT(_lv_group_ll), group); lv_mem_free(group); } @@ -138,7 +139,7 @@ void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj) obj->group_p = group; lv_obj_t ** next = lv_ll_ins_tail(&group->obj_ll); - lv_mem_assert(next); + LV_ASSERT_MEM(next); if(next == NULL) return; *next = obj; @@ -183,7 +184,7 @@ void lv_group_remove_obj(lv_obj_t * obj) LV_LL_READ(g->obj_ll, i) { if(*i == obj) { - lv_ll_rem(&g->obj_ll, i); + lv_ll_remove(&g->obj_ll, i); lv_mem_free(i); obj->group_p = NULL; break; diff --git a/src/lv_core/lv_indev.c b/src/lv_core/lv_indev.c index 6ec59bdac..45496a1eb 100644 --- a/src/lv_core/lv_indev.c +++ b/src/lv_core/lv_indev.c @@ -40,8 +40,9 @@ static void indev_proc_press(lv_indev_proc_t * proc); static void indev_proc_release(lv_indev_proc_t * proc); static void indev_proc_reset_query_handler(lv_indev_t * indev); static lv_obj_t * indev_search_obj(const lv_indev_proc_t * proc, lv_obj_t * obj); -static void indev_drag(lv_indev_proc_t * state); +static void indev_drag(lv_indev_proc_t * proc); static void indev_drag_throw(lv_indev_proc_t * proc); +static lv_obj_t * get_dragged_obj(lv_obj_t * obj); static bool indev_reset_check(lv_indev_proc_t * proc); /********************** @@ -291,6 +292,36 @@ void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point) } } +/** + * Manually finish dragging. + * `LV_SIGNAL_DRAG_END` and `LV_EVENT_DRAG_END` will be sent. + * @param indev pointer to an input device + * @return `LV_RES_INV` if the object being dragged was deleted. Else `LV_RES_OK`. + */ +lv_res_t lv_indev_finish_drag(lv_indev_t * indev) +{ + if(indev == NULL) return LV_RES_OK; + if(indev->driver.type != LV_INDEV_TYPE_POINTER) return LV_RES_OK; + if(indev->proc.types.pointer.drag_in_prog == 0) return LV_RES_OK; + + indev->proc.types.pointer.drag_in_prog = 0; + indev->proc.types.pointer.drag_throw_vect.x = 0; + indev->proc.types.pointer.drag_throw_vect.y = 0; + + lv_obj_t * drag_obj; + drag_obj = get_dragged_obj(indev->proc.types.pointer.act_obj); + if(drag_obj == NULL) return LV_RES_OK; + + lv_res_t res; + res = drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_END, NULL); + if(res != LV_RES_OK) return res; + + res = lv_event_send(drag_obj, LV_EVENT_DRAG_END, NULL); + if(res != LV_RES_OK) return res; + + return res; +} + /** * Do nothing until the next release * @param indev pointer to an input device @@ -691,17 +722,17 @@ static void indev_proc_press(lv_indev_proc_t * proc) /*If there is no last object then search*/ if(indev_obj_act == NULL) { - indev_obj_act = indev_search_obj(proc, lv_disp_get_layer_sys(disp)); - if(indev_obj_act == NULL) indev_obj_act = indev_search_obj(proc, lv_disp_get_layer_top(disp)); - if(indev_obj_act == NULL) indev_obj_act = indev_search_obj(proc, lv_disp_get_scr_act(disp)); + indev_obj_act = lv_indev_search_obj(lv_disp_get_layer_sys(disp), &proc->types.pointer.act_point); + if(indev_obj_act == NULL) indev_obj_act = lv_indev_search_obj(lv_disp_get_layer_top(disp), &proc->types.pointer.act_point); + if(indev_obj_act == NULL) indev_obj_act = lv_indev_search_obj(lv_disp_get_scr_act(disp), &proc->types.pointer.act_point); new_obj_searched = true; } /*If there is last object but it is not dragged and not protected also search*/ else if(proc->types.pointer.drag_in_prog == 0 && lv_obj_is_protected(indev_obj_act, LV_PROTECT_PRESS_LOST) == false) { - indev_obj_act = indev_search_obj(proc, lv_disp_get_layer_sys(disp)); - if(indev_obj_act == NULL) indev_obj_act = indev_search_obj(proc, lv_disp_get_layer_top(disp)); - if(indev_obj_act == NULL) indev_obj_act = indev_search_obj(proc, lv_disp_get_scr_act(disp)); + indev_obj_act = lv_indev_search_obj(lv_disp_get_layer_sys(disp), &proc->types.pointer.act_point); + if(indev_obj_act == NULL) indev_obj_act = lv_indev_search_obj(lv_disp_get_layer_top(disp), &proc->types.pointer.act_point); + if(indev_obj_act == NULL) indev_obj_act = lv_indev_search_obj(lv_disp_get_scr_act(disp), &proc->types.pointer.act_point); new_obj_searched = true; } /*If a dragable or a protected object was the last then keep it*/ @@ -736,14 +767,14 @@ static void indev_proc_press(lv_indev_proc_t * proc) proc->types.pointer.last_obj = indev_obj_act; if(indev_obj_act != NULL) { - /* Save the time when the obj pressed. - * It is necessary to count the long press time.*/ + /* Save the time when the obj pressed to count long press time.*/ proc->pr_timestamp = lv_tick_get(); proc->long_pr_sent = 0; proc->types.pointer.drag_limit_out = 0; proc->types.pointer.drag_in_prog = 0; proc->types.pointer.drag_sum.x = 0; proc->types.pointer.drag_sum.y = 0; + proc->types.pointer.drag_dir = LV_DRAG_DIR_NONE; proc->types.pointer.vect.x = 0; proc->types.pointer.vect.y = 0; @@ -766,6 +797,7 @@ static void indev_proc_press(lv_indev_proc_t * proc) lv_event_send(indev_obj_act, LV_EVENT_PRESSED, NULL); if(indev_reset_check(proc)) return; + if(indev_act->proc.wait_until_release) return; } } @@ -795,6 +827,7 @@ static void indev_proc_press(lv_indev_proc_t * proc) if(indev_reset_check(proc)) return; lv_event_send(indev_obj_act, LV_EVENT_PRESSING, NULL); if(indev_reset_check(proc)) return; + if(indev_act->proc.wait_until_release) return; indev_drag(proc); if(indev_reset_check(proc)) return; @@ -846,6 +879,7 @@ static void indev_proc_release(lv_indev_proc_t * proc) /*Forget the act obj and send a released signal */ if(indev_obj_act) { + /* If the object was protected against press lost then it possible that * the object is already not pressed but still it is the `act_obj`. * In this case send the `LV_SIGNAL_RELEASED/CLICKED` instead of `LV_SIGNAL_PRESS_LOST` if @@ -923,7 +957,7 @@ static void indev_proc_release(lv_indev_proc_t * proc) #endif /* Send defocus to the lastly "active" object and foucus to the new one. - * DO not sent the events if they was sent by the click focus*/ + * Do not send the events if they was sent by the click focus*/ if(proc->types.pointer.last_pressed != indev_obj_act && click_focus_sent == false) { lv_event_send(proc->types.pointer.last_pressed, LV_EVENT_DEFOCUSED, NULL); if(indev_reset_check(proc)) return; @@ -938,13 +972,13 @@ static void indev_proc_release(lv_indev_proc_t * proc) /*Send LV_EVENT_DRAG_THROW_BEGIN if required */ /*If drag parent is active check recursively the drag_parent attribute*/ - lv_obj_t * drag_obj = indev_obj_act; - while(lv_obj_get_drag_parent(drag_obj) != false && drag_obj != NULL) { - drag_obj = lv_obj_get_parent(drag_obj); - } + lv_obj_t * drag_obj = get_dragged_obj(indev_obj_act); if(drag_obj) { if(lv_obj_get_drag_throw(drag_obj) && proc->types.pointer.drag_in_prog) { + if(drag_obj->signal_cb) drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_THROW_BEGIN, NULL); + if(indev_reset_check(proc)) return; + lv_event_send(drag_obj, LV_EVENT_DRAG_THROW_BEGIN, NULL); if(indev_reset_check(proc)) return; } @@ -983,6 +1017,7 @@ static void indev_proc_reset_query_handler(lv_indev_t * indev) indev->proc.longpr_rep_timestamp = 0; indev->proc.types.pointer.drag_sum.x = 0; indev->proc.types.pointer.drag_sum.y = 0; + indev->proc.types.pointer.drag_dir = LV_DRAG_DIR_NONE; indev->proc.types.pointer.drag_throw_vect.x = 0; indev->proc.types.pointer.drag_throw_vect.y = 0; indev->proc.reset_query = 0; @@ -990,12 +1025,12 @@ static void indev_proc_reset_query_handler(lv_indev_t * indev) } } /** - * Search the most top, clickable object on the last point of an input device - * @param proc pointer to the `lv_indev_proc_t` part of the input device + * Search the most top, clickable object by a point * @param obj pointer to a start object, typically the screen + * @param point pointer to a point for searhing the most top child * @return pointer to the found object or NULL if there was no suitable object */ -static lv_obj_t * indev_search_obj(const lv_indev_proc_t * proc, lv_obj_t * obj) +lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t *point) { lv_obj_t * found_p = NULL; @@ -1007,7 +1042,7 @@ static lv_obj_t * indev_search_obj(const lv_indev_proc_t * proc, lv_obj_t * obj) ext_area.y1 = obj->coords.y1 - obj->ext_click_pad_ver; ext_area.y2 = obj->coords.y2 + obj->ext_click_pad_ver; - if(lv_area_is_point_on(&ext_area, &proc->types.pointer.act_point)) { + if(lv_area_is_point_on(&ext_area, point)) { #elif LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL lv_area_t ext_area; ext_area.x1 = obj->coords.x1 - obj->ext_click_pad.x1; @@ -1015,15 +1050,15 @@ static lv_obj_t * indev_search_obj(const lv_indev_proc_t * proc, lv_obj_t * obj) ext_area.y1 = obj->coords.y1 - obj->ext_click_pad.y1; ext_area.y2 = obj->coords.y2 + obj->ext_click_pad.y2; - if(lv_area_is_point_on(&ext_area, &proc->types.pointer.act_point)) { + if(lv_area_is_point_on(&ext_area, point)) { #else - if(lv_area_is_point_on(&obj->coords, &proc->types.pointer.act_point)) { + if(lv_area_is_point_on(&obj->coords, point)) { #endif lv_obj_t * i; LV_LL_READ(obj->child_ll, i) { - found_p = indev_search_obj(proc, i); + found_p = lv_indev_search_obj(i, point); /*If a child was found then break*/ if(found_p != NULL) { @@ -1051,42 +1086,54 @@ static lv_obj_t * indev_search_obj(const lv_indev_proc_t * proc, lv_obj_t * obj) * Handle the dragging of indev_proc_p->types.pointer.act_obj * @param indev pointer to a input device state */ -static void indev_drag(lv_indev_proc_t * state) +static void indev_drag(lv_indev_proc_t * proc) { - lv_obj_t * drag_obj = state->types.pointer.act_obj; + lv_obj_t * drag_obj = get_dragged_obj(proc->types.pointer.act_obj); bool drag_just_started = false; - /*If drag parent is active check recursively the drag_parent attribute*/ - while(lv_obj_get_drag_parent(drag_obj) != false && drag_obj != NULL) { - drag_obj = lv_obj_get_parent(drag_obj); - } - if(drag_obj == NULL) return; if(lv_obj_get_drag(drag_obj) == false) return; + lv_drag_dir_t allowed_dirs = lv_obj_get_drag_dir(drag_obj); /*Count the movement by drag*/ - state->types.pointer.drag_sum.x += state->types.pointer.vect.x; - state->types.pointer.drag_sum.y += state->types.pointer.vect.y; + if(proc->types.pointer.drag_limit_out == 0) { + proc->types.pointer.drag_sum.x += proc->types.pointer.vect.x; + proc->types.pointer.drag_sum.y += proc->types.pointer.vect.y; + + /*Enough move?*/ + bool hor_en = false; + bool ver_en = false; + if(allowed_dirs == LV_DRAG_DIR_HOR || allowed_dirs == LV_DRAG_DIR_BOTH) { + hor_en = true; + } + + if(allowed_dirs == LV_DRAG_DIR_VER || allowed_dirs == LV_DRAG_DIR_BOTH) { + ver_en = true; + } + + if(allowed_dirs == LV_DRAG_DIR_ONE) { + if(LV_MATH_ABS(proc->types.pointer.drag_sum.x) > LV_MATH_ABS(proc->types.pointer.drag_sum.y)) { + hor_en = true; + } else { + ver_en = true; + } + } - /*Enough move?*/ - if(state->types.pointer.drag_limit_out == 0) { /*If a move is greater then LV_DRAG_LIMIT then begin the drag*/ - if(((allowed_dirs & LV_DRAG_DIR_HOR) && - LV_MATH_ABS(state->types.pointer.drag_sum.x) >= indev_act->driver.drag_limit) || - ((allowed_dirs & LV_DRAG_DIR_VER) && - LV_MATH_ABS(state->types.pointer.drag_sum.y) >= indev_act->driver.drag_limit)) { - state->types.pointer.drag_limit_out = 1; + if((hor_en && LV_MATH_ABS(proc->types.pointer.drag_sum.x) >= indev_act->driver.drag_limit) || + (ver_en && LV_MATH_ABS(proc->types.pointer.drag_sum.y) >= indev_act->driver.drag_limit)) { + proc->types.pointer.drag_limit_out = 1; drag_just_started = true; } } /*If the drag limit is exceeded handle the dragging*/ - if(state->types.pointer.drag_limit_out != 0) { + if(proc->types.pointer.drag_limit_out != 0) { /*Set new position if the vector is not zero*/ - if(state->types.pointer.vect.x != 0 || state->types.pointer.vect.y != 0) { + if(proc->types.pointer.vect.x != 0 || proc->types.pointer.vect.y != 0) { uint16_t inv_buf_size = lv_disp_get_inv_buf_size(indev_act->driver.disp); /*Get the number of currently invalidated areas*/ @@ -1100,27 +1147,70 @@ static void indev_drag(lv_indev_proc_t * state) lv_coord_t act_x = lv_obj_get_x(drag_obj); lv_coord_t act_y = lv_obj_get_y(drag_obj); - if(allowed_dirs == LV_DRAG_DIR_ALL) { + if(allowed_dirs == LV_DRAG_DIR_BOTH) { if(drag_just_started) { - act_x += state->types.pointer.drag_sum.x; - act_y += state->types.pointer.drag_sum.y; + proc->types.pointer.drag_dir = LV_DRAG_DIR_BOTH; + act_x += proc->types.pointer.drag_sum.x; + act_y += proc->types.pointer.drag_sum.y; } - lv_obj_set_pos(drag_obj, act_x + state->types.pointer.vect.x, act_y + state->types.pointer.vect.y); - } else if(allowed_dirs & LV_DRAG_DIR_HOR) { + lv_obj_set_pos(drag_obj, act_x + proc->types.pointer.vect.x, act_y + proc->types.pointer.vect.y); + } else if(allowed_dirs == LV_DRAG_DIR_HOR) { if(drag_just_started) { - act_x += state->types.pointer.drag_sum.x; + proc->types.pointer.drag_dir = LV_DRAG_DIR_HOR; + proc->types.pointer.drag_sum.y = 0; + act_x += proc->types.pointer.drag_sum.x; } - lv_obj_set_x(drag_obj, act_x + state->types.pointer.vect.x); - } else if(allowed_dirs & LV_DRAG_DIR_VER) { + lv_obj_set_x(drag_obj, act_x + proc->types.pointer.vect.x); + } else if(allowed_dirs == LV_DRAG_DIR_VER) { if(drag_just_started) { - act_y += state->types.pointer.drag_sum.y; + proc->types.pointer.drag_dir = LV_DRAG_DIR_VER; + proc->types.pointer.drag_sum.x = 0; + act_y += proc->types.pointer.drag_sum.y; } - lv_obj_set_y(drag_obj, act_y + state->types.pointer.vect.y); + lv_obj_set_y(drag_obj, act_y + proc->types.pointer.vect.y); + } else if(allowed_dirs == LV_DRAG_DIR_ONE) { + if(drag_just_started) { + if(LV_MATH_ABS(proc->types.pointer.drag_sum.x) > LV_MATH_ABS(proc->types.pointer.drag_sum.y)) { + proc->types.pointer.drag_dir = LV_DRAG_DIR_HOR; + proc->types.pointer.drag_sum.y = 0; + act_x += proc->types.pointer.drag_sum.x; + } else { + proc->types.pointer.drag_dir = LV_DRAG_DIR_VER; + proc->types.pointer.drag_sum.x = 0; + act_y += proc->types.pointer.drag_sum.y; + } + } + } + + /*Move the object*/ + if(allowed_dirs == LV_DRAG_DIR_HOR || + allowed_dirs == LV_DRAG_DIR_BOTH || + (allowed_dirs == LV_DRAG_DIR_ONE && + LV_MATH_ABS(proc->types.pointer.drag_sum.x) > LV_MATH_ABS(proc->types.pointer.drag_sum.y))) { + act_x += proc->types.pointer.vect.x; + } + if(allowed_dirs == LV_DRAG_DIR_VER || + allowed_dirs == LV_DRAG_DIR_BOTH || + (allowed_dirs == LV_DRAG_DIR_ONE && + LV_MATH_ABS(proc->types.pointer.drag_sum.x) < LV_MATH_ABS(proc->types.pointer.drag_sum.y))) { + act_y += proc->types.pointer.vect.y; + } + + lv_obj_set_pos(drag_obj, act_x, act_y); + proc->types.pointer.drag_in_prog = 1; + + /*Set the drag in progress flag*/ + /*Send the drag begin signal on first move*/ + if(drag_just_started) { + drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_BEGIN, indev_act); + if(indev_reset_check(proc)) return; + + lv_event_send(drag_obj, LV_EVENT_DRAG_BEGIN, NULL); + if(indev_reset_check(proc)) return; } /*If the object didn't moved then clear the invalidated areas*/ if(drag_obj->coords.x1 == prev_x && drag_obj->coords.y1 == prev_y) { -// state->types.pointer.drag_in_prog = 0; /*In a special case if the object is moved on a page and * the scrollable has fit == true and the object is dragged of the page then * while its coordinate is not changing only the parent's size is reduced */ @@ -1130,16 +1220,6 @@ static void indev_drag(lv_indev_proc_t * state) uint16_t new_inv_buf_size = lv_disp_get_inv_buf_size(indev_act->driver.disp); lv_disp_pop_from_inv_buf(indev_act->driver.disp, new_inv_buf_size - inv_buf_size); } - } else { - state->types.pointer.drag_in_prog = 1; - /*Set the drag in progress flag*/ - /*Send the drag begin signal on first move*/ - if(drag_just_started) { - drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_BEGIN, indev_act); - if(indev_reset_check(state)) return; - lv_event_send(drag_obj, LV_EVENT_DRAG_BEGIN, NULL); - if(indev_reset_check(state)) return; - } } } } @@ -1153,22 +1233,14 @@ static void indev_drag_throw(lv_indev_proc_t * proc) { if(proc->types.pointer.drag_in_prog == 0) return; - lv_obj_t * drag_obj = proc->types.pointer.last_obj; + lv_obj_t * drag_obj = get_dragged_obj(proc->types.pointer.last_obj); - /*If drag parent is active check recursively the drag_parent attribute*/ - while(lv_obj_get_drag_parent(drag_obj) != false && drag_obj != NULL) { - drag_obj = lv_obj_get_parent(drag_obj); - } - - if(drag_obj == NULL) { - return; - } + if(drag_obj == NULL) return; /*Return if the drag throw is not enabled*/ if(lv_obj_get_drag_throw(drag_obj) == false) { proc->types.pointer.drag_in_prog = 0; drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_END, indev_act); - lv_event_send(drag_obj, LV_EVENT_DRAG_END, NULL); if(indev_reset_check(proc)) return; lv_event_send(drag_obj, LV_EVENT_DRAG_END, NULL); @@ -1190,13 +1262,13 @@ static void indev_drag_throw(lv_indev_proc_t * proc) lv_coord_t act_x = lv_obj_get_x(drag_obj) + proc->types.pointer.drag_throw_vect.x; lv_coord_t act_y = lv_obj_get_y(drag_obj) + proc->types.pointer.drag_throw_vect.y; - if(allowed_dirs == LV_DRAG_DIR_ALL) - lv_obj_set_pos(drag_obj, act_x, act_y); - else if(allowed_dirs & LV_DRAG_DIR_HOR) - lv_obj_set_x(drag_obj, act_x); - else if(allowed_dirs & LV_DRAG_DIR_VER) - lv_obj_set_y(drag_obj, act_y); - + if(allowed_dirs == LV_DRAG_DIR_BOTH) lv_obj_set_pos(drag_obj, act_x, act_y); + else if(allowed_dirs == LV_DRAG_DIR_HOR) lv_obj_set_x(drag_obj, act_x); + else if(allowed_dirs == LV_DRAG_DIR_VER) lv_obj_set_y(drag_obj, act_y); + else if(allowed_dirs == LV_DRAG_DIR_ONE) { + if(proc->types.pointer.drag_sum.x) lv_obj_set_x(drag_obj, act_x); + else lv_obj_set_y(drag_obj, act_y); + } lv_area_t coord_new; lv_obj_get_coords(drag_obj, &coord_new); @@ -1210,6 +1282,7 @@ static void indev_drag_throw(lv_indev_proc_t * proc) proc->types.pointer.drag_throw_vect.y = 0; drag_obj->signal_cb(drag_obj, LV_SIGNAL_DRAG_END, indev_act); if(indev_reset_check(proc)) return; + lv_event_send(drag_obj, LV_EVENT_DRAG_END, NULL); if(indev_reset_check(proc)) return; } @@ -1225,6 +1298,23 @@ static void indev_drag_throw(lv_indev_proc_t * proc) } } + +/** + * Get the really dragged object by taking `drag_parent` into account. + * @param obj the start obejct + * @return the object to really drag + */ +static lv_obj_t * get_dragged_obj(lv_obj_t * obj) +{ + if(obj == NULL) return NULL; + lv_obj_t * drag_obj = obj; + while(lv_obj_get_drag_parent(drag_obj) != false && drag_obj != NULL) { + drag_obj = lv_obj_get_parent(drag_obj); + } + + return drag_obj; +} + /** * Checks if the reset_query flag has been set. If so, perform necessary global indev cleanup actions * @param proc pointer to an input device 'proc' diff --git a/src/lv_core/lv_indev.h b/src/lv_core/lv_indev.h index 69ab5a410..21b8e844e 100644 --- a/src/lv_core/lv_indev.h +++ b/src/lv_core/lv_indev.h @@ -127,6 +127,14 @@ bool lv_indev_is_dragging(const lv_indev_t * indev); */ void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point); +/** + * Manually finish dragging. + * `LV_SIGNAL_DRAG_END` and `LV_EVENT_DRAG_END` will be sent. + * @param indev pointer to an input device + * @return `LV_RES_INV` if the object being dragged was deleted. Else `LV_RES_OK`. + */ +lv_res_t lv_indev_finish_drag(lv_indev_t * indev); + /** * Do nothing until the next release * @param indev pointer to an input device @@ -148,6 +156,14 @@ lv_task_t * lv_indev_get_read_task(lv_disp_t * indev); */ lv_obj_t * lv_indev_get_obj_act(void); +/** + * Search the most top, clickable object by a point + * @param obj pointer to a start object, typically the screen + * @param point pointer to a point for searhing the most top child + * @return pointer to the found object or NULL if there was no suitable object + */ +lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t *point); + /********************** * MACROS **********************/ diff --git a/src/lv_core/lv_obj.c b/src/lv_core/lv_obj.c index e0ad6c42c..1d690e78f 100644 --- a/src/lv_core/lv_obj.c +++ b/src/lv_core/lv_obj.c @@ -11,16 +11,20 @@ #include "lv_refr.h" #include "lv_group.h" #include "lv_disp.h" +#include "../lv_core/lv_debug.h" #include "../lv_themes/lv_theme.h" #include "../lv_draw/lv_draw.h" #include "../lv_misc/lv_anim.h" #include "../lv_misc/lv_task.h" #include "../lv_misc/lv_async.h" #include "../lv_misc/lv_fs.h" +#include "../lv_misc/lv_gc.h" +#include "../lv_misc/lv_math.h" +#include "../lv_misc/lv_gc.h" +#include "../lv_misc/lv_math.h" #include "../lv_hal/lv_hal.h" #include #include -#include "../lv_misc/lv_gc.h" #if defined(LV_GC_INCLUDE) #include LV_GC_INCLUDE @@ -29,6 +33,7 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_obj" #define LV_OBJ_DEF_WIDTH (LV_DPI) #define LV_OBJ_DEF_HEIGHT (2 * LV_DPI / 3) @@ -49,9 +54,10 @@ static void refresh_children_position(lv_obj_t * obj, lv_coord_t x_diff, lv_coor static void report_style_mod_core(void * style_p, lv_obj_t * obj); static void refresh_children_style(lv_obj_t * obj); static void delete_children(lv_obj_t * obj); +static void base_dir_refr_children(lv_obj_t * obj); static void lv_event_mark_deleted(lv_obj_t * obj); static void lv_obj_del_async_cb(void * obj); -static bool lv_obj_design(lv_obj_t * obj, const lv_area_t * mask_p, lv_design_mode_t mode); +static lv_design_res_t lv_obj_design(lv_obj_t * obj, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param); /********************** @@ -142,12 +148,17 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) } new_obj = lv_ll_ins_head(&disp->scr_ll); - lv_mem_assert(new_obj); + LV_ASSERT_MEM(new_obj); if(new_obj == NULL) return NULL; new_obj->par = NULL; /*Screens has no a parent*/ lv_ll_init(&(new_obj->child_ll), sizeof(lv_obj_t)); + /*Set the callbacks*/ + new_obj->signal_cb = lv_obj_signal; + new_obj->design_cb = lv_obj_design; + new_obj->event_cb = NULL; + /*Set coordinates to full screen size*/ new_obj->coords.x1 = 0; new_obj->coords.y1 = 0; @@ -180,10 +191,6 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) } else { new_obj->style_p = &lv_style_scr; } - /*Set the callbacks*/ - lv_obj_set_signal_cb(new_obj, lv_obj_signal); - lv_obj_set_design_cb(new_obj, lv_obj_design); - new_obj->event_cb = NULL; /*Init. user date*/ #if LV_USE_USER_DATA @@ -198,12 +205,19 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) new_obj->drag = 0; new_obj->drag_throw = 0; new_obj->drag_parent = 0; + new_obj->drag_dir = 0; new_obj->hidden = 0; new_obj->top = 0; new_obj->protect = LV_PROTECT_NONE; new_obj->opa_scale_en = 0; new_obj->opa_scale = LV_OPA_COVER; new_obj->parent_event = 0; +#if LV_USE_BIDI + new_obj->base_dir = LV_BIDI_BASE_DIR_DEF; +#else + new_obj->base_dir = LV_BIDI_DIR_LTR; +#endif + new_obj->reserved = 0; new_obj->ext_attr = NULL; @@ -213,19 +227,36 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) /*parent != NULL create normal obj. on a parent*/ else { LV_LOG_TRACE("Object create started"); + LV_ASSERT_OBJ(parent, LV_OBJX_NAME); new_obj = lv_ll_ins_head(&parent->child_ll); - lv_mem_assert(new_obj); + LV_ASSERT_MEM(new_obj); if(new_obj == NULL) return NULL; new_obj->par = parent; /*Set the parent*/ lv_ll_init(&(new_obj->child_ll), sizeof(lv_obj_t)); + /*Set the callbacks*/ + new_obj->signal_cb = lv_obj_signal; + new_obj->design_cb = lv_obj_design; + new_obj->event_cb = NULL; + +#if LV_USE_BIDI + new_obj->base_dir = LV_BIDI_DIR_INHERIT; +#else + new_obj->base_dir = LV_BIDI_DIR_LTR; +#endif + /*Set coordinates left top corner of parent*/ - new_obj->coords.x1 = parent->coords.x1; new_obj->coords.y1 = parent->coords.y1; - new_obj->coords.x2 = parent->coords.x1 + LV_OBJ_DEF_WIDTH; new_obj->coords.y2 = parent->coords.y1 + LV_OBJ_DEF_HEIGHT; + if(lv_obj_get_base_dir(new_obj) == LV_BIDI_DIR_RTL) { + new_obj->coords.x2 = parent->coords.x2; + new_obj->coords.x1 = parent->coords.x2 - LV_OBJ_DEF_WIDTH; + } else { + new_obj->coords.x1 = parent->coords.x1; + new_obj->coords.x2 = parent->coords.x1 + LV_OBJ_DEF_WIDTH; + } new_obj->ext_draw_pad = 0; #if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL @@ -253,11 +284,6 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) new_obj->style_p = &lv_style_plain_color; } - /*Set the callbacks*/ - lv_obj_set_signal_cb(new_obj, lv_obj_signal); - lv_obj_set_design_cb(new_obj, lv_obj_design); - new_obj->event_cb = NULL; - #if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL memset(&new_obj->ext_click_pad, 0, sizeof(new_obj->ext_click_pad)); #endif @@ -279,7 +305,7 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) /*Set attributes*/ new_obj->click = 1; new_obj->drag = 0; - new_obj->drag_dir = LV_DRAG_DIR_ALL; + new_obj->drag_dir = LV_DRAG_DIR_BOTH; new_obj->drag_throw = 0; new_obj->drag_parent = 0; new_obj->hidden = 0; @@ -288,12 +314,14 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) new_obj->opa_scale = LV_OPA_COVER; new_obj->opa_scale_en = 0; new_obj->parent_event = 0; + new_obj->reserved = 0; new_obj->ext_attr = NULL; } /*Copy the attributes if required*/ if(copy != NULL) { + LV_ASSERT_OBJ(copy, LV_OBJX_NAME); lv_area_copy(&new_obj->coords, ©->coords); new_obj->ext_draw_pad = copy->ext_draw_pad; @@ -319,7 +347,7 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) new_obj->realign.auto_realign = copy->realign.auto_realign; #endif - /*Only copy the `event_cb`. `signal_cb` and `design_cb` will be copied the the derived + /*Only copy the `event_cb`. `signal_cb` and `design_cb` will be copied in the derived * object type (e.g. `lv_btn`)*/ new_obj->event_cb = copy->event_cb; @@ -374,6 +402,7 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) */ lv_res_t lv_obj_del(lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); lv_obj_invalidate(obj); /*Delete from the group*/ @@ -407,15 +436,6 @@ lv_res_t lv_obj_del(lv_obj_t * obj) lv_event_mark_deleted(obj); - /*Remove the object from parent's children list*/ - lv_obj_t * par = lv_obj_get_parent(obj); - if(par == NULL) { /*It is a screen*/ - lv_disp_t * d = lv_obj_get_disp(obj); - lv_ll_rem(&d->scr_ll, obj); - } else { - lv_ll_rem(&(par->child_ll), obj); - } - /* Reset all input devices if the object to delete is used*/ lv_indev_t * indev = lv_indev_get_next(NULL); while(indev) { @@ -438,6 +458,15 @@ lv_res_t lv_obj_del(lv_obj_t * obj) * Now clean up the object specific data*/ obj->signal_cb(obj, LV_SIGNAL_CLEANUP, NULL); + /*Remove the object from parent's children list*/ + lv_obj_t * par = lv_obj_get_parent(obj); + if(par == NULL) { /*It is a screen*/ + lv_disp_t * d = lv_obj_get_disp(obj); + lv_ll_remove(&d->scr_ll, obj); + } else { + lv_ll_remove(&(par->child_ll), obj); + } + /*Delete the base objects*/ if(obj->ext_attr != NULL) lv_mem_free(obj->ext_attr); lv_mem_free(obj); /*Free the object itself*/ @@ -458,6 +487,7 @@ lv_res_t lv_obj_del(lv_obj_t * obj) */ void lv_obj_del_async(lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); lv_async_call(lv_obj_del_async_cb, obj); } @@ -467,6 +497,7 @@ void lv_obj_del_async(lv_obj_t * obj) */ void lv_obj_clean(lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); lv_obj_t * child = lv_obj_get_child(obj, NULL); lv_obj_t * child_next; while(child) { @@ -484,6 +515,8 @@ void lv_obj_clean(lv_obj_t * obj) */ void lv_obj_invalidate(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + if(lv_obj_get_hidden(obj)) return; /*Invalidate the object only if it belongs to the 'LV_GC_ROOT(_lv_act_scr)'*/ @@ -531,6 +564,9 @@ void lv_obj_invalidate(const lv_obj_t * obj) */ void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + LV_ASSERT_OBJ(parent, LV_OBJX_NAME); + if(obj->par == NULL) { LV_LOG_WARN("Can't set the parent of a screen"); return; @@ -543,15 +579,29 @@ void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent) lv_obj_invalidate(obj); + lv_obj_t * old_par = obj->par; lv_point_t old_pos; - old_pos.x = lv_obj_get_x(obj); old_pos.y = lv_obj_get_y(obj); - lv_obj_t * old_par = obj->par; + lv_bidi_dir_t new_base_dir = lv_obj_get_base_dir(parent); + + if(new_base_dir != LV_BIDI_DIR_RTL) { + old_pos.x = lv_obj_get_x(obj); + } else { + old_pos.x = old_par->coords.x2 - obj->coords.x2; + } lv_ll_chg_list(&obj->par->child_ll, &parent->child_ll, obj, true); obj->par = parent; - lv_obj_set_pos(obj, old_pos.x, old_pos.y); + + + if(new_base_dir != LV_BIDI_DIR_RTL) { + lv_obj_set_pos(obj, old_pos.x, old_pos.y); + } else { + /*Align to the right in case of RTL base dir*/ + lv_coord_t new_x = lv_obj_get_width(parent) - old_pos.x - lv_obj_get_width(obj); + lv_obj_set_pos(obj, new_x , old_pos.y); + } /*Notify the original parent because one of its children is lost*/ old_par->signal_cb(old_par, LV_SIGNAL_CHILD_CHG, NULL); @@ -568,6 +618,8 @@ void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent) */ void lv_obj_move_foreground(lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_obj_t * parent = lv_obj_get_parent(obj); /*Do nothing of already in the foreground*/ @@ -589,6 +641,8 @@ void lv_obj_move_foreground(lv_obj_t * obj) */ void lv_obj_move_background(lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_obj_t * parent = lv_obj_get_parent(obj); /*Do nothing of already in the background*/ @@ -616,6 +670,8 @@ void lv_obj_move_background(lv_obj_t * obj) */ void lv_obj_set_pos(lv_obj_t * obj, lv_coord_t x, lv_coord_t y) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + /*Convert x and y to absolute coordinates*/ lv_obj_t * par = obj->par; @@ -663,6 +719,8 @@ void lv_obj_set_pos(lv_obj_t * obj, lv_coord_t x, lv_coord_t y) */ void lv_obj_set_x(lv_obj_t * obj, lv_coord_t x) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_obj_set_pos(obj, x, lv_obj_get_y(obj)); } @@ -673,6 +731,8 @@ void lv_obj_set_x(lv_obj_t * obj, lv_coord_t x) */ void lv_obj_set_y(lv_obj_t * obj, lv_coord_t y) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_obj_set_pos(obj, lv_obj_get_x(obj), y); } @@ -684,6 +744,8 @@ void lv_obj_set_y(lv_obj_t * obj, lv_coord_t y) */ void lv_obj_set_size(lv_obj_t * obj, lv_coord_t w, lv_coord_t h) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + /* Do nothing if the size is not changed */ /* It is very important else recursive resizing can @@ -700,8 +762,12 @@ void lv_obj_set_size(lv_obj_t * obj, lv_coord_t w, lv_coord_t h) lv_obj_get_coords(obj, &ori); /*Set the length and height*/ - obj->coords.x2 = obj->coords.x1 + w - 1; obj->coords.y2 = obj->coords.y1 + h - 1; + if(lv_obj_get_base_dir(obj) == LV_BIDI_DIR_RTL) { + obj->coords.x1 = obj->coords.x2 - w + 1; + } else { + obj->coords.x2 = obj->coords.x1 + w - 1; + } /*Send a signal to the object with its new coordinates*/ obj->signal_cb(obj, LV_SIGNAL_CORD_CHG, &ori); @@ -733,6 +799,8 @@ void lv_obj_set_size(lv_obj_t * obj, lv_coord_t w, lv_coord_t h) */ void lv_obj_set_width(lv_obj_t * obj, lv_coord_t w) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_obj_set_size(obj, w, lv_obj_get_height(obj)); } @@ -743,6 +811,8 @@ void lv_obj_set_width(lv_obj_t * obj, lv_coord_t w) */ void lv_obj_set_height(lv_obj_t * obj, lv_coord_t h) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_obj_set_size(obj, lv_obj_get_width(obj), h); } @@ -756,6 +826,8 @@ void lv_obj_set_height(lv_obj_t * obj, lv_coord_t h) */ void lv_obj_align(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, lv_coord_t x_mod, lv_coord_t y_mod) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_coord_t new_x = lv_obj_get_x(obj); lv_coord_t new_y = lv_obj_get_y(obj); @@ -763,6 +835,9 @@ void lv_obj_align(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, lv_co base = lv_obj_get_parent(obj); } + LV_ASSERT_OBJ(base, LV_OBJX_NAME); + + switch(align) { case LV_ALIGN_CENTER: new_x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; @@ -901,6 +976,8 @@ void lv_obj_align(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, lv_co */ void lv_obj_align_origo(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, lv_coord_t x_mod, lv_coord_t y_mod) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_coord_t new_x = lv_obj_get_x(obj); lv_coord_t new_y = lv_obj_get_y(obj); @@ -911,6 +988,9 @@ void lv_obj_align_origo(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, base = lv_obj_get_parent(obj); } + LV_ASSERT_OBJ(base, LV_OBJX_NAME); + + switch(align) { case LV_ALIGN_CENTER: new_x = lv_obj_get_width(base) / 2 - obj_w_half; @@ -1045,6 +1125,8 @@ void lv_obj_align_origo(lv_obj_t * obj, const lv_obj_t * base, lv_align_t align, */ void lv_obj_realign(lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + #if LV_USE_OBJ_REALIGN if(obj->realign.origo_align) lv_obj_align_origo(obj, obj->realign.base, obj->realign.align, obj->realign.xofs, obj->realign.yofs); @@ -1064,6 +1146,8 @@ void lv_obj_realign(lv_obj_t * obj) */ void lv_obj_set_auto_realign(lv_obj_t * obj, bool en) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + #if LV_USE_OBJ_REALIGN obj->realign.auto_realign = en ? 1 : 0; #else @@ -1073,19 +1157,6 @@ void lv_obj_set_auto_realign(lv_obj_t * obj, bool en) #endif } -#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY -/** - * Set the size of an extended clickable area - * @param obj pointer to an object - * @param w extended width to both sides - * @param h extended height to both sides - */ -void lv_obj_set_ext_click_area(lv_obj_t * obj, uint8_t w, uint8_t h) -{ - obj->ext_click_pad_hor = w; - obj->ext_click_pad_ver = h; -} -#endif /** * Set the size of an extended clickable area @@ -1099,6 +1170,8 @@ void lv_obj_set_ext_click_area(lv_obj_t * obj, uint8_t w, uint8_t h) */ void lv_obj_set_ext_click_area(lv_obj_t * obj, lv_coord_t left, lv_coord_t right, lv_coord_t top, lv_coord_t bottom) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + #if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL obj->ext_click_pad.x1 = left; obj->ext_click_pad.x2 = right; @@ -1127,6 +1200,11 @@ void lv_obj_set_ext_click_area(lv_obj_t * obj, lv_coord_t left, lv_coord_t right */ void lv_obj_set_style(lv_obj_t * obj, const lv_style_t * style) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + if(style) { + LV_ASSERT_STYLE(style); + } + obj->style_p = style; /*Send a signal about style change to every children with NULL style*/ @@ -1142,6 +1220,8 @@ void lv_obj_set_style(lv_obj_t * obj, const lv_style_t * style) */ void lv_obj_refresh_style(lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_obj_invalidate(obj); obj->signal_cb(obj, LV_SIGNAL_STYLE_CHG, NULL); lv_obj_invalidate(obj); @@ -1154,6 +1234,8 @@ void lv_obj_refresh_style(lv_obj_t * obj) */ void lv_obj_report_style_mod(lv_style_t * style) { + LV_ASSERT_STYLE(style); + lv_disp_t * d = lv_disp_get_next(NULL); while(d) { @@ -1181,6 +1263,8 @@ void lv_obj_report_style_mod(lv_style_t * style) */ void lv_obj_set_hidden(lv_obj_t * obj, bool en) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + if(!obj->hidden) lv_obj_invalidate(obj); /*Invalidate when not hidden (hidden objects are ignored) */ obj->hidden = en == false ? 0 : 1; @@ -1198,6 +1282,8 @@ void lv_obj_set_hidden(lv_obj_t * obj, bool en) */ void lv_obj_set_click(lv_obj_t * obj, bool en) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->click = (en == true ? 1 : 0); } @@ -1209,6 +1295,8 @@ void lv_obj_set_click(lv_obj_t * obj, bool en) */ void lv_obj_set_top(lv_obj_t * obj, bool en) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->top = (en == true ? 1 : 0); } @@ -1219,6 +1307,8 @@ void lv_obj_set_top(lv_obj_t * obj, bool en) */ void lv_obj_set_drag(lv_obj_t * obj, bool en) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + if(en == true) lv_obj_set_click(obj, true); /*Drag is useless without enabled clicking*/ obj->drag = (en == true ? 1 : 0); } @@ -1230,6 +1320,8 @@ void lv_obj_set_drag(lv_obj_t * obj, bool en) */ void lv_obj_set_drag_dir(lv_obj_t * obj, lv_drag_dir_t drag_dir) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->drag_dir = drag_dir; if(obj->drag_dir != 0) lv_obj_set_drag(obj, true); /*Drag direction requires drag*/ @@ -1242,6 +1334,8 @@ void lv_obj_set_drag_dir(lv_obj_t * obj, lv_drag_dir_t drag_dir) */ void lv_obj_set_drag_throw(lv_obj_t * obj, bool en) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->drag_throw = (en == true ? 1 : 0); } @@ -1253,6 +1347,8 @@ void lv_obj_set_drag_throw(lv_obj_t * obj, bool en) */ void lv_obj_set_drag_parent(lv_obj_t * obj, bool en) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->drag_parent = (en == true ? 1 : 0); } @@ -1263,9 +1359,28 @@ void lv_obj_set_drag_parent(lv_obj_t * obj, bool en) */ void lv_obj_set_parent_event(lv_obj_t * obj, bool en) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->parent_event = (en == true ? 1 : 0); } +void lv_obj_set_base_dir(lv_obj_t * obj, lv_bidi_dir_t dir) +{ + if(dir != LV_BIDI_DIR_LTR && dir != LV_BIDI_DIR_RTL && + dir != LV_BIDI_DIR_AUTO && dir != LV_BIDI_DIR_INHERIT) { + + LV_LOG_WARN("lv_obj_set_base_dir: invalid base dir"); + return; + } + + obj->base_dir = dir; + lv_signal_send(obj, LV_SIGNAL_BASE_DIR_CHG, NULL); + + /* Notify the children about the parent base dir has changed. + * (The children might have `LV_BIDI_DIR_INHERIT`)*/ + base_dir_refr_children(obj); +} + /** * Set the opa scale enable parameter (required to set opa_scale with `lv_obj_set_opa_scale()`) * @param obj pointer to an object @@ -1273,6 +1388,8 @@ void lv_obj_set_parent_event(lv_obj_t * obj, bool en) */ void lv_obj_set_opa_scale_enable(lv_obj_t * obj, bool en) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->opa_scale_en = en ? 1 : 0; } @@ -1286,6 +1403,8 @@ void lv_obj_set_opa_scale_enable(lv_obj_t * obj, bool en) */ void lv_obj_set_opa_scale(lv_obj_t * obj, lv_opa_t opa_scale) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->opa_scale = opa_scale; lv_obj_invalidate(obj); } @@ -1297,6 +1416,8 @@ void lv_obj_set_opa_scale(lv_obj_t * obj, lv_opa_t opa_scale) */ void lv_obj_set_protect(lv_obj_t * obj, uint8_t prot) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->protect |= prot; } @@ -1307,6 +1428,8 @@ void lv_obj_set_protect(lv_obj_t * obj, uint8_t prot) */ void lv_obj_clear_protect(lv_obj_t * obj, uint8_t prot) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + prot = (~prot) & 0xFF; obj->protect &= prot; } @@ -1319,6 +1442,8 @@ void lv_obj_clear_protect(lv_obj_t * obj, uint8_t prot) */ void lv_obj_set_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->event_cb = event_cb; } @@ -1333,6 +1458,8 @@ lv_res_t lv_event_send(lv_obj_t * obj, lv_event_t event, const void * data) { if(obj == NULL) return LV_RES_OK; + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_res_t res; res = lv_event_send_func(obj->event_cb, obj, event, data); return res; @@ -1414,6 +1541,8 @@ const void * lv_event_get_data(void) */ void lv_obj_set_signal_cb(lv_obj_t * obj, lv_signal_cb_t signal_cb) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->signal_cb = signal_cb; } @@ -1424,6 +1553,8 @@ void lv_obj_set_signal_cb(lv_obj_t * obj, lv_signal_cb_t signal_cb) */ void lv_signal_send(lv_obj_t * obj, lv_signal_t signal, void * param) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + if(obj->signal_cb) obj->signal_cb(obj, signal, param); } @@ -1434,6 +1565,8 @@ void lv_signal_send(lv_obj_t * obj, lv_signal_t signal, void * param) */ void lv_obj_set_design_cb(lv_obj_t * obj, lv_design_cb_t design_cb) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->design_cb = design_cb; } @@ -1445,12 +1578,17 @@ void lv_obj_set_design_cb(lv_obj_t * obj, lv_design_cb_t design_cb) * Allocate a new ext. data for an object * @param obj pointer to an object * @param ext_size the size of the new ext. data - * @return Normal pointer to the allocated ext + * @return pointer to the allocated ext. + * If out of memory NULL is returned and the original ext is preserved */ void * lv_obj_allocate_ext_attr(lv_obj_t * obj, uint16_t ext_size) { - obj->ext_attr = lv_mem_realloc(obj->ext_attr, ext_size); + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + void * new_ext = lv_mem_realloc(obj->ext_attr, ext_size); + if(new_ext == NULL) return NULL; + + obj->ext_attr = new_ext; return (void *)obj->ext_attr; } @@ -1460,6 +1598,8 @@ void * lv_obj_allocate_ext_attr(lv_obj_t * obj, uint16_t ext_size) */ void lv_obj_refresh_ext_draw_pad(lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + obj->ext_draw_pad = 0; obj->signal_cb(obj, LV_SIGNAL_REFR_EXT_DRAW_PAD, NULL); @@ -1477,6 +1617,8 @@ void lv_obj_refresh_ext_draw_pad(lv_obj_t * obj) */ lv_obj_t * lv_obj_get_screen(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + const lv_obj_t * par = obj; const lv_obj_t * act_p; @@ -1495,6 +1637,8 @@ lv_obj_t * lv_obj_get_screen(const lv_obj_t * obj) */ lv_disp_t * lv_obj_get_disp(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + const lv_obj_t * scr; if(obj->par == NULL) @@ -1527,6 +1671,8 @@ lv_disp_t * lv_obj_get_disp(const lv_obj_t * obj) */ lv_obj_t * lv_obj_get_parent(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->par; } @@ -1539,6 +1685,8 @@ lv_obj_t * lv_obj_get_parent(const lv_obj_t * obj) */ lv_obj_t * lv_obj_get_child(const lv_obj_t * obj, const lv_obj_t * child) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_obj_t * result = NULL; if(child == NULL) { @@ -1559,6 +1707,8 @@ lv_obj_t * lv_obj_get_child(const lv_obj_t * obj, const lv_obj_t * child) */ lv_obj_t * lv_obj_get_child_back(const lv_obj_t * obj, const lv_obj_t * child) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_obj_t * result = NULL; if(child == NULL) { @@ -1577,6 +1727,8 @@ lv_obj_t * lv_obj_get_child_back(const lv_obj_t * obj, const lv_obj_t * child) */ uint16_t lv_obj_count_children(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_obj_t * i; uint16_t cnt = 0; @@ -1591,6 +1743,8 @@ uint16_t lv_obj_count_children(const lv_obj_t * obj) */ uint16_t lv_obj_count_children_recursive(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_obj_t * i; uint16_t cnt = 0; @@ -1614,6 +1768,8 @@ uint16_t lv_obj_count_children_recursive(const lv_obj_t * obj) */ void lv_obj_get_coords(const lv_obj_t * obj, lv_area_t * cords_p) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_area_copy(cords_p, &obj->coords); } @@ -1624,14 +1780,16 @@ void lv_obj_get_coords(const lv_obj_t * obj, lv_area_t * cords_p) */ void lv_obj_get_inner_coords(const lv_obj_t * obj, lv_area_t * coords_p) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + const lv_style_t * style = lv_obj_get_style(obj); - if(style->body.border.part & LV_BORDER_LEFT) coords_p->x1 += style->body.border.width; + if(style->body.border.part & LV_BORDER_PART_LEFT) coords_p->x1 += style->body.border.width; - if(style->body.border.part & LV_BORDER_RIGHT) coords_p->x2 -= style->body.border.width; + if(style->body.border.part & LV_BORDER_PART_RIGHT) coords_p->x2 -= style->body.border.width; - if(style->body.border.part & LV_BORDER_TOP) coords_p->y1 += style->body.border.width; + if(style->body.border.part & LV_BORDER_PART_TOP) coords_p->y1 += style->body.border.width; - if(style->body.border.part & LV_BORDER_BOTTOM) coords_p->y2 -= style->body.border.width; + if(style->body.border.part & LV_BORDER_PART_BOTTOM) coords_p->y2 -= style->body.border.width; } /** @@ -1641,10 +1799,15 @@ void lv_obj_get_inner_coords(const lv_obj_t * obj, lv_area_t * coords_p) */ lv_coord_t lv_obj_get_x(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_coord_t rel_x; lv_obj_t * parent = lv_obj_get_parent(obj); - rel_x = obj->coords.x1 - parent->coords.x1; - + if(parent) { + rel_x = obj->coords.x1 - parent->coords.x1; + } else { + rel_x = obj->coords.x1; + } return rel_x; } @@ -1655,10 +1818,15 @@ lv_coord_t lv_obj_get_x(const lv_obj_t * obj) */ lv_coord_t lv_obj_get_y(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_coord_t rel_y; lv_obj_t * parent = lv_obj_get_parent(obj); - rel_y = obj->coords.y1 - parent->coords.y1; - + if(parent) { + rel_y = obj->coords.y1 - parent->coords.y1; + } else { + rel_y = obj->coords.y1; + } return rel_y; } @@ -1669,6 +1837,8 @@ lv_coord_t lv_obj_get_y(const lv_obj_t * obj) */ lv_coord_t lv_obj_get_width(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return lv_area_get_width(&obj->coords); } @@ -1679,6 +1849,8 @@ lv_coord_t lv_obj_get_width(const lv_obj_t * obj) */ lv_coord_t lv_obj_get_height(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return lv_area_get_height(&obj->coords); } @@ -1687,8 +1859,10 @@ lv_coord_t lv_obj_get_height(const lv_obj_t * obj) * @param obj pointer to an object * @return the width which still fits into the container */ -lv_coord_t lv_obj_get_width_fit(lv_obj_t * obj) +lv_coord_t lv_obj_get_width_fit(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + const lv_style_t * style = lv_obj_get_style(obj); return lv_obj_get_width(obj) - style->body.padding.left - style->body.padding.right; @@ -1699,8 +1873,10 @@ lv_coord_t lv_obj_get_width_fit(lv_obj_t * obj) * @param obj pointer to an object * @return the height which still fits into the container */ -lv_coord_t lv_obj_get_height_fit(lv_obj_t * obj) +lv_coord_t lv_obj_get_height_fit(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + const lv_style_t * style = lv_obj_get_style(obj); return lv_obj_get_height(obj) - style->body.padding.top - style->body.padding.bottom; @@ -1711,8 +1887,10 @@ lv_coord_t lv_obj_get_height_fit(lv_obj_t * obj) * @param obj pointer to an object * @return true: auto realign is enabled; false: auto realign is disabled */ -bool lv_obj_get_auto_realign(lv_obj_t * obj) +bool lv_obj_get_auto_realign(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + #if LV_USE_OBJ_REALIGN return obj->realign.auto_realign ? true : false; #else @@ -1728,6 +1906,8 @@ bool lv_obj_get_auto_realign(lv_obj_t * obj) */ lv_coord_t lv_obj_get_ext_click_pad_left(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + #if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY return obj->ext_click_pad_hor; #elif LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL @@ -1745,6 +1925,8 @@ lv_coord_t lv_obj_get_ext_click_pad_left(const lv_obj_t * obj) */ lv_coord_t lv_obj_get_ext_click_pad_right(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + #if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY return obj->ext_click_pad_hor; #elif LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL @@ -1762,6 +1944,8 @@ lv_coord_t lv_obj_get_ext_click_pad_right(const lv_obj_t * obj) */ lv_coord_t lv_obj_get_ext_click_pad_top(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + #if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY return obj->ext_click_pad_ver; #elif LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL @@ -1779,8 +1963,10 @@ lv_coord_t lv_obj_get_ext_click_pad_top(const lv_obj_t * obj) */ lv_coord_t lv_obj_get_ext_click_pad_bottom(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + #if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY - return obj->ext_click_pad_ver + return obj->ext_click_pad_ver; #elif LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL return obj->ext_click_pad.y2; #else @@ -1796,6 +1982,8 @@ lv_coord_t lv_obj_get_ext_click_pad_bottom(const lv_obj_t * obj) */ lv_coord_t lv_obj_get_ext_draw_pad(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->ext_draw_pad; } @@ -1810,6 +1998,8 @@ lv_coord_t lv_obj_get_ext_draw_pad(const lv_obj_t * obj) */ const lv_style_t * lv_obj_get_style(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + const lv_style_t * style_act = obj->style_p; if(style_act == NULL) { lv_obj_t * par = obj->par; @@ -1858,6 +2048,8 @@ const lv_style_t * lv_obj_get_style(const lv_obj_t * obj) */ bool lv_obj_get_hidden(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->hidden == 0 ? false : true; } @@ -1868,6 +2060,8 @@ bool lv_obj_get_hidden(const lv_obj_t * obj) */ bool lv_obj_get_click(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->click == 0 ? false : true; } @@ -1878,6 +2072,8 @@ bool lv_obj_get_click(const lv_obj_t * obj) */ bool lv_obj_get_top(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->top == 0 ? false : true; } @@ -1888,6 +2084,8 @@ bool lv_obj_get_top(const lv_obj_t * obj) */ bool lv_obj_get_drag(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->drag == 0 ? false : true; } @@ -1898,6 +2096,8 @@ bool lv_obj_get_drag(const lv_obj_t * obj) */ lv_drag_dir_t lv_obj_get_drag_dir(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->drag_dir; } @@ -1908,6 +2108,8 @@ lv_drag_dir_t lv_obj_get_drag_dir(const lv_obj_t * obj) */ bool lv_obj_get_drag_throw(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->drag_throw == 0 ? false : true; } @@ -1928,9 +2130,31 @@ bool lv_obj_get_drag_parent(const lv_obj_t * obj) */ bool lv_obj_get_parent_event(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->parent_event == 0 ? false : true; } + +lv_bidi_dir_t lv_obj_get_base_dir(const lv_obj_t * obj) +{ +#if LV_USE_BIDI + const lv_obj_t * parent = obj; + + while(parent) { + if(parent->base_dir != LV_BIDI_DIR_INHERIT) return parent->base_dir; + + parent = lv_obj_get_parent(parent); + } + + return LV_BIDI_BASE_DIR_DEF; +#else + (void) obj; /*Unused*/ + return LV_BIDI_DIR_LTR; +#endif +} + + /** * Get the opa scale enable parameter * @param obj pointer to an object @@ -1938,6 +2162,8 @@ bool lv_obj_get_parent_event(const lv_obj_t * obj) */ lv_opa_t lv_obj_get_opa_scale_enable(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->opa_scale_en == 0 ? false : true; } @@ -1948,6 +2174,8 @@ lv_opa_t lv_obj_get_opa_scale_enable(const lv_obj_t * obj) */ lv_opa_t lv_obj_get_opa_scale(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + const lv_obj_t * parent = obj; while(parent) { @@ -1965,6 +2193,8 @@ lv_opa_t lv_obj_get_opa_scale(const lv_obj_t * obj) */ uint8_t lv_obj_get_protect(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->protect; } @@ -1976,6 +2206,8 @@ uint8_t lv_obj_get_protect(const lv_obj_t * obj) */ bool lv_obj_is_protected(const lv_obj_t * obj, uint8_t prot) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return (obj->protect & prot) == 0 ? false : true; } @@ -1986,6 +2218,8 @@ bool lv_obj_is_protected(const lv_obj_t * obj, uint8_t prot) */ lv_signal_cb_t lv_obj_get_signal_cb(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->signal_cb; } @@ -1996,6 +2230,8 @@ lv_signal_cb_t lv_obj_get_signal_cb(const lv_obj_t * obj) */ lv_design_cb_t lv_obj_get_design_cb(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->design_cb; } @@ -2006,6 +2242,8 @@ lv_design_cb_t lv_obj_get_design_cb(const lv_obj_t * obj) */ lv_event_cb_t lv_obj_get_event_cb(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->event_cb; } @@ -2021,6 +2259,8 @@ lv_event_cb_t lv_obj_get_event_cb(const lv_obj_t * obj) */ void * lv_obj_get_ext_attr(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->ext_attr; } @@ -2030,14 +2270,17 @@ void * lv_obj_get_ext_attr(const lv_obj_t * obj) * @param obj pointer to an object which type should be get * @param buf pointer to an `lv_obj_type_t` buffer to store the types */ -void lv_obj_get_type(lv_obj_t * obj, lv_obj_type_t * buf) +void lv_obj_get_type(const lv_obj_t * obj, lv_obj_type_t * buf) { + LV_ASSERT_NULL(buf); + LV_ASSERT_NULL(obj); + lv_obj_type_t tmp; memset(buf, 0, sizeof(lv_obj_type_t)); memset(&tmp, 0, sizeof(lv_obj_type_t)); - obj->signal_cb(obj, LV_SIGNAL_GET_TYPE, &tmp); + obj->signal_cb((lv_obj_t *)obj, LV_SIGNAL_GET_TYPE, &tmp); uint8_t cnt; for(cnt = 0; cnt < LV_MAX_ANCESTOR_NUM; cnt++) { @@ -2058,8 +2301,10 @@ void lv_obj_get_type(lv_obj_t * obj, lv_obj_type_t * buf) * @param obj pointer to an object * @return user data */ -lv_obj_user_data_t lv_obj_get_user_data(lv_obj_t * obj) +lv_obj_user_data_t lv_obj_get_user_data(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->user_data; } @@ -2068,9 +2313,11 @@ lv_obj_user_data_t lv_obj_get_user_data(lv_obj_t * obj) * @param obj pointer to an object * @return pointer to the user data */ -lv_obj_user_data_t * lv_obj_get_user_data_ptr(lv_obj_t * obj) +lv_obj_user_data_t * lv_obj_get_user_data_ptr(const lv_obj_t * obj) { - return &obj->user_data; + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + + return (lv_obj_user_data_t *)&obj->user_data; } /** @@ -2080,6 +2327,8 @@ lv_obj_user_data_t * lv_obj_get_user_data_ptr(lv_obj_t * obj) */ void lv_obj_set_user_data(lv_obj_t * obj, lv_obj_user_data_t data) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + memcpy(&obj->user_data, &data, sizeof(lv_obj_user_data_t)); } #endif @@ -2092,6 +2341,8 @@ void lv_obj_set_user_data(lv_obj_t * obj, lv_obj_user_data_t data) */ void * lv_obj_get_group(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + return obj->group_p; } @@ -2102,6 +2353,8 @@ void * lv_obj_get_group(const lv_obj_t * obj) */ bool lv_obj_is_focused(const lv_obj_t * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + if(obj->group_p) { if(lv_group_get_focused(obj->group_p) == obj) return true; } @@ -2110,40 +2363,66 @@ bool lv_obj_is_focused(const lv_obj_t * obj) } #endif + +/*------------------- + * OTHER FUNCTIONS + *------------------*/ + +/** + * Used in the signal callback to handle `LV_SIGNAL_GET_TYPE` signal + * @param obj pointer to an object + * @param buf pointer to `lv_obj_type_t`. (`param` in the signal callback) + * @param name name of the object. E.g. "lv_btn". (Only the pointer is saved) + * @return LV_RES_OK + */ +lv_res_t lv_obj_handle_get_type_signal(lv_obj_type_t * buf, const char * name) +{ + uint8_t i; + for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ + if(buf->type[i] == NULL) break; + } + buf->type[i] = name; + + return LV_RES_OK; +} + /********************** * STATIC FUNCTIONS **********************/ static void lv_obj_del_async_cb(void * obj) { + LV_ASSERT_OBJ(obj, LV_OBJX_NAME); + lv_obj_del(obj); } /** * Handle the drawing related tasks of the base objects. * @param obj pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_obj_design(lv_obj_t * obj, const lv_area_t * mask_p, lv_design_mode_t mode) +static lv_design_res_t lv_obj_design(lv_obj_t * obj, const lv_area_t * clip_area, lv_design_mode_t mode) { if(mode == LV_DESIGN_COVER_CHK) { - /*Most trivial test. Is the mask fully IN the object? If no it surely doesn't cover it*/ - if(lv_area_is_in(mask_p, &obj->coords) == false) return false; + if(lv_area_is_in(clip_area, &obj->coords) == false) return LV_DESIGN_RES_NOT_COVER; + + const lv_style_t * style = lv_obj_get_style(obj); + if(style->body.corner_mask) return LV_DESIGN_RES_MASKED; /*Can cover the area only if fully solid (no opacity)*/ - const lv_style_t * style = lv_obj_get_style(obj); - if(style->body.opa < LV_OPA_MAX) return false; + if(style->body.opa < LV_OPA_MAX) return LV_DESIGN_RES_NOT_COVER; /* Because of the radius it is not sure the area is covered * Check the areas where there is no radius*/ lv_coord_t r = style->body.radius; - if(r == LV_RADIUS_CIRCLE) return false; + if(r == LV_RADIUS_CIRCLE) return LV_DESIGN_RES_NOT_COVER; lv_area_t area_tmp; @@ -2151,20 +2430,38 @@ static bool lv_obj_design(lv_obj_t * obj, const lv_area_t * mask_p, lv_design_mo lv_obj_get_coords(obj, &area_tmp); area_tmp.x1 += r; area_tmp.x2 -= r; - if(lv_area_is_in(mask_p, &area_tmp) == false) return false; + if(lv_area_is_in(clip_area, &area_tmp) == false) return LV_DESIGN_RES_NOT_COVER; /*Check vertically without radius*/ lv_obj_get_coords(obj, &area_tmp); area_tmp.y1 += r; area_tmp.y2 -= r; - if(lv_area_is_in(mask_p, &area_tmp) == false) return false; + if(lv_area_is_in(clip_area, &area_tmp) == false) return LV_DESIGN_RES_NOT_COVER; - } else if(mode == LV_DESIGN_DRAW_MAIN) { + return LV_DESIGN_RES_COVER; + + } + else if(mode == LV_DESIGN_DRAW_MAIN) { const lv_style_t * style = lv_obj_get_style(obj); - lv_draw_rect(&obj->coords, mask_p, style, lv_obj_get_opa_scale(obj)); + lv_draw_rect(&obj->coords, clip_area, style, lv_obj_get_opa_scale(obj)); + + if(style->body.corner_mask) { + lv_draw_mask_radius_param_t * mp = lv_mem_buf_get(sizeof(lv_draw_mask_radius_param_t)); + + lv_draw_mask_radius_init(mp, &obj->coords, style->body.radius, false); + /*Add the mask and use `obj+8` as custom id. Don't use `obj` directly because it might be used by the user*/ + lv_draw_mask_add(mp, obj + 8); + } + } + else if(mode == LV_DESIGN_DRAW_POST) { + const lv_style_t * style = lv_obj_get_style(obj); + if(style->body.corner_mask) { + lv_draw_mask_radius_param_t * param = lv_draw_mask_remove_custom(obj + 8); + lv_mem_buf_release(param); + } } - return true; + return LV_DESIGN_RES_OK; } /** @@ -2176,24 +2473,23 @@ static bool lv_obj_design(lv_obj_t * obj, const lv_area_t * mask_p, lv_design_mo */ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param) { - (void)param; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_res_t res = LV_RES_OK; - const lv_style_t * style = lv_obj_get_style(obj); - if(sign == LV_SIGNAL_CHILD_CHG) { /*Return 'invalid' if the child change signal is not enabled*/ if(lv_obj_is_protected(obj, LV_PROTECT_CHILD_CHG) != false) res = LV_RES_INV; } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { - if(style->body.shadow.width > obj->ext_draw_pad) obj->ext_draw_pad = style->body.shadow.width; + const lv_style_t * style = lv_obj_get_style(obj); + lv_coord_t shadow = (style->body.shadow.width >> 1) + 1; + shadow += style->body.shadow.spread; + shadow += LV_MATH_MAX(LV_MATH_ABS(style->body.shadow.offset.x), LV_MATH_ABS(style->body.shadow.offset.y)); + + if(shadow > obj->ext_draw_pad) obj->ext_draw_pad = shadow; } else if(sign == LV_SIGNAL_STYLE_CHG) { lv_obj_refresh_ext_draw_pad(obj); - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - buf->type[0] = "lv_obj"; } - return res; } @@ -2314,18 +2610,34 @@ static void delete_children(lv_obj_t * obj) indev = lv_indev_get_next(indev); } - /*Remove the object from parent's children list*/ - lv_obj_t * par = lv_obj_get_parent(obj); - lv_ll_rem(&(par->child_ll), obj); - /* Clean up the object specific data*/ obj->signal_cb(obj, LV_SIGNAL_CLEANUP, NULL); + /*Remove the object from parent's children list*/ + lv_obj_t * par = lv_obj_get_parent(obj); + lv_ll_remove(&(par->child_ll), obj); + /*Delete the base objects*/ if(obj->ext_attr != NULL) lv_mem_free(obj->ext_attr); lv_mem_free(obj); /*Free the object itself*/ } +static void base_dir_refr_children(lv_obj_t * obj) +{ + lv_obj_t * child; + child = lv_obj_get_child(obj, NULL); + + while(child) { + if(child->base_dir == LV_BIDI_DIR_INHERIT) { + lv_signal_send(child, LV_SIGNAL_BASE_DIR_CHG, NULL); + base_dir_refr_children(child); + } + + child = lv_obj_get_child(obj, child); + } +} + + static void lv_event_mark_deleted(lv_obj_t * obj) { lv_event_temp_data_t * t = event_temp_data_head; diff --git a/src/lv_core/lv_obj.h b/src/lv_core/lv_obj.h index c2062e969..c976cad6c 100644 --- a/src/lv_core/lv_obj.h +++ b/src/lv_core/lv_obj.h @@ -28,6 +28,7 @@ extern "C" { #include "../lv_misc/lv_ll.h" #include "../lv_misc/lv_color.h" #include "../lv_misc/lv_log.h" +#include "../lv_misc/lv_bidi.h" #include "../lv_hal/lv_hal.h" /********************* @@ -64,11 +65,21 @@ enum { }; typedef uint8_t lv_design_mode_t; + +/** Design results */ +enum { + LV_DESIGN_RES_OK, /**< Draw ready */ + LV_DESIGN_RES_COVER, /**< Returned on `LV_DESIGN_COVER_CHK` if the areas is fully covered*/ + LV_DESIGN_RES_NOT_COVER, /**< Returned on `LV_DESIGN_COVER_CHK` if the areas is not covered*/ + LV_DESIGN_RES_MASKED, /**< Returned on `LV_DESIGN_COVER_CHK` if the areas is masked out (children also not cover)*/ +}; +typedef uint8_t lv_design_res_t; + /** * The design callback is used to draw the object on the screen. * It accepts the object, a mask area, and the mode in which to draw the object. */ -typedef bool (*lv_design_cb_t)(struct _lv_obj_t * obj, const lv_area_t * mask_p, lv_design_mode_t mode); +typedef lv_design_res_t (*lv_design_cb_t)(struct _lv_obj_t * obj, const lv_area_t * clip_area, lv_design_mode_t mode); enum { LV_EVENT_PRESSED, /**< The object has been pressed*/ @@ -111,7 +122,8 @@ enum { LV_SIGNAL_CHILD_CHG, /**< Child was removed/added */ LV_SIGNAL_CORD_CHG, /**< Object coordinates/size have changed */ LV_SIGNAL_PARENT_SIZE_CHG, /**< Parent's size has changed */ - LV_SIGNAL_STYLE_CHG, /**< Object's style has changed */ + LV_SIGNAL_STYLE_CHG, /**< Object's style has changed */ + LV_SIGNAL_BASE_DIR_CHG, /**driver.rounder_cb(&disp_refr->driver, &tmp); /*If this height fits into `max_row` then fine*/ if(lv_area_get_height(&tmp) <= max_row) break; /*Decrement the height of the area until it fits into `max_row` after rounding*/ - y_tmp--; - } while(y_tmp != 0); + h_tmp--; + } while(h_tmp > 0); - if(y_tmp == 0) { + if(h_tmp <= 0) { LV_LOG_WARN("Can't set VDB height using the round function. (Wrong round_cb or to " "small VDB)"); return; @@ -419,6 +419,9 @@ static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj) /*If this object is fully cover the draw area check the children too */ if(lv_area_is_in(area_p, &obj->coords) && obj->hidden == 0) { + lv_design_res_t design_res = obj->design_cb(obj, area_p, LV_DESIGN_COVER_CHK); + if(design_res == LV_DESIGN_RES_MASKED) return NULL; + lv_obj_t * i; LV_LL_READ(obj->child_ll, i) { @@ -433,8 +436,11 @@ static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj) /*If no better children check this object*/ if(found_p == NULL) { const lv_style_t * style = lv_obj_get_style(obj); - if(style->body.opa == LV_OPA_COVER && obj->design_cb(obj, area_p, LV_DESIGN_COVER_CHK) != false && - lv_obj_get_opa_scale(obj) == LV_OPA_COVER) { + if(style->body.opa == LV_OPA_COVER && design_res == LV_DESIGN_RES_COVER && + lv_obj_get_opa_scale(obj) == LV_OPA_COVER && + style->body.blend_mode == LV_BLEND_MODE_NORMAL && + style->body.border.blend_mode == LV_BLEND_MODE_NORMAL && + style->image.blend_mode == LV_BLEND_MODE_NORMAL) { found_p = obj; } } @@ -518,7 +524,12 @@ static void lv_refr_obj(lv_obj_t * obj, const lv_area_t * mask_ori_p) #if MASK_AREA_DEBUG static lv_color_t debug_color = LV_COLOR_RED; - lv_draw_fill(&obj_ext_mask, &obj_ext_mask, debug_color, LV_OPA_50); + LV_STYLE_CREATE(style_debug, &lv_style_plain); + style_debug.body.main_color = debug_color; + style_debug.body.grad_color = debug_color; + style_debug.body.border.width = 2; + style_debug.body.border.color.full = (debug_color.full + 0x13) * 9; + lv_draw_rect(&obj_ext_mask, &obj_ext_mask, &style_debug, LV_OPA_50); debug_color.full *= 17; debug_color.full += 0xA1; #endif diff --git a/src/lv_core/lv_style.c b/src/lv_core/lv_style.c index f5241fb77..a2f69ecf5 100644 --- a/src/lv_core/lv_style.c +++ b/src/lv_core/lv_style.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ #include "lv_obj.h" +#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_mem.h" #include "../lv_misc/lv_anim.h" @@ -74,7 +75,11 @@ void lv_style_init(void) lv_style_scr.body.opa = LV_OPA_COVER; lv_style_scr.body.main_color = LV_COLOR_WHITE; lv_style_scr.body.grad_color = LV_COLOR_WHITE; + lv_style_scr.body.main_color_stop = 0; + lv_style_scr.body.grad_color_stop = 255; + lv_style_scr.body.grad_dir = LV_GRAD_DIR_VER; lv_style_scr.body.radius = 0; + lv_style_scr.body.blend_mode = LV_BLEND_MODE_NORMAL; lv_style_scr.body.padding.left = 0; lv_style_scr.body.padding.right = 0; lv_style_scr.body.padding.top = 0; @@ -84,11 +89,16 @@ void lv_style_init(void) lv_style_scr.body.border.color = LV_COLOR_BLACK; lv_style_scr.body.border.opa = LV_OPA_COVER; lv_style_scr.body.border.width = 0; - lv_style_scr.body.border.part = LV_BORDER_FULL; + lv_style_scr.body.border.part = LV_BORDER_PART_FULL; + lv_style_scr.body.border.blend_mode = LV_BLEND_MODE_NORMAL; lv_style_scr.body.shadow.color = LV_COLOR_GRAY; - lv_style_scr.body.shadow.type = LV_SHADOW_FULL; lv_style_scr.body.shadow.width = 0; + lv_style_scr.body.shadow.opa = LV_OPA_COVER; + lv_style_scr.body.shadow.offset.x = 0; + lv_style_scr.body.shadow.offset.y = 0; + lv_style_scr.body.shadow.spread = 0; + lv_style_scr.body.shadow.blend_mode = LV_BLEND_MODE_NORMAL; lv_style_scr.text.opa = LV_OPA_COVER; lv_style_scr.text.color = lv_color_make(0x30, 0x30, 0x30); @@ -96,18 +106,30 @@ void lv_style_init(void) lv_style_scr.text.font = LV_FONT_DEFAULT; lv_style_scr.text.letter_space = 0; lv_style_scr.text.line_space = 2; + lv_style_scr.text.blend_mode = LV_BLEND_MODE_NORMAL; + lv_style_scr.text.underline = 0; + lv_style_scr.text.strikethrough = 0; lv_style_scr.image.opa = LV_OPA_COVER; lv_style_scr.image.color = lv_color_make(0x20, 0x20, 0x20); lv_style_scr.image.intense = LV_OPA_TRANSP; + lv_style_scr.image.blend_mode = LV_BLEND_MODE_NORMAL; lv_style_scr.line.opa = LV_OPA_COVER; lv_style_scr.line.color = lv_color_make(0x20, 0x20, 0x20); lv_style_scr.line.width = 2; lv_style_scr.line.rounded = 0; + lv_style_scr.line.blend_mode = LV_BLEND_MODE_NORMAL; + +#if LV_USE_DEBUG +#if LV_USE_ASSERT_STYLE + lv_style_scr.debug_sentinel = LV_STYLE_DEGUG_SENTINEL_VALUE; +#endif +#endif /*Plain style (by default near the same as the screen style)*/ lv_style_copy(&lv_style_plain, &lv_style_scr); + lv_style_plain.body.opa = LV_OPA_COVER; lv_style_plain.body.padding.left = LV_DPI / 20; lv_style_plain.body.padding.right = LV_DPI / 20; lv_style_plain.body.padding.top = LV_DPI / 20; @@ -163,7 +185,11 @@ void lv_style_init(void) lv_style_copy(&lv_style_btn_rel, &lv_style_plain); lv_style_btn_rel.body.main_color = lv_color_make(0x76, 0xa2, 0xd0); lv_style_btn_rel.body.grad_color = lv_color_make(0x19, 0x3a, 0x5d); + lv_style_btn_rel.body.main_color_stop = 0x00; + lv_style_btn_rel.body.grad_color_stop = 0xff;; + lv_style_btn_rel.body.grad_dir = LV_GRAD_DIR_VER; lv_style_btn_rel.body.radius = LV_DPI / 15; + lv_style_btn_rel.body.opa = LV_OPA_COVER; lv_style_btn_rel.body.padding.left = LV_DPI / 4; lv_style_btn_rel.body.padding.right = LV_DPI / 4; lv_style_btn_rel.body.padding.top = LV_DPI / 6; @@ -172,8 +198,11 @@ void lv_style_init(void) lv_style_btn_rel.body.border.color = lv_color_make(0x0b, 0x19, 0x28); lv_style_btn_rel.body.border.width = LV_DPI / 50 >= 1 ? LV_DPI / 50 : 1; lv_style_btn_rel.body.border.opa = LV_OPA_70; - lv_style_btn_rel.body.shadow.color = LV_COLOR_GRAY; + lv_style_btn_rel.body.shadow.color = LV_COLOR_BLACK; lv_style_btn_rel.body.shadow.width = 0; + lv_style_btn_rel.body.shadow.opa = LV_OPA_COVER; + lv_style_btn_rel.body.shadow.offset.x = 0; + lv_style_btn_rel.body.shadow.offset.y = 0; lv_style_btn_rel.text.color = lv_color_make(0xff, 0xff, 0xff); lv_style_btn_rel.image.color = lv_color_make(0xff, 0xff, 0xff); @@ -236,6 +265,9 @@ void lv_style_mix(const lv_style_t * start, const lv_style_t * end, lv_style_t * STYLE_ATTR_MIX(body.border.width, ratio); STYLE_ATTR_MIX(body.border.opa, ratio); STYLE_ATTR_MIX(body.shadow.width, ratio); + STYLE_ATTR_MIX(body.shadow.offset.x, ratio); + STYLE_ATTR_MIX(body.shadow.offset.y, ratio); + STYLE_ATTR_MIX(body.shadow.spread, ratio); STYLE_ATTR_MIX(body.padding.left, ratio); STYLE_ATTR_MIX(body.padding.right, ratio); STYLE_ATTR_MIX(body.padding.top, ratio); @@ -263,13 +295,11 @@ void lv_style_mix(const lv_style_t * start, const lv_style_t * end, lv_style_t * res->body.border.part = start->body.border.part; res->glass = start->glass; res->text.font = start->text.font; - res->body.shadow.type = start->body.shadow.type; res->line.rounded = start->line.rounded; } else { res->body.border.part = end->body.border.part; res->glass = end->glass; res->text.font = end->text.font; - res->body.shadow.type = end->body.shadow.type; res->line.rounded = end->line.rounded; } } @@ -287,7 +317,7 @@ void lv_style_anim_init(lv_anim_t * a) lv_style_anim_dsc_t * dsc; dsc = lv_mem_alloc(sizeof(lv_style_anim_dsc_t)); - lv_mem_assert(dsc); + LV_ASSERT_MEM(dsc); if(dsc == NULL) return; dsc->ready_cb = NULL; dsc->style_anim = NULL; diff --git a/src/lv_core/lv_style.h b/src/lv_core/lv_style.h index 83c46f123..58bccb0d1 100644 --- a/src/lv_core/lv_style.h +++ b/src/lv_core/lv_style.h @@ -18,11 +18,15 @@ extern "C" { #include "../lv_misc/lv_color.h" #include "../lv_misc/lv_area.h" #include "../lv_misc/lv_anim.h" +#include "../lv_draw/lv_draw_blend.h" /********************* * DEFINES *********************/ #define LV_RADIUS_CIRCLE (LV_COORD_MAX) /**< A very big radius to always draw as circle*/ +#define LV_STYLE_DEGUG_SENTINEL_VALUE 0x12345678 + +LV_EXPORT_CONST_INT(LV_RADIUS_CIRCLE); /********************** * TYPEDEFS @@ -30,25 +34,28 @@ extern "C" { /*Border types (Use 'OR'ed values)*/ enum { - LV_BORDER_NONE = 0x00, - LV_BORDER_BOTTOM = 0x01, - LV_BORDER_TOP = 0x02, - LV_BORDER_LEFT = 0x04, - LV_BORDER_RIGHT = 0x08, - LV_BORDER_FULL = 0x0F, - LV_BORDER_INTERNAL = 0x10, /**< FOR matrix-like objects (e.g. Button matrix)*/ + LV_BORDER_PART_NONE = 0x00, + LV_BORDER_PART_BOTTOM = 0x01, + LV_BORDER_PART_TOP = 0x02, + LV_BORDER_PART_LEFT = 0x04, + LV_BORDER_PART_RIGHT = 0x08, + LV_BORDER_PART_FULL = 0x0F, + LV_BORDER_PART_INTERNAL = 0x10, /**< FOR matrix-like objects (e.g. Button matrix)*/ }; typedef uint8_t lv_border_part_t; -/*Shadow types*/ + + enum { - LV_SHADOW_BOTTOM = 0, /**< Only draw bottom shadow */ - LV_SHADOW_FULL, /**< Draw shadow on all sides */ + LV_GRAD_DIR_NONE, + LV_GRAD_DIR_VER, + LV_GRAD_DIR_HOR, }; -typedef uint8_t lv_shadow_type_t; + +typedef uint8_t lv_grad_dir_t; /** - * Objects in LittlevGL can be assigned a style - which holds information about + * Styles can be assigned to objects - which holds information about * how the object should be drawn. * * This allows for easy customization without having to modify the object's design @@ -65,6 +72,11 @@ typedef struct lv_color_t grad_color; /**< Second color. If not equal to `main_color` a gradient will be drawn for the background. */ lv_coord_t radius; /**< Object's corner radius. You can use #LV_RADIUS_CIRCLE if you want to draw a circle. */ lv_opa_t opa; /**< Object's opacity (0-255). */ + uint8_t main_color_stop; /**< 0..255 proportionally where should the gradient start (the main color stop)*/ + uint8_t grad_color_stop; /**< 0..255 proportionally where should the gradient stop (the grad_color start) */ + lv_blend_mode_t blend_mode :3; + lv_grad_dir_t grad_dir :2; /**< LV_GRAD_DIR_NONE/VER/HOR*/ + uint8_t corner_mask :1; /**< Crop the overflowing content from the rounded corners */ struct { @@ -72,6 +84,7 @@ typedef struct lv_coord_t width; /**< Border width */ lv_border_part_t part; /**< Which borders to draw */ lv_opa_t opa; /**< Border opacity. */ + lv_blend_mode_t blend_mode :3; } border; @@ -79,7 +92,10 @@ typedef struct { lv_color_t color; lv_coord_t width; - lv_shadow_type_t type; /**< Which parts of the shadow to draw */ + lv_coord_t spread; + lv_point_t offset; + lv_opa_t opa; + lv_blend_mode_t blend_mode :3; } shadow; struct @@ -101,6 +117,9 @@ typedef struct lv_coord_t letter_space; /**< Space between letters */ lv_coord_t line_space; /**< Space between lines (vertical) */ lv_opa_t opa; /**< Text opacity */ + lv_blend_mode_t blend_mode :3; + uint8_t underline :1; + uint8_t strikethrough :1; } text; /**< Style of images. */ @@ -109,6 +128,7 @@ typedef struct lv_color_t color; /**< Color to recolor the image with */ lv_opa_t intense; /**< Opacity of recoloring (0 means no recoloring) */ lv_opa_t opa; /**< Opacity of whole image */ + lv_blend_mode_t blend_mode :3; } image; /**< Style of lines (not borders). */ @@ -118,7 +138,15 @@ typedef struct lv_coord_t width; lv_opa_t opa; uint8_t rounded : 1; /**< 1: rounded line endings*/ + lv_blend_mode_t blend_mode :3; } line; + +#if LV_USE_DEBUG +#if LV_USE_ASSERT_STYLE + uint32_t debug_sentinel; /** -#include -#include "lv_draw.h" -#include "../lv_misc/lv_math.h" -#include "../lv_misc/lv_log.h" -#include "../lv_misc/lv_math.h" -#include "../lv_misc/lv_mem.h" -#include "../lv_misc/lv_gc.h" - -#if defined(LV_GC_INCLUDE) -#include LV_GC_INCLUDE -#endif /* LV_ENABLE_GC */ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static uint32_t draw_buf_size = 0; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Give a buffer with the given to use during drawing. - * Be careful to not use the buffer while other processes are using it. - * @param size the required size - */ -void * lv_draw_get_buf(uint32_t size) -{ - if(size <= draw_buf_size) return LV_GC_ROOT(_lv_draw_buf); - - LV_LOG_TRACE("lv_draw_get_buf: allocate"); - - draw_buf_size = size; - - if(LV_GC_ROOT(_lv_draw_buf) == NULL) { - LV_GC_ROOT(_lv_draw_buf) = lv_mem_alloc(size); - lv_mem_assert(LV_GC_ROOT(_lv_draw_buf)); - return LV_GC_ROOT(_lv_draw_buf); - } - - LV_GC_ROOT(_lv_draw_buf) = lv_mem_realloc(LV_GC_ROOT(_lv_draw_buf), size); - lv_mem_assert(LV_GC_ROOT(_lv_draw_buf)); - return LV_GC_ROOT(_lv_draw_buf); -} - -/** - * Free the draw buffer - */ -void lv_draw_free_buf(void) -{ - if(LV_GC_ROOT(_lv_draw_buf)) { - lv_mem_free(LV_GC_ROOT(_lv_draw_buf)); - LV_GC_ROOT(_lv_draw_buf) = NULL; - draw_buf_size = 0; - } -} - -#if LV_ANTIALIAS - -/** - * Get the opacity of a pixel based it's position in a line segment - * @param seg segment length - * @param px_id position of of a pixel which opacity should be get [0..seg-1] - * @param base_opa the base opacity - * @return the opacity of the given pixel - */ -lv_opa_t lv_draw_aa_get_opa(lv_coord_t seg, lv_coord_t px_id, lv_opa_t base_opa) -{ - /* How to calculate the opacity of pixels on the edges which makes the anti-aliasing? - * For example we have a line like this (y = -0.5 * x): - * - * | _ _ - * * * | - * - * Anti-aliased pixels come to the '*' characters - * Calculate what percentage of the pixels should be covered if real line (not rasterized) would - * be drawn: - * 1. A real line should start on (0;0) and end on (2;1) - * 2. So the line intersection coordinates on the first pixel: (0;0) (1;0.5) -> 25% covered - * pixel in average - * 3. For the second pixel: (1;0.5) (2;1) -> 75% covered pixel in average - * 4. The equation: (px_id * 2 + 1) / (segment_width * 2) - * segment_width: the line segment which is being anti-aliased (was 2 in the - * example) px_id: pixel ID from 0 to (segment_width - 1) result: [0..1] coverage of the pixel - */ - - /*Accelerate the common segment sizes to avoid division*/ - static const lv_opa_t seg1[1] = {128}; - static const lv_opa_t seg2[2] = {64, 192}; - static const lv_opa_t seg3[3] = {42, 128, 212}; - static const lv_opa_t seg4[4] = {32, 96, 159, 223}; - static const lv_opa_t seg5[5] = {26, 76, 128, 178, 230}; - static const lv_opa_t seg6[6] = {21, 64, 106, 148, 191, 234}; - static const lv_opa_t seg7[7] = {18, 55, 91, 128, 164, 200, 237}; - static const lv_opa_t seg8[8] = {16, 48, 80, 112, 143, 175, 207, 239}; - - static const lv_opa_t * seg_map[] = {seg1, seg2, seg3, seg4, seg5, seg6, seg7, seg8}; - - if(seg == 0) - return LV_OPA_TRANSP; - else if(seg < 8) - return (uint32_t)((uint32_t)seg_map[seg - 1][px_id] * base_opa) >> 8; - else { - return ((px_id * 2 + 1) * base_opa) / (2 * seg); - } -} - -/** - * Add a vertical anti-aliasing segment (pixels with decreasing opacity) - * @param x start point x coordinate - * @param y start point y coordinate - * @param length length of segment (negative value to start from 0 opacity) - * @param mask draw only in this area - * @param color color of pixels - * @param opa maximum opacity - */ -void lv_draw_aa_ver_seg(lv_coord_t x, lv_coord_t y, lv_coord_t length, const lv_area_t * mask, lv_color_t color, - lv_opa_t opa) -{ - bool aa_inv = false; - if(length < 0) { - aa_inv = true; - length = -length; - } - - lv_coord_t i; - for(i = 0; i < length; i++) { - lv_opa_t px_opa = lv_draw_aa_get_opa(length, i, opa); - if(aa_inv) px_opa = opa - px_opa; - lv_draw_px(x, y + i, mask, color, px_opa); - } -} - -/** - * Add a horizontal anti-aliasing segment (pixels with decreasing opacity) - * @param x start point x coordinate - * @param y start point y coordinate - * @param length length of segment (negative value to start from 0 opacity) - * @param mask draw only in this area - * @param color color of pixels - * @param opa maximum opacity - */ -void lv_draw_aa_hor_seg(lv_coord_t x, lv_coord_t y, lv_coord_t length, const lv_area_t * mask, lv_color_t color, - lv_opa_t opa) -{ - bool aa_inv = false; - if(length < 0) { - aa_inv = true; - length = -length; - } - - lv_coord_t i; - for(i = 0; i < length; i++) { - lv_opa_t px_opa = lv_draw_aa_get_opa(length, i, opa); - if(aa_inv) px_opa = opa - px_opa; - lv_draw_px(x + i, y, mask, color, px_opa); - } -} - -#endif - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/lv_draw/lv_draw.h b/src/lv_draw/lv_draw.h index a9fa58d91..8beabd53b 100644 --- a/src/lv_draw/lv_draw.h +++ b/src/lv_draw/lv_draw.h @@ -23,6 +23,15 @@ extern "C" { #include "../lv_misc/lv_txt.h" #include "lv_img_decoder.h" +#include "lv_draw_rect.h" +#include "lv_draw_label.h" +#include "lv_draw_img.h" +#include "lv_draw_line.h" +#include "lv_draw_triangle.h" +#include "lv_draw_arc.h" +#include "lv_draw_blend.h" +#include "lv_draw_mask.h" + /********************* * DEFINES *********************/ @@ -35,54 +44,6 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -/** - * Give a buffer with the given to use during drawing. - * Be careful to not use the buffer while other processes are using it. - * @param size the required size - */ -void * lv_draw_get_buf(uint32_t size); - -/** - * Free the draw buffer - */ -void lv_draw_free_buf(void); - -#if LV_ANTIALIAS - -/** - * Get the opacity of a pixel based it's position in a line segment - * @param seg segment length - * @param px_id position of of a pixel which opacity should be get [0..seg-1] - * @param base_opa the base opacity - * @return the opacity of the given pixel - */ -lv_opa_t lv_draw_aa_get_opa(lv_coord_t seg, lv_coord_t px_id, lv_opa_t base_opa); - -/** - * Add a vertical anti-aliasing segment (pixels with decreasing opacity) - * @param x start point x coordinate - * @param y start point y coordinate - * @param length length of segment (negative value to start from 0 opacity) - * @param mask draw only in this area - * @param color color of pixels - * @param opa maximum opacity - */ -void lv_draw_aa_ver_seg(lv_coord_t x, lv_coord_t y, lv_coord_t length, const lv_area_t * mask, lv_color_t color, - lv_opa_t opa); - -/** - * Add a horizontal anti-aliasing segment (pixels with decreasing opacity) - * @param x start point x coordinate - * @param y start point y coordinate - * @param length length of segment (negative value to start from 0 opacity) - * @param mask draw only in this area - * @param color color of pixels - * @param opa maximum opacity - */ -void lv_draw_aa_hor_seg(lv_coord_t x, lv_coord_t y, lv_coord_t length, const lv_area_t * mask, lv_color_t color, - lv_opa_t opa); -#endif - /********************** * GLOBAL VARIABLES **********************/ @@ -94,13 +55,6 @@ void lv_draw_aa_hor_seg(lv_coord_t x, lv_coord_t y, lv_coord_t length, const lv_ /********************** * POST INCLUDES *********************/ -#include "lv_draw_basic.h" -#include "lv_draw_rect.h" -#include "lv_draw_label.h" -#include "lv_draw_img.h" -#include "lv_draw_line.h" -#include "lv_draw_triangle.h" -#include "lv_draw_arc.h" #ifdef __cplusplus } /* extern "C" */ diff --git a/src/lv_draw/lv_draw.mk b/src/lv_draw/lv_draw.mk index c879ebe6e..ea09d6cac 100644 --- a/src/lv_draw/lv_draw.mk +++ b/src/lv_draw/lv_draw.mk @@ -1,5 +1,5 @@ -CSRCS += lv_draw_basic.c -CSRCS += lv_draw.c +CSRCS += lv_draw_mask.c +CSRCS += lv_draw_blend.c CSRCS += lv_draw_rect.c CSRCS += lv_draw_label.c CSRCS += lv_draw_line.c @@ -8,6 +8,7 @@ CSRCS += lv_draw_arc.c CSRCS += lv_draw_triangle.c CSRCS += lv_img_decoder.c CSRCS += lv_img_cache.c +CSRCS += lv_img_buf.c DEPPATH += --dep-path $(LVGL_DIR)/lvgl/src/lv_draw VPATH += :$(LVGL_DIR)/lvgl/src/lv_draw diff --git a/src/lv_draw/lv_draw_arc.c b/src/lv_draw/lv_draw_arc.c index 306249256..fcb95d55d 100644 --- a/src/lv_draw/lv_draw_arc.c +++ b/src/lv_draw/lv_draw_arc.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ #include "lv_draw_arc.h" +#include "lv_draw_mask.h" #include "../lv_misc/lv_math.h" /********************* @@ -20,13 +21,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static uint16_t fast_atan2(int x, int y); -static void ver_line(lv_coord_t x, lv_coord_t y, const lv_area_t * mask, lv_coord_t len, lv_color_t color, - lv_opa_t opa); -static void hor_line(lv_coord_t x, lv_coord_t y, const lv_area_t * mask, lv_coord_t len, lv_color_t color, - lv_opa_t opa); -static bool deg_test_norm(uint16_t deg, uint16_t start, uint16_t end); -static bool deg_test_inv(uint16_t deg, uint16_t start, uint16_t end); +static void get_rounded_area(int16_t angle, lv_coord_t radius, uint8_t tickness, lv_area_t * res_area); /********************** * STATIC VARIABLES @@ -51,221 +46,105 @@ static bool deg_test_inv(uint16_t deg, uint16_t start, uint16_t end); * @param style style of the arc (`body.thickness`, `body.main_color`, `body.opa` is used) * @param opa_scale scale down all opacities by the factor */ -void lv_draw_arc(lv_coord_t center_x, lv_coord_t center_y, uint16_t radius, const lv_area_t * mask, - uint16_t start_angle, uint16_t end_angle, const lv_style_t * style, lv_opa_t opa_scale) +void lv_draw_arc(lv_coord_t center_x, lv_coord_t center_y, uint16_t radius, const lv_area_t * clip_area, + uint16_t start_angle, uint16_t end_angle, const lv_style_t * style, lv_opa_t opa_scale) { - lv_coord_t thickness = style->line.width; - if(thickness > radius) thickness = radius; + lv_style_t circle_style; + lv_style_copy(&circle_style, style); + circle_style.body.radius = LV_RADIUS_CIRCLE; + circle_style.body.opa = LV_OPA_TRANSP; + circle_style.body.border.width = style->line.width; + circle_style.body.border.color = style->line.color; + circle_style.body.border.opa = style->line.opa; - lv_coord_t r_out = radius; - lv_coord_t r_in = r_out - thickness; - int16_t deg_base; - int16_t deg; - lv_coord_t x_start[4]; - lv_coord_t x_end[4]; + lv_draw_mask_angle_param_t mask_angle_param; + lv_draw_mask_angle_init(&mask_angle_param, center_x, center_y, start_angle, end_angle); - lv_color_t color = style->line.color; - lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->body.opa : (uint16_t)((uint16_t)style->body.opa * opa_scale) >> 8; + int16_t mask_angle_id = lv_draw_mask_add(&mask_angle_param, NULL); - bool (*deg_test)(uint16_t, uint16_t, uint16_t); - if(start_angle <= end_angle) - deg_test = deg_test_norm; - else - deg_test = deg_test_inv; + lv_area_t area; + area.x1 = center_x - radius; + area.y1 = center_y - radius; + area.x2 = center_x + radius - 1; /*-1 because the center already belongs to the left/bottom part*/ + area.y2 = center_y + radius - 1; - if(deg_test(270, start_angle, end_angle)) - hor_line(center_x - r_out + 1, center_y, mask, thickness - 1, color, opa); /*Left Middle*/ - if(deg_test(90, start_angle, end_angle)) - hor_line(center_x + r_in, center_y, mask, thickness - 1, color, opa); /*Right Middle*/ - if(deg_test(180, start_angle, end_angle)) - ver_line(center_x, center_y - r_out + 1, mask, thickness - 1, color, opa); /*Top Middle*/ - if(deg_test(0, start_angle, end_angle)) - ver_line(center_x, center_y + r_in, mask, thickness - 1, color, opa); /*Bottom middle*/ + lv_draw_rect(&area, clip_area, &circle_style, LV_OPA_COVER); - uint32_t r_out_sqr = r_out * r_out; - uint32_t r_in_sqr = r_in * r_in; - int16_t xi; - int16_t yi; - for(yi = -r_out; yi < 0; yi++) { - x_start[0] = LV_COORD_MIN; - x_start[1] = LV_COORD_MIN; - x_start[2] = LV_COORD_MIN; - x_start[3] = LV_COORD_MIN; - x_end[0] = LV_COORD_MIN; - x_end[1] = LV_COORD_MIN; - x_end[2] = LV_COORD_MIN; - x_end[3] = LV_COORD_MIN; - for(xi = -r_out; xi < 0; xi++) { + lv_draw_mask_remove_id(mask_angle_id); - uint32_t r_act_sqr = xi * xi + yi * yi; - if(r_act_sqr > r_out_sqr) continue; + if(style->line.rounded) { + circle_style.body.main_color = style->line.color; + circle_style.body.grad_color = style->line.color; + circle_style.body.opa = LV_OPA_COVER; + circle_style.body.border.width = 0; - deg_base = fast_atan2(xi, yi) - 180; + lv_area_t round_area; + get_rounded_area(start_angle, radius, style->line.width, &round_area); + round_area.x1 += center_x; + round_area.x2 += center_x; + round_area.y1 += center_y; + round_area.y2 += center_y; - deg = 180 + deg_base; - if(deg_test(deg, start_angle, end_angle)) { - if(x_start[0] == LV_COORD_MIN) x_start[0] = xi; - } else if(x_start[0] != LV_COORD_MIN && x_end[0] == LV_COORD_MIN) { - x_end[0] = xi - 1; - } + lv_draw_rect(&round_area, clip_area, &circle_style, opa_scale); - deg = 360 - deg_base; - if(deg_test(deg, start_angle, end_angle)) { - if(x_start[1] == LV_COORD_MIN) x_start[1] = xi; - } else if(x_start[1] != LV_COORD_MIN && x_end[1] == LV_COORD_MIN) { - x_end[1] = xi - 1; - } + get_rounded_area(end_angle, radius, style->line.width, &round_area); + round_area.x1 += center_x; + round_area.x2 += center_x; + round_area.y1 += center_y; + round_area.y2 += center_y; - deg = 180 - deg_base; - if(deg_test(deg, start_angle, end_angle)) { - if(x_start[2] == LV_COORD_MIN) x_start[2] = xi; - } else if(x_start[2] != LV_COORD_MIN && x_end[2] == LV_COORD_MIN) { - x_end[2] = xi - 1; - } - - deg = deg_base; - if(deg_test(deg, start_angle, end_angle)) { - if(x_start[3] == LV_COORD_MIN) x_start[3] = xi; - } else if(x_start[3] != LV_COORD_MIN && x_end[3] == LV_COORD_MIN) { - x_end[3] = xi - 1; - } - - if(r_act_sqr < r_in_sqr) - break; /*No need to continue the iteration in x once we found the inner edge of the - arc*/ - } - - if(x_start[0] != LV_COORD_MIN) { - if(x_end[0] == LV_COORD_MIN) x_end[0] = xi - 1; - hor_line(center_x + x_start[0], center_y + yi, mask, x_end[0] - x_start[0], color, opa); - } - - if(x_start[1] != LV_COORD_MIN) { - if(x_end[1] == LV_COORD_MIN) x_end[1] = xi - 1; - hor_line(center_x + x_start[1], center_y - yi, mask, x_end[1] - x_start[1], color, opa); - } - - if(x_start[2] != LV_COORD_MIN) { - if(x_end[2] == LV_COORD_MIN) x_end[2] = xi - 1; - hor_line(center_x - x_end[2], center_y + yi, mask, LV_MATH_ABS(x_end[2] - x_start[2]), color, opa); - } - - if(x_start[3] != LV_COORD_MIN) { - if(x_end[3] == LV_COORD_MIN) x_end[3] = xi - 1; - hor_line(center_x - x_end[3], center_y - yi, mask, LV_MATH_ABS(x_end[3] - x_start[3]), color, opa); - } - -#if LV_ANTIALIAS - /*TODO*/ - -#endif + lv_draw_rect(&round_area, clip_area, &circle_style, opa_scale); } } -static uint16_t fast_atan2(int x, int y) -{ - // Fast XY vector to integer degree algorithm - Jan 2011 www.RomanBlack.com - // Converts any XY values including 0 to a degree value that should be - // within +/- 1 degree of the accurate value without needing - // large slow trig functions like ArcTan() or ArcCos(). - // NOTE! at least one of the X or Y values must be non-zero! - // This is the full version, for all 4 quadrants and will generate - // the angle in integer degrees from 0-360. - // Any values of X and Y are usable including negative values provided - // they are between -1456 and 1456 so the 16bit multiply does not overflow. - - unsigned char negflag; - unsigned char tempdegree; - unsigned char comp; - unsigned int degree; /*this will hold the result*/ - unsigned int ux; - unsigned int uy; - - /*Save the sign flags then remove signs and get XY as unsigned ints*/ - negflag = 0; - if(x < 0) { - negflag += 0x01; /*x flag bit*/ - x = (0 - x); /*is now +*/ - } - ux = x; /*copy to unsigned var before multiply*/ - if(y < 0) { - negflag += 0x02; /*y flag bit*/ - y = (0 - y); /*is now +*/ - } - uy = y; /*copy to unsigned var before multiply*/ - - /*1. Calc the scaled "degrees"*/ - if(ux > uy) { - degree = (uy * 45) / ux; /*degree result will be 0-45 range*/ - negflag += 0x10; /*octant flag bit*/ - } else { - degree = (ux * 45) / uy; /*degree result will be 0-45 range*/ - } - - /*2. Compensate for the 4 degree error curve*/ - comp = 0; - tempdegree = degree; /*use an unsigned char for speed!*/ - if(tempdegree > 22) { /*if top half of range*/ - if(tempdegree <= 44) comp++; - if(tempdegree <= 41) comp++; - if(tempdegree <= 37) comp++; - if(tempdegree <= 32) comp++; /*max is 4 degrees compensated*/ - } else { /*else is lower half of range*/ - if(tempdegree >= 2) comp++; - if(tempdegree >= 6) comp++; - if(tempdegree >= 10) comp++; - if(tempdegree >= 15) comp++; /*max is 4 degrees compensated*/ - } - degree += comp; /*degree is now accurate to +/- 1 degree!*/ - - /*Invert degree if it was X>Y octant, makes 0-45 into 90-45*/ - if(negflag & 0x10) degree = (90 - degree); - - /*3. Degree is now 0-90 range for this quadrant,*/ - /*need to invert it for whichever quadrant it was in*/ - if(negflag & 0x02) { /*if -Y*/ - if(negflag & 0x01) /*if -Y -X*/ - degree = (180 + degree); - else /*else is -Y +X*/ - degree = (180 - degree); - } else { /*else is +Y*/ - if(negflag & 0x01) /*if +Y -X*/ - degree = (360 - degree); - } - return degree; -} /********************** * STATIC FUNCTIONS **********************/ -static void ver_line(lv_coord_t x, lv_coord_t y, const lv_area_t * mask, lv_coord_t len, lv_color_t color, lv_opa_t opa) + +static void get_rounded_area(int16_t angle, lv_coord_t radius, uint8_t tickness, lv_area_t * res_area) { - lv_area_t area; - lv_area_set(&area, x, y, x, y + len); + const uint8_t ps = 8; + const uint8_t pa = 127; - lv_draw_fill(&area, mask, color, opa); -} - -static void hor_line(lv_coord_t x, lv_coord_t y, const lv_area_t * mask, lv_coord_t len, lv_color_t color, lv_opa_t opa) -{ - lv_area_t area; - lv_area_set(&area, x, y, x + len, y); - - lv_draw_fill(&area, mask, color, opa); -} - -static bool deg_test_norm(uint16_t deg, uint16_t start, uint16_t end) -{ - if(deg >= start && deg <= end) - return true; - else - return false; -} - -static bool deg_test_inv(uint16_t deg, uint16_t start, uint16_t end) -{ - if(deg >= start || deg <= end) { - return true; - } else - return false; + lv_coord_t thick_half = tickness / 2; + lv_coord_t thick_corr = tickness & 0x01 ? 0 : 1; + + lv_coord_t rx_corr; + lv_coord_t ry_corr; + + if(angle > 90 && angle < 270) rx_corr = 0; + else rx_corr = 0; + + if(angle > 0 && angle < 180) ry_corr = 0; + else ry_corr = 0; + + lv_coord_t cir_x; + lv_coord_t cir_y; + + cir_x = ((radius - rx_corr - thick_half) * lv_trigo_sin(90 - angle)) >> (LV_TRIGO_SHIFT - ps); + cir_y = ((radius - ry_corr - thick_half) * lv_trigo_sin(angle)) >> (LV_TRIGO_SHIFT - ps); + + /* Actually the center of the pixel need to be calculated so apply 1/2 px offset*/ + if(cir_x > 0) { + cir_x = (cir_x - pa) >> ps; + res_area->x1 = cir_x - thick_half + thick_corr; + res_area->x2 = cir_x + thick_half; + } + else { + cir_x = (cir_x + pa) >> ps; + res_area->x1 = cir_x - thick_half; + res_area->x2 = cir_x + thick_half - thick_corr; + } + + if(cir_y > 0) { + cir_y = (cir_y - pa) >> ps; + res_area->y1 = cir_y - thick_half + thick_corr; + res_area->y2 = cir_y + thick_half; + } + else { + cir_y = (cir_y + pa) >> ps; + res_area->y1 = cir_y - thick_half; + res_area->y2 = cir_y + thick_half - thick_corr; + } } diff --git a/src/lv_draw/lv_draw_basic.c b/src/lv_draw/lv_draw_basic.c deleted file mode 100644 index afbf481df..000000000 --- a/src/lv_draw/lv_draw_basic.c +++ /dev/null @@ -1,707 +0,0 @@ -/** - * @file lv_draw_basic.c - * - */ - -#include "lv_draw_basic.h" - -#include -#include -#include - -#include "../lv_core/lv_refr.h" -#include "../lv_hal/lv_hal.h" -#include "../lv_font/lv_font.h" -#include "../lv_misc/lv_area.h" -#include "../lv_misc/lv_color.h" -#include "../lv_misc/lv_log.h" - -#include -#include "lv_draw.h" - -/********************* - * INCLUDES - *********************/ - -/********************* - * DEFINES - *********************/ - -/*Always fill < 50 px with 'sw_color_fill' because of the hw. init overhead*/ -#define VFILL_HW_ACC_SIZE_LIMIT 50 - -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void sw_mem_blend(lv_color_t * dest, const lv_color_t * src, uint32_t length, lv_opa_t opa); -static void sw_color_fill(lv_color_t * mem, lv_coord_t mem_width, const lv_area_t * fill_area, lv_color_t color, - lv_opa_t opa); - -#if LV_COLOR_DEPTH == 32 && LV_COLOR_SCREEN_TRANSP -static inline lv_color_t color_mix_2_alpha(lv_color_t bg_color, lv_opa_t bg_opa, lv_color_t fg_color, lv_opa_t fg_opa); -#endif - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Put a pixel in the Virtual Display Buffer - * @param x pixel x coordinate - * @param y pixel y coordinate - * @param mask_p fill only on this mask (truncated to VDB area) - * @param color pixel color - * @param opa opacity of the area (0..255) - */ -void lv_draw_px(lv_coord_t x, lv_coord_t y, const lv_area_t * mask_p, lv_color_t color, lv_opa_t opa) -{ - - if(opa < LV_OPA_MIN) return; - if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; - - /*Pixel out of the mask*/ - if(x < mask_p->x1 || x > mask_p->x2 || y < mask_p->y1 || y > mask_p->y2) { - return; - } - - lv_disp_t * disp = lv_refr_get_disp_refreshing(); - lv_disp_buf_t * vdb = lv_disp_get_buf(disp); - uint32_t vdb_width = lv_area_get_width(&vdb->area); - - /*Make the coordinates relative to VDB*/ - x -= vdb->area.x1; - y -= vdb->area.y1; - - if(disp->driver.set_px_cb) { - disp->driver.set_px_cb(&disp->driver, (uint8_t *)vdb->buf_act, vdb_width, x, y, color, opa); - } else { - bool scr_transp = false; -#if LV_COLOR_DEPTH == 32 && LV_COLOR_SCREEN_TRANSP - scr_transp = disp->driver.screen_transp; -#endif - - lv_color_t * vdb_px_p = vdb->buf_act; - vdb_px_p += y * vdb_width + x; - - if(scr_transp == false) { - if(opa == LV_OPA_COVER) { - *vdb_px_p = color; - } else { - *vdb_px_p = lv_color_mix(color, *vdb_px_p, opa); - } - } else { -#if LV_COLOR_DEPTH == 32 && LV_COLOR_SCREEN_TRANSP - *vdb_px_p = color_mix_2_alpha(*vdb_px_p, (*vdb_px_p).ch.alpha, color, opa); -#endif - } - } -} - -/** - * Fill an area in the Virtual Display Buffer - * @param cords_p coordinates of the area to fill - * @param mask_p fill only o this mask (truncated to VDB area) - * @param color fill color - * @param opa opacity of the area (0..255) - */ -void lv_draw_fill(const lv_area_t * cords_p, const lv_area_t * mask_p, lv_color_t color, lv_opa_t opa) -{ - if(opa < LV_OPA_MIN) return; - if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; - - lv_area_t res_a; - bool union_ok; - - /*Get the union of cord and mask*/ - /* The mask is already truncated to the vdb size - * in 'lv_refr_area_with_vdb' function */ - union_ok = lv_area_intersect(&res_a, cords_p, mask_p); - - /*If there are common part of the three area then draw to the vdb*/ - if(union_ok == false) { - return; - } - - lv_disp_t * disp = lv_refr_get_disp_refreshing(); - lv_disp_buf_t * vdb = lv_disp_get_buf(disp); - - lv_area_t vdb_rel_a; /*Stores relative coordinates on vdb*/ - vdb_rel_a.x1 = res_a.x1 - vdb->area.x1; - vdb_rel_a.y1 = res_a.y1 - vdb->area.y1; - vdb_rel_a.x2 = res_a.x2 - vdb->area.x1; - vdb_rel_a.y2 = res_a.y2 - vdb->area.y1; - - lv_color_t * vdb_buf_tmp = vdb->buf_act; - uint32_t vdb_width = lv_area_get_width(&vdb->area); - /*Move the vdb_tmp to the first row*/ - vdb_buf_tmp += vdb_width * vdb_rel_a.y1; - -#if LV_USE_GPU - static LV_ATTRIBUTE_MEM_ALIGN lv_color_t color_array_tmp[LV_HOR_RES_MAX]; /*Used by 'lv_disp_mem_blend'*/ - static lv_coord_t last_width = -1; - - lv_coord_t w = lv_area_get_width(&vdb_rel_a); - /*Don't use hw. acc. for every small fill (because of the init overhead)*/ - if(w < VFILL_HW_ACC_SIZE_LIMIT) { - sw_color_fill(vdb->buf_act, vdb_width, &vdb_rel_a, color, opa); - } - /*Not opaque fill*/ - else if(opa == LV_OPA_COVER) { - /*Use hw fill if present*/ - if(disp->driver.gpu_fill_cb) { - disp->driver.gpu_fill_cb(&disp->driver, vdb->buf_act, vdb_width, &vdb_rel_a, color); - } - /*Use hw blend if present and the area is not too small*/ - else if(lv_area_get_height(&vdb_rel_a) > VFILL_HW_ACC_SIZE_LIMIT && disp->driver.gpu_blend_cb) { - /*Fill a one line sized buffer with a color and blend this later*/ - if(color_array_tmp[0].full != color.full || last_width != w) { - uint16_t i; - for(i = 0; i < w; i++) { - color_array_tmp[i].full = color.full; - } - last_width = w; - } - - /*Blend the filled line to every line VDB line-by-line*/ - lv_coord_t row; - for(row = vdb_rel_a.y1; row <= vdb_rel_a.y2; row++) { - disp->driver.gpu_blend_cb(&disp->driver, &vdb_buf_tmp[vdb_rel_a.x1], color_array_tmp, w, opa); - vdb_buf_tmp += vdb_width; - } - - } - /*Else use sw fill if no better option*/ - else { - sw_color_fill(vdb->buf_act, vdb_width, &vdb_rel_a, color, opa); - } - - } - /*Fill with opacity*/ - else { - /*Use hw blend if present*/ - if(disp->driver.gpu_blend_cb) { - if(color_array_tmp[0].full != color.full || last_width != w) { - uint16_t i; - for(i = 0; i < w; i++) { - color_array_tmp[i].full = color.full; - } - - last_width = w; - } - lv_coord_t row; - for(row = vdb_rel_a.y1; row <= vdb_rel_a.y2; row++) { - disp->driver.gpu_blend_cb(&disp->driver, &vdb_buf_tmp[vdb_rel_a.x1], color_array_tmp, w, opa); - vdb_buf_tmp += vdb_width; - } - - } - /*Use sw fill with opa if no better option*/ - else { - sw_color_fill(vdb->buf_act, vdb_width, &vdb_rel_a, color, opa); - } - } -#else - sw_color_fill(vdb->buf_act, vdb_width, &vdb_rel_a, color, opa); -#endif -} - -/** - * Draw a letter in the Virtual Display Buffer - * @param pos_p left-top coordinate of the latter - * @param mask_p the letter will be drawn only on this area (truncated to VDB area) - * @param font_p pointer to font - * @param letter a letter to draw - * @param color color of letter - * @param opa opacity of letter (0..255) - */ -void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * mask_p, const lv_font_t * font_p, uint32_t letter, - lv_color_t color, lv_opa_t opa) -{ - /*clang-format off*/ - const uint8_t bpp1_opa_table[2] = {0, 255}; /*Opacity mapping with bpp = 1 (Just for compatibility)*/ - const uint8_t bpp2_opa_table[4] = {0, 85, 170, 255}; /*Opacity mapping with bpp = 2*/ - const uint8_t bpp4_opa_table[16] = {0, 17, 34, 51, /*Opacity mapping with bpp = 4*/ - 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255}; - /*clang-format on*/ - - if(opa < LV_OPA_MIN) return; - if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; - - if(font_p == NULL) { - LV_LOG_WARN("Font: character's bitmap not found"); - return; - } - - lv_font_glyph_dsc_t g; - bool g_ret = lv_font_get_glyph_dsc(font_p, &g, letter, '\0'); - if(g_ret == false) return; - - lv_coord_t pos_x = pos_p->x + g.ofs_x; - lv_coord_t pos_y = pos_p->y + (font_p->line_height - font_p->base_line) - g.box_h - g.ofs_y; - - const uint8_t * bpp_opa_table; - uint8_t bitmask_init; - uint8_t bitmask; - - switch(g.bpp) { - case 1: - bpp_opa_table = bpp1_opa_table; - bitmask_init = 0x80; - break; - case 2: - bpp_opa_table = bpp2_opa_table; - bitmask_init = 0xC0; - break; - case 4: - bpp_opa_table = bpp4_opa_table; - bitmask_init = 0xF0; - break; - case 8: - bpp_opa_table = NULL; - bitmask_init = 0xFF; - break; /*No opa table, pixel value will be used directly*/ - default: return; /*Invalid bpp. Can't render the letter*/ - } - - const uint8_t * map_p = lv_font_get_glyph_bitmap(font_p, letter); - - if(map_p == NULL) return; - - /*If the letter is completely out of mask don't draw it */ - if(pos_x + g.box_w < mask_p->x1 || pos_x > mask_p->x2 || pos_y + g.box_h < mask_p->y1 || pos_y > mask_p->y2) return; - - lv_disp_t * disp = lv_refr_get_disp_refreshing(); - lv_disp_buf_t * vdb = lv_disp_get_buf(disp); - - lv_coord_t vdb_width = lv_area_get_width(&vdb->area); - lv_color_t * vdb_buf_tmp = vdb->buf_act; - lv_coord_t col, row; - - uint8_t width_byte_scr = g.box_w >> 3; /*Width in bytes (on the screen finally) (e.g. w = 11 -> 2 bytes wide)*/ - if(g.box_w & 0x7) width_byte_scr++; - uint16_t width_bit = g.box_w * g.bpp; /*Letter width in bits*/ - - /* Calculate the col/row start/end on the map*/ - lv_coord_t col_start = pos_x >= mask_p->x1 ? 0 : mask_p->x1 - pos_x; - lv_coord_t col_end = pos_x + g.box_w <= mask_p->x2 ? g.box_w : mask_p->x2 - pos_x + 1; - lv_coord_t row_start = pos_y >= mask_p->y1 ? 0 : mask_p->y1 - pos_y; - lv_coord_t row_end = pos_y + g.box_h <= mask_p->y2 ? g.box_h : mask_p->y2 - pos_y + 1; - - /*Set a pointer on VDB to the first pixel of the letter*/ - vdb_buf_tmp += ((pos_y - vdb->area.y1) * vdb_width) + pos_x - vdb->area.x1; - - /*If the letter is partially out of mask the move there on VDB*/ - vdb_buf_tmp += (row_start * vdb_width) + col_start; - - /*Move on the map too*/ - uint32_t bit_ofs = (row_start * width_bit) + (col_start * g.bpp); - map_p += bit_ofs >> 3; - - uint8_t letter_px; - lv_opa_t px_opa; - uint16_t col_bit; - col_bit = bit_ofs & 0x7; /* "& 0x7" equals to "% 8" just faster */ - - bool scr_transp = false; -#if LV_COLOR_DEPTH == 32 && LV_COLOR_SCREEN_TRANSP - scr_transp = disp->driver.screen_transp; -#endif - - for(row = row_start; row < row_end; row++) { - bitmask = bitmask_init >> col_bit; - for(col = col_start; col < col_end; col++) { - letter_px = (*map_p & bitmask) >> (8 - col_bit - g.bpp); - if(letter_px != 0) { - if(opa == LV_OPA_COVER) { - px_opa = g.bpp == 8 ? letter_px : bpp_opa_table[letter_px]; - } else { - px_opa = g.bpp == 8 ? (uint16_t)((uint16_t)letter_px * opa) >> 8 - : (uint16_t)((uint16_t)bpp_opa_table[letter_px] * opa) >> 8; - } - - if(disp->driver.set_px_cb) { - disp->driver.set_px_cb(&disp->driver, (uint8_t *)vdb->buf_act, vdb_width, - (col + pos_x) - vdb->area.x1, (row + pos_y) - vdb->area.y1, color, px_opa); - } else if(vdb_buf_tmp->full != color.full) { - if(px_opa > LV_OPA_MAX) - *vdb_buf_tmp = color; - else if(px_opa > LV_OPA_MIN) { - if(scr_transp == false) { - *vdb_buf_tmp = lv_color_mix(color, *vdb_buf_tmp, px_opa); - } else { -#if LV_COLOR_DEPTH == 32 && LV_COLOR_SCREEN_TRANSP - *vdb_buf_tmp = color_mix_2_alpha(*vdb_buf_tmp, (*vdb_buf_tmp).ch.alpha, color, px_opa); -#endif - } - } - } - } - - vdb_buf_tmp++; - - if(col_bit < 8 - g.bpp) { - col_bit += g.bpp; - bitmask = bitmask >> g.bpp; - } else { - col_bit = 0; - bitmask = bitmask_init; - map_p++; - } - } - col_bit += ((g.box_w - col_end) + col_start) * g.bpp; - - map_p += (col_bit >> 3); - col_bit = col_bit & 0x7; - vdb_buf_tmp += vdb_width - (col_end - col_start); /*Next row in VDB*/ - } -} - -/** - * Draw a color map to the display (image) - * @param cords_p coordinates the color map - * @param mask_p the map will drawn only on this area (truncated to VDB area) - * @param map_p pointer to a lv_color_t array - * @param opa opacity of the map - * @param chroma_keyed true: enable transparency of LV_IMG_LV_COLOR_TRANSP color pixels - * @param alpha_byte true: extra alpha byte is inserted for every pixel - * @param recolor mix the pixels with this color - * @param recolor_opa the intense of recoloring - */ -void lv_draw_map(const lv_area_t * cords_p, const lv_area_t * mask_p, const uint8_t * map_p, lv_opa_t opa, - bool chroma_key, bool alpha_byte, lv_color_t recolor, lv_opa_t recolor_opa) -{ - - if(opa < LV_OPA_MIN) return; - if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; - - lv_area_t masked_a; - bool union_ok; - - /*Get the union of map size and mask*/ - /* The mask is already truncated to the vdb size - * in 'lv_refr_area_with_vdb' function */ - union_ok = lv_area_intersect(&masked_a, cords_p, mask_p); - - /*If there are common part of the three area then draw to the vdb*/ - if(union_ok == false) return; - - /*The pixel size in byte is different if an alpha byte is added too*/ - uint8_t px_size_byte = alpha_byte ? LV_IMG_PX_SIZE_ALPHA_BYTE : sizeof(lv_color_t); - - /*If the map starts OUT of the masked area then calc. the first pixel*/ - lv_coord_t map_width = lv_area_get_width(cords_p); - if(cords_p->y1 < masked_a.y1) { - map_p += (uint32_t)map_width * ((masked_a.y1 - cords_p->y1)) * px_size_byte; - } - if(cords_p->x1 < masked_a.x1) { - map_p += (masked_a.x1 - cords_p->x1) * px_size_byte; - } - - lv_disp_t * disp = lv_refr_get_disp_refreshing(); - lv_disp_buf_t * vdb = lv_disp_get_buf(disp); - - /*Stores coordinates relative to the current VDB*/ - masked_a.x1 = masked_a.x1 - vdb->area.x1; - masked_a.y1 = masked_a.y1 - vdb->area.y1; - masked_a.x2 = masked_a.x2 - vdb->area.x1; - masked_a.y2 = masked_a.y2 - vdb->area.y1; - - lv_coord_t vdb_width = lv_area_get_width(&vdb->area); - lv_color_t * vdb_buf_tmp = vdb->buf_act; - vdb_buf_tmp += (uint32_t)vdb_width * masked_a.y1; /*Move to the first row*/ - vdb_buf_tmp += (uint32_t)masked_a.x1; /*Move to the first col*/ - - lv_coord_t row; - lv_coord_t map_useful_w = lv_area_get_width(&masked_a); - - bool scr_transp = false; -#if LV_COLOR_DEPTH == 32 && LV_COLOR_SCREEN_TRANSP - scr_transp = disp->driver.screen_transp; -#endif - - /*The simplest case just copy the pixels into the VDB*/ - if(chroma_key == false && alpha_byte == false && opa == LV_OPA_COVER && recolor_opa == LV_OPA_TRANSP) { - - /*Use the custom VDB write function is exists*/ - if(disp->driver.set_px_cb) { - lv_coord_t col; - for(row = masked_a.y1; row <= masked_a.y2; row++) { - for(col = 0; col < map_useful_w; col++) { - lv_color_t px_color = *((lv_color_t *)&map_p[(uint32_t)col * px_size_byte]); - disp->driver.set_px_cb(&disp->driver, (uint8_t *)vdb->buf_act, vdb_width, col + masked_a.x1, row, - px_color, opa); - } - map_p += map_width * px_size_byte; /*Next row on the map*/ - } - } - /*Normal native VDB*/ - else { - for(row = masked_a.y1; row <= masked_a.y2; row++) { -#if LV_USE_GPU - if(disp->driver.gpu_blend_cb == false) { - sw_mem_blend(vdb_buf_tmp, (lv_color_t *)map_p, map_useful_w, opa); - } else { - disp->driver.gpu_blend_cb(&disp->driver, vdb_buf_tmp, (lv_color_t *)map_p, map_useful_w, opa); - } -#else - sw_mem_blend(vdb_buf_tmp, (lv_color_t *)map_p, map_useful_w, opa); -#endif - map_p += map_width * px_size_byte; /*Next row on the map*/ - vdb_buf_tmp += vdb_width; /*Next row on the VDB*/ - } - } - } - - /*In the other cases every pixel need to be checked one-by-one*/ - else { - - lv_coord_t col; - lv_color_t last_img_px = LV_COLOR_BLACK; - lv_color_t recolored_px = lv_color_mix(recolor, last_img_px, recolor_opa); - for(row = masked_a.y1; row <= masked_a.y2; row++) { - for(col = 0; col < map_useful_w; col++) { - lv_opa_t opa_result = opa; - uint8_t * px_color_p = (uint8_t *)&map_p[(uint32_t)col * px_size_byte]; - lv_color_t px_color; - - /*Calculate with the pixel level alpha*/ - if(alpha_byte) { -#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1 - px_color.full = px_color_p[0]; -#elif LV_COLOR_DEPTH == 16 - /*Because of Alpha byte 16 bit color can start on odd address which can cause - * crash*/ - px_color.full = px_color_p[0] + (px_color_p[1] << 8); -#elif LV_COLOR_DEPTH == 32 - px_color = *((lv_color_t *)px_color_p); -#endif - lv_opa_t px_opa = *(px_color_p + LV_IMG_PX_SIZE_ALPHA_BYTE - 1); - if(px_opa == LV_OPA_TRANSP) - continue; - else if(px_opa != LV_OPA_COVER) - opa_result = (uint32_t)((uint32_t)px_opa * opa_result) >> 8; - } else { - px_color = *((lv_color_t *)px_color_p); - } - - /*Handle chroma key*/ - if(chroma_key && px_color.full == disp->driver.color_chroma_key.full) continue; - - /*Re-color the pixel if required*/ - if(recolor_opa != LV_OPA_TRANSP) { - if(last_img_px.full != px_color.full) { /*Minor acceleration: calculate only for - new colors (save the last)*/ - last_img_px = px_color; - recolored_px = lv_color_mix(recolor, last_img_px, recolor_opa); - } - /*Handle custom VDB write is present*/ - if(disp->driver.set_px_cb) { - disp->driver.set_px_cb(&disp->driver, (uint8_t *)vdb->buf_act, vdb_width, col + masked_a.x1, - row, recolored_px, opa_result); - } - /*Normal native VDB write*/ - else { - if(opa_result == LV_OPA_COVER) - vdb_buf_tmp[col].full = recolored_px.full; - else - vdb_buf_tmp[col] = lv_color_mix(recolored_px, vdb_buf_tmp[col], opa_result); - } - } else { - /*Handle custom VDB write is present*/ - if(disp->driver.set_px_cb) { - disp->driver.set_px_cb(&disp->driver, (uint8_t *)vdb->buf_act, vdb_width, col + masked_a.x1, - row, px_color, opa_result); - } - /*Normal native VDB write*/ - else { - - if(opa_result == LV_OPA_COVER) - vdb_buf_tmp[col] = px_color; - else { - if(scr_transp == false) { - vdb_buf_tmp[col] = lv_color_mix(px_color, vdb_buf_tmp[col], opa_result); - } else { -#if LV_COLOR_DEPTH == 32 && LV_COLOR_SCREEN_TRANSP - vdb_buf_tmp[col] = color_mix_2_alpha(vdb_buf_tmp[col], vdb_buf_tmp[col].ch.alpha, - px_color, opa_result); -#endif - } - } - } - } - } - - map_p += map_width * px_size_byte; /*Next row on the map*/ - vdb_buf_tmp += vdb_width; /*Next row on the VDB*/ - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Blend pixels to destination memory using opacity - * @param dest a memory address. Copy 'src' here. - * @param src pointer to pixel map. Copy it to 'dest'. - * @param length number of pixels in 'src' - * @param opa opacity (0, LV_OPA_TRANSP: transparent ... 255, LV_OPA_COVER, fully cover) - */ -static void sw_mem_blend(lv_color_t * dest, const lv_color_t * src, uint32_t length, lv_opa_t opa) -{ - if(opa == LV_OPA_COVER) { - memcpy(dest, src, length * sizeof(lv_color_t)); - } else { - uint32_t col; - for(col = 0; col < length; col++) { - dest[col] = lv_color_mix(src[col], dest[col], opa); - } - } -} - -/** - * Fill an area with a color - * @param mem a memory address. Considered to a rectangular window according to 'mem_area' - * @param mem_width width of the 'mem' buffer - * @param fill_area coordinates of an area to fill. Relative to 'mem_area'. - * @param color fill color - * @param opa opacity (0, LV_OPA_TRANSP: transparent ... 255, LV_OPA_COVER, fully cover) - */ -static void sw_color_fill(lv_color_t * mem, lv_coord_t mem_width, const lv_area_t * fill_area, lv_color_t color, - lv_opa_t opa) -{ - /*Set all row in vdb to the given color*/ - lv_coord_t row; - lv_coord_t col; - - lv_disp_t * disp = lv_refr_get_disp_refreshing(); - if(disp->driver.set_px_cb) { - for(col = fill_area->x1; col <= fill_area->x2; col++) { - for(row = fill_area->y1; row <= fill_area->y2; row++) { - disp->driver.set_px_cb(&disp->driver, (uint8_t *)mem, mem_width, col, row, color, opa); - } - } - } else { - mem += fill_area->y1 * mem_width; /*Go to the first row*/ - - /*Run simpler function without opacity*/ - if(opa == LV_OPA_COVER) { - - /*Fill the first row with 'color'*/ - for(col = fill_area->x1; col <= fill_area->x2; col++) { - mem[col] = color; - } - - /*Copy the first row to all other rows*/ - lv_color_t * mem_first = &mem[fill_area->x1]; - lv_coord_t copy_size = (fill_area->x2 - fill_area->x1 + 1) * sizeof(lv_color_t); - mem += mem_width; - - for(row = fill_area->y1 + 1; row <= fill_area->y2; row++) { - memcpy(&mem[fill_area->x1], mem_first, copy_size); - mem += mem_width; - } - } - /*Calculate with alpha too*/ - else { - bool scr_transp = false; -#if LV_COLOR_DEPTH == 32 && LV_COLOR_SCREEN_TRANSP - scr_transp = disp->driver.screen_transp; -#endif - - lv_color_t bg_tmp = LV_COLOR_BLACK; - lv_color_t opa_tmp = lv_color_mix(color, bg_tmp, opa); - for(row = fill_area->y1; row <= fill_area->y2; row++) { - for(col = fill_area->x1; col <= fill_area->x2; col++) { - if(scr_transp == false) { - /*If the bg color changed recalculate the result color*/ - if(mem[col].full != bg_tmp.full) { - bg_tmp = mem[col]; - opa_tmp = lv_color_mix(color, bg_tmp, opa); - } - - mem[col] = opa_tmp; - - } else { -#if LV_COLOR_DEPTH == 32 && LV_COLOR_SCREEN_TRANSP - mem[col] = color_mix_2_alpha(mem[col], mem[col].ch.alpha, color, opa); -#endif - } - } - mem += mem_width; - } - } - } -} - -#if LV_COLOR_DEPTH == 32 && LV_COLOR_SCREEN_TRANSP -/** - * Mix two colors. Both color can have alpha value. It requires ARGB888 colors. - * @param bg_color background color - * @param bg_opa alpha of the background color - * @param fg_color foreground color - * @param fg_opa alpha of the foreground color - * @return the mixed color. the alpha channel (color.alpha) contains the result alpha - */ -static inline lv_color_t color_mix_2_alpha(lv_color_t bg_color, lv_opa_t bg_opa, lv_color_t fg_color, lv_opa_t fg_opa) -{ - /* Pick the foreground if it's fully opaque or the Background is fully transparent*/ - if(fg_opa > LV_OPA_MAX || bg_opa <= LV_OPA_MIN) { - fg_color.ch.alpha = fg_opa; - return fg_color; - } - /*Transparent foreground: use the Background*/ - else if(fg_opa <= LV_OPA_MIN) { - return bg_color; - } - /*Opaque background: use simple mix*/ - else if(bg_opa >= LV_OPA_MAX) { - return lv_color_mix(fg_color, bg_color, fg_opa); - } - /*Both colors have alpha. Expensive calculation need to be applied*/ - else { - /*Save the parameters and the result. If they will be asked again don't compute again*/ - static lv_opa_t fg_opa_save = 0; - static lv_opa_t bg_opa_save = 0; - static lv_color_t fg_color_save = {{0}}; - static lv_color_t bg_color_save = {{0}}; - static lv_color_t c = {{0}}; - - if(fg_opa != fg_opa_save || bg_opa != bg_opa_save || fg_color.full != fg_color_save.full || - bg_color.full != bg_color_save.full) { - fg_opa_save = fg_opa; - bg_opa_save = bg_opa; - fg_color_save.full = fg_color.full; - bg_color_save.full = bg_color.full; - /*Info: - * https://en.wikipedia.org/wiki/Alpha_compositing#Analytical_derivation_of_the_over_operator*/ - lv_opa_t alpha_res = 255 - ((uint16_t)((uint16_t)(255 - fg_opa) * (255 - bg_opa)) >> 8); - if(alpha_res == 0) { - while(1) - ; - } - lv_opa_t ratio = (uint16_t)((uint16_t)fg_opa * 255) / alpha_res; - c = lv_color_mix(fg_color, bg_color, ratio); - c.ch.alpha = alpha_res; - } - return c; - } -} -#endif diff --git a/src/lv_draw/lv_draw_basic.h b/src/lv_draw/lv_draw_basic.h deleted file mode 100644 index 266b0c6cc..000000000 --- a/src/lv_draw/lv_draw_basic.h +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @file lv_draw_basic.h - * - */ - -#ifndef LV_DRAW_BASIC_H -#define LV_DRAW_BASIC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include "../lv_font/lv_font.h" -#include "../lv_misc/lv_color.h" -#include "../lv_misc/lv_area.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_draw_px(lv_coord_t x, lv_coord_t y, const lv_area_t * mask_p, lv_color_t color, lv_opa_t opa); -/** - * Fill an area in the Virtual Display Buffer - * @param cords_p coordinates of the area to fill - * @param mask_p fill only o this mask - * @param color fill color - * @param opa opacity of the area (0..255) - */ -void lv_draw_fill(const lv_area_t * cords_p, const lv_area_t * mask_p, lv_color_t color, lv_opa_t opa); - -/** - * Draw a letter in the Virtual Display Buffer - * @param pos_p left-top coordinate of the latter - * @param mask_p the letter will be drawn only on this area - * @param font_p pointer to font - * @param letter a letter to draw - * @param color color of letter - * @param opa opacity of letter (0..255) - */ -void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * mask_p, const lv_font_t * font_p, uint32_t letter, - lv_color_t color, lv_opa_t opa); - -/** - * Draw a color map to the display (image) - * @param cords_p coordinates the color map - * @param mask_p the map will drawn only on this area (truncated to VDB area) - * @param map_p pointer to a lv_color_t array - * @param opa opacity of the map - * @param chroma_keyed true: enable transparency of LV_IMG_LV_COLOR_TRANSP color pixels - * @param alpha_byte true: extra alpha byte is inserted for every pixel - * @param recolor mix the pixels with this color - * @param recolor_opa the intense of recoloring - */ -void lv_draw_map(const lv_area_t * cords_p, const lv_area_t * mask_p, const uint8_t * map_p, lv_opa_t opa, - bool chroma_key, bool alpha_byte, lv_color_t recolor, lv_opa_t recolor_opa); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_DRAW_BASIC_H*/ diff --git a/src/lv_draw/lv_draw_blend.c b/src/lv_draw/lv_draw_blend.c new file mode 100644 index 000000000..7df70c477 --- /dev/null +++ b/src/lv_draw/lv_draw_blend.c @@ -0,0 +1,775 @@ +/** + * @file lv_draw_blend.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_blend.h" +#include "lv_img_decoder.h" +#include "../lv_misc/lv_math.h" +#include "../lv_hal/lv_hal_disp.h" +#include "../lv_core/lv_refr.h" + +/********************* + * DEFINES + *********************/ +#define FILL_DIRECT_LEN 32 +#define FILL_DIRECT_MASK 0x1F +#define GPU_WIDTH_LIMIT 32 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +static void fill_set_px(const lv_area_t * disp_area, lv_color_t * disp_buf, const lv_area_t * draw_area, + lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_draw_mask_res_t mask_res); + +static void fill_normal(const lv_area_t * disp_area, lv_color_t * disp_buf, const lv_area_t * draw_area, + lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_draw_mask_res_t mask_res); + +static void fill_blended(const lv_area_t * disp_area, lv_color_t * disp_buf, const lv_area_t * draw_area, + lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_draw_mask_res_t mask_res, lv_blend_mode_t mode); + +static void map_set_px(const lv_area_t * disp_area, lv_color_t * disp_buf, const lv_area_t * draw_area, + const lv_area_t * map_area, const lv_color_t * map_buf, lv_opa_t opa, + const lv_opa_t * mask, lv_draw_mask_res_t mask_res); + +static void map_normal(const lv_area_t * disp_area, lv_color_t * disp_buf, const lv_area_t * draw_area, + const lv_area_t * map_area, const lv_color_t * map_buf, lv_opa_t opa, + const lv_opa_t * mask, lv_draw_mask_res_t mask_res); + +static void map_blended(const lv_area_t * disp_area, lv_color_t * disp_buf, const lv_area_t * draw_area, + const lv_area_t * map_area, const lv_color_t * map_buf, lv_opa_t opa, + const lv_opa_t * mask, lv_draw_mask_res_t mask_res, lv_blend_mode_t mode); + +static inline lv_color_t color_blend_true_color_additive(lv_color_t fg, lv_color_t bg, lv_opa_t opa); +static inline lv_color_t color_blend_true_color_subtractive(lv_color_t fg, lv_color_t bg, lv_opa_t opa); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + + +/** + * + * @param disp_area + * @param clip_area already truncated to disp_arae + * @param fill_area + * @param disp_buf + * @param cf + * @param color + * @param mask + * @param mask_res + * @param opa + * @param mode + */ +void lv_blend_fill(const lv_area_t * clip_area, const lv_area_t * fill_area, + lv_color_t color, lv_opa_t * mask, lv_draw_mask_res_t mask_res, lv_opa_t opa, + lv_blend_mode_t mode) +{ + /*Do not draw transparent things*/ + if(opa < LV_OPA_MIN) return; + if(mask_res == LV_DRAW_MASK_RES_FULL_TRANSP) return; + + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + lv_disp_buf_t * vdb = lv_disp_get_buf(disp); + const lv_area_t * disp_area = &vdb->area; + lv_color_t * disp_buf = vdb->buf_act; + + + /* Get clipped fill area which is the real draw area. + * It is always the same or inside `fill_area` */ + lv_area_t draw_area; + bool is_common; + is_common = lv_area_intersect(&draw_area, clip_area, fill_area); + if(!is_common) return; + + /* Now `draw_area` has absolute coordinates. + * Make it relative to `disp_area` to simplify draw to `disp_buf`*/ + draw_area.x1 -= disp_area->x1; + draw_area.y1 -= disp_area->y1; + draw_area.x2 -= disp_area->x1; + draw_area.y2 -= disp_area->y1; + + /*Round the values in the mask if anti-aliasing is disabled*/ + if(mask && disp->driver.antialiasing == 0) { + lv_coord_t mask_w = lv_area_get_width(&draw_area); + lv_coord_t i; + for (i = 0; i < mask_w; i++) mask[i] = mask[i] > 128 ? LV_OPA_COVER : LV_OPA_TRANSP; + } + + if(disp->driver.set_px_cb) { + fill_set_px(disp_area, disp_buf, &draw_area, color, opa, mask, mask_res); + } + else if(mode == LV_BLEND_MODE_NORMAL) { + fill_normal(disp_area, disp_buf, &draw_area, color, opa, mask, mask_res); + } + else { + fill_blended(disp_area, disp_buf, &draw_area, color, opa, mask, mask_res, mode); + } +} + + +void lv_blend_map(const lv_area_t * clip_area, const lv_area_t * map_area, const lv_color_t * map_buf, + lv_opa_t * mask, lv_draw_mask_res_t mask_res, + lv_opa_t opa, lv_blend_mode_t mode) +{ + /*Do not draw transparent things*/ + if(opa < LV_OPA_MIN) return; + if(mask_res == LV_DRAW_MASK_RES_FULL_TRANSP) return; + + /* Get clipped fill area which is the real draw area. + * It is always the same or inside `fill_area` */ + lv_area_t draw_area; + bool is_common; + is_common = lv_area_intersect(&draw_area, clip_area, map_area); + if(!is_common) return; + + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + lv_disp_buf_t * vdb = lv_disp_get_buf(disp); + const lv_area_t * disp_area = &vdb->area; + lv_color_t * disp_buf = vdb->buf_act; + + /* Now `draw_area` has absolute coordinates. + * Make it relative to `disp_area` to simplify draw to `disp_buf`*/ + draw_area.x1 -= disp_area->x1; + draw_area.y1 -= disp_area->y1; + draw_area.x2 -= disp_area->x1; + draw_area.y2 -= disp_area->y1; + + /*Round the values in the mask if anti-aliasing is disabled*/ + if(mask && disp->driver.antialiasing == 0) { + lv_coord_t mask_w = lv_area_get_width(&draw_area); + lv_coord_t i; + for (i = 0; i < mask_w; i++) mask[i] = mask[i] > 128 ? LV_OPA_COVER : LV_OPA_TRANSP; + } + if(disp->driver.set_px_cb) { + map_set_px(disp_area, disp_buf, &draw_area, map_area, map_buf, opa, mask, mask_res); + } + else if(mode == LV_BLEND_MODE_NORMAL) { + map_normal(disp_area, disp_buf, &draw_area, map_area, map_buf, opa, mask, mask_res); + } else { + map_blended(disp_area, disp_buf, &draw_area, map_area, map_buf, opa, mask, mask_res, mode); + } +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static void fill_set_px(const lv_area_t * disp_area, lv_color_t * disp_buf, const lv_area_t * draw_area, + lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_draw_mask_res_t mask_res) +{ + + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + + /*Get the width of the `disp_area` it will be used to go to the next line*/ + lv_coord_t disp_w = lv_area_get_width(disp_area); + + lv_coord_t x; + lv_coord_t y; + + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) { + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + disp->driver.set_px_cb(&disp->driver, (void*)disp_buf, disp_w, x, y, color, opa); + } + } + } else { + /* The mask is relative to the clipped area. + * In the cycles below mask will be indexed from `draw_area.x1` + * but it corresponds to zero index. So prepare `mask_tmp` accordingly. */ + const lv_opa_t * mask_tmp = mask - draw_area->x1; + + /*Get the width of the `draw_area` it will be used to go to the next line of the mask*/ + lv_coord_t draw_area_w = lv_area_get_width(draw_area); + + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + disp->driver.set_px_cb(&disp->driver, (void*)disp_buf, disp_w, x, y, color, (uint16_t)((uint16_t)opa * mask_tmp[x]) >> 8); + } + mask_tmp += draw_area_w; + } + } +} + +static void fill_normal(const lv_area_t * disp_area, lv_color_t * disp_buf, const lv_area_t * draw_area, + lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_draw_mask_res_t mask_res) +{ + + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + + /*Get the width of the `disp_area` it will be used to go to the next line*/ + lv_coord_t disp_w = lv_area_get_width(disp_area); + + /*Get the width of the `draw_area` it will be used to go to the next line of the mask*/ + lv_coord_t draw_area_w = lv_area_get_width(draw_area); + + /*Create a temp. disp_buf which always point to current line to draw*/ + lv_color_t * disp_buf_tmp = disp_buf + disp_w * draw_area->y1; + + lv_coord_t x; + lv_coord_t y; + + /*Simple fill (maybe with opacity), no masking*/ + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) { + if(opa > LV_OPA_MAX) { + lv_color_t * disp_buf_tmp_ori = disp_buf_tmp; + +#if LV_USE_GPU + if(disp->driver.gpu_fill_cb && draw_area_w > GPU_WIDTH_LIMIT) { + disp->driver.gpu_fill_cb(&disp->driver, disp_buf, disp_w, draw_area, color); + return; + } +#endif + + /*Fill the first line. Use `memcpy` because it's faster then simple value assignment*/ + /*Set the first pixels manually*/ + lv_coord_t direct_fill_end = LV_MATH_MIN(draw_area->x2, draw_area->x1 + FILL_DIRECT_LEN + (draw_area_w & FILL_DIRECT_MASK) - 1); + for(x = draw_area->x1; x <= direct_fill_end ; x++) { + disp_buf_tmp[x].full = color.full; + } + + for(; x <= draw_area->x2; x += FILL_DIRECT_LEN) { + memcpy(&disp_buf_tmp[x], &disp_buf_tmp[draw_area->x1], FILL_DIRECT_LEN * sizeof(lv_color_t)); + } + + disp_buf_tmp += disp_w; + + for(y = draw_area->y1 + 1; y <= draw_area->y2; y++) { + memcpy(&disp_buf_tmp[draw_area->x1], &disp_buf_tmp_ori[draw_area->x1], draw_area_w * sizeof(lv_color_t)); + disp_buf_tmp += disp_w; + } + } + else { + +#if LV_USE_GPU + if(disp->driver.gpu_blend_cb && draw_area_w > GPU_WIDTH_LIMIT) { + static lv_color_t blend_buf[LV_HOR_RES_MAX]; + for(x = 0; x < draw_area_w ; x++) blend_buf[x].full = color.full; + + for(y = draw_area->y1; y <= draw_area->y2; y++) { + disp->driver.gpu_blend_cb(&disp->driver, &disp_buf_tmp[draw_area->x1], blend_buf, draw_area_w, opa); + disp_buf_tmp += disp_w; + } + return; + } +#endif + lv_color_t last_dest_color = LV_COLOR_BLACK; + lv_color_t last_res_color = lv_color_mix(color, last_dest_color, opa); + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + if(last_dest_color.full != disp_buf_tmp[x].full) { + last_dest_color = disp_buf_tmp[x]; + +#if LV_COLOR_SCREEN_TRANSP + if(disp->driver.screen_transp) { + lv_color_mix_with_alpha(disp_buf_tmp[x], disp_buf_tmp[x].ch.alpha, color, opa, &last_res_color, &last_res_color.ch.alpha); + } else +#endif + { + last_res_color = lv_color_mix(color, disp_buf_tmp[x], opa); + } + } + disp_buf_tmp[x] = last_res_color; + } + disp_buf_tmp += disp_w; + } + } + } + /*Masked*/ + else { + /* The mask is relative to the clipped area. + * In the cycles below mask will be indexed from `draw_area.x1` + * but it corresponds to zero index. So prepare `mask_tmp` accordingly. */ + const lv_opa_t * mask_tmp = mask - draw_area->x1; + + /*Buffer the result color to avoid recalculating the same color*/ + lv_color_t last_dest_color; + lv_color_t last_res_color; + lv_opa_t last_mask = LV_OPA_TRANSP; + last_dest_color.full = disp_buf_tmp[0].full; + last_res_color.full = disp_buf_tmp[0].full; + + /*Only the mask matters*/ + if(opa > LV_OPA_MAX) { + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + if(mask_tmp[x] == 0) continue; + if(mask_tmp[x] != last_mask || last_dest_color.full != disp_buf_tmp[x].full) + { +#if LV_COLOR_SCREEN_TRANSP + if(disp->driver.screen_transp) { + lv_color_mix_with_alpha(disp_buf_tmp[x], disp_buf_tmp[x].ch.alpha, color, mask_tmp[x], &last_res_color, &last_res_color.ch.alpha); + } else +#endif + { + if(mask_tmp[x] > LV_OPA_MAX) last_res_color = color; + else if(mask_tmp[x] < LV_OPA_MIN) last_res_color = disp_buf_tmp[x]; + else if(disp_buf_tmp[x].full == color.full) last_res_color = color; + else last_res_color = lv_color_mix(color, disp_buf_tmp[x], mask_tmp[x]); + } + last_mask = mask_tmp[x]; + last_dest_color.full = disp_buf_tmp[x].full; + } + disp_buf_tmp[x] = last_res_color; + } + disp_buf_tmp += disp_w; + mask_tmp += draw_area_w; + } + } + /*Handle opa and mask values too*/ + else { + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + if(mask_tmp[x] == 0) continue; + if(mask_tmp[x] != last_mask || last_dest_color.full != disp_buf_tmp[x].full) { + lv_opa_t opa_tmp = (uint16_t)((uint16_t)mask_tmp[x] * opa) >> 8; +#if LV_COLOR_SCREEN_TRANSP + if(disp->driver.screen_transp) { + lv_color_mix_with_alpha(disp_buf_tmp[x], disp_buf_tmp[x].ch.alpha, color, opa_tmp, &last_res_color, &last_res_color.ch.alpha); + } else +#endif + { + if(opa_tmp > LV_OPA_MAX) last_res_color = lv_color_mix(color, disp_buf_tmp[x], mask_tmp[x]); + else if(opa_tmp < LV_OPA_MIN) last_res_color = disp_buf_tmp[x]; + else last_res_color = lv_color_mix(color, disp_buf_tmp[x],opa_tmp); + } + last_mask = mask_tmp[x]; + last_dest_color.full = disp_buf_tmp[x].full; + } + disp_buf_tmp[x] = last_res_color; + } + disp_buf_tmp += disp_w; + mask_tmp += draw_area_w; + } + } + } +} + + +static void fill_blended(const lv_area_t * disp_area, lv_color_t * disp_buf, const lv_area_t * draw_area, + lv_color_t color, lv_opa_t opa, + const lv_opa_t * mask, lv_draw_mask_res_t mask_res, lv_blend_mode_t mode) +{ + /*Get the width of the `disp_area` it will be used to go to the next line*/ + lv_coord_t disp_w = lv_area_get_width(disp_area); + + /*Create a temp. disp_buf which always point to current line to draw*/ + lv_color_t * disp_buf_tmp = disp_buf + disp_w * draw_area->y1; + + + lv_color_t (*blend_fp)(lv_color_t, lv_color_t, lv_opa_t); + switch (mode) { + case LV_BLEND_MODE_ADDITIVE: + blend_fp = color_blend_true_color_additive; + break; + case LV_BLEND_MODE_SUBTRACTIVE: + blend_fp = color_blend_true_color_subtractive; + break; + default: + LV_LOG_WARN("fill_blended: unsupported blend mode"); + return; + break; + } + + lv_coord_t x; + lv_coord_t y; + + /*Simple fill (maybe with opacity), no masking*/ + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) { + lv_color_t last_dest_color = LV_COLOR_BLACK; + lv_color_t last_res_color = lv_color_mix(color, last_dest_color, opa); + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + if(last_dest_color.full != disp_buf_tmp[x].full) { + last_dest_color = disp_buf_tmp[x]; + last_res_color = blend_fp(color, disp_buf_tmp[x], opa); + } + disp_buf_tmp[x] = last_res_color; + } + disp_buf_tmp += disp_w; + } + } + /*Masked*/ + else { + /*Get the width of the `draw_area` it will be used to go to the next line of the mask*/ + lv_coord_t draw_area_w = lv_area_get_width(draw_area); + + /* The mask is relative to the clipped area. + * In the cycles below mask will be indexed from `draw_area.x1` + * but it corresponds to zero index. So prepare `mask_tmp` accordingly. */ + const lv_opa_t * mask_tmp = mask - draw_area->x1; + + /*Buffer the result color to avoid recalculating the same color*/ + lv_color_t last_dest_color; + lv_color_t last_res_color; + lv_opa_t last_mask = LV_OPA_TRANSP; + last_dest_color.full = disp_buf_tmp[0].full; + last_res_color.full = disp_buf_tmp[0].full; + + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + if(mask_tmp[x] == 0) continue; + if(mask_tmp[x] != last_mask || last_dest_color.full != disp_buf_tmp[x].full) { + lv_opa_t opa_tmp = mask_tmp[x] >= LV_OPA_MAX ? opa : (uint16_t)((uint16_t)mask_tmp[x] * opa) >> 8; + + last_res_color = blend_fp(color, disp_buf_tmp[x], opa_tmp); + last_mask = mask_tmp[x]; + last_dest_color.full = disp_buf_tmp[x].full; + } + disp_buf_tmp[x] = last_res_color; + } + disp_buf_tmp += disp_w; + mask_tmp += draw_area_w; + } + } +} + +static void map_set_px(const lv_area_t * disp_area, lv_color_t * disp_buf, const lv_area_t * draw_area, + const lv_area_t * map_area, const lv_color_t * map_buf, lv_opa_t opa, + const lv_opa_t * mask, lv_draw_mask_res_t mask_res) + +{ + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + + /*Get the width of the `disp_area` it will be used to go to the next line*/ + lv_coord_t disp_w = lv_area_get_width(disp_area); + + /*Get the width of the `draw_area` it will be used to go to the next line of the mask*/ + lv_coord_t draw_area_w = lv_area_get_width(draw_area); + + /*Get the width of the `mask_area` it will be used to go to the next line*/ + lv_coord_t map_w = lv_area_get_width(map_area); + + /*Create a temp. map_buf which always point to current line to draw*/ + const lv_color_t * map_buf_tmp = map_buf + map_w * (draw_area->y1 - (map_area->y1 - disp_area->y1)); + + map_buf_tmp += (draw_area->x1 - (map_area->x1 - disp_area->x1)); + map_buf_tmp -= draw_area->x1; + lv_coord_t x; + lv_coord_t y; + + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) { + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + disp->driver.set_px_cb(&disp->driver, (void*)disp_buf, disp_w, x, y, map_buf_tmp[x], opa); + } + map_buf_tmp += map_w; + } + } else { + /* The mask is relative to the clipped area. + * In the cycles below mask will be indexed from `draw_area.x1` + * but it corresponds to zero index. So prepare `mask_tmp` accordingly. */ + const lv_opa_t * mask_tmp = mask - draw_area->x1; + + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + disp->driver.set_px_cb(&disp->driver, (void*)disp_buf, disp_w, x, y, map_buf_tmp[x], (uint16_t)((uint16_t)opa * mask_tmp[x]) >> 8); + } + mask_tmp += draw_area_w; + map_buf_tmp += map_w; + } + } +} + + +static void map_normal(const lv_area_t * disp_area, lv_color_t * disp_buf, const lv_area_t * draw_area, + const lv_area_t * map_area, const lv_color_t * map_buf, lv_opa_t opa, + const lv_opa_t * mask, lv_draw_mask_res_t mask_res) +{ + + /*Get the width of the `disp_area` it will be used to go to the next line*/ + lv_coord_t disp_w = lv_area_get_width(disp_area); + + /*Get the width of the `draw_area` it will be used to go to the next line of the mask*/ + lv_coord_t draw_area_w = lv_area_get_width(draw_area); + + /*Get the width of the `mask_area` it will be used to go to the next line*/ + lv_coord_t map_w = lv_area_get_width(map_area); + + /*Create a temp. disp_buf which always point to current line to draw*/ + lv_color_t * disp_buf_tmp = disp_buf + disp_w * draw_area->y1; + + /*Create a temp. map_buf which always point to current line to draw*/ + const lv_color_t * map_buf_tmp = map_buf + map_w * (draw_area->y1 - (map_area->y1 - disp_area->y1)); + + +#if LV_COLOR_SCREEN_TRANSP + lv_opa_t opa_composed; +#endif + + lv_coord_t x; + lv_coord_t y; + + /*Simple fill (maybe with opacity), no masking*/ + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) { + /*Go to the first px of the row*/ + map_buf_tmp += (draw_area->x1 - (map_area->x1 - disp_area->x1)); +#if LV_USE_GPU + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + if(disp->driver.gpu_blend_cb && + ((draw_area_w > GPU_WIDTH_LIMIT * 4 && opa == LV_OPA_COVER) || + (draw_area_w > GPU_WIDTH_LIMIT && opa != LV_OPA_COVER))) { + for(y = draw_area->y1; y <= draw_area->y2; y++) { + disp->driver.gpu_blend_cb(&disp->driver, &disp_buf_tmp[draw_area->x1], map_buf_tmp, draw_area_w, opa); + disp_buf_tmp += disp_w; + map_buf_tmp += map_w; + } + return; + } +#endif + + if(opa > LV_OPA_MAX) { + for(y = draw_area->y1; y <= draw_area->y2; y++) { + memcpy(&disp_buf_tmp[draw_area->x1], map_buf_tmp, draw_area_w * sizeof(lv_color_t)); + disp_buf_tmp += disp_w; + map_buf_tmp += map_w; + } + } + else { + /*The map will be indexed from `draw_area->x1` so compensate it.*/ + map_buf_tmp -= draw_area->x1; + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { +#if LV_COLOR_SCREEN_TRANSP + if(disp->driver.screen_transp) { + lv_color_mix_with_alpha(disp_buf_tmp[x], disp_buf_tmp[x].ch.alpha, map_buf_tmp[x], opa, &disp_buf_tmp[x], &disp_buf_tmp[x].ch.alpha); + } else +#endif + { + disp_buf_tmp[x] = lv_color_mix(map_buf_tmp[x], disp_buf_tmp[x], opa); + } + } + disp_buf_tmp += disp_w; + map_buf_tmp += map_w; + } + } + } + /*Masked*/ + else { + /* The mask is relative to the clipped area. + * In the cycles below mask will be indexed from `draw_area.x1` + * but it corresponds to zero index. So prepare `mask_tmp` accordingly. */ + const lv_opa_t * mask_tmp = mask - draw_area->x1; + + /*Buffer the result color to avoid recalculating the same color*/ + lv_color_t res_color; + res_color.full = disp_buf_tmp[0].full; + + /*Only the mask matters*/ + if(opa > LV_OPA_MAX) { + /*Go to the first pixel of the row */ + map_buf_tmp += (draw_area->x1 - (map_area->x1 - disp_area->x1)); + map_buf_tmp -= draw_area->x1; + + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + if(mask_tmp[x] < LV_OPA_MIN) continue; +#if LV_COLOR_SCREEN_TRANSP + if(disp->driver.screen_transp) { + lv_color_mix_with_alpha(disp_buf_tmp[x], disp_buf_tmp[x].ch.alpha, map_buf_tmp[x], mask_tmp[x], &res_color, &opa_composed); + res_color.ch.alpha = opa_composed; + } else +#endif + { + if(mask_tmp[x] > LV_OPA_MAX) res_color = map_buf_tmp[x]; + else res_color = lv_color_mix(map_buf_tmp[x], disp_buf_tmp[x], mask_tmp[x]); + } + disp_buf_tmp[x] = res_color;//lv_color_mix(map_buf_tmp[x], disp_buf_tmp[x], mask_tmp[x]); + } + disp_buf_tmp += disp_w; + mask_tmp += draw_area_w; + map_buf_tmp += map_w; + } + } + /*Handle opa and mask values too*/ + else { + map_buf_tmp -= draw_area->x1; + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + if(mask_tmp[x] == 0) continue; + lv_opa_t opa_tmp = mask_tmp[x] >= LV_OPA_MAX ? opa : ((opa * mask_tmp[x]) >> 8); +#if LV_COLOR_SCREEN_TRANSP + if(disp->driver.screen_transp) { + lv_color_mix_with_alpha(disp_buf_tmp[x], disp_buf_tmp[x].ch.alpha, map_buf_tmp[x], opa_tmp, &disp_buf_tmp[x], &disp_buf_tmp[x].ch.alpha); + } else +#endif + { + disp_buf_tmp[x] = lv_color_mix(map_buf_tmp[x], disp_buf_tmp[x], opa_tmp); + } + } + disp_buf_tmp += disp_w; + mask_tmp += draw_area_w; + map_buf_tmp += map_w; + } + } + } +} + +static void map_blended(const lv_area_t * disp_area, lv_color_t * disp_buf, const lv_area_t * draw_area, + const lv_area_t * map_area, const lv_color_t * map_buf, lv_opa_t opa, + const lv_opa_t * mask, lv_draw_mask_res_t mask_res, lv_blend_mode_t mode) +{ + + /*Get the width of the `disp_area` it will be used to go to the next line*/ + lv_coord_t disp_w = lv_area_get_width(disp_area); + + /*Get the width of the `draw_area` it will be used to go to the next line of the mask*/ + lv_coord_t draw_area_w = lv_area_get_width(draw_area); + + /*Get the width of the `mask_area` it will be used to go to the next line*/ + lv_coord_t map_w = lv_area_get_width(map_area); + + /*Create a temp. disp_buf which always point to current line to draw*/ + lv_color_t * disp_buf_tmp = disp_buf + disp_w * draw_area->y1; + + /*Create a temp. map_buf which always point to current line to draw*/ + const lv_color_t * map_buf_tmp = map_buf + map_w * (draw_area->y1 - (map_area->y1 - disp_area->y1)); + + lv_color_t (*blend_fp)(lv_color_t, lv_color_t, lv_opa_t); + switch (mode) { + case LV_BLEND_MODE_ADDITIVE: + blend_fp = color_blend_true_color_additive; + break; + case LV_BLEND_MODE_SUBTRACTIVE: + blend_fp = color_blend_true_color_subtractive; + break; + default: + LV_LOG_WARN("fill_blended: unsupported blend mode"); + return; + break; + } + + lv_coord_t x; + lv_coord_t y; + + /*Simple fill (maybe with opacity), no masking*/ + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) { + /*Go to the first px of the row*/ + map_buf_tmp += (draw_area->x1 - (map_area->x1 - disp_area->x1)); + + /*The map will be indexed from `draw_area->x1` so compensate it.*/ + map_buf_tmp -= draw_area->x1; + + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + disp_buf_tmp[x] = blend_fp(map_buf_tmp[x], disp_buf_tmp[x], opa); + } + disp_buf_tmp += disp_w; + map_buf_tmp += map_w; + } + } + /*Masked*/ + else { + /* The mask is relative to the clipped area. + * In the cycles below mask will be indexed from `draw_area.x1` + * but it corresponds to zero index. So prepare `mask_tmp` accordingly. */ + const lv_opa_t * mask_tmp = mask - draw_area->x1; + + map_buf_tmp -= draw_area->x1; + for(y = draw_area->y1; y <= draw_area->y2; y++) { + for(x = draw_area->x1; x <= draw_area->x2; x++) { + if(mask_tmp[x] == 0) continue; + lv_opa_t opa_tmp = mask_tmp[x] >= LV_OPA_MAX ? opa : ((opa * mask_tmp[x]) >> 8); + disp_buf_tmp[x] = blend_fp(map_buf_tmp[x], disp_buf_tmp[x], opa_tmp); + } + disp_buf_tmp += disp_w; + mask_tmp += draw_area_w; + map_buf_tmp += map_w; + } + } +} + +static inline lv_color_t color_blend_true_color_additive(lv_color_t fg, lv_color_t bg, lv_opa_t opa) +{ + + if(opa <= LV_OPA_MIN) return bg; + + uint16_t tmp; + tmp = bg.ch.red + fg.ch.red; +#if LV_COLOR_DEPTH == 8 + fg.ch.red = LV_MATH_MIN(tmp, 7); +#elif LV_COLOR_DEPTH == 16 + fg.ch.red = LV_MATH_MIN(tmp, 31); +#elif LV_COLOR_DEPTH == 32 + fg.ch.red = LV_MATH_MIN(tmp, 255); +#endif + +#if LV_COLOR_DEPTH == 8 + fg.ch.green = LV_MATH_MIN(tmp, 7); +#elif LV_COLOR_DEPTH == 16 +#if LV_COLOR_16_SWAP == 0 + tmp = bg.ch.green + fg.ch.green; + fg.ch.green = LV_MATH_MIN(tmp, 63); +#else + tmp = (bg.ch.green_h << 3) + bg.ch.green_l + (fg.ch.green_h << 3) + fg.ch.green_l; + tmp = LV_MATH_MIN(tmp, 63); + fg.ch.green_h = tmp >> 3; + fg.ch.green_l = tmp & 0x7; +#endif + +#elif LV_COLOR_DEPTH == 32 + fg.ch.green = LV_MATH_MIN(tmp, 255); +#endif + + tmp = bg.ch.blue + fg.ch.blue; +#if LV_COLOR_DEPTH == 8 + fg.ch.blue = LV_MATH_MIN(tmp, 4); +#elif LV_COLOR_DEPTH == 16 + fg.ch.blue = LV_MATH_MIN(tmp, 31); +#elif LV_COLOR_DEPTH == 32 + fg.ch.blue = LV_MATH_MIN(tmp, 255); +#endif + + if(opa == LV_OPA_COVER) return fg; + + return lv_color_mix(fg, bg, opa); +} + +static inline lv_color_t color_blend_true_color_subtractive(lv_color_t fg, lv_color_t bg, lv_opa_t opa) +{ + + if(opa <= LV_OPA_MIN) return bg; + + int16_t tmp; + tmp = bg.ch.red - fg.ch.red; + fg.ch.red = LV_MATH_MAX(tmp, 0); + +#if LV_COLOR_16_SWAP == 0 + tmp = bg.ch.green - fg.ch.green; + fg.ch.green = LV_MATH_MAX(tmp, 0); +#else + tmp = (bg.ch.green_h << 3) + bg.ch.green_l + (fg.ch.green_h << 3) + fg.ch.green_l; + tmp = LV_MATH_MAX(tmp, 0); + fg.ch.green_h = tmp >> 3; + fg.ch.green_l = tmp & 0x7; +#endif + + tmp = bg.ch.blue - fg.ch.blue; + fg.ch.blue = LV_MATH_MAX(tmp, 0); + + if(opa == LV_OPA_COVER) return fg; + + return lv_color_mix(fg, bg, opa); +} diff --git a/src/lv_draw/lv_draw_blend.h b/src/lv_draw/lv_draw_blend.h new file mode 100644 index 000000000..c2ebe2849 --- /dev/null +++ b/src/lv_draw/lv_draw_blend.h @@ -0,0 +1,54 @@ +/** + * @file lv_draw_blend.h + * + */ + +#ifndef LV_DRAW_BLEND_H +#define LV_DRAW_BLEND_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../lv_misc/lv_color.h" +#include "../lv_misc/lv_area.h" +#include "lv_draw_mask.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ +enum { + LV_BLEND_MODE_NORMAL, + LV_BLEND_MODE_ADDITIVE, + LV_BLEND_MODE_SUBTRACTIVE, +}; + +typedef uint8_t lv_blend_mode_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +void lv_blend_fill(const lv_area_t * clip_area, const lv_area_t * fill_area, lv_color_t color, + lv_opa_t * mask, lv_draw_mask_res_t mask_res, lv_opa_t opa, lv_blend_mode_t mode); + + +void lv_blend_map(const lv_area_t * clip_area, const lv_area_t * map_area, const lv_color_t * map_buf, + lv_opa_t * mask, lv_draw_mask_res_t mask_res, lv_opa_t opa, lv_blend_mode_t mode); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_DRAW_BLEND_H*/ diff --git a/src/lv_draw/lv_draw_img.c b/src/lv_draw/lv_draw_img.c index 8b5048bf6..a52537bdb 100644 --- a/src/lv_draw/lv_draw_img.c +++ b/src/lv_draw/lv_draw_img.c @@ -8,7 +8,11 @@ *********************/ #include "lv_draw_img.h" #include "lv_img_cache.h" +#include "../lv_hal/lv_hal_disp.h" #include "../lv_misc/lv_log.h" +#include "../lv_core/lv_refr.h" +#include "../lv_misc/lv_mem.h" +#include "../lv_misc/lv_math.h" /********************* * DEFINES @@ -22,7 +26,10 @@ * STATIC PROTOTYPES **********************/ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mask, const void * src, - const lv_style_t * style, lv_opa_t opa_scale); + const lv_style_t * style, uint16_t angle, lv_point_t * pivot, uint16_t zoom, bool antialaias, lv_opa_t opa_scale); + +static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area, const uint8_t * map_p, lv_opa_t opa, + bool chroma_key, bool alpha_byte, const lv_style_t * style, uint16_t angle, lv_point_t * pivot, uint16_t zoom, bool antialaias); /********************** * STATIC VARIABLES @@ -42,348 +49,56 @@ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mas * @param mask the image will be drawn only in this area * @param src pointer to a lv_color_t array which contains the pixels of the image * @param style style of the image + * @param angle rotation angle of the image + * @param center rotation center of the image + * @param antialias anti-alias transformations (rotate, zoom) or not * @param opa_scale scale down all opacities by the factor */ void lv_draw_img(const lv_area_t * coords, const lv_area_t * mask, const void * src, const lv_style_t * style, - lv_opa_t opa_scale) + uint16_t angle, lv_point_t * center, uint16_t zoom, bool antialias, lv_opa_t opa_scale) { if(src == NULL) { LV_LOG_WARN("Image draw: src is NULL"); lv_draw_rect(coords, mask, &lv_style_plain, LV_OPA_COVER); - lv_draw_label(coords, mask, &lv_style_plain, LV_OPA_COVER, "No\ndata", LV_TXT_FLAG_NONE, NULL, -1, -1, NULL); + lv_draw_label(coords, mask, &lv_style_plain, LV_OPA_COVER, "No\ndata", LV_TXT_FLAG_NONE, NULL, NULL, NULL, LV_BIDI_DIR_LTR); return; } lv_res_t res; - res = lv_img_draw_core(coords, mask, src, style, opa_scale); + res = lv_img_draw_core(coords, mask, src, style, angle, center, zoom, antialias, opa_scale); if(res == LV_RES_INV) { LV_LOG_WARN("Image draw error"); lv_draw_rect(coords, mask, &lv_style_plain, LV_OPA_COVER); - lv_draw_label(coords, mask, &lv_style_plain, LV_OPA_COVER, "No\ndata", LV_TXT_FLAG_NONE, NULL, -1, -1, NULL); + lv_draw_label(coords, mask, &lv_style_plain, LV_OPA_COVER, "No\ndata", LV_TXT_FLAG_NONE, NULL, NULL, NULL, LV_BIDI_DIR_LTR); return; } } -/** - * Get the color of an image's pixel - * @param dsc an image descriptor - * @param x x coordinate of the point to get - * @param y x coordinate of the point to get - * @param style style of the image. In case of `LV_IMG_CF_ALPHA_1/2/4/8` `style->image.color` shows - * the color. Can be `NULL` but for `ALPHA` images black will be returned. In other cases it is not - * used. - * @return color of the point - */ -lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, const lv_style_t * style) -{ - lv_color_t p_color = LV_COLOR_BLACK; - if(x >= dsc->header.w) { - x = dsc->header.w - 1; - LV_LOG_WARN("lv_canvas_get_px: x is too large (out of canvas)"); - } else if(x < 0) { - x = 0; - LV_LOG_WARN("lv_canvas_get_px: x is < 0 (out of canvas)"); - } - - if(y >= dsc->header.h) { - y = dsc->header.h - 1; - LV_LOG_WARN("lv_canvas_get_px: y is too large (out of canvas)"); - } else if(y < 0) { - y = 0; - LV_LOG_WARN("lv_canvas_get_px: y is < 0 (out of canvas)"); - } - - uint8_t * buf_u8 = (uint8_t *)dsc->data; - - if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR || dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED || - dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { - uint8_t px_size = lv_img_color_format_get_px_size(dsc->header.cf) >> 3; - uint32_t px = dsc->header.w * y * px_size + x * px_size; - memcpy(&p_color, &buf_u8[px], sizeof(lv_color_t)); -#if LV_COLOR_SIZE == 32 - p_color.ch.alpha = 0xFF; /*Only the color should be get so use a deafult alpha value*/ -#endif - } else if(dsc->header.cf == LV_IMG_CF_INDEXED_1BIT) { - buf_u8 += 4 * 2; - uint8_t bit = x & 0x7; - x = x >> 3; - - /* Get the current pixel. - * dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned - * so the possible real width are 8, 16, 24 ...*/ - uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; - p_color.full = (buf_u8[px] & (1 << (7 - bit))) >> (7 - bit); - } else if(dsc->header.cf == LV_IMG_CF_INDEXED_2BIT) { - buf_u8 += 4 * 4; - uint8_t bit = (x & 0x3) * 2; - x = x >> 2; - - /* Get the current pixel. - * dsc->header.w + 3 means rounding up to 4 because the lines are byte aligned - * so the possible real width are 4, 8, 12 ...*/ - uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; - p_color.full = (buf_u8[px] & (3 << (6 - bit))) >> (6 - bit); - } else if(dsc->header.cf == LV_IMG_CF_INDEXED_4BIT) { - buf_u8 += 4 * 16; - uint8_t bit = (x & 0x1) * 4; - x = x >> 1; - - /* Get the current pixel. - * dsc->header.w + 1 means rounding up to 2 because the lines are byte aligned - * so the possible real width are 2, 4, 6 ...*/ - uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; - p_color.full = (buf_u8[px] & (0xF << (4 - bit))) >> (4 - bit); - } else if(dsc->header.cf == LV_IMG_CF_INDEXED_8BIT) { - buf_u8 += 4 * 256; - uint32_t px = dsc->header.w * y + x; - p_color.full = buf_u8[px]; - } else if(dsc->header.cf == LV_IMG_CF_ALPHA_1BIT || dsc->header.cf == LV_IMG_CF_ALPHA_2BIT || - dsc->header.cf == LV_IMG_CF_ALPHA_4BIT || dsc->header.cf == LV_IMG_CF_ALPHA_8BIT) { - if(style) - p_color = style->image.color; - else - p_color = LV_COLOR_BLACK; - } - return p_color; -} - -/** - * Get the alpha value of an image's pixel - * @param dsc pointer to an image descriptor - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @return alpha value of the point - */ -lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y) -{ - if(x >= dsc->header.w) { - x = dsc->header.w - 1; - LV_LOG_WARN("lv_canvas_get_px: x is too large (out of canvas)"); - } else if(x < 0) { - x = 0; - LV_LOG_WARN("lv_canvas_get_px: x is < 0 (out of canvas)"); - } - - if(y >= dsc->header.h) { - y = dsc->header.h - 1; - LV_LOG_WARN("lv_canvas_get_px: y is too large (out of canvas)"); - } else if(y < 0) { - y = 0; - LV_LOG_WARN("lv_canvas_get_px: y is < 0 (out of canvas)"); - } - - uint8_t * buf_u8 = (uint8_t *)dsc->data; - - if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { - uint32_t px = dsc->header.w * y * LV_IMG_PX_SIZE_ALPHA_BYTE + x * LV_IMG_PX_SIZE_ALPHA_BYTE; - return buf_u8[px + LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; - } else if(dsc->header.cf == LV_IMG_CF_ALPHA_1BIT) { - uint8_t bit = x & 0x7; - x = x >> 3; - - /* Get the current pixel. - * dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned - * so the possible real width are 8 ,16, 24 ...*/ - uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; - uint8_t px_opa = (buf_u8[px] & (1 << (7 - bit))) >> (7 - bit); - return px_opa ? LV_OPA_TRANSP : LV_OPA_COVER; - } else if(dsc->header.cf == LV_IMG_CF_ALPHA_2BIT) { - const uint8_t opa_table[4] = {0, 85, 170, 255}; /*Opacity mapping with bpp = 2*/ - - uint8_t bit = (x & 0x3) * 2; - x = x >> 2; - - /* Get the current pixel. - * dsc->header.w + 4 means rounding up to 8 because the lines are byte aligned - * so the possible real width are 4 ,8, 12 ...*/ - uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; - uint8_t px_opa = (buf_u8[px] & (3 << (6 - bit))) >> (6 - bit); - return opa_table[px_opa]; - } else if(dsc->header.cf == LV_IMG_CF_ALPHA_4BIT) { - const uint8_t opa_table[16] = {0, 17, 34, 51, /*Opacity mapping with bpp = 4*/ - 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255}; - - uint8_t bit = (x & 0x1) * 4; - x = x >> 1; - - /* Get the current pixel. - * dsc->header.w + 1 means rounding up to 8 because the lines are byte aligned - * so the possible real width are 2 ,4, 6 ...*/ - uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; - uint8_t px_opa = (buf_u8[px] & (0xF << (4 - bit))) >> (4 - bit); - return opa_table[px_opa]; - } else if(dsc->header.cf == LV_IMG_CF_ALPHA_8BIT) { - uint32_t px = dsc->header.w * y + x; - return buf_u8[px]; - } - - return LV_OPA_COVER; -} - -/** - * Set the color of a pixel of an image. The alpha channel won't be affected. - * @param dsc pointer to an image descriptor - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @param c color of the point - */ -void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c) -{ - uint8_t * buf_u8 = (uint8_t *)dsc->data; - - if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR || dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { - uint8_t px_size = lv_img_color_format_get_px_size(dsc->header.cf) >> 3; - uint32_t px = dsc->header.w * y * px_size + x * px_size; - memcpy(&buf_u8[px], &c, px_size); - } else if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { - uint8_t px_size = lv_img_color_format_get_px_size(dsc->header.cf) >> 3; - uint32_t px = dsc->header.w * y * px_size + x * px_size; - memcpy(&buf_u8[px], &c, px_size - 1); /*-1 to not overwrite the alpha value*/ - } else if(dsc->header.cf == LV_IMG_CF_INDEXED_1BIT) { - buf_u8 += sizeof(lv_color32_t) * 2; /*Skip the palette*/ - - uint8_t bit = x & 0x7; - x = x >> 3; - - /* Get the current pixel. - * dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned - * so the possible real width are 8 ,16, 24 ...*/ - uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; - buf_u8[px] = buf_u8[px] & ~(1 << (7 - bit)); - buf_u8[px] = buf_u8[px] | ((c.full & 0x1) << (7 - bit)); - } else if(dsc->header.cf == LV_IMG_CF_INDEXED_2BIT) { - buf_u8 += sizeof(lv_color32_t) * 4; /*Skip the palette*/ - uint8_t bit = (x & 0x3) * 2; - x = x >> 2; - - /* Get the current pixel. - * dsc->header.w + 3 means rounding up to 4 because the lines are byte aligned - * so the possible real width are 4, 8 ,12 ...*/ - uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; - - buf_u8[px] = buf_u8[px] & ~(3 << (6 - bit)); - buf_u8[px] = buf_u8[px] | ((c.full & 0x3) << (6 - bit)); - } else if(dsc->header.cf == LV_IMG_CF_INDEXED_4BIT) { - buf_u8 += sizeof(lv_color32_t) * 16; /*Skip the palette*/ - uint8_t bit = (x & 0x1) * 4; - x = x >> 1; - - /* Get the current pixel. - * dsc->header.w + 1 means rounding up to 2 because the lines are byte aligned - * so the possible real width are 2 ,4, 6 ...*/ - uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; - buf_u8[px] = buf_u8[px] & ~(0xF << (4 - bit)); - buf_u8[px] = buf_u8[px] | ((c.full & 0xF) << (4 - bit)); - } else if(dsc->header.cf == LV_IMG_CF_INDEXED_8BIT) { - buf_u8 += sizeof(lv_color32_t) * 256; /*Skip the palette*/ - uint32_t px = dsc->header.w * y + x; - buf_u8[px] = c.full; - } -} - -/** - * Set the alpha value of a pixel of an image. The color won't be affected - * @param dsc pointer to an image descriptor - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @param opa the desired opacity - */ -void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa) -{ - uint8_t * buf_u8 = (uint8_t *)dsc->data; - - if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { - uint8_t px_size = lv_img_color_format_get_px_size(dsc->header.cf) >> 3; - uint32_t px = dsc->header.w * y * px_size + x * px_size; - buf_u8[px + px_size - 1] = opa; - } else if(dsc->header.cf == LV_IMG_CF_ALPHA_1BIT) { - opa = opa >> 7; /*opa -> [0,1]*/ - uint8_t bit = x & 0x7; - x = x >> 3; - - /* Get the current pixel. - * dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned - * so the possible real width are 8 ,16, 24 ...*/ - uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; - buf_u8[px] = buf_u8[px] & ~(1 << (7 - bit)); - buf_u8[px] = buf_u8[px] | ((opa & 0x1) << (7 - bit)); - } else if(dsc->header.cf == LV_IMG_CF_ALPHA_2BIT) { - opa = opa >> 6; /*opa -> [0,3]*/ - uint8_t bit = (x & 0x3) * 2; - x = x >> 2; - - /* Get the current pixel. - * dsc->header.w + 4 means rounding up to 8 because the lines are byte aligned - * so the possible real width are 4 ,8, 12 ...*/ - uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; - buf_u8[px] = buf_u8[px] & ~(3 << (6 - bit)); - buf_u8[px] = buf_u8[px] | ((opa & 0x3) << (6 - bit)); - } else if(dsc->header.cf == LV_IMG_CF_ALPHA_4BIT) { - opa = opa >> 4; /*opa -> [0,15]*/ - uint8_t bit = (x & 0x1) * 4; - x = x >> 1; - - /* Get the current pixel. - * dsc->header.w + 1 means rounding up to 8 because the lines are byte aligned - * so the possible real width are 2 ,4, 6 ...*/ - uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; - buf_u8[px] = buf_u8[px] & ~(0xF << (4 - bit)); - buf_u8[px] = buf_u8[px] | ((opa & 0xF) << (4 - bit)); - } else if(dsc->header.cf == LV_IMG_CF_ALPHA_8BIT) { - uint32_t px = dsc->header.w * y + x; - buf_u8[px] = opa; - } -} - -/** - * Set the palette color of an indexed image. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` - * @param dsc pointer to an image descriptor - * @param id the palette color to set: - * - for `LV_IMG_CF_INDEXED1`: 0..1 - * - for `LV_IMG_CF_INDEXED2`: 0..3 - * - for `LV_IMG_CF_INDEXED4`: 0..15 - * - for `LV_IMG_CF_INDEXED8`: 0..255 - * @param c the color to set - */ -void lv_img_buf_set_palette(lv_img_dsc_t * dsc, uint8_t id, lv_color_t c) -{ - if((dsc->header.cf == LV_IMG_CF_ALPHA_1BIT && id > 1) || (dsc->header.cf == LV_IMG_CF_ALPHA_2BIT && id > 3) || - (dsc->header.cf == LV_IMG_CF_ALPHA_4BIT && id > 15) || (dsc->header.cf == LV_IMG_CF_ALPHA_8BIT)) { - LV_LOG_WARN("lv_img_buf_set_px_alpha: invalid 'id'"); - return; - } - - lv_color32_t c32; - c32.full = lv_color_to32(c); - uint8_t * buf = (uint8_t *)dsc->data; - memcpy(&buf[id * sizeof(c32)], &c32, sizeof(c32)); -} - /** * Get the pixel size of a color format in bits * @param cf a color format (`LV_IMG_CF_...`) * @return the pixel size in bits */ -uint8_t lv_img_color_format_get_px_size(lv_img_cf_t cf) +uint8_t lv_img_cf_get_px_size(lv_img_cf_t cf) { uint8_t px_size = 0; switch(cf) { - case LV_IMG_CF_UNKNOWN: - case LV_IMG_CF_RAW: px_size = 0; break; - case LV_IMG_CF_TRUE_COLOR: - case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: px_size = LV_COLOR_SIZE; break; - case LV_IMG_CF_TRUE_COLOR_ALPHA: px_size = LV_IMG_PX_SIZE_ALPHA_BYTE << 3; break; - case LV_IMG_CF_INDEXED_1BIT: - case LV_IMG_CF_ALPHA_1BIT: px_size = 1; break; - case LV_IMG_CF_INDEXED_2BIT: - case LV_IMG_CF_ALPHA_2BIT: px_size = 2; break; - case LV_IMG_CF_INDEXED_4BIT: - case LV_IMG_CF_ALPHA_4BIT: px_size = 4; break; - case LV_IMG_CF_INDEXED_8BIT: - case LV_IMG_CF_ALPHA_8BIT: px_size = 8; break; - default: px_size = 0; break; + case LV_IMG_CF_UNKNOWN: + case LV_IMG_CF_RAW: px_size = 0; break; + case LV_IMG_CF_TRUE_COLOR: + case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: px_size = LV_COLOR_SIZE; break; + case LV_IMG_CF_TRUE_COLOR_ALPHA: px_size = LV_IMG_PX_SIZE_ALPHA_BYTE << 3; break; + case LV_IMG_CF_INDEXED_1BIT: + case LV_IMG_CF_ALPHA_1BIT: px_size = 1; break; + case LV_IMG_CF_INDEXED_2BIT: + case LV_IMG_CF_ALPHA_2BIT: px_size = 2; break; + case LV_IMG_CF_INDEXED_4BIT: + case LV_IMG_CF_ALPHA_4BIT: px_size = 4; break; + case LV_IMG_CF_INDEXED_8BIT: + case LV_IMG_CF_ALPHA_8BIT: px_size = 8; break; + default: px_size = 0; break; } return px_size; @@ -394,18 +109,22 @@ uint8_t lv_img_color_format_get_px_size(lv_img_cf_t cf) * @param cf a color format (`LV_IMG_CF_...`) * @return true: chroma keyed; false: not chroma keyed */ -bool lv_img_color_format_is_chroma_keyed(lv_img_cf_t cf) +bool lv_img_cf_is_chroma_keyed(lv_img_cf_t cf) { bool is_chroma_keyed = false; switch(cf) { - case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: - case LV_IMG_CF_RAW_CHROMA_KEYED: - case LV_IMG_CF_INDEXED_1BIT: - case LV_IMG_CF_INDEXED_2BIT: - case LV_IMG_CF_INDEXED_4BIT: - case LV_IMG_CF_INDEXED_8BIT: is_chroma_keyed = true; break; - default: is_chroma_keyed = false; break; + case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: + case LV_IMG_CF_RAW_CHROMA_KEYED: +#if LV_INDEXED_CHROMA + case LV_IMG_CF_INDEXED_1BIT: + case LV_IMG_CF_INDEXED_2BIT: + case LV_IMG_CF_INDEXED_4BIT: + case LV_IMG_CF_INDEXED_8BIT: +#endif + is_chroma_keyed = true; break; + + default: is_chroma_keyed = false; break; } return is_chroma_keyed; @@ -416,18 +135,22 @@ bool lv_img_color_format_is_chroma_keyed(lv_img_cf_t cf) * @param cf a color format (`LV_IMG_CF_...`) * @return true: has alpha channel; false: doesn't have alpha channel */ -bool lv_img_color_format_has_alpha(lv_img_cf_t cf) +bool lv_img_cf_has_alpha(lv_img_cf_t cf) { bool has_alpha = false; switch(cf) { - case LV_IMG_CF_TRUE_COLOR_ALPHA: - case LV_IMG_CF_RAW_ALPHA: - case LV_IMG_CF_ALPHA_1BIT: - case LV_IMG_CF_ALPHA_2BIT: - case LV_IMG_CF_ALPHA_4BIT: - case LV_IMG_CF_ALPHA_8BIT: has_alpha = true; break; - default: has_alpha = false; break; + case LV_IMG_CF_TRUE_COLOR_ALPHA: + case LV_IMG_CF_RAW_ALPHA: + case LV_IMG_CF_INDEXED_1BIT: + case LV_IMG_CF_INDEXED_2BIT: + case LV_IMG_CF_INDEXED_4BIT: + case LV_IMG_CF_INDEXED_8BIT: + case LV_IMG_CF_ALPHA_1BIT: + case LV_IMG_CF_ALPHA_2BIT: + case LV_IMG_CF_ALPHA_4BIT: + case LV_IMG_CF_ALPHA_8BIT: has_alpha = true; break; + default: has_alpha = false; break; } return has_alpha; @@ -469,44 +192,96 @@ lv_img_src_t lv_img_src_get_type(const void * src) **********************/ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mask, const void * src, - const lv_style_t * style, lv_opa_t opa_scale) + const lv_style_t * style, uint16_t angle, lv_point_t * pivot, uint16_t zoom, bool antialias, lv_opa_t opa_scale) { - - lv_area_t mask_com; /*Common area of mask and coords*/ - bool union_ok; - union_ok = lv_area_intersect(&mask_com, mask, coords); - if(union_ok == false) { - return LV_RES_OK; /*Out of mask. There is nothing to draw so the image is drawn - successfully.*/ - } - lv_opa_t opa = - opa_scale == LV_OPA_COVER ? style->image.opa : (uint16_t)((uint16_t)style->image.opa * opa_scale) >> 8; + opa_scale == LV_OPA_COVER ? style->image.opa : (uint16_t)((uint16_t)style->image.opa * opa_scale) >> 8; lv_img_cache_entry_t * cdsc = lv_img_cache_open(src, style); if(cdsc == NULL) return LV_RES_INV; - bool chroma_keyed = lv_img_color_format_is_chroma_keyed(cdsc->dec_dsc.header.cf); - bool alpha_byte = lv_img_color_format_has_alpha(cdsc->dec_dsc.header.cf); + bool chroma_keyed = lv_img_cf_is_chroma_keyed(cdsc->dec_dsc.header.cf); + bool alpha_byte = lv_img_cf_has_alpha(cdsc->dec_dsc.header.cf); if(cdsc->dec_dsc.error_msg != NULL) { LV_LOG_WARN("Image draw error"); lv_draw_rect(coords, mask, &lv_style_plain, LV_OPA_COVER); - lv_draw_label(coords, mask, &lv_style_plain, LV_OPA_COVER, cdsc->dec_dsc.error_msg, LV_TXT_FLAG_NONE, NULL, -1, - -1, NULL); + lv_draw_label(coords, mask, &lv_style_plain, LV_OPA_COVER, cdsc->dec_dsc.error_msg, LV_TXT_FLAG_NONE, NULL, NULL, NULL, LV_BIDI_DIR_LTR); } /* The decoder open could open the image and gave the entire uncompressed image. * Just draw it!*/ else if(cdsc->dec_dsc.img_data) { - lv_draw_map(coords, mask, cdsc->dec_dsc.img_data, opa, chroma_keyed, alpha_byte, style->image.color, - style->image.intense); + lv_area_t map_area_rot; + lv_area_copy(&map_area_rot, coords); + if(angle || zoom != LV_IMG_ZOOM_NONE) { + /*Get the exact area which is required to show the rotated image*/ + lv_coord_t pivot_x = lv_area_get_width(coords) / 2 + coords->x1; + lv_coord_t pivot_y = lv_area_get_height(coords) / 2 + coords->y1; + + if (pivot){ + pivot_x = pivot->x + coords->x1; + pivot_y = pivot->y + coords->y1; + } + lv_coord_t w = lv_area_get_width(coords); + lv_coord_t w_zoom = (((w * zoom) >> 8) - w) / 2; + lv_coord_t h = lv_area_get_height(coords); + lv_coord_t h_zoom = (((h * zoom) >> 8) - h) / 2; + + lv_area_t norm; + norm.x1 = coords->x1 - pivot_x - w_zoom; + norm.y1 = coords->y1 - pivot_y - h_zoom; + norm.x2 = coords->x2 - pivot_x + w_zoom; + norm.y2 = coords->y2 - pivot_y + h_zoom; + + int16_t sinma = lv_trigo_sin(angle); + int16_t cosma = lv_trigo_sin(angle + 90); + + lv_point_t lt; + lv_point_t rt; + lv_point_t lb; + lv_point_t rb; + lt.x = ((cosma * norm.x1 - sinma * norm.y1) >> (LV_TRIGO_SHIFT)) + pivot_x; + lt.y = ((sinma * norm.x1 + cosma * norm.y1) >> (LV_TRIGO_SHIFT)) + pivot_y; + + rt.x = ((cosma * norm.x2 - sinma * norm.y1) >> (LV_TRIGO_SHIFT)) + pivot_x; + rt.y = ((sinma * norm.x2 + cosma * norm.y1) >> (LV_TRIGO_SHIFT)) + pivot_y; + + lb.x = ((cosma * norm.x1 - sinma * norm.y2) >> (LV_TRIGO_SHIFT)) + pivot_x; + lb.y = ((sinma * norm.x1 + cosma * norm.y2) >> (LV_TRIGO_SHIFT)) + pivot_y; + + rb.x = ((cosma * norm.x2 - sinma * norm.y2) >> (LV_TRIGO_SHIFT)) + pivot_x; + rb.y = ((sinma * norm.x2 + cosma * norm.y2) >> (LV_TRIGO_SHIFT)) + pivot_y; + + map_area_rot.x1 = LV_MATH_MIN(LV_MATH_MIN(LV_MATH_MIN(lb.x, lt.x), rb.x), rt.x); + map_area_rot.x2 = LV_MATH_MAX(LV_MATH_MAX(LV_MATH_MAX(lb.x, lt.x), rb.x), rt.x); + map_area_rot.y1 = LV_MATH_MIN(LV_MATH_MIN(LV_MATH_MIN(lb.y, lt.y), rb.y), rt.y); + map_area_rot.y2 = LV_MATH_MAX(LV_MATH_MAX(LV_MATH_MAX(lb.y, lt.y), rb.y), rt.y); + } + + lv_area_t mask_com; /*Common area of mask and coords*/ + bool union_ok; + union_ok = lv_area_intersect(&mask_com, mask, &map_area_rot); + if(union_ok == false) { + return LV_RES_OK; /*Out of mask. There is nothing to draw so the image is drawn + successfully.*/ + } + + lv_draw_map(coords, &mask_com, cdsc->dec_dsc.img_data, opa, chroma_keyed, alpha_byte, style, angle, pivot, zoom, antialias); } /* The whole uncompressed image is not available. Try to read it line-by-line*/ else { + lv_area_t mask_com; /*Common area of mask and coords*/ + bool union_ok; + union_ok = lv_area_intersect(&mask_com, mask, coords); + if(union_ok == false) { + return LV_RES_OK; /*Out of mask. There is nothing to draw so the image is drawn + successfully.*/ + } + lv_coord_t width = lv_area_get_width(&mask_com); - uint8_t * buf = lv_draw_get_buf(lv_area_get_width(&mask_com) * ((LV_COLOR_DEPTH >> 3) + 1)); /*+1 because of the possible alpha byte*/ + uint8_t * buf = lv_mem_buf_get(lv_area_get_width(&mask_com) * LV_IMG_PX_SIZE_ALPHA_BYTE); /*+1 because of the possible alpha byte*/ lv_area_t line; lv_area_copy(&line, &mask_com); @@ -516,18 +291,228 @@ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mas lv_coord_t row; lv_res_t read_res; for(row = mask_com.y1; row <= mask_com.y2; row++) { + lv_area_t mask_line; + union_ok = lv_area_intersect(&mask_line, mask, &line); + if(union_ok == false) continue; + read_res = lv_img_decoder_read_line(&cdsc->dec_dsc, x, y, width, buf); if(read_res != LV_RES_OK) { lv_img_decoder_close(&cdsc->dec_dsc); LV_LOG_WARN("Image draw can't read the line"); + lv_mem_buf_release(buf); return LV_RES_INV; } - lv_draw_map(&line, mask, buf, opa, chroma_keyed, alpha_byte, style->image.color, style->image.intense); + + + lv_draw_map(&line, &mask_line, buf, opa, chroma_keyed, alpha_byte, style, 0, NULL, LV_IMG_ZOOM_NONE, false); line.y1++; line.y2++; y++; } + lv_mem_buf_release(buf); } return LV_RES_OK; } + +/** + * Draw a color map to the display (image) + * @param cords_p coordinates the color map + * @param mask_p the map will drawn only on this area (truncated to VDB area) + * @param map_p pointer to a lv_color_t array + * @param opa opacity of the map + * @param chroma_keyed true: enable transparency of LV_IMG_LV_COLOR_TRANSP color pixels + * @param alpha_byte true: extra alpha byte is inserted for every pixel + * @param style style of the image + * @param angle angle in degree + * @param pivot center of rotation + * @param zoom zoom factor + * @param antialias anti-alias transformations (rotate, zoom) or not + */ +static void lv_draw_map(const lv_area_t * map_area, const lv_area_t * clip_area, const uint8_t * map_p, lv_opa_t opa, + bool chroma_key, bool alpha_byte, const lv_style_t * style, uint16_t angle, lv_point_t * pivot, uint16_t zoom, bool antialaias) +{ + + if(opa < LV_OPA_MIN) return; + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + /* Use the clip area as draw area*/ + lv_area_t draw_area; + lv_area_copy(&draw_area, clip_area); + + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + lv_disp_buf_t * vdb = lv_disp_get_buf(disp); + const lv_area_t * disp_area = &vdb->area; + + /* Now `draw_area` has absolute coordinates. + * Make it relative to `disp_area` to simplify draw to `disp_buf`*/ + draw_area.x1 -= disp_area->x1; + draw_area.y1 -= disp_area->y1; + draw_area.x2 -= disp_area->x1; + draw_area.y2 -= disp_area->y1; + + uint8_t other_mask_cnt = lv_draw_mask_get_cnt(); + + /*The simplest case just copy the pixels into the VDB*/ + if(other_mask_cnt == 0 && angle == 0 && zoom == LV_IMG_ZOOM_NONE && + chroma_key == false && alpha_byte == false && + opa == LV_OPA_COVER && style->image.intense == LV_OPA_TRANSP) { + lv_blend_map(clip_area, map_area, (lv_color_t *)map_p, NULL, LV_DRAW_MASK_RES_FULL_COVER, LV_OPA_COVER, style->image.blend_mode); + } + /*In the other cases every pixel need to be checked one-by-one*/ + else { + /*The pixel size in byte is different if an alpha byte is added too*/ + uint8_t px_size_byte = alpha_byte ? LV_IMG_PX_SIZE_ALPHA_BYTE : sizeof(lv_color_t); + + /*Build the image and a mask line-by-line*/ + uint32_t mask_buf_size = lv_area_get_size(&draw_area) > LV_HOR_RES_MAX ? LV_HOR_RES_MAX : lv_area_get_size(&draw_area); + lv_color_t * map2 = lv_mem_buf_get(mask_buf_size * sizeof(lv_color_t)); + lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size); + + /*Go to the first displayed pixel of the map*/ + lv_coord_t map_w = lv_area_get_width(map_area); + lv_coord_t map_h = lv_area_get_height(map_area); + const uint8_t * map_buf_tmp = map_p; + map_buf_tmp += map_w * (draw_area.y1 - (map_area->y1 - disp_area->y1)) * px_size_byte; + map_buf_tmp += (draw_area.x1 - (map_area->x1 - disp_area->x1)) * px_size_byte; + + lv_color_t c; + lv_color_t chroma_keyed_color = LV_COLOR_TRANSP; + uint32_t px_i = 0; + uint32_t px_i_start; + + const uint8_t * map_px; + + lv_area_t blend_area; + blend_area.x1 = draw_area.x1 + disp_area->x1; + blend_area.x2 = blend_area.x1 + lv_area_get_width(&draw_area) - 1; + blend_area.y1 = disp_area->y1 + draw_area.y1; + blend_area.y2 = blend_area.y1; + + /*Prepare the `mask_buf`if there are other masks*/ + if(other_mask_cnt) { + memset(mask_buf, 0xFF, mask_buf_size); + } + + + bool transform = angle != 0 || zoom != LV_IMG_ZOOM_NONE ? true : false; + lv_img_transform_dsc_t trans_dsc; + memset(&trans_dsc, 0, sizeof(lv_img_transform_dsc_t)); + if(transform) { + lv_img_cf_t cf = LV_IMG_CF_TRUE_COLOR; + if(alpha_byte) cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + else if(chroma_key) cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED; + + + trans_dsc.cfg.angle = angle; + trans_dsc.cfg.zoom = zoom; + trans_dsc.cfg.src = map_p; + trans_dsc.cfg.src_w = map_w; + trans_dsc.cfg.src_h = map_h; + trans_dsc.cfg.cf = cf; + trans_dsc.cfg.pivot_x = map_w / 2; + trans_dsc.cfg.pivot_y = map_h / 2; + if (pivot){ + trans_dsc.cfg.pivot_x = pivot->x; + trans_dsc.cfg.pivot_y = pivot->y; + } + trans_dsc.cfg.color = style->image.color; + trans_dsc.cfg.antialias = antialaias; + + lv_img_buf_transform_init(&trans_dsc); + } + + lv_draw_mask_res_t mask_res; + mask_res = (alpha_byte || chroma_key || angle) ? LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER; + lv_coord_t x; + lv_coord_t y; + for(y = 0; y < lv_area_get_height(&draw_area); y++) { + map_px = map_buf_tmp; + px_i_start = px_i; + + for(x = 0; x < lv_area_get_width(&draw_area); x++, map_px += px_size_byte, px_i++) { + + if(transform == false) { + if(alpha_byte) { + lv_opa_t px_opa = map_px[LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; + mask_buf[px_i] = px_opa; + if(px_opa < LV_OPA_MIN) continue; + } else { + mask_buf[px_i] = LV_OPA_COVER; + } + +#if LV_COLOR_DEPTH == 8 + c.full = map_px[0]; +#elif LV_COLOR_DEPTH == 16 + c.full = map_px[0] + (map_px[1] << 8); +#elif LV_COLOR_DEPTH == 32 + c.full = *((uint32_t*)map_px); +#endif + if (chroma_key) { + if(c.full == chroma_keyed_color.full) { + mask_buf[px_i] = LV_OPA_TRANSP; + continue; + } + } + } else { + /*Rotate*/ + bool ret; + lv_coord_t rot_x = x + (disp_area->x1 + draw_area.x1) - map_area->x1; + lv_coord_t rot_y = y + (disp_area->y1 + draw_area.y1) - map_area->y1; + ret = lv_img_buf_transform(&trans_dsc, rot_x, rot_y); + if(ret == false) { + mask_buf[px_i] = LV_OPA_TRANSP; + continue; + } else { + mask_buf[px_i] = trans_dsc.res.opa; + c.full = trans_dsc.res.color.full; + } + } + + if(style->image.intense != 0) { + c = lv_color_mix(style->image.color, c, style->image.intense); + } + + map2[px_i].full = c.full; + } + + /*Apply the masks if any*/ + if(other_mask_cnt) { + lv_draw_mask_res_t mask_res_sub; + mask_res_sub = lv_draw_mask_apply(mask_buf + px_i_start, draw_area.x1 + vdb->area.x1, y + draw_area.y1 + vdb->area.y1, lv_area_get_width(&draw_area)); + if(mask_res_sub == LV_DRAW_MASK_RES_FULL_TRANSP) { + memset(mask_buf + px_i_start, 0x00, lv_area_get_width(&draw_area)); + mask_res = LV_DRAW_MASK_RES_CHANGED; + } else if(mask_res_sub == LV_DRAW_MASK_RES_CHANGED) { + mask_res = LV_DRAW_MASK_RES_CHANGED; + } + } + + map_buf_tmp += map_w * px_size_byte; + if(px_i + lv_area_get_width(&draw_area) < mask_buf_size) { + blend_area.y2 ++; + } else { + lv_blend_map(clip_area, &blend_area, map2, mask_buf, mask_res, opa, style->image.blend_mode); + + blend_area.y1 = blend_area.y2 + 1; + blend_area.y2 = blend_area.y1; + + px_i = 0; + mask_res = (alpha_byte || chroma_key || angle) ? LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER; + + /*Prepare the `mask_buf`if there are other masks*/ + if(other_mask_cnt) { + memset(mask_buf, 0xFF, mask_buf_size); + } + } + } + /*Flush the last part*/ + if(blend_area.y1 != blend_area.y2) { + blend_area.y2--; + lv_blend_map(clip_area, &blend_area, map2, mask_buf, mask_res, opa, style->image.blend_mode); + } + + lv_mem_buf_release(mask_buf); + lv_mem_buf_release(map2); + } +} diff --git a/src/lv_draw/lv_draw_img.h b/src/lv_draw/lv_draw_img.h index 61c604805..47d15132e 100644 --- a/src/lv_draw/lv_draw_img.h +++ b/src/lv_draw/lv_draw_img.h @@ -15,15 +15,21 @@ extern "C" { *********************/ #include "lv_draw.h" #include "lv_img_decoder.h" +#include "lv_img_buf.h" /********************* * DEFINES *********************/ +/********************** + * MACROS + **********************/ + /********************** * TYPEDEFS **********************/ + /********************** * GLOBAL PROTOTYPES **********************/ @@ -34,10 +40,13 @@ extern "C" { * @param mask the image will be drawn only in this area * @param src pointer to a lv_color_t array which contains the pixels of the image * @param style style of the image + * @param angle rotation angle of the image + * @param center rotation center of the image + * @param antialias anti-alias transformations (rotate, zoom) or not * @param opa_scale scale down all opacities by the factor */ void lv_draw_img(const lv_area_t * coords, const lv_area_t * mask, const void * src, const lv_style_t * style, - lv_opa_t opa_scale); + uint16_t angle, lv_point_t * center, uint16_t zoom, bool antialaias, lv_opa_t opa_scale); /** * Get the type of an image source @@ -49,80 +58,27 @@ void lv_draw_img(const lv_area_t * coords, const lv_area_t * mask, const void * */ lv_img_src_t lv_img_src_get_type(const void * src); -/** - * Get the color of an image's pixel - * @param dsc an image descriptor - * @param x x coordinate of the point to get - * @param y x coordinate of the point to get - * @param style style of the image. In case of `LV_IMG_CF_ALPHA_1/2/4/8` `style->image.color` shows - * the color. Can be `NULL` but for `ALPHA` images black will be returned. In other cases it is not - * used. - * @return color of the point - */ -lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, const lv_style_t * style); -/** - * Get the alpha value of an image's pixel - * @param dsc pointer to an image descriptor - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @return alpha value of the point - */ -lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y); - -/** - * Set the color of a pixel of an image. The alpha channel won't be affected. - * @param dsc pointer to an image descriptor - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @param c color of the point - */ -void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c); - -/** - * Set the alpha value of a pixel of an image. The color won't be affected - * @param dsc pointer to an image descriptor - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @param opa the desired opacity - */ -void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa); - -/** - * Set the palette color of an indexed image. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` - * @param dsc pointer to an image descriptor - * @param id the palette color to set: - * - for `LV_IMG_CF_INDEXED1`: 0..1 - * - for `LV_IMG_CF_INDEXED2`: 0..3 - * - for `LV_IMG_CF_INDEXED4`: 0..15 - * - for `LV_IMG_CF_INDEXED8`: 0..255 - * @param c the color to set - */ -void lv_img_buf_set_palette(lv_img_dsc_t * dsc, uint8_t id, lv_color_t c); - /** * Get the pixel size of a color format in bits * @param cf a color format (`LV_IMG_CF_...`) * @return the pixel size in bits */ -uint8_t lv_img_color_format_get_px_size(lv_img_cf_t cf); +uint8_t lv_img_cf_get_px_size(lv_img_cf_t cf); /** * Check if a color format is chroma keyed or not * @param cf a color format (`LV_IMG_CF_...`) * @return true: chroma keyed; false: not chroma keyed */ -bool lv_img_color_format_is_chroma_keyed(lv_img_cf_t cf); +bool lv_img_cf_is_chroma_keyed(lv_img_cf_t cf); /** * Check if a color format has alpha channel or not * @param cf a color format (`LV_IMG_CF_...`) * @return true: has alpha channel; false: doesn't have alpha channel */ -bool lv_img_color_format_has_alpha(lv_img_cf_t cf); +bool lv_img_cf_has_alpha(lv_img_cf_t cf); -/********************** - * MACROS - **********************/ #ifdef __cplusplus } /* extern "C" */ diff --git a/src/lv_draw/lv_draw_label.c b/src/lv_draw/lv_draw_label.c index aa3445dd2..65a9ccaf1 100644 --- a/src/lv_draw/lv_draw_label.c +++ b/src/lv_draw/lv_draw_label.c @@ -8,6 +8,9 @@ *********************/ #include "lv_draw_label.h" #include "../lv_misc/lv_math.h" +#include "../lv_hal/lv_hal_disp.h" +#include "../lv_core/lv_refr.h" +#include "../lv_misc/lv_bidi.h" /********************* * DEFINES @@ -28,11 +31,25 @@ typedef uint8_t cmd_state_t; /********************** * STATIC PROTOTYPES **********************/ +static void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * clip_area, const lv_font_t * font_p, uint32_t letter, + lv_color_t color, lv_opa_t opa); +static void draw_letter_normal(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_dsc_t * g, const lv_area_t * clip_area, const uint8_t * map_p, lv_color_t color, lv_opa_t opa); +static void draw_letter_subpx(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_dsc_t * g, const lv_area_t * clip_area, const uint8_t * map_p, lv_color_t color, lv_opa_t opa); + + static uint8_t hex_char_to_num(char hex); /********************** * STATIC VARIABLES **********************/ +/*clang-format off*/ +static const uint8_t bpp1_opa_table[2] = {0, 255}; /*Opacity mapping with bpp = 1 (Just for compatibility)*/ +static const uint8_t bpp2_opa_table[4] = {0, 85, 170, 255}; /*Opacity mapping with bpp = 2*/ +static const uint8_t bpp4_opa_table[16] = {0, 17, 34, 51, /*Opacity mapping with bpp = 4*/ + 68, 85, 102, 119, + 136, 153, 170, 187, + 204, 221, 238, 255}; + /*clang-format on*/ /********************** * MACROS @@ -51,15 +68,18 @@ static uint8_t hex_char_to_num(char hex); * @param txt 0 terminated text to write * @param flag settings for the text from 'txt_flag_t' enum * @param offset text offset in x and y direction (NULL if unused) - * @param sel_start start index of selected area (`LV_LABEL_TXT_SEL_OFF` if none) - * @param sel_end end index of selected area (`LV_LABEL_TXT_SEL_OFF` if none) + * @param sel make the text selected in the range by drawing a background there */ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa_scale, - const char * txt, lv_txt_flag_t flag, lv_point_t * offset, uint16_t sel_start, uint16_t sel_end, - lv_draw_label_hint_t * hint) + const char * txt, lv_txt_flag_t flag, lv_point_t * offset, lv_draw_label_txt_sel_t * sel, + lv_draw_label_hint_t * hint, lv_bidi_dir_t bidi_dir) { const lv_font_t * font = style->text.font; lv_coord_t w; + + /*No need to waste processor time if string is empty*/ + if (txt[0] == '\0') return; + if((flag & LV_TXT_FLAG_EXPAND) == 0) { /*Normally use the label's width as width*/ w = lv_area_get_width(coords); @@ -67,7 +87,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st /*If EXAPND is enabled then not limit the text's width to the object's width*/ lv_point_t p; lv_txt_get_size(&p, txt, style->text.font, style->text.letter_space, style->text.line_space, LV_COORD_MAX, - flag); + flag); w = p.x; } @@ -105,6 +125,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st pos.y += hint->y; } + uint32_t line_end = line_start + lv_txt_get_next_line(&txt[line_start], font, style->text.letter_space, w, flag); /*Go the first visible line*/ @@ -139,6 +160,27 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->text.opa : (uint16_t)((uint16_t)style->text.opa * opa_scale) >> 8; + uint16_t sel_start = 0xFFFF; + uint16_t sel_end = 0xFFFF; + if(sel) { + sel_start = sel->start; + sel_end = sel->end; + if(sel_start > sel_end) { + uint16_t tmp = sel_start; + sel_start = sel_end; + sel_end = tmp; + } + } + + lv_style_t line_style; + if(style->text.underline || style->text.strikethrough) { + lv_style_copy(&line_style, style); + line_style.line.color = style->text.color; + line_style.line.width = (style->text.font->line_height + 5) / 10; /*+5 for rounding*/ + line_style.line.opa = style->text.opa; + line_style.line.blend_mode = style->text.blend_mode; + } + cmd_state_t cmd_state = CMD_STATE_WAIT; uint32_t i; uint16_t par_start = 0; @@ -147,20 +189,38 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st lv_style_t sel_style; lv_style_copy(&sel_style, &lv_style_plain_color); sel_style.body.main_color = sel_style.body.grad_color = style->text.sel_color; - + lv_coord_t pos_x_start = pos.x; /*Write out all lines*/ while(txt[line_start] != '\0') { - if(offset != NULL) { - pos.x += x_ofs; - } + if(offset != NULL) pos.x += x_ofs; + /*Write all letter of a line*/ cmd_state = CMD_STATE_WAIT; - i = line_start; + i = 0; uint32_t letter; uint32_t letter_next; - while(i < line_end) { - letter = lv_txt_encoded_next(txt, &i); - letter_next = lv_txt_encoded_next(&txt[i], NULL); +#if LV_USE_BIDI + char *bidi_txt = lv_mem_buf_get(line_end - line_start + 1); + lv_bidi_process_paragraph(txt + line_start, bidi_txt, line_end - line_start, bidi_dir, NULL, 0); +#else + const char *bidi_txt = txt + line_start; +#endif + + while(i < line_end - line_start) { + uint16_t logical_char_pos = 0; + if(sel_start != 0xFFFF && sel_end != 0xFFFF) { +#if LV_USE_BIDI + logical_char_pos = lv_txt_encoded_get_char_id(txt, line_start); + uint16_t t = lv_txt_encoded_get_char_id(bidi_txt, i); + logical_char_pos += lv_bidi_get_logical_pos(bidi_txt, NULL, line_end - line_start, bidi_dir, t, NULL); +#else + logical_char_pos = lv_txt_encoded_get_char_id(txt, line_start + i); +#endif + } + + letter = lv_txt_encoded_next(bidi_txt, &i); + letter_next = lv_txt_encoded_next(&bidi_txt[i], NULL); + /*Handle the re-color command*/ if((flag & LV_TXT_FLAG_RECOLOR) != 0) { @@ -183,7 +243,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st /*Get the parameter*/ if(i - par_start == LABEL_RECOLOR_PAR_LENGTH + 1) { char buf[LABEL_RECOLOR_PAR_LENGTH + 1]; - memcpy(buf, &txt[par_start], LABEL_RECOLOR_PAR_LENGTH); + memcpy(buf, &bidi_txt[par_start], LABEL_RECOLOR_PAR_LENGTH); buf[LABEL_RECOLOR_PAR_LENGTH] = '\0'; int r, g, b; r = (hex_char_to_num(buf[0]) << 4) + hex_char_to_num(buf[1]); @@ -206,9 +266,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st letter_w = lv_font_get_glyph_width(font, letter, letter_next); if(sel_start != 0xFFFF && sel_end != 0xFFFF) { - int char_ind = lv_encoded_get_char_id(txt, i); - /*Do not draw the rectangle on the character at `sel_start`.*/ - if(char_ind > sel_start && char_ind <= sel_end) { + if(logical_char_pos >= sel_start && logical_char_pos < sel_end) { lv_area_t sel_coords; sel_coords.x1 = pos.x; sel_coords.y1 = pos.y; @@ -217,12 +275,38 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st lv_draw_rect(&sel_coords, mask, &sel_style, opa); } } + lv_draw_letter(&pos, mask, font, letter, color, opa); if(letter_w > 0) { pos.x += letter_w + style->text.letter_space; } } + + if(style->text.strikethrough) { + lv_point_t p1; + lv_point_t p2; + p1.x = pos_x_start; + p1.y = pos.y + (style->text.font->line_height / 2) + style->line.width / 2; + p2.x = pos.x; + p2.y = p1.y; + lv_draw_line(&p1, &p2, mask, &line_style, opa_scale); + } + + if(style->text.underline) { + lv_point_t p1; + lv_point_t p2; + p1.x = pos_x_start; + p1.y = pos.y + style->text.font->line_height - style->text.font->base_line + style->line.width / 2 + 1; + p2.x = pos.x; + p2.y = p1.y; + lv_draw_line(&p1, &p2, mask, &line_style, opa_scale); + } + +#if LV_USE_BIDI + lv_mem_buf_release(bidi_txt); + bidi_txt = NULL; +#endif /*Go to next line*/ line_start = line_end; line_end += lv_txt_get_next_line(&txt[line_start], font, style->text.letter_space, w, flag); @@ -231,7 +315,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st /*Align to middle*/ if(flag & LV_TXT_FLAG_CENTER) { line_width = - lv_txt_get_width(&txt[line_start], line_end - line_start, font, style->text.letter_space, flag); + lv_txt_get_width(&txt[line_start], line_end - line_start, font, style->text.letter_space, flag); pos.x += (lv_area_get_width(coords) - line_width) / 2; @@ -239,7 +323,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st /*Align to the right*/ else if(flag & LV_TXT_FLAG_RIGHT) { line_width = - lv_txt_get_width(&txt[line_start], line_end - line_start, font, style->text.letter_space, flag); + lv_txt_get_width(&txt[line_start], line_end - line_start, font, style->text.letter_space, flag); pos.x += lv_area_get_width(coords) - line_width; } @@ -254,6 +338,396 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st * STATIC FUNCTIONS **********************/ + +/** + * Draw a letter in the Virtual Display Buffer + * @param pos_p left-top coordinate of the latter + * @param mask_p the letter will be drawn only on this area (truncated to VDB area) + * @param font_p pointer to font + * @param letter a letter to draw + * @param color color of letter + * @param opa opacity of letter (0..255) + */ +static void lv_draw_letter(const lv_point_t * pos_p, const lv_area_t * clip_area, const lv_font_t * font_p, uint32_t letter, + lv_color_t color, lv_opa_t opa) +{ + if(opa < LV_OPA_MIN) return; + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + if(font_p == NULL) { + LV_LOG_WARN("lv_draw_letter: font is NULL"); + return; + } + + lv_font_glyph_dsc_t g; + bool g_ret = lv_font_get_glyph_dsc(font_p, &g, letter, '\0'); + if(g_ret == false) { + /* Add waring if the dsc is not found + * but do not print warning for non printable ASCII chars (e.g. '\n')*/ + if(letter >= 0x20) { + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found"); + } + return; + } + + lv_coord_t pos_x = pos_p->x + g.ofs_x; + lv_coord_t pos_y = pos_p->y + (font_p->line_height - font_p->base_line) - g.box_h - g.ofs_y; + + /*If the letter is completely out of mask don't draw it */ + if(pos_x + g.box_w < clip_area->x1 || + pos_x > clip_area->x2 || + pos_y + g.box_h < clip_area->y1 || + pos_y > clip_area->y2) return; + + + const uint8_t * map_p = lv_font_get_glyph_bitmap(font_p, letter); + if(map_p == NULL) { + LV_LOG_WARN("lv_draw_letter: character's bitmap not found"); + return; + } + + if(font_p->subpx) { + draw_letter_subpx(pos_x, pos_y, &g, clip_area, map_p, color, opa); + } else { + draw_letter_normal(pos_x, pos_y, &g, clip_area, map_p, color, opa); + } +} + + +static void draw_letter_normal(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_dsc_t * g, const lv_area_t * clip_area, const uint8_t * map_p, lv_color_t color, lv_opa_t opa) +{ + + const uint8_t * bpp_opa_table; + uint8_t bitmask_init; + uint8_t bitmask; + + if(g->bpp == 3) g->bpp = 4; + + switch(g->bpp) { + case 1: + bpp_opa_table = bpp1_opa_table; + bitmask_init = 0x80; + break; + case 2: + bpp_opa_table = bpp2_opa_table; + bitmask_init = 0xC0; + break; + case 4: + bpp_opa_table = bpp4_opa_table; + bitmask_init = 0xF0; + break; + case 8: + bpp_opa_table = NULL; + bitmask_init = 0xFF; + break; /*No opa table, pixel value will be used directly*/ + default: + LV_LOG_WARN("lv_draw_letter: invalid bpp not found"); + return; /*Invalid bpp. Can't render the letter*/ + } + + + + lv_coord_t col, row; + + uint8_t width_byte_scr = g->box_w >> 3; /*Width in bytes (on the screen finally) (e.g. w = 11 -> 2 bytes wide)*/ + if(g->box_w & 0x7) width_byte_scr++; + uint16_t width_bit = g->box_w * g->bpp; /*Letter width in bits*/ + + + /* Calculate the col/row start/end on the map*/ + lv_coord_t col_start = pos_x >= clip_area->x1 ? 0 : clip_area->x1 - pos_x; + lv_coord_t col_end = pos_x + g->box_w <= clip_area->x2 ? g->box_w : clip_area->x2 - pos_x + 1; + lv_coord_t row_start = pos_y >= clip_area->y1 ? 0 : clip_area->y1 - pos_y; + lv_coord_t row_end = pos_y + g->box_h <= clip_area->y2 ? g->box_h : clip_area->y2 - pos_y + 1; + + /*Move on the map too*/ + uint32_t bit_ofs = (row_start * width_bit) + (col_start * g->bpp); + map_p += bit_ofs >> 3; + + uint8_t letter_px; + lv_opa_t px_opa; + uint16_t col_bit; + col_bit = bit_ofs & 0x7; /* "& 0x7" equals to "% 8" just faster */ + + uint32_t mask_buf_size = g->box_w * g->box_h > LV_HOR_RES_MAX ? g->box_w * g->box_h : LV_HOR_RES_MAX; + lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size); + lv_coord_t mask_p = 0; + lv_coord_t mask_p_start; + + lv_area_t fill_area; + fill_area.x1 = col_start + pos_x; + fill_area.x2 = col_end + pos_x - 1; + fill_area.y1 = row_start + pos_y; + fill_area.y2 = fill_area.y1; + + uint8_t other_mask_cnt = lv_draw_mask_get_cnt(); + + for(row = row_start ; row < row_end; row++) { + bitmask = bitmask_init >> col_bit; + mask_p_start = mask_p; + for(col = col_start; col < col_end; col++) { + + /*Load the pixel's opacity into the mask*/ + letter_px = (*map_p & bitmask) >> (8 - col_bit - g->bpp); + if(letter_px != 0) { + if(opa == LV_OPA_COVER) { + px_opa = g->bpp == 8 ? letter_px : bpp_opa_table[letter_px]; + } else { + px_opa = g->bpp == 8 ? (uint16_t)((uint16_t)letter_px * opa) >> 8 + : (uint16_t)((uint16_t)bpp_opa_table[letter_px] * opa) >> 8; + } + + mask_buf[mask_p] = px_opa; + + } else { + mask_buf[mask_p] = 0; + } + + /*Go to the next column*/ + if(col_bit < 8 - g->bpp) { + col_bit += g->bpp; + bitmask = bitmask >> g->bpp; + } else { + col_bit = 0; + bitmask = bitmask_init; + map_p++; + } + + /*Next mask byte*/ + mask_p++; + } + + /*Apply masks if any*/ + if(other_mask_cnt) { + lv_draw_mask_res_t mask_res = lv_draw_mask_apply(mask_buf + mask_p_start, fill_area.x1, fill_area.y2, lv_area_get_width(&fill_area)); + if(mask_res == LV_DRAW_MASK_RES_FULL_TRANSP) { + memset(mask_buf + mask_p_start, 0x00, lv_area_get_width(&fill_area)); + } + } + + if((uint32_t) mask_p + (row_end - row_start) < mask_buf_size) { + fill_area.y2 ++; + } else { + lv_blend_fill(clip_area, &fill_area, + color, mask_buf, LV_DRAW_MASK_RES_CHANGED, opa, + LV_BLEND_MODE_NORMAL); + + fill_area.y1 = fill_area.y2 + 1; + fill_area.y2 = fill_area.y1; + mask_p = 0; + } + + col_bit += ((g->box_w - col_end) + col_start) * g->bpp; + + map_p += (col_bit >> 3); + col_bit = col_bit & 0x7; + } + + /*Flush the last part*/ + if(fill_area.y1 != fill_area.y2) { + fill_area.y2--; + lv_blend_fill(clip_area, &fill_area, + color, mask_buf, LV_DRAW_MASK_RES_CHANGED, opa, + LV_BLEND_MODE_NORMAL); + mask_p = 0; + } + + lv_mem_buf_release(mask_buf); +} + +static void draw_letter_subpx(lv_coord_t pos_x, lv_coord_t pos_y, lv_font_glyph_dsc_t * g, const lv_area_t * clip_area, const uint8_t * map_p, lv_color_t color, lv_opa_t opa) +{ + const uint8_t * bpp_opa_table; + uint8_t bitmask_init; + uint8_t bitmask; + + if(g->bpp == 3) g->bpp = 4; + + switch(g->bpp) { + case 1: + bpp_opa_table = bpp1_opa_table; + bitmask_init = 0x80; + break; + case 2: + bpp_opa_table = bpp2_opa_table; + bitmask_init = 0xC0; + break; + case 4: + bpp_opa_table = bpp4_opa_table; + bitmask_init = 0xF0; + break; + case 8: + bpp_opa_table = NULL; + bitmask_init = 0xFF; + break; /*No opa table, pixel value will be used directly*/ + default: + LV_LOG_WARN("lv_draw_letter: invalid bpp not found"); + return; /*Invalid bpp. Can't render the letter*/ + } + + lv_coord_t col, row; + + uint8_t width_byte_scr = g->box_w >> 3; /*Width in bytes (on the screen finally) (e.g. w = 11 -> 2 bytes wide)*/ + if(g->box_w & 0x7) width_byte_scr++; + uint16_t width_bit = g->box_w * g->bpp; /*Letter width in bits*/ + + + /* Calculate the col/row start/end on the map*/ + lv_coord_t col_start = pos_x >= clip_area->x1 ? 0 : (clip_area->x1 - pos_x) * 3; + lv_coord_t col_end = pos_x + g->box_w / 3 <= clip_area->x2 ? g->box_w : (clip_area->x2 - pos_x + 1) * 3; + lv_coord_t row_start = pos_y >= clip_area->y1 ? 0 : clip_area->y1 - pos_y; + lv_coord_t row_end = pos_y + g->box_h <= clip_area->y2 ? g->box_h : clip_area->y2 - pos_y + 1; + + /*Move on the map too*/ + uint32_t bit_ofs = (row_start * width_bit) + (col_start * g->bpp); + map_p += bit_ofs >> 3; + + uint8_t letter_px; + lv_opa_t px_opa; + uint16_t col_bit; + col_bit = bit_ofs & 0x7; /* "& 0x7" equals to "% 8" just faster */ + + uint32_t mask_buf_size = g->box_w * g->box_h > LV_HOR_RES_MAX ? g->box_w * g->box_h : LV_HOR_RES_MAX; + lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size); + lv_coord_t mask_p = 0; + lv_coord_t mask_p_start; + lv_color_t * color_buf = lv_mem_buf_get(mask_buf_size * sizeof(lv_color_t)); + + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + lv_disp_buf_t * vdb = lv_disp_get_buf(disp); + + lv_coord_t vdb_width = lv_area_get_width(&vdb->area); + lv_color_t * vdb_buf_tmp = vdb->buf_act; + + /*Set a pointer on VDB to the first pixel of the letter*/ + vdb_buf_tmp += ((pos_y - vdb->area.y1) * vdb_width) + pos_x - vdb->area.x1; + + /*If the letter is partially out of mask the move there on VDB*/ + vdb_buf_tmp += (row_start * vdb_width) + col_start / 3; + + lv_area_t map_area; + map_area.x1 = col_start / 3 + pos_x; + map_area.x2 = col_end / 3 + pos_x - 1; + map_area.y1 = row_start + pos_y; + map_area.y2 = map_area.y1; + + uint8_t other_mask_cnt = lv_draw_mask_get_cnt(); + + uint8_t font_rgb[3]; + +#if LV_COLOR_16_SWAP == 0 + uint8_t txt_rgb[3] = {color.ch.red, color.ch.green, color.ch.blue}; +#else + uint8_t txt_rgb[3] = {color.ch.red, (color.ch.green_h << 3) + color.ch.green_l, color.ch.blue}; +#endif + + for(row = row_start ; row < row_end; row++) { + uint8_t subpx_cnt = 0; + bitmask = bitmask_init >> col_bit; + mask_p_start = mask_p; + for(col = col_start; col < col_end; col++) { + /*Load the pixel's opacity into the mask*/ + letter_px = (*map_p & bitmask) >> (8 - col_bit - g->bpp); + if(letter_px != 0) { + if(opa == LV_OPA_COVER) { + px_opa = g->bpp == 8 ? letter_px : bpp_opa_table[letter_px]; + } else { + px_opa = g->bpp == 8 ? (uint16_t)((uint16_t)letter_px * opa) >> 8 + : (uint16_t)((uint16_t)bpp_opa_table[letter_px] * opa) >> 8; + } + } else { + px_opa = 0; + } + + font_rgb[subpx_cnt] = px_opa; + + subpx_cnt ++; + if(subpx_cnt == 3) { + subpx_cnt = 0; + + lv_color_t res_color; +#if LV_COLOR_16_SWAP == 0 + uint8_t bg_rgb[3] = {vdb_buf_tmp->ch.red, vdb_buf_tmp->ch.green, vdb_buf_tmp->ch.blue}; +#else + uint8_t bg_rgb[3] = {vdb_buf_tmp->ch.red, + (vdb_buf_tmp->ch.green_h << 3) + vdb_buf_tmp->ch.green_l, + vdb_buf_tmp->ch.blue}; +#endif + +#if LV_SUBPX_BGR + res_color.ch.blue = (uint16_t)((uint16_t)txt_rgb[0] * font_rgb[0] + (bg_rgb[0] * (255 - font_rgb[0]))) >> 8; + res_color.ch.red = (uint16_t)((uint16_t)txt_rgb[2] * font_rgb[2] + (bg_rgb[2] * (255 - font_rgb[2]))) >> 8; +#else + res_color.ch.red = (uint16_t)((uint16_t)txt_rgb[0] * font_rgb[0] + (bg_rgb[0] * (255 - font_rgb[0]))) >> 8; + res_color.ch.blue = (uint16_t)((uint16_t)txt_rgb[2] * font_rgb[2] + (bg_rgb[2] * (255 - font_rgb[2]))) >> 8; +#endif + +#if LV_COLOR_16_SWAP == 0 + res_color.ch.green = (uint16_t)((uint16_t)txt_rgb[1] * font_rgb[1] + (bg_rgb[1] * (255 - font_rgb[1]))) >> 8; +#else + uint8_t green = (uint16_t)((uint16_t)txt_rgb[1] * font_rgb[1] + (bg_rgb[1] * (255 - font_rgb[1]))) >> 8; + res_color.ch.green_h = green >> 3; + res_color.ch.green_l = green & 0x7; +#endif + + if(font_rgb[0] == 0 && font_rgb[1] == 0 && font_rgb[2] == 0) mask_buf[mask_p] = LV_OPA_TRANSP; + else mask_buf[mask_p] = LV_OPA_COVER; + color_buf[mask_p] = res_color; + + /*Next mask byte*/ + mask_p++; + vdb_buf_tmp++; + } + + /*Go to the next column*/ + if(col_bit < 8 - g->bpp) { + col_bit += g->bpp; + bitmask = bitmask >> g->bpp; + } else { + col_bit = 0; + bitmask = bitmask_init; + map_p++; + } + } + + /*Apply masks if any*/ + if(other_mask_cnt) { + lv_draw_mask_res_t mask_res = lv_draw_mask_apply(mask_buf + mask_p_start, map_area.x1, map_area.y2, lv_area_get_width(&map_area)); + if(mask_res == LV_DRAW_MASK_RES_FULL_TRANSP) { + memset(mask_buf + mask_p_start, 0x00, lv_area_get_width(&map_area)); + } + } + + if((uint32_t) mask_p + (row_end - row_start) < mask_buf_size) { + map_area.y2 ++; + } else { + lv_blend_map(clip_area, &map_area, color_buf, mask_buf, LV_DRAW_MASK_RES_CHANGED, opa, LV_BLEND_MODE_NORMAL); + + map_area.y1 = map_area.y2 + 1; + map_area.y2 = map_area.y1; + mask_p = 0; + } + + col_bit += ((g->box_w - col_end) + col_start) * g->bpp; + + map_p += (col_bit >> 3); + col_bit = col_bit & 0x7; + + /*Next row in VDB*/ + vdb_buf_tmp += vdb_width - (col_end - col_start) / 3; + } + + /*Flush the last part*/ + if(map_area.y1 != map_area.y2) { + map_area.y2--; + lv_blend_map(clip_area, &map_area, color_buf, mask_buf, LV_DRAW_MASK_RES_CHANGED, opa, LV_BLEND_MODE_NORMAL); + } + + lv_mem_buf_release(mask_buf); + lv_mem_buf_release(color_buf); +} + + /** * Convert a hexadecimal characters to a number (0..15) * @param hex Pointer to a hexadecimal character (0..9, A..F) @@ -269,13 +743,13 @@ static uint8_t hex_char_to_num(char hex) if(hex >= 'a') hex -= 'a' - 'A'; /*Convert to upper case*/ switch(hex) { - case 'A': result = 10; break; - case 'B': result = 11; break; - case 'C': result = 12; break; - case 'D': result = 13; break; - case 'E': result = 14; break; - case 'F': result = 15; break; - default: result = 0; break; + case 'A': result = 10; break; + case 'B': result = 11; break; + case 'C': result = 12; break; + case 'D': result = 13; break; + case 'E': result = 14; break; + case 'F': result = 15; break; + default: result = 0; break; } } diff --git a/src/lv_draw/lv_draw_label.h b/src/lv_draw/lv_draw_label.h index 2328aa2b3..6dc4d6464 100644 --- a/src/lv_draw/lv_draw_label.h +++ b/src/lv_draw/lv_draw_label.h @@ -14,15 +14,24 @@ extern "C" { * INCLUDES *********************/ #include "lv_draw.h" +#include "../lv_misc/lv_bidi.h" /********************* * DEFINES *********************/ +#define LV_DRAW_LABEL_NO_TXT_SEL (0xFFFF) /********************** * TYPEDEFS **********************/ +typedef struct +{ + uint16_t start; + uint16_t end; +}lv_draw_label_txt_sel_t; + + /** Store some info to speed up drawing of very large texts * It takes a lot of time to get the first visible character because * all the previous characters needs to be checked to calculate the positions. @@ -54,11 +63,11 @@ typedef struct { * @param flag settings for the text from 'txt_flag_t' enum * @param offset text offset in x and y direction (NULL if unused) * @param sel_start start index of selected area (`LV_LABEL_TXT_SEL_OFF` if none) - * @param sel_end end index of selected area (`LV_LABEL_TXT_SEL_OFF` if none) + * @param bidi_dir base direction of the text */ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa_scale, - const char * txt, lv_txt_flag_t flag, lv_point_t * offset, uint16_t sel_start, uint16_t sel_end, - lv_draw_label_hint_t * hint); + const char * txt, lv_txt_flag_t flag, lv_point_t * offset, lv_draw_label_txt_sel_t * sel, + lv_draw_label_hint_t * hint, lv_bidi_dir_t bidi_dir); /********************** * MACROS diff --git a/src/lv_draw/lv_draw_line.c b/src/lv_draw/lv_draw_line.c index a522a4b57..949860b9d 100644 --- a/src/lv_draw/lv_draw_line.c +++ b/src/lv_draw/lv_draw_line.c @@ -1,4 +1,4 @@ -/** +/**lip * @file lv_draw_line.c * */ @@ -9,6 +9,8 @@ #include #include #include "lv_draw.h" +#include "lv_draw_mask.h" +#include "lv_draw_blend.h" #include "../lv_core/lv_refr.h" #include "../lv_misc/lv_math.h" @@ -20,40 +22,16 @@ * TYPEDEFS **********************/ -typedef struct -{ - lv_point_t p1; - lv_point_t p2; - lv_point_t p_act; - lv_coord_t dx; - lv_coord_t sx; /*-1: x1 < x2; 1: x2 >= x1*/ - lv_coord_t dy; - lv_coord_t sy; /*-1: y1 < y2; 1: y2 >= y1*/ - lv_coord_t err; - lv_coord_t e2; - bool hor; /*Rather horizontal or vertical*/ -} line_draw_t; - -typedef struct -{ - lv_coord_t width; - lv_coord_t width_1; - lv_coord_t width_half; -} line_width_t; - /********************** * STATIC PROTOTYPES **********************/ -static void line_draw_hor(line_draw_t * main_line, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale); -static void line_draw_ver(line_draw_t * main_line, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale); -static void line_draw_skew(line_draw_t * main_line, bool dir_ori, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale); -static void line_init(line_draw_t * line, const lv_point_t * p1, const lv_point_t * p2); -static bool line_next(line_draw_t * line); -static bool line_next_y(line_draw_t * line); -static bool line_next_x(line_draw_t * line); +static void draw_line_skew(const lv_point_t * point1, const lv_point_t * point2, const lv_area_t * clip, + const lv_style_t * style, lv_opa_t opa_scale); +static void draw_line_hor(const lv_point_t * point1, const lv_point_t * point2, const lv_area_t * clip, + const lv_style_t * style, lv_opa_t opa_scale); +static void draw_line_ver(const lv_point_t * point1, const lv_point_t * point2, const lv_area_t * clip, + const lv_style_t * style, lv_opa_t opa_scale); + /********************** * STATIC VARIABLES @@ -75,563 +53,297 @@ static bool line_next_x(line_draw_t * line); * @param style pointer to a line's style * @param opa_scale scale down all opacities by the factor */ -void lv_draw_line(const lv_point_t * point1, const lv_point_t * point2, const lv_area_t * mask, - const lv_style_t * style, lv_opa_t opa_scale) +void lv_draw_line(const lv_point_t * point1, const lv_point_t * point2, const lv_area_t * clip, + const lv_style_t * style, lv_opa_t opa_scale) { - if(style->line.width == 0) return; if(point1->x == point2->x && point1->y == point2->y) return; - /*Return if the points are out of the mask*/ - if(point1->x < mask->x1 - style->line.width && point2->x < mask->x1 - style->line.width) return; - if(point1->x > mask->x2 + style->line.width && point2->x > mask->x2 + style->line.width) return; - if(point1->y < mask->y1 - style->line.width && point2->y < mask->y1 - style->line.width) return; - if(point1->y > mask->y2 + style->line.width && point2->y > mask->y2 + style->line.width) return; + lv_area_t clip_line; + clip_line.x1 = LV_MATH_MIN(point1->x, point2->x) - style->line.width/2; + clip_line.x2 = LV_MATH_MAX(point1->x, point2->x) + style->line.width/2; + clip_line.y1 = LV_MATH_MIN(point1->y, point2->y) - style->line.width/2; + clip_line.y2 = LV_MATH_MAX(point1->y, point2->y) + style->line.width/2; - line_draw_t main_line; - lv_point_t p1; - lv_point_t p2; + bool is_common; + is_common = lv_area_intersect(&clip_line, &clip_line, clip); + if(!is_common) return; - /*If the line if rather vertical then be sure y1 < y2 else x1 < x2*/ - - if(LV_MATH_ABS(point1->x - point2->x) > LV_MATH_ABS(point1->y - point2->y)) { - - /*Steps less in y then x -> rather horizontal*/ - if(point1->x < point2->x) { - p1.x = point1->x; - p1.y = point1->y; - p2.x = point2->x; - p2.y = point2->y; - } else { - p1.x = point2->x; - p1.y = point2->y; - p2.x = point1->x; - p2.y = point1->y; - } - } else { - /*Steps less in x then y -> rather vertical*/ - if(point1->y < point2->y) { - p1.x = point1->x; - p1.y = point1->y; - p2.x = point2->x; - p2.y = point2->y; - } else { - p1.x = point2->x; - p1.y = point2->y; - p2.x = point1->x; - p2.y = point1->y; - } - } - - line_init(&main_line, &p1, &p2); - - /*Special case draw a horizontal line*/ - if(main_line.p1.y == main_line.p2.y) { - line_draw_hor(&main_line, mask, style, opa_scale); - } - /*Special case draw a vertical line*/ - else if(main_line.p1.x == main_line.p2.x) { - line_draw_ver(&main_line, mask, style, opa_scale); - } - /*Arbitrary skew line*/ - else { - bool dir_ori = false; -#if LV_ANTIALIAS - bool aa = lv_disp_get_antialiasing(lv_refr_get_disp_refreshing()); - if(aa) { - lv_point_t p_tmp; - - if(main_line.hor) { - if(main_line.p1.y < main_line.p2.y) { - dir_ori = true; - p_tmp.x = main_line.p2.x; - p_tmp.y = main_line.p2.y - 1; - line_init(&main_line, &p1, &p_tmp); - main_line.sy = LV_MATH_ABS(main_line.sy); /*The sign can change if the line becomes horizontal*/ - } else if(main_line.p1.y > main_line.p2.y) { - dir_ori = false; - p_tmp.x = main_line.p2.x; - p_tmp.y = main_line.p2.y + 1; - line_init(&main_line, &p1, &p_tmp); - main_line.sy = -LV_MATH_ABS(main_line.sy); /*The sign can change if the line becomes horizontal*/ - } - } else { - if(main_line.p1.x < main_line.p2.x) { - dir_ori = true; - p_tmp.x = main_line.p2.x - 1; - p_tmp.y = main_line.p2.y; - line_init(&main_line, &p1, &p_tmp); - main_line.sx = LV_MATH_ABS(main_line.sx); /*The sign can change if the line becomes vertical*/ - } else if(main_line.p1.x > main_line.p2.x) { - dir_ori = false; - p_tmp.x = main_line.p2.x + 1; - p_tmp.y = main_line.p2.y; - line_init(&main_line, &p1, &p_tmp); - main_line.sx = -LV_MATH_ABS(main_line.sx); /*The sign can change if the line becomes vertical*/ - } - } - } -#endif - line_draw_skew(&main_line, dir_ori, mask, style, opa_scale); - } + if(point1->y == point2->y) draw_line_hor(point1, point2, &clip_line, style, opa_scale); + else if(point1->x == point2->x) draw_line_ver(point1, point2, &clip_line, style, opa_scale); + else draw_line_skew(point1, point2, &clip_line, style, opa_scale); } /********************** * STATIC FUNCTIONS **********************/ -static void line_draw_hor(line_draw_t * main_line, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa_scale) +static void draw_line_hor(const lv_point_t * point1, const lv_point_t * point2, const lv_area_t * clip, + const lv_style_t * style, lv_opa_t opa_scale) { - lv_coord_t width = style->line.width - 1; - lv_coord_t width_half = width >> 1; - lv_coord_t width_1 = width & 0x1; - lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->line.opa : (uint16_t)((uint16_t)style->line.opa * opa_scale) >> 8; + lv_opa_t opa = style->line.opa; + if(opa_scale != LV_OPA_COVER) opa = (opa * opa_scale) >> 8; - lv_area_t act_area; - act_area.x1 = main_line->p1.x; - act_area.x2 = main_line->p2.x; - act_area.y1 = main_line->p1.y - width_half - width_1; - act_area.y2 = main_line->p2.y + width_half; + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + lv_disp_buf_t * vdb = lv_disp_get_buf(disp); + + const lv_area_t * disp_area = &vdb->area; + + lv_coord_t w = style->line.width - 1; + lv_coord_t w_half0 = w >> 1; + lv_coord_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ + + + int16_t other_mask_cnt = lv_draw_mask_get_cnt(); lv_area_t draw_area; - draw_area.x1 = LV_MATH_MIN(act_area.x1, act_area.x2); - draw_area.x2 = LV_MATH_MAX(act_area.x1, act_area.x2); - draw_area.y1 = LV_MATH_MIN(act_area.y1, act_area.y2); - draw_area.y2 = LV_MATH_MAX(act_area.y1, act_area.y2); - lv_draw_fill(&draw_area, mask, style->line.color, opa); -} + draw_area.x1 = LV_MATH_MIN(point1->x, point2->x); + draw_area.x2 = LV_MATH_MAX(point1->x, point2->x) - 1; + draw_area.y1 = point1->y - w_half1; + draw_area.y2 = point1->y + w_half0; -static void line_draw_ver(line_draw_t * main_line, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa_scale) -{ - lv_coord_t width = style->line.width - 1; - lv_coord_t width_half = width >> 1; - lv_coord_t width_1 = width & 0x1; - lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->line.opa : (uint16_t)((uint16_t)style->line.opa * opa_scale) >> 8; - - lv_area_t act_area; - act_area.x1 = main_line->p1.x - width_half; - act_area.x2 = main_line->p2.x + width_half + width_1; - act_area.y1 = main_line->p1.y; - act_area.y2 = main_line->p2.y; - - lv_area_t draw_area; - draw_area.x1 = LV_MATH_MIN(act_area.x1, act_area.x2); - draw_area.x2 = LV_MATH_MAX(act_area.x1, act_area.x2); - draw_area.y1 = LV_MATH_MIN(act_area.y1, act_area.y2); - draw_area.y2 = LV_MATH_MAX(act_area.y1, act_area.y2); - lv_draw_fill(&draw_area, mask, style->line.color, opa); -} - -static void line_draw_skew(line_draw_t * main_line, bool dir_ori, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale) -{ - - lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->line.opa : (uint16_t)((uint16_t)style->line.opa * opa_scale) >> 8; -#if LV_ANTIALIAS - bool aa = lv_disp_get_antialiasing(lv_refr_get_disp_refreshing()); -#endif - lv_point_t vect_main, vect_norm; - vect_main.x = main_line->p2.x - main_line->p1.x; - vect_main.y = main_line->p2.y - main_line->p1.y; - - if(main_line->hor) { - if(main_line->p1.y < main_line->p2.y + dir_ori) { - vect_norm.x = -vect_main.y; - vect_norm.y = vect_main.x; - } else { - vect_norm.x = vect_main.y; - vect_norm.y = -vect_main.x; - } - } else { - if(main_line->p1.x < main_line->p2.x + dir_ori) { - vect_norm.x = vect_main.y; - vect_norm.y = -vect_main.x; - } else { - vect_norm.x = -vect_main.y; - vect_norm.y = vect_main.x; - } + /*If there is no mask then simply draw a rectangle*/ + if(other_mask_cnt == 0) { + lv_blend_fill(clip, &draw_area, + style->line.color, NULL, LV_DRAW_MASK_RES_FULL_COVER,opa, + LV_BLEND_MODE_NORMAL); } - - /* In case of a short but tick line the perpendicular ending is longer then the real line. - * it would break the calculations so make the normal vector larger*/ - vect_norm.x = vect_norm.x << 4; - vect_norm.y = vect_norm.y << 4; - - lv_coord_t width; - width = style->line.width; - - /* The pattern stores the points of the line ending. It has the good direction and length. - * The worth case is the 45° line where pattern can have 1.41 x `width` points*/ - - lv_coord_t pattern_size = width * 2; - lv_point_t * pattern = lv_draw_get_buf(pattern_size * sizeof(lv_point_t)); - lv_coord_t i = 0; - - /*Create a perpendicular pattern (a small line)*/ - if(width != 0) { - line_draw_t pattern_line; - lv_point_t p0 = {0, 0}; - line_init(&pattern_line, &p0, &vect_norm); - - uint32_t width_sqr = width * width; - /* Run for a lot of times. Meanwhile the real width will be determined as well */ - for(i = 0; i < (lv_coord_t)pattern_size - 1; i++) { - pattern[i].x = pattern_line.p_act.x; - pattern[i].y = pattern_line.p_act.y; - - /*Finish the pattern line if it's length equal to the desired width (Use Pythagoras - * theorem)*/ - uint32_t sqr = pattern_line.p_act.x * pattern_line.p_act.x + pattern_line.p_act.y * pattern_line.p_act.y; - if(sqr >= width_sqr) { - width = i; -#if LV_ANTIALIAS - if(aa) width--; -#endif - break; - } - - line_next(&pattern_line); - } - } - -#if LV_ANTIALIAS - lv_coord_t aa_last_corner; - lv_coord_t width_safe = width; - if(aa) { - if(width == 0) width_safe = 1; - - aa_last_corner = 0; - } -#endif - - lv_coord_t x_center_ofs = 0; - lv_coord_t y_center_ofs = 0; - - if(width != 0) { - x_center_ofs = pattern[width - 1].x / 2; - y_center_ofs = pattern[width - 1].y / 2; - } else { - if(main_line->hor && main_line->p1.y >= main_line->p2.y + dir_ori) pattern[0].y--; - if(!main_line->hor && main_line->p1.x >= main_line->p2.x + dir_ori) pattern[0].x--; - } - - /* Make the coordinates relative to the center */ - for(i = 0; i < width; i++) { - pattern[i].x -= x_center_ofs; - pattern[i].y -= y_center_ofs; -#if LV_ANTIALIAS - if(aa) { - if(i != 0) { - if(main_line->hor) { - if(pattern[i - 1].x != pattern[i].x) { - lv_coord_t seg_w = pattern[i].y - pattern[aa_last_corner].y; - if(main_line->sy < 0) { - lv_draw_aa_ver_seg(main_line->p1.x + pattern[aa_last_corner].x - 1, - main_line->p1.y + pattern[aa_last_corner].y + seg_w + 1, seg_w, mask, - style->line.color, opa); - - lv_draw_aa_ver_seg(main_line->p2.x + pattern[aa_last_corner].x + 1, - main_line->p2.y + pattern[aa_last_corner].y + seg_w + 1, -seg_w, mask, - style->line.color, opa); - } else { - lv_draw_aa_ver_seg(main_line->p1.x + pattern[aa_last_corner].x - 1, - main_line->p1.y + pattern[aa_last_corner].y, seg_w, mask, - style->line.color, opa); - - lv_draw_aa_ver_seg(main_line->p2.x + pattern[aa_last_corner].x + 1, - main_line->p2.y + pattern[aa_last_corner].y, -seg_w, mask, - style->line.color, opa); - } - aa_last_corner = i; - } - } else { - if(pattern[i - 1].y != pattern[i].y) { - lv_coord_t seg_w = pattern[i].x - pattern[aa_last_corner].x; - if(main_line->sx < 0) { - lv_draw_aa_hor_seg(main_line->p1.x + pattern[aa_last_corner].x + seg_w + 1, - main_line->p1.y + pattern[aa_last_corner].y - 1, seg_w, mask, - style->line.color, opa); - - lv_draw_aa_hor_seg(main_line->p2.x + pattern[aa_last_corner].x + seg_w + 1, - main_line->p2.y + pattern[aa_last_corner].y + 1, -seg_w, mask, - style->line.color, opa); - } else { - lv_draw_aa_hor_seg(main_line->p1.x + pattern[aa_last_corner].x, - main_line->p1.y + pattern[aa_last_corner].y - 1, seg_w, mask, - style->line.color, opa); - - lv_draw_aa_hor_seg(main_line->p2.x + pattern[aa_last_corner].x, - main_line->p2.y + pattern[aa_last_corner].y + 1, -seg_w, mask, - style->line.color, opa); - } - aa_last_corner = i; - } - } - } - } -#endif - } - -#if LV_ANTIALIAS - /*Add the last part of anti-aliasing for the perpendicular ending*/ - if(width != 0 && aa) { /*Due to rounding error with very thin lines it looks ugly*/ - if(main_line->hor) { - lv_coord_t seg_w = pattern[width_safe - 1].y - pattern[aa_last_corner].y; - if(main_line->sy < 0) { - lv_draw_aa_ver_seg(main_line->p1.x + pattern[aa_last_corner].x - 1, - main_line->p1.y + pattern[aa_last_corner].y + seg_w, seg_w + main_line->sy, mask, - style->line.color, opa); - - lv_draw_aa_ver_seg(main_line->p2.x + pattern[aa_last_corner].x + 1, - main_line->p2.y + pattern[aa_last_corner].y + seg_w, -(seg_w + main_line->sy), mask, - style->line.color, opa); - - } else { - lv_draw_aa_ver_seg(main_line->p1.x + pattern[aa_last_corner].x - 1, - main_line->p1.y + pattern[aa_last_corner].y, seg_w + main_line->sy, mask, - style->line.color, opa); - - lv_draw_aa_ver_seg(main_line->p2.x + pattern[aa_last_corner].x + 1, - main_line->p2.y + pattern[aa_last_corner].y, -(seg_w + main_line->sy), mask, - style->line.color, opa); - } - } else { - lv_coord_t seg_w = pattern[width_safe - 1].x - pattern[aa_last_corner].x; - if(main_line->sx < 0) { - lv_draw_aa_hor_seg(main_line->p1.x + pattern[aa_last_corner].x + seg_w, - main_line->p1.y + pattern[aa_last_corner].y - 1, seg_w + main_line->sx, mask, - style->line.color, opa); - - lv_draw_aa_hor_seg(main_line->p2.x + pattern[aa_last_corner].x + seg_w, - main_line->p2.y + pattern[aa_last_corner].y + 1, -(seg_w + main_line->sx), mask, - style->line.color, opa); - - } else { - lv_draw_aa_hor_seg(main_line->p1.x + pattern[aa_last_corner].x, - main_line->p1.y + pattern[aa_last_corner].y - 1, seg_w + main_line->sx, mask, - style->line.color, opa); - - lv_draw_aa_hor_seg(main_line->p2.x + pattern[aa_last_corner].x, - main_line->p2.y + pattern[aa_last_corner].y + 1, -(seg_w + main_line->sx), mask, - style->line.color, opa); - } - } - } -#endif - -#if LV_ANTIALIAS - - /*Shift the anti aliasing on the edges (-1, 1 or 0 (zero only in case width == 0))*/ - lv_coord_t aa_shift1 = 0; - lv_coord_t aa_shift2 = 0; - if(aa) { - if(main_line->hor == false) { - if(main_line->sx < 0) { - aa_shift1 = -1; - aa_shift2 = width == 0 ? 0 : aa_shift1; - } else { - aa_shift2 = 1; - aa_shift1 = width == 0 ? 0 : aa_shift2; - } - } else { - if(main_line->sy < 0) { - aa_shift1 = -1; - aa_shift2 = width == 0 ? 0 : aa_shift1; - } else { - aa_shift2 = 1; - aa_shift1 = width == 0 ? 0 : aa_shift2; - } - } - } -#endif - - volatile lv_point_t prev_p; - prev_p.x = main_line->p1.x; - prev_p.y = main_line->p1.y; - lv_area_t draw_area; - bool first_run = true; - - if(main_line->hor) { - while(line_next_y(main_line)) { - for(i = 0; i < width; i++) { - draw_area.x1 = prev_p.x + pattern[i].x; - draw_area.y1 = prev_p.y + pattern[i].y; - draw_area.x2 = draw_area.x1 + main_line->p_act.x - prev_p.x - 1; - draw_area.y2 = draw_area.y1; - lv_draw_fill(&draw_area, mask, style->line.color, opa); - - /* Fill the gaps - * When stepping in y one pixel remains empty on every corner (don't do this on the - * first segment ) */ - if(i != 0 && pattern[i].x != pattern[i - 1].x && !first_run) { - lv_draw_px(draw_area.x1, draw_area.y1 - main_line->sy, mask, style->line.color, opa); - } - } - -#if LV_ANTIALIAS - if(aa) { - lv_draw_aa_hor_seg(prev_p.x + pattern[0].x, prev_p.y + pattern[0].y - aa_shift1, - -(main_line->p_act.x - prev_p.x), mask, style->line.color, opa); - lv_draw_aa_hor_seg(prev_p.x + pattern[width_safe - 1].x, - prev_p.y + pattern[width_safe - 1].y + aa_shift2, main_line->p_act.x - prev_p.x, - mask, style->line.color, opa); - } -#endif - - first_run = false; - - prev_p.x = main_line->p_act.x; - prev_p.y = main_line->p_act.y; - } - - for(i = 0; i < width; i++) { - draw_area.x1 = prev_p.x + pattern[i].x; - draw_area.y1 = prev_p.y + pattern[i].y; - draw_area.x2 = draw_area.x1 + main_line->p_act.x - prev_p.x; - draw_area.y2 = draw_area.y1; - lv_draw_fill(&draw_area, mask, style->line.color, opa); - - /* Fill the gaps - * When stepping in y one pixel remains empty on every corner */ - if(i != 0 && pattern[i].x != pattern[i - 1].x && !first_run) { - lv_draw_px(draw_area.x1, draw_area.y1 - main_line->sy, mask, style->line.color, opa); - } - } - -#if LV_ANTIALIAS - if(aa) { - lv_draw_aa_hor_seg(prev_p.x + pattern[0].x, prev_p.y + pattern[0].y - aa_shift1, - -(main_line->p_act.x - prev_p.x + 1), mask, style->line.color, opa); - lv_draw_aa_hor_seg(prev_p.x + pattern[width_safe - 1].x, prev_p.y + pattern[width_safe - 1].y + aa_shift2, - main_line->p_act.x - prev_p.x + 1, mask, style->line.color, opa); - } -#endif - } - /*Rather a vertical line*/ + /*If there other mask apply it*/ else { + /* Get clipped fill area which is the real draw area. + * It is always the same or inside `fill_area` */ + bool is_common; + is_common = lv_area_intersect(&draw_area, clip, &draw_area); + if(!is_common) return; - while(line_next_x(main_line)) { - for(i = 0; i < width; i++) { - draw_area.x1 = prev_p.x + pattern[i].x; - draw_area.y1 = prev_p.y + pattern[i].y; - draw_area.x2 = draw_area.x1; - draw_area.y2 = draw_area.y1 + main_line->p_act.y - prev_p.y - 1; + /* Now `draw_area` has absolute coordinates. + * Make it relative to `disp_area` to simplify draw to `disp_buf`*/ + draw_area.x1 -= vdb->area.x1; + draw_area.y1 -= vdb->area.y1; + draw_area.x2 -= vdb->area.x1; + draw_area.y2 -= vdb->area.y1; - lv_draw_fill(&draw_area, mask, style->line.color, opa); + lv_coord_t draw_area_w = lv_area_get_width(&draw_area); - /* Fill the gaps - * When stepping in x one pixel remains empty on every corner (don't do this on the - * first segment ) */ - if(i != 0 && pattern[i].y != pattern[i - 1].y && !first_run) { - lv_draw_px(draw_area.x1 - main_line->sx, draw_area.y1, mask, style->line.color, opa); - } - } + lv_area_t fill_area; + fill_area.x1 = draw_area.x1 + disp_area->x1; + fill_area.x2 = draw_area.x2 + disp_area->x1; + fill_area.y1 = draw_area.y1 + disp_area->y1; + fill_area.y2 = fill_area.y1; -#if LV_ANTIALIAS - if(aa) { - lv_draw_aa_ver_seg(prev_p.x + pattern[0].x - aa_shift1, prev_p.y + pattern[0].y, - -(main_line->p_act.y - prev_p.y), mask, style->line.color, opa); - lv_draw_aa_ver_seg(prev_p.x + pattern[width_safe - 1].x + aa_shift2, - prev_p.y + pattern[width_safe - 1].y, main_line->p_act.y - prev_p.y, mask, - style->line.color, opa); - } -#endif + lv_opa_t * mask_buf = lv_mem_buf_get(draw_area_w); + lv_coord_t h; + lv_draw_mask_res_t mask_res; + for(h = draw_area.y1; h <= draw_area.y2; h++) { + memset(mask_buf, LV_OPA_COVER, draw_area_w); + mask_res = lv_draw_mask_apply(mask_buf, vdb->area.x1 + draw_area.x1, vdb->area.y1 + h, draw_area_w); - first_run = false; + lv_blend_fill(clip, &fill_area, + style->line.color, mask_buf, mask_res, style->line.opa, + style->line.blend_mode); - prev_p.x = main_line->p_act.x; - prev_p.y = main_line->p_act.y; - } - - /*Draw the last part*/ - for(i = 0; i < width; i++) { - draw_area.x1 = prev_p.x + pattern[i].x; - draw_area.y1 = prev_p.y + pattern[i].y; - draw_area.x2 = draw_area.x1; - draw_area.y2 = draw_area.y1 + main_line->p_act.y - prev_p.y; - - lv_draw_fill(&draw_area, mask, style->line.color, opa); - - /* Fill the gaps - * When stepping in x one pixel remains empty on every corner */ - if(i != 0 && pattern[i].y != pattern[i - 1].y && !first_run) { - lv_draw_px(draw_area.x1 - main_line->sx, draw_area.y1, mask, style->line.color, opa); - } - } - -#if LV_ANTIALIAS - if(aa) { - lv_draw_aa_ver_seg(prev_p.x + pattern[0].x - aa_shift1, prev_p.y + pattern[0].y, - -(main_line->p_act.y - prev_p.y + 1), mask, style->line.color, opa); - lv_draw_aa_ver_seg(prev_p.x + pattern[width_safe - 1].x + aa_shift2, prev_p.y + pattern[width_safe - 1].y, - main_line->p_act.y - prev_p.y + 1, mask, style->line.color, opa); - } -#endif + fill_area.y1++; + fill_area.y2++; + } + lv_mem_buf_release(mask_buf); } } -static void line_init(line_draw_t * line, const lv_point_t * p1, const lv_point_t * p2) + +static void draw_line_ver(const lv_point_t * point1, const lv_point_t * point2, const lv_area_t * clip, + const lv_style_t * style, lv_opa_t opa_scale) { - line->p1.x = p1->x; - line->p1.y = p1->y; - line->p2.x = p2->x; - line->p2.y = p2->y; + lv_opa_t opa = style->line.opa; + if(opa_scale != LV_OPA_COVER) opa = (opa * opa_scale) >> 8; - line->dx = LV_MATH_ABS(line->p2.x - line->p1.x); - line->sx = line->p1.x < line->p2.x ? 1 : -1; - line->dy = LV_MATH_ABS(line->p2.y - line->p1.y); - line->sy = line->p1.y < line->p2.y ? 1 : -1; - line->err = (line->dx > line->dy ? line->dx : -line->dy) / 2; - line->e2 = 0; - line->hor = line->dx > line->dy ? true : false; /*Rather horizontal or vertical*/ + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + lv_disp_buf_t * vdb = lv_disp_get_buf(disp); - line->p_act.x = line->p1.x; - line->p_act.y = line->p1.y; -} + const lv_area_t * disp_area = &vdb->area; -static bool line_next(line_draw_t * line) -{ - if(line->p_act.x == line->p2.x && line->p_act.y == line->p2.y) return false; - line->e2 = line->err; - if(line->e2 > -line->dx) { - line->err -= line->dy; - line->p_act.x += line->sx; + lv_coord_t w = style->line.width - 1; + lv_coord_t w_half0 = w >> 1; + lv_coord_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ + + + int16_t other_mask_cnt = lv_draw_mask_get_cnt(); + + lv_area_t draw_area; + draw_area.x1 = point1->x - w_half1; + draw_area.x2 = point1->x + w_half0; + draw_area.y1 = LV_MATH_MIN(point1->y, point2->y); + draw_area.y2 = LV_MATH_MAX(point1->y, point2->y) - 1; + + /*If there is no mask then simply draw a rectangle*/ + if(other_mask_cnt == 0) { + + lv_blend_fill(clip, &draw_area, + style->line.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa, + style->line.blend_mode); } - if(line->e2 < line->dy) { - line->err += line->dx; - line->p_act.y += line->sy; + /*If there other mask apply it*/ + else { + /* Get clipped fill area which is the real draw area. + * It is always the same or inside `fill_area` */ + bool is_common; + is_common = lv_area_intersect(&draw_area, clip, &draw_area); + if(!is_common) return; + + /* Now `draw_area` has absolute coordinates. + * Make it relative to `disp_area` to simplify draw to `disp_buf`*/ + draw_area.x1 -= vdb->area.x1; + draw_area.y1 -= vdb->area.y1; + draw_area.x2 -= vdb->area.x1; + draw_area.y2 -= vdb->area.y1; + + lv_coord_t draw_area_w = lv_area_get_width(&draw_area); + + lv_area_t fill_area; + fill_area.x1 = draw_area.x1 + disp_area->x1; + fill_area.x2 = draw_area.x2 + disp_area->x1; + fill_area.y1 = draw_area.y1 + disp_area->y1; + fill_area.y2 = fill_area.y1; + + lv_opa_t * mask_buf = lv_mem_buf_get(draw_area_w); + lv_coord_t h; + lv_draw_mask_res_t mask_res; + for(h = draw_area.y1; h <= draw_area.y2; h++) { + memset(mask_buf, LV_OPA_COVER, draw_area_w); + mask_res = lv_draw_mask_apply(mask_buf, vdb->area.x1 + draw_area.x1, vdb->area.y1 + h, draw_area_w); + + lv_blend_fill(clip, &fill_area, + style->line.color, mask_buf, mask_res, style->line.opa, + LV_BLEND_MODE_NORMAL); + + fill_area.y1++; + fill_area.y2++; + } + lv_mem_buf_release(mask_buf); } - return true; } -/** - * Iterate until step one in y direction. - * @param line - * @return - */ -static bool line_next_y(line_draw_t * line) + +static void draw_line_skew(const lv_point_t * point1, const lv_point_t * point2, const lv_area_t * clip, + const lv_style_t * style, lv_opa_t opa_scale) { - lv_coord_t last_y = line->p_act.y; + lv_opa_t opa = style->line.opa; + if(opa_scale != LV_OPA_COVER) opa = (opa * opa_scale) >> 8; - do { - if(!line_next(line)) return false; - } while(last_y == line->p_act.y); + /*Keep the great y in p1*/ + lv_point_t p1; + lv_point_t p2; + if(point1->y < point2->y) { + p1.y = point1->y; + p2.y = point2->y; + p1.x = point1->x; + p2.x = point2->x; + } else { + p1.y = point2->y; + p2.y = point1->y; + p1.x = point2->x; + p2.x = point1->x; + } - return true; -} - -/** - * Iterate until step one in x direction. - * @param line - * @return - */ -static bool line_next_x(line_draw_t * line) -{ - lv_coord_t last_x = line->p_act.x; - - do { - if(!line_next(line)) return false; - } while(last_x == line->p_act.x); - - return true; + lv_coord_t xdiff = p2.x - p1.x; + lv_coord_t ydiff = p2.y - p1.y; + bool flat = LV_MATH_ABS(xdiff) > LV_MATH_ABS(ydiff) ? true : false; + + static const uint8_t wcorr[] = { + 128, 128, 128, 129, 129, 130, 130, 131, + 132, 133, 134, 135, 137, 138, 140, 141, + 143, 145, 147, 149, 151, 153, 155, 158, + 160, 162, 165, 167, 170, 173, 175, 178, + 181, + }; + + lv_coord_t w = style->line.width; + lv_coord_t wcorr_i = 0; + if(flat) wcorr_i = (LV_MATH_ABS(ydiff) << 5) / LV_MATH_ABS(xdiff); + else wcorr_i = (LV_MATH_ABS(xdiff) << 5) / LV_MATH_ABS(ydiff); + + w = (w * wcorr[wcorr_i]) >> 7; + lv_coord_t w_half0 = w >> 1; + lv_coord_t w_half1 = w_half0 + (w & 0x1); /*Compensate rounding error*/ + + lv_area_t draw_area; + draw_area.x1 = LV_MATH_MIN(p1.x, p2.x) - w; + draw_area.x2 = LV_MATH_MAX(p1.x, p2.x) + w; + draw_area.y1 = LV_MATH_MIN(p1.y, p2.y) - w; + draw_area.y2 = LV_MATH_MAX(p1.y, p2.y) + w; + + /* Get the union of `coords` and `clip`*/ + /* `clip` is already truncated to the `vdb` size + * in 'lv_refr_area' function */ + bool is_common = lv_area_intersect(&draw_area, &draw_area, clip); + if(is_common == false) return; + + lv_draw_mask_line_param_t mask_left_param; + lv_draw_mask_line_param_t mask_right_param; + lv_draw_mask_line_param_t mask_top_param; + lv_draw_mask_line_param_t mask_bottom_param; + + if(flat) { + if(xdiff > 0) { + lv_draw_mask_line_points_init(&mask_left_param, p1.x, p1.y - w_half0, p2.x, p2.y - w_half0, LV_DRAW_MASK_LINE_SIDE_LEFT); + lv_draw_mask_line_points_init(&mask_right_param, p1.x, p1.y + w_half1, p2.x, p2.y + w_half1, LV_DRAW_MASK_LINE_SIDE_RIGHT); + } else { + lv_draw_mask_line_points_init(&mask_left_param, p1.x, p1.y + w_half1, p2.x, p2.y + w_half1, LV_DRAW_MASK_LINE_SIDE_LEFT); + lv_draw_mask_line_points_init(&mask_right_param, p1.x, p1.y - w_half0, p2.x, p2.y - w_half0, LV_DRAW_MASK_LINE_SIDE_RIGHT); + } + } else { + lv_draw_mask_line_points_init(&mask_left_param, p1.x + w_half1, p1.y, p2.x + w_half1, p2.y, LV_DRAW_MASK_LINE_SIDE_LEFT); + lv_draw_mask_line_points_init(&mask_right_param, p1.x - w_half0, p1.y, p2.x - w_half0, p2.y, LV_DRAW_MASK_LINE_SIDE_RIGHT); + } + + /*Use the normal vector for the endings*/ + lv_draw_mask_line_points_init(&mask_top_param, p1.x, p1.y, p1.x - ydiff, p1.y + xdiff, LV_DRAW_MASK_LINE_SIDE_BOTTOM); + lv_draw_mask_line_points_init(&mask_bottom_param, p2.x, p2.y,p2.x - ydiff, p2.y + xdiff, LV_DRAW_MASK_LINE_SIDE_TOP); + + int16_t mask_left_id = lv_draw_mask_add(&mask_left_param, NULL); + int16_t mask_right_id = lv_draw_mask_add(&mask_right_param, NULL); + int16_t mask_top_id = lv_draw_mask_add(&mask_top_param, NULL); + int16_t mask_bottom_id = lv_draw_mask_add(&mask_bottom_param, NULL); + + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + lv_disp_buf_t * vdb = lv_disp_get_buf(disp); + + const lv_area_t * disp_area = &vdb->area; + + /*Store the coordinates of the `draw_a` relative to the VDB */ + draw_area.x1 -= disp_area->x1; + draw_area.y1 -= disp_area->y1; + draw_area.x2 -= disp_area->x1; + draw_area.y2 -= disp_area->y1; + + lv_coord_t draw_area_w = lv_area_get_width(&draw_area); + + /*Draw the background line by line*/ + lv_coord_t h; + lv_draw_mask_res_t mask_res; + lv_opa_t * mask_buf = lv_mem_buf_get(draw_area_w); + lv_area_t fill_area; + fill_area.x1 = draw_area.x1 + disp_area->x1; + fill_area.x2 = draw_area.x2 + disp_area->x1; + fill_area.y1 = draw_area.y1 + disp_area->y1; + fill_area.y2 = fill_area.y1; + + /*Fill the first row with 'color'*/ + for(h = draw_area.y1; h <= draw_area.y2; h++) { + memset(mask_buf, LV_OPA_COVER, draw_area_w); + mask_res = lv_draw_mask_apply(mask_buf, vdb->area.x1 + draw_area.x1, vdb->area.y1 + h, draw_area_w); + + lv_blend_fill(clip, &fill_area, + style->line.color, mask_buf, mask_res, opa, + style->line.blend_mode); + + fill_area.y1++; + fill_area.y2++; + } + + lv_mem_buf_release(mask_buf); + + lv_draw_mask_remove_id(mask_left_id); + lv_draw_mask_remove_id(mask_right_id); + lv_draw_mask_remove_id(mask_top_id); + lv_draw_mask_remove_id(mask_bottom_id); } diff --git a/src/lv_draw/lv_draw_mask.c b/src/lv_draw/lv_draw_mask.c new file mode 100644 index 000000000..891369306 --- /dev/null +++ b/src/lv_draw/lv_draw_mask.c @@ -0,0 +1,1127 @@ +/** + * @file lv_mask.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_draw_mask.h" +#include "../lv_misc/lv_math.h" +#include "../lv_misc/lv_log.h" +#include "../lv_core/lv_debug.h" + +/********************* + * DEFINES + *********************/ +#define LV_MASK_MAX_NUM 16 + +/********************** + * TYPEDEFS + **********************/ +typedef struct +{ + void * param; + void * custom_id; +}lv_mask_saved_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_line_param_t * param); +static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_radius_param_t * param); +static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_angle_param_t * param); +static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_fade_param_t * param); +static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_map_param_t * param); + +static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_line_param_t * p); +static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_line_param_t * p); + +static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_t mask_new); + +/********************** + * STATIC VARIABLES + **********************/ +static lv_mask_saved_t mask_list[LV_MASK_MAX_NUM]; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Add a draw mask. Everything drawn after it (until removing the mask) will be affected by the mask. + * @param param an initialized mask parameter. Only the pointer is saved. + * @param custom_id a custom pointer to identify the mask. Used in `lv_draw_mask_remove_custom`. + * @return the an integer, the ID of the mask. Can be used in `lv_draw_mask_remove_id`. + */ +int16_t lv_draw_mask_add(void * param, void * custom_id) +{ + /*Look for a free entry*/ + uint8_t i; + for(i = 0; i < LV_MASK_MAX_NUM; i++) { + if(mask_list[i].param == NULL) break; + } + + if(i >= LV_MASK_MAX_NUM) { + LV_LOG_WARN("lv_mask_add: no place to add the mask"); + return LV_MASK_ID_INV; + } + + mask_list[i].param = param; + mask_list[i].custom_id = custom_id; + + return i; +} + +/** + * Apply the added buffers on a line. Used internally by the library's drawing routins. + * @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`. + * @param abs_x absolute X coordinate where the line to calculate start + * @param abs_y absolute Y coordinate where the line to calculate start + * @param len length of the line to calculate (in pixel count) + * @return Oneof these values: + * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero + * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged + * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line + */ +lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len) +{ + bool changed = false; + lv_draw_mask_common_dsc_t * dsc; + + lv_draw_mask_res_t res = LV_DRAW_MASK_RES_FULL_COVER; + uint8_t i; + for(i = 0; i < LV_MASK_MAX_NUM; i++) { + if(mask_list[i].param) { + dsc = mask_list[i].param; + res = dsc->cb(mask_buf, abs_x, abs_y, len, (void*)mask_list[i].param); + if(res == LV_DRAW_MASK_RES_FULL_TRANSP) return LV_DRAW_MASK_RES_FULL_TRANSP; + else if(res == LV_DRAW_MASK_RES_CHANGED) changed = true; + } + } + + return changed ? LV_DRAW_MASK_RES_CHANGED : LV_DRAW_MASK_RES_FULL_COVER; +} + +/** + * Remove a mask with a given ID + * @param id the ID of the mask. Returned by `lv_draw_mask_add` + * @return the parameter of the removed mask. + * If more masks have `custom_id` ID then the last mask's parameter will be returned + */ +void * lv_draw_mask_remove_id(int16_t id) +{ + void * p = NULL; + + if(id != LV_MASK_ID_INV) { + p = mask_list[id].param; + mask_list[id].param = NULL; + mask_list[id].custom_id = NULL; + } + + return p; +} + +/** + * Remove all mask with a given custom ID + * @param custom_id a pointer used in `lv_draw_mask_add` + * @return return the parameter of the removed mask. + * If more masks have `custom_id` ID then the last mask's parameter will be returned + */ +void * lv_draw_mask_remove_custom(void * custom_id) +{ + void * p = NULL; + uint8_t i; + for(i = 0; i < LV_MASK_MAX_NUM; i++) { + if(mask_list[i].custom_id == custom_id) { + p = mask_list[i].param; + mask_list[i].param = NULL; + mask_list[i].custom_id = NULL; + } + } + return p; +} + +/** + * Count the currently added masks + * @return number of active masks + */ +uint8_t lv_draw_mask_get_cnt(void) +{ + uint8_t cnt = 0; + uint8_t i; + for(i = 0; i < LV_MASK_MAX_NUM; i++) { + if(mask_list[i].param) cnt++; + } + return cnt; +} + +/** + *Initialize a line mask from two points. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param p1x X coordinate of the first point of the line + * @param p1y Y coordinate of the first point of the line + * @param p2x X coordinate of the second point of the line + * @param p2y y coordinate of the second point of the line + * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. + * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept + * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept + */ +void lv_draw_mask_line_points_init(lv_draw_mask_line_param_t * param, lv_coord_t p1x, lv_coord_t p1y, lv_coord_t p2x, lv_coord_t p2y, lv_draw_mask_line_side_t side) +{ + memset(param, 0x00, sizeof(lv_draw_mask_line_param_t)); + + if(p1y > p2y) { + lv_coord_t t; + t = p2x; + p2x = p1x; + p1x = t; + + t = p2y; + p2y = p1y; + p1y = t; + } + + param->cfg.p1.x = p1x; + param->cfg.p1.y = p1y; + param->cfg.p2.x = p1x; + param->cfg.p2.y = p1y; + param->cfg.side = side; + + param->origo.x = p1x; + param->origo.y = p1y; + param->flat = (LV_MATH_ABS(p2x-p1x) > LV_MATH_ABS(p2y-p1y)) ? 1 : 0; + param->yx_steep = 0; + param->xy_steep = 0; + param->dsc.cb = (lv_draw_mask_cb_t)lv_draw_mask_line; + param->dsc.type = LV_DRAW_MASK_TYPE_LINE; + + lv_coord_t dx = p2x-p1x; + lv_coord_t dy = p2y-p1y; + + if(param->flat) { + /*Normalize the steep. Delta x should be relative to delta x = 1024*/ + int32_t m; + + if(dx) { + m = (1 << 20) / dx; /*m is multiplier to normalize y (upscaled by 1024)*/ + param->yx_steep = (m * dy) >> 10; + } + + if(dy) { + m = (1 << 20) / dy; /*m is multiplier to normalize x (upscaled by 1024)*/ + param->xy_steep = (m * dx) >> 10; + } + param->steep = param->yx_steep; + } else { + /*Normalize the steep. Delta y should be relative to delta x = 1024*/ + int32_t m; + + if(dy) { + m = (1 << 20) / dy; /*m is multiplier to normalize x (upscaled by 1024)*/ + param->xy_steep = (m * dx) >> 10; + } + + if(dx) { + m = (1 << 20) / dx; /*m is multiplier to normalize x (upscaled by 1024)*/ + param->yx_steep = (m * dy) >> 10; + } + param->steep = param->xy_steep; + } + + if(param->cfg.side == LV_DRAW_MASK_LINE_SIDE_LEFT) param->inv = 0; + else if(param->cfg.side == LV_DRAW_MASK_LINE_SIDE_RIGHT) param->inv = 1; + else if(param->cfg.side == LV_DRAW_MASK_LINE_SIDE_TOP) { + if(param->steep > 0) param->inv = 1; + else param->inv = 0; + } + else if(param->cfg.side == LV_DRAW_MASK_LINE_SIDE_BOTTOM) { + if(param->steep > 0) param->inv = 0; + else param->inv = 1; + } + + param->spx = param->steep >> 2; + if(param->steep < 0) param->spx = -param->spx; +} + +/** + *Initialize a line mask from a point and an angle. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param px X coordiante of a point of the line + * @param py X coordiante of a point of the line + * @param angle right 0 deg, bottom: 90 + * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. + * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept + * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept + */ +void lv_draw_mask_line_angle_init(lv_draw_mask_line_param_t* param, lv_coord_t p1x, lv_coord_t py, int16_t angle, lv_draw_mask_line_side_t side) +{ + /* Find an optimal degree. + * lv_mask_line_points_init will swap the points to keep the smaller y in p1 + * Theoretically a line with `angle` or `angle+180` is the same only the points are swapped + * Find the degree which keeps the origo in place */ + if(angle > 180) angle -= 180; /*> 180 will swap the origo*/ + + + lv_coord_t p2x; + lv_coord_t p2y; + + p2x = (lv_trigo_sin(angle + 90) >> 5) + p1x; + p2y = (lv_trigo_sin(angle) >> 5) + py; + + lv_draw_mask_line_points_init(param, p1x, py, p2x, p2y, side); +} + + +/** + * Initialize an angle mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param vertex_x X coordinate of the angle vertex (absolute coordinates) + * @param vertex_y Y coordinate of the angle vertex (absolute coordinates) + * @param start_angle start angle in degrees. 0 deg on the right, 90 deg, on the bottom + * @param end_angle end angle + */ +void lv_draw_mask_angle_init(lv_draw_mask_angle_param_t * param, lv_coord_t vertex_x, lv_coord_t vertex_y, lv_coord_t start_angle, lv_coord_t end_angle) +{ + lv_draw_mask_line_side_t start_side; + lv_draw_mask_line_side_t end_side; + + /* Constrain the input angles */ + if(start_angle < 0) + start_angle = 0; + else if(start_angle > 359) + start_angle = 359; + + if(end_angle < 0) + end_angle = 0; + else if(end_angle > 359) + end_angle = 359; + + if(end_angle < start_angle) { + param->delta_deg = 360 - start_angle + end_angle; + } else { + param->delta_deg = LV_MATH_ABS(end_angle - start_angle); + } + + param->cfg.start_angle = start_angle; + param->cfg.end_angle = end_angle; + param->cfg.vertex_p.x = vertex_x; + param->cfg.vertex_p.y = vertex_y; + param->dsc.cb = (lv_draw_mask_cb_t)lv_draw_mask_angle; + param->dsc.type = LV_DRAW_MASK_TYPE_ANGLE; + + if(start_angle >= 0 && start_angle < 180) { + start_side = LV_DRAW_MASK_LINE_SIDE_LEFT; + } + else if(start_angle >= 180 && start_angle < 360) { + start_side = LV_DRAW_MASK_LINE_SIDE_RIGHT; + } else { + LV_DEBUG_ASSERT(false, "Unexpected start_angle", start_angle); + } + + if(end_angle >= 0 && end_angle < 180) { + end_side = LV_DRAW_MASK_LINE_SIDE_RIGHT; + } + else if(end_angle >= 180 && end_angle < 360) { + end_side = LV_DRAW_MASK_LINE_SIDE_LEFT; + } else { + LV_DEBUG_ASSERT(false, "Unexpected end_angle", end_angle); + } + + lv_draw_mask_line_angle_init(¶m->start_line, vertex_x, vertex_y, start_angle, start_side); + lv_draw_mask_line_angle_init(¶m->end_line, vertex_x, vertex_y, end_angle, end_side); +} + + +/** + * Initialize a fade mask. + * @param param param pointer to a `lv_draw_mask_param_t` to initialize + * @param rect coordinates of the rectangle to affect (absolute coordinates) + * @param radius radius of the rectangle + * @param inv: true: keep the pixels inside teh rectangle; keep teh pixels outside of the rectangle + */ +void lv_draw_mask_radius_init(lv_draw_mask_radius_param_t * param, const lv_area_t * rect, lv_coord_t radius, bool inv) +{ + + lv_coord_t short_side = LV_MATH_MIN(lv_area_get_width(rect), lv_area_get_height(rect)); + if(radius > short_side >> 1) radius = short_side >> 1; + + lv_area_copy(¶m->cfg.rect, rect); + param->cfg.radius = radius; + param->cfg.outer = inv ? 1 : 0; + param->dsc.cb = (lv_draw_mask_cb_t)lv_draw_mask_radius; + param->dsc.type = LV_DRAW_MASK_TYPE_RADIUS; +} + + +/** + * Initialize a fade mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param coords coordinates of the area to affect (absolute coordinates) + * @param opa_top opacity on the top + * @param y_top at which coordinate start to change to opacity to `opa_bottom` + * @param opa_bottom opacity at the bottom + * @param y_bottom at which coordinate reach `opa_bottom`. + */ +void lv_draw_mask_fade_init(lv_draw_mask_fade_param_t * param, lv_area_t * coords, lv_opa_t opa_top, lv_coord_t y_top, lv_opa_t opa_bottom, lv_coord_t y_bottom) +{ + lv_area_copy(¶m->cfg.coords, coords); + param->cfg.opa_top= opa_top; + param->cfg.opa_bottom = opa_bottom; + param->cfg.y_top= y_top; + param->cfg.y_bottom = y_bottom; + param->dsc.cb = (lv_draw_mask_cb_t)lv_draw_mask_fade; + param->dsc.type = LV_DRAW_MASK_TYPE_FADE; +} + + +/** + * Initialize a map mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param coords coordinates of the map (absolute coordinates) + * @param map array of bytes with the mask values + */ +void lv_draw_mask_map_init(lv_draw_mask_map_param_t * param, lv_area_t * coords, const lv_opa_t * map) +{ + lv_area_copy(¶m->cfg.coords, coords); + param->cfg.map = map; + param->dsc.cb = (lv_draw_mask_cb_t)lv_draw_mask_map; + param->dsc.type = LV_DRAW_MASK_TYPE_MAP; +} + + +/********************** + * STATIC FUNCTIONS + **********************/ + +static lv_draw_mask_res_t lv_draw_mask_line(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_line_param_t * p) +{ + /*Make to points relative to the vertex*/ + abs_y -= p->origo.y; + abs_x -= p->origo.x; + + /*Handle special cases*/ + if(p->steep == 0) { + /*Horizontal*/ + if(p->flat) { + /*Non sense: Can't be on the right/left of a horizontal line*/ + if(p->cfg.side == LV_DRAW_MASK_LINE_SIDE_LEFT || p->cfg.side == LV_DRAW_MASK_LINE_SIDE_RIGHT) return LV_DRAW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_MASK_LINE_SIDE_TOP && abs_y+1 < 0) return LV_DRAW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_MASK_LINE_SIDE_BOTTOM && abs_y > 0) return LV_DRAW_MASK_RES_FULL_COVER; + else { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } + } + /*Vertical*/ + else { + /*Non sense: Can't be on the top/bottom of a vertical line*/ + if(p->cfg.side == LV_DRAW_MASK_LINE_SIDE_TOP || p->cfg.side == LV_DRAW_MASK_LINE_SIDE_BOTTOM) return LV_DRAW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_MASK_LINE_SIDE_RIGHT && abs_x > 0) return LV_DRAW_MASK_RES_FULL_COVER; + else if(p->cfg.side == LV_DRAW_MASK_LINE_SIDE_LEFT) { + if(abs_x + len < 0) return LV_DRAW_MASK_RES_FULL_COVER; + else { + int32_t k = - abs_x; + if(k < 0) return LV_DRAW_MASK_RES_FULL_TRANSP; + if(k >= 0 && k < len) memset(&mask_buf[k], 0x00, len - k); + return LV_DRAW_MASK_RES_CHANGED; + } + } + else { + if(abs_x + len < 0) return LV_DRAW_MASK_RES_FULL_TRANSP; + else { + int32_t k = - abs_x; + if(k < 0) k = 0; + if(k >= len) return LV_DRAW_MASK_RES_FULL_TRANSP; + else if(k >= 0 && k < len) memset(&mask_buf[0], 0x00,k); + return LV_DRAW_MASK_RES_CHANGED; + } + } + } + } + + lv_draw_mask_res_t res; + if(p->flat) { + res = line_mask_flat(mask_buf, abs_x, abs_y, len, p); + } else { + res = line_mask_steep(mask_buf, abs_x, abs_y, len, p); + } + + return res; +} + +static lv_draw_mask_res_t line_mask_flat(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_line_param_t * p) +{ + lv_coord_t y_at_x; + y_at_x = (int32_t)((int32_t)p->yx_steep * abs_x) >> 10; + + if(p->yx_steep > 0) { + if(y_at_x > abs_y) { + if(p->inv) { + return LV_DRAW_MASK_RES_FULL_COVER; + } else { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } + } + } else { + if(y_at_x < abs_y) { + if(p->inv) { + return LV_DRAW_MASK_RES_FULL_COVER; + } else { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } + } + } + + /* At the end of the mask if the limit line is smaller then the mask's y. + * Then the mask is in the "good" area*/ + y_at_x = (int32_t)((int32_t)p->yx_steep * (abs_x + len)) >> 10; + if(p->yx_steep > 0) { + if(y_at_x < abs_y) { + if(p->inv) { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } else { + return LV_DRAW_MASK_RES_FULL_COVER; + } + } + } else { + if(y_at_x > abs_y) { + if(p->inv) { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } else { + return LV_DRAW_MASK_RES_FULL_COVER; + } + } + } + + int32_t xe; + if(p->yx_steep > 0) xe = ((abs_y << 8) * p->xy_steep) >> 10; + else xe = (((abs_y + 1) << 8) * p->xy_steep) >> 10; + + int32_t xei = xe >> 8; + int32_t xef = xe & 0xFF; + + int32_t px_h; + if(xef == 0) px_h = 255; + else px_h = 255 - (((255 - xef) * p->spx) >> 8); + int32_t k = xei - abs_x; + lv_opa_t m; + + if(xef) { + if(k >= 0 && k < len) { + m = 255 - (((255-xef) * (255 - px_h)) >> 9); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k++; + } + + while(px_h > p->spx) { + if(k >= 0 && k < len) { + m = px_h - (p->spx >> 1); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + px_h -= p->spx; + k++; + if(k >= len) break; + } + + + if(k < len && k >= 0) { + int32_t x_inters = (px_h * p->xy_steep) >> 10; + m = (x_inters * px_h) >> 9; + if(p->yx_steep < 0) m = 255 - m; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + + + if(p->inv) { + k = xei - abs_x; + if(k > len) { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } + if(k >= 0) + { + memset(&mask_buf[0], 0x00, k); + } + } else { + k++; + if(k < 0) { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } + if(k <= len) { + memset(&mask_buf[k], 0x00, len - k); + } + } + + return LV_DRAW_MASK_RES_CHANGED; +} + +static lv_draw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_line_param_t * p) +{ + int32_t k; + lv_coord_t x_at_y; + /* At the beginning of the mask if the limit line is greater then the mask's y. + * Then the mask is in the "wrong" area*/ + x_at_y = (int32_t)((int32_t)p->xy_steep * abs_y) >> 10; + if(p->xy_steep > 0) x_at_y++; + if(x_at_y < abs_x) { + if(p->inv) { + return LV_DRAW_MASK_RES_FULL_COVER; + } else { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } + } + + /* At the end of the mask if the limit line is smaller then the mask's y. + * Then the mask is in the "good" area*/ + x_at_y = (int32_t)((int32_t)p->xy_steep * (abs_y)) >> 10; + if(x_at_y > abs_x + len) { + if(p->inv) { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } else { + return LV_DRAW_MASK_RES_FULL_COVER; + } + } + + int32_t xe = ((abs_y << 8) * p->xy_steep) >> 10; + int32_t xei = xe >> 8; + int32_t xef = xe & 0xFF; + + int32_t xq = (((abs_y + 1) << 8) * p->xy_steep) >> 10; + int32_t xqi = xq >> 8; + int32_t xqf = xq & 0xFF; + + lv_opa_t m; + + k = xei - abs_x; + if(xei != xqi && (p->xy_steep < 0 && xef == 0)) { + xef = 0xFF; + xei = xqi; + k--; + } + + if(xei == xqi) { + if(k >= 0 && k < len) { + m = (xef + xqf) >> 1; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k++; + + if(p->inv) { + k = xei - abs_x; + if(k >= len) { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } + if(k >= 0) memset(&mask_buf[0], 0x00, k); + + } else { + if(k > len) k = len; + if(k == 0) return LV_DRAW_MASK_RES_FULL_TRANSP; + else if(k > 0) memset(&mask_buf[k] ,0x00, len - k); + } + + } else { + int32_t y_inters; + if(p->xy_steep < 0) { + y_inters = (xef * (-p->yx_steep)) >> 10; + if(k >= 0 && k < len ) { + m = (y_inters * xef) >> 9; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k--; + + int32_t x_inters = ((255-y_inters) * (-p->xy_steep)) >> 10; + + if(k >= 0 && k < len ) { + m = 255-(((255-y_inters) * x_inters) >> 9); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + + k+=2; + + if(p->inv) { + k = xei - abs_x - 1; + + if(k > len) k = len; + else if(k > 0) memset(&mask_buf[0], 0x00, k); + + } else { + if(k > len) return LV_DRAW_MASK_RES_FULL_COVER; + if(k >= 0) memset(&mask_buf[k] ,0x00, len - k); + } + + } else { + y_inters = ((255-xef) * p->yx_steep) >> 10; + if(k >= 0 && k < len ) { + m = 255 - ((y_inters * (255-xef)) >> 9); + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + + k++; + + int32_t x_inters = ((255-y_inters) * p->xy_steep) >> 10; + if(k >= 0 && k < len ) { + m = ((255-y_inters) * x_inters) >> 9; + if(p->inv) m = 255 - m; + mask_buf[k] = mask_mix(mask_buf[k], m); + } + k++; + + if(p->inv) { + k = xei - abs_x; + if(k > len) return LV_DRAW_MASK_RES_FULL_TRANSP; + if(k >= 0) memset(&mask_buf[0], 0x00, k); + + } else { + if(k > len) k = len; + if(k == 0) return LV_DRAW_MASK_RES_FULL_TRANSP; + else if(k > 0) memset(&mask_buf[k] ,0x00, len - k); + } + + } + } + + return LV_DRAW_MASK_RES_CHANGED; +} + + +static lv_draw_mask_res_t lv_draw_mask_angle(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_angle_param_t * p) +{ + lv_coord_t rel_y = abs_y - p->cfg.vertex_p.y; + lv_coord_t rel_x = abs_x - p->cfg.vertex_p.x; + + + if(p->cfg.start_angle < 180 && p->cfg.end_angle < 180 && + p->cfg.start_angle != 0 && p->cfg.end_angle != 0 && + p->cfg.start_angle > p->cfg.end_angle) { + + if(abs_y < p->cfg.vertex_p.y) { + return LV_DRAW_MASK_RES_FULL_COVER; + } + + /*Start angle mask can work only from the end of end angle mask */ + lv_coord_t end_angle_first = (rel_y * p->end_line.xy_steep) >> 10; + lv_coord_t start_angle_last= ((rel_y+1) * p->start_line.xy_steep) >> 10; + + + /*Do not let the line end cross the vertex else it will affect the opposite part*/ + if(p->cfg.start_angle > 270 && p->cfg.start_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 0 && p->cfg.start_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 90 && p->cfg.start_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + if(p->cfg.end_angle > 270 && p->cfg.end_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 0 && p->cfg.end_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 90 && p->cfg.end_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + + int32_t dist = (end_angle_first - start_angle_last) >> 1; + + lv_draw_mask_res_t res1 = LV_DRAW_MASK_RES_FULL_COVER; + lv_draw_mask_res_t res2 = LV_DRAW_MASK_RES_FULL_COVER; + + int32_t tmp = start_angle_last + dist - rel_x; + if(tmp > len) tmp = len; + if(tmp > 0) { + res1 = lv_draw_mask_line(&mask_buf[0], abs_x, abs_y, tmp, &p->start_line); + if(res1 == LV_DRAW_MASK_RES_FULL_TRANSP) { + memset(&mask_buf[0], 0x00, tmp); + } + } + + if(tmp > len) tmp = len; + if(tmp < 0) tmp = 0; + res2 = lv_draw_mask_line(&mask_buf[tmp], abs_x+tmp, abs_y, len-tmp, &p->end_line); + if(res2 == LV_DRAW_MASK_RES_FULL_TRANSP) { + memset(&mask_buf[tmp], 0x00, len-tmp); + } + if(res1 == res2) return res1; + else return LV_DRAW_MASK_RES_CHANGED; + } + else if(p->cfg.start_angle > 180 && p->cfg.end_angle > 180 && p->cfg.start_angle > p->cfg.end_angle) { + + if(abs_y > p->cfg.vertex_p.y) { + return LV_DRAW_MASK_RES_FULL_COVER; + } + + /*Start angle mask can work only from the end of end angle mask */ + lv_coord_t end_angle_first = (rel_y * p->end_line.xy_steep) >> 10; + lv_coord_t start_angle_last= ((rel_y+1) * p->start_line.xy_steep) >> 10; + + /*Do not let the line end cross the vertex else it will affect the opposite part*/ + if(p->cfg.start_angle > 270 && p->cfg.start_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 0 && p->cfg.start_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.start_angle > 90 && p->cfg.start_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + if(p->cfg.end_angle > 270 && p->cfg.end_angle <= 359 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 0 && p->cfg.end_angle <= 90 && start_angle_last < 0) start_angle_last = 0; + else if(p->cfg.end_angle > 90 && p->cfg.end_angle < 270 && start_angle_last > 0) start_angle_last = 0; + + int32_t dist = (end_angle_first - start_angle_last) >> 1; + + lv_draw_mask_res_t res1 = LV_DRAW_MASK_RES_FULL_COVER; + lv_draw_mask_res_t res2 = LV_DRAW_MASK_RES_FULL_COVER; + + int32_t tmp = start_angle_last + dist - rel_x; + if(tmp > len) tmp = len; + if(tmp > 0) { + res1 = lv_draw_mask_line(&mask_buf[0], abs_x, abs_y, tmp, (lv_draw_mask_line_param_t*)&p->end_line); + if(res1 == LV_DRAW_MASK_RES_FULL_TRANSP) { + memset(&mask_buf[0], 0x00, tmp); + } + } + + if(tmp > len) tmp = len; + if(tmp < 0) tmp = 0; + res2 = lv_draw_mask_line(&mask_buf[tmp], abs_x+tmp, abs_y, len-tmp, (lv_draw_mask_line_param_t*)&p->start_line); + if(res2 == LV_DRAW_MASK_RES_FULL_TRANSP) { + memset(&mask_buf[tmp], 0x00, len-tmp); + } + if(res1 == res2) return res1; + else return LV_DRAW_MASK_RES_CHANGED; + } + else { + + lv_draw_mask_res_t res1 = LV_DRAW_MASK_RES_FULL_COVER; + lv_draw_mask_res_t res2 = LV_DRAW_MASK_RES_FULL_COVER; + + if(p->cfg.start_angle == 180) { + if(abs_y < p->cfg.vertex_p.y) res1 = LV_DRAW_MASK_RES_FULL_COVER; + else res1 = LV_DRAW_MASK_RES_UNKNOWN; + } + else if(p->cfg.start_angle == 0) { + if(abs_y < p->cfg.vertex_p.y) res1 = LV_DRAW_MASK_RES_UNKNOWN; + else res1 = LV_DRAW_MASK_RES_FULL_COVER; + } + else if((p->cfg.start_angle < 180 && abs_y < p->cfg.vertex_p.y) || + (p->cfg.start_angle > 180 && abs_y >= p->cfg.vertex_p.y)) { + res1 = LV_DRAW_MASK_RES_UNKNOWN; + } + else { + res1 = lv_draw_mask_line(mask_buf, abs_x, abs_y, len, &p->start_line); + } + + if(p->cfg.end_angle == 180) { + if(abs_y < p->cfg.vertex_p.y) res2 = LV_DRAW_MASK_RES_UNKNOWN; + else res2 = LV_DRAW_MASK_RES_FULL_COVER; + } + else if(p->cfg.end_angle == 0) { + if(abs_y < p->cfg.vertex_p.y) res2 = LV_DRAW_MASK_RES_FULL_COVER; + else res2 = LV_DRAW_MASK_RES_UNKNOWN; + } + else if((p->cfg.end_angle < 180 && abs_y < p->cfg.vertex_p.y) || + (p->cfg.end_angle > 180 && abs_y >= p->cfg.vertex_p.y)) { + res2 = LV_DRAW_MASK_RES_UNKNOWN; + } + else { + res2 = lv_draw_mask_line(mask_buf, abs_x, abs_y, len, &p->end_line); + } + + if(res1 == LV_DRAW_MASK_RES_FULL_TRANSP || res2 == LV_DRAW_MASK_RES_FULL_TRANSP) return LV_DRAW_MASK_RES_FULL_TRANSP; + else if(res1 == LV_DRAW_MASK_RES_UNKNOWN && res2 == LV_DRAW_MASK_RES_UNKNOWN) return LV_DRAW_MASK_RES_FULL_TRANSP; + else if(res1 == LV_DRAW_MASK_RES_FULL_COVER && res2 == LV_DRAW_MASK_RES_FULL_COVER) return LV_DRAW_MASK_RES_FULL_COVER; + else return LV_DRAW_MASK_RES_CHANGED; + } +} + +static lv_draw_mask_res_t lv_draw_mask_radius(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_radius_param_t * p) +{ + if(p->cfg.outer == 0) { + if(abs_y < p->cfg.rect.y1 || abs_y > p->cfg.rect.y2) { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } + } else { + if(abs_y < p->cfg.rect.y1 || abs_y > p->cfg.rect.y2) { + return LV_DRAW_MASK_RES_FULL_COVER; + } + } + + if((abs_x >= p->cfg.rect.x1 + p->cfg.radius && abs_x + len <= p->cfg.rect.x2 - p->cfg.radius) || + (abs_y >= p->cfg.rect.y1 + p->cfg.radius && abs_y <= p->cfg.rect.y2 - p->cfg.radius)) { + if(p->cfg.outer == 0) { + /*Remove the edges*/ + int32_t last = p->cfg.rect.x1 - abs_x; + if(last > len) return LV_DRAW_MASK_RES_FULL_TRANSP; + if(last >= 0) { + memset(&mask_buf[0], 0x00, last); + } + + int32_t first = p->cfg.rect.x2 - abs_x + 1; + if(first <= 0) return LV_DRAW_MASK_RES_FULL_TRANSP; + else if(first < len) { + memset(&mask_buf[first], 0x00, len-first); + } + if(last == 0 && first == len) return LV_DRAW_MASK_RES_FULL_COVER; + else return LV_DRAW_MASK_RES_CHANGED; + } + else { + int32_t first = p->cfg.rect.x1 - abs_x; + if(first < 0) first = 0; + if(first <= len) { + int32_t last = p->cfg.rect.x2 - abs_x - first + 1; + if(first + last > len) last = len - first; + if(last >= 0) { + memset(&mask_buf[first], 0x00, last); + } + } + } + return LV_DRAW_MASK_RES_CHANGED; + } + + int32_t k = p->cfg.rect.x1 -abs_x; /*First relevant coordinate on the of the mask*/ + lv_coord_t w = lv_area_get_width(&p->cfg.rect); + lv_coord_t h = lv_area_get_height(&p->cfg.rect); + abs_x -= p->cfg.rect.x1; + abs_y -= p->cfg.rect.y1; + + uint32_t r2 = p->cfg.radius * p->cfg.radius; + + /*Handle corner areas*/ + if(abs_y < p->cfg.radius || abs_y > h - p->cfg.radius - 1) { + /* y = 0 should mean the top of the circle */ + lv_coord_t y; + if(abs_y < p->cfg.radius) y = p->cfg.radius - abs_y; + else y = p->cfg.radius - (h - abs_y) + 1; + + /* Get the x intersection points for `abs_y` and `abs_y+1` + * Use the circle's equation x = sqrt(r^2 - y^2) */ + lv_sqrt_res_t x0; + lv_sqrt(r2 - (y * y), &x0); + + lv_sqrt_res_t x1; + lv_sqrt(r2 - ((y-1) * (y-1)), &x1); + + /* If x1 is on the next round coordinate (e.g. x0: 3.5, x1:4.0) + * then treat x1 as x1: 3.99 to handle them as they were on the same pixel*/ + if(x0.i == x1.i - 1 && x1.f == 0) { + x1.i--; + x1.f = 0xFF; + } + + /*If the two x intersections are on the same x then just get average of the fractionals*/ + if(x0.i == x1.i) { + lv_opa_t m = (x0.f + x1.f) >> 1; + if(p->cfg.outer) m = 255 - m; + int32_t ofs = p->cfg.radius - x0.i - 1; + + /*Left corner*/ + int32_t kl = k + ofs; + + if(kl >= 0 && kl < len) { + mask_buf[kl] = mask_mix(mask_buf[kl], m); + } + + /*Right corner*/ + int32_t kr = k+(w-ofs-1); + if(kr >= 0 && kr < len) { + mask_buf[kr] = mask_mix(mask_buf[kr], m); + } + + /*Clear the unused parts*/ + if(p->cfg.outer == 0) { + kr++; + if(kl > len) { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } + if(kl >= 0) { + memset(&mask_buf[0], 0x00, kl); + } + if(kr < 0) { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } + if(kr <= len) { + memset(&mask_buf[kr], 0x00, len-kr); + } + } else { + kl++; + int32_t first = kl; + if(first < 0) first = 0; + + int32_t len_tmp = kr-first; + if(len_tmp + first > len) len_tmp = len - first; + if(first < len && len_tmp >= 0) { + memset(&mask_buf[first], 0x00, len_tmp); + } + } + } + /*Multiple pixels are affected. Get y intersection of the pixels*/ + else { + int32_t ofs = p->cfg.radius - (x0.i + 1); + int32_t kl = k + ofs; + int32_t kr = k + (w - ofs -1); + + if(p->cfg.outer) { + int32_t first = kl + 1; + if(first < 0) first = 0; + + int32_t len_tmp = kr-first; + if(len_tmp + first > len) len_tmp = len - first; + if(first < len && len_tmp >= 0) { + memset(&mask_buf[first], 0x00, len_tmp); + } + } + + uint32_t i = x0.i + 1; + lv_opa_t m; + lv_sqrt_res_t y_prev; + lv_sqrt_res_t y_next; + + lv_sqrt(r2 - (x0.i * x0.i), &y_prev); + + if(y_prev.f == 0) { + y_prev.i--; + y_prev.f = 0xFF; + } + + /*The first y intersection is special as it might be in the previous line*/ + if(y_prev.i >= y) { + lv_sqrt(r2 - (i * i), &y_next); + m = 255 - (((255-x0.f) * (255 - y_next.f)) >> 9); + + if(p->cfg.outer) m = 255 - m; + if(kl >= 0 && kl < len) mask_buf[kl] = mask_mix(mask_buf[kl], m); + if(kr >= 0 && kr < len) mask_buf[kr] = mask_mix(mask_buf[kr], m); + kl--; + kr++; + y_prev.f = y_next.f; + i++; + } + + /*Set all points which are crossed by the circle*/ + for(; i <= x1.i; i++) { + lv_sqrt(r2 - (i * i), &y_next); + + m = (y_prev.f + y_next.f) >> 1; + if(p->cfg.outer) m = 255 - m; + if(kl >= 0 && kl < len) mask_buf[kl] = mask_mix(mask_buf[kl], m); + if(kr >= 0 && kr < len) mask_buf[kr] = mask_mix(mask_buf[kr], m); + kl--; + kr++; + y_prev.f = y_next.f; + } + + /*If the last pixel was left in its middle therefore + * the circle still has parts on the next one*/ + if(y_prev.f) { + m = (y_prev.f * x1.f) >> 9; + if(p->cfg.outer) m = 255 - m; + if(kl >= 0 && kl < len) mask_buf[kl] = mask_mix(mask_buf[kl], m); + if(kr >= 0 && kr < len) mask_buf[kr] = mask_mix(mask_buf[kr], m); + kl--; + kr++; + } + + if(p->cfg.outer == 0) { + kl++; + if(kl > len) { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } + if(kl >= 0) memset(&mask_buf[0], 0x00, kl); + + if(kr < 0) { + return LV_DRAW_MASK_RES_FULL_TRANSP; + } + if(kr < len) memset(&mask_buf[kr], 0x00, len - kr); + } + } + } + + return LV_DRAW_MASK_RES_CHANGED; +} + + +static lv_draw_mask_res_t lv_draw_mask_fade(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_fade_param_t * p) +{ + if(abs_y < p->cfg.coords.y1) return LV_DRAW_MASK_RES_FULL_COVER; + if(abs_y > p->cfg.coords.y2) return LV_DRAW_MASK_RES_FULL_COVER; + if(abs_x + len < p->cfg.coords.x1) return LV_DRAW_MASK_RES_FULL_COVER; + if(abs_x > p->cfg.coords.x2) return LV_DRAW_MASK_RES_FULL_COVER; + + if(abs_x + len > p->cfg.coords.x2) len -= abs_x + len - p->cfg.coords.x2 - 1; + + if(abs_x < p->cfg.coords.x1) { + lv_coord_t x_ofs = 0; + x_ofs = p->cfg.coords.x1 - abs_x; + len -= x_ofs; + mask_buf += x_ofs; + } + + lv_coord_t i; + + if(abs_y <= p->cfg.y_top) { + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], p->cfg.opa_top); + } + return LV_DRAW_MASK_RES_CHANGED; + } else if(abs_y >= p->cfg.y_bottom) { + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], p->cfg.opa_bottom); + } + return LV_DRAW_MASK_RES_CHANGED; + } else { + /*Calculate the opa proportionally*/ + int16_t opa_diff = p->cfg.opa_bottom - p->cfg.opa_top; + lv_coord_t y_diff = p->cfg.y_bottom - p->cfg.y_top + 1; + lv_opa_t opa_act = (int32_t)((int32_t)(abs_y - p->cfg.y_top) * opa_diff) / y_diff; + opa_act += p->cfg.opa_top; + + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], opa_act); + } + return LV_DRAW_MASK_RES_CHANGED; + + + } + return LV_DRAW_MASK_RES_FULL_COVER; +} + +static lv_draw_mask_res_t lv_draw_mask_map(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, lv_draw_mask_map_param_t * p) +{ + /*Handle out of the mask cases*/ + if(abs_y < p->cfg.coords.y1) return LV_DRAW_MASK_RES_FULL_COVER; + if(abs_y > p->cfg.coords.y2) return LV_DRAW_MASK_RES_FULL_COVER; + if(abs_x + len < p->cfg.coords.x1) return LV_DRAW_MASK_RES_FULL_COVER; + if(abs_x > p->cfg.coords.x2) return LV_DRAW_MASK_RES_FULL_COVER; + + /*Got to the current row in the map*/ + const lv_opa_t * map_tmp = p->cfg.map; + map_tmp += (abs_y - p->cfg.coords.y1) * lv_area_get_width(&p->cfg.coords); + + + if(abs_x + len > p->cfg.coords.x2) len -= abs_x + len - p->cfg.coords.x2 - 1; + + if(abs_x < p->cfg.coords.x1) { + lv_coord_t x_ofs = 0; + x_ofs = p->cfg.coords.x1 - abs_x; + len -= x_ofs; + mask_buf += x_ofs; + } else { + map_tmp += (abs_x - p->cfg.coords.x1); + } + + lv_coord_t i; + for(i = 0; i < len; i++) { + mask_buf[i] = mask_mix(mask_buf[i], map_tmp[i]); + } + + return LV_DRAW_MASK_RES_CHANGED; +} + + +static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_t mask_new) +{ + if(mask_new > LV_OPA_MAX) return mask_act; + if(mask_new < LV_OPA_MIN) return 0; + + return (uint16_t)((uint16_t) (mask_act * mask_new) >> 8); + +} diff --git a/src/lv_draw/lv_draw_mask.h b/src/lv_draw/lv_draw_mask.h new file mode 100644 index 000000000..a0c48b900 --- /dev/null +++ b/src/lv_draw/lv_draw_mask.h @@ -0,0 +1,274 @@ +/** + * @file lv_mask.h + * + */ + +#ifndef LV_MASK_H +#define LV_MASK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include "../lv_misc/lv_area.h" +#include "../lv_misc/lv_color.h" + +/********************* + * DEFINES + *********************/ +#define LV_MASK_ID_INV (-1) + +/********************** + * TYPEDEFS + **********************/ + +enum { + LV_DRAW_MASK_RES_FULL_TRANSP, + LV_DRAW_MASK_RES_FULL_COVER, + LV_DRAW_MASK_RES_CHANGED, + LV_DRAW_MASK_RES_UNKNOWN +}; + +typedef uint8_t lv_draw_mask_res_t; + + +enum { + LV_DRAW_MASK_TYPE_LINE, + LV_DRAW_MASK_TYPE_ANGLE, + LV_DRAW_MASK_TYPE_RADIUS, + LV_DRAW_MASK_TYPE_FADE, + LV_DRAW_MASK_TYPE_MAP, +}; + +typedef uint8_t lv_draw_mask_type_t; + +enum { + LV_DRAW_MASK_LINE_SIDE_LEFT = 0, + LV_DRAW_MASK_LINE_SIDE_RIGHT, + LV_DRAW_MASK_LINE_SIDE_TOP, + LV_DRAW_MASK_LINE_SIDE_BOTTOM, +}; + +typedef lv_draw_mask_res_t (*lv_draw_mask_cb_t)(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len, void * p); + +typedef uint8_t lv_draw_mask_line_side_t; + +typedef struct { + lv_draw_mask_cb_t cb; + lv_draw_mask_type_t type; +}lv_draw_mask_common_dsc_t; + +typedef struct { + /*The first element must be the common descriptor*/ + lv_draw_mask_common_dsc_t dsc; + + struct { + /*First point */ + lv_point_t p1; + + /*Second point*/ + lv_point_t p2; + + /*Which side to keep?*/ + lv_draw_mask_line_side_t side :2; + }cfg; + + /*A point of the line*/ + lv_point_t origo; + + /* X / (1024*Y) steepness (X is 0..1023 range). What is the change of X in 1024 Y?*/ + int32_t xy_steep; + + /* Y / (1024*X) steepness (Y is 0..1023 range). What is the change of Y in 1024 X?*/ + int32_t yx_steep; + + /*Helper which stores yx_steep for flat lines and xy_steep for steep (non flat) lines */ + int32_t steep; + + /*Steepness in 1 px in 0..255 range. Used only by flat lines. */ + int32_t spx; + + /*1: It's a flat line? (Near to horizontal)*/ + uint8_t flat :1; + + + /* Invert the mask. The default is: Keep the left part. + * It is used to select left/right/top/bottom*/ + uint8_t inv:1; +}lv_draw_mask_line_param_t; + +typedef struct { + /*The first element must be the common descriptor*/ + lv_draw_mask_common_dsc_t dsc; + + struct { + lv_point_t vertex_p; + lv_coord_t start_angle; + lv_coord_t end_angle; + }cfg; + + lv_draw_mask_line_param_t start_line; + lv_draw_mask_line_param_t end_line; + uint16_t delta_deg; +}lv_draw_mask_angle_param_t; + +typedef struct { + /*The first element must be the common descriptor*/ + lv_draw_mask_common_dsc_t dsc; + + struct { + lv_area_t rect; + lv_coord_t radius; + /* Invert the mask. 0: Keep the pixels inside.*/ + uint8_t outer:1; + }cfg; + +}lv_draw_mask_radius_param_t; + +typedef struct { + /*The first element must be the common descriptor*/ + lv_draw_mask_common_dsc_t dsc; + + struct { + lv_area_t coords; + lv_coord_t y_top; + lv_coord_t y_bottom; + lv_opa_t opa_top; + lv_opa_t opa_bottom; + }cfg; + +}lv_draw_mask_fade_param_t; + +typedef struct _lv_draw_mask_map_param_t { + /*The first element must be the common descriptor*/ + lv_draw_mask_common_dsc_t dsc; + + struct { + lv_area_t coords; + const lv_opa_t * map; + }cfg; +}lv_draw_mask_map_param_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Add a draw mask. Everything drawn after it (until removing the mask) will be affected by the mask. + * @param param an initialized mask parameter. Only the pointer is saved. + * @param custom_id a custom pointer to identify the mask. Used in `lv_draw_mask_remove_custom`. + * @return the an integer, the ID of the mask. Can be used in `lv_draw_mask_remove_id`. + */ +int16_t lv_draw_mask_add(void * param, void * custom_id); + +/** + * Apply the added buffers on a line. Used internally by the library's drawing routines. + * @param mask_buf store the result mask here. Has to be `len` byte long. Should be initialized with `0xFF`. + * @param abs_x absolute X coordinate where the line to calculate start + * @param abs_y absolute Y coordinate where the line to calculate start + * @param len length of the line to calculate (in pixel count) + * @return Oneof these values: + * - `LV_DRAW_MASK_RES_FULL_TRANSP`: the whole line is transparent. `mask_buf` is not set to zero + * - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged + * - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line + */ +lv_draw_mask_res_t lv_draw_mask_apply(lv_opa_t * mask_buf, lv_coord_t abs_x, lv_coord_t abs_y, lv_coord_t len); + +/** + * Remove a mask with a given ID + * @param id the ID of the mask. Returned by `lv_draw_mask_add` + * @return the parameter of the removed mask. + * If more masks have `custom_id` ID then the last mask's parameter will be returned + */ +void * lv_draw_mask_remove_id(int16_t id); + +/** + * Remove all mask with a given custom ID + * @param custom_id a pointer used in `lv_draw_mask_add` + * @return return the parameter of the removed mask. + * If more masks have `custom_id` ID then the last mask's parameter will be returned + */ +void * lv_draw_mask_remove_custom(void * custom_id); + +/** + * Count the currently added masks + * @return number of active masks + */ +uint8_t lv_draw_mask_get_cnt(void); + +/** + *Initialize a line mask from two points. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param p1x X coordinate of the first point of the line + * @param p1y Y coordinate of the first point of the line + * @param p2x X coordinate of the second point of the line + * @param p2y y coordinate of the second point of the line + * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. + * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept + * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept + */ +void lv_draw_mask_line_points_init(lv_draw_mask_line_param_t * param, lv_coord_t p1x, lv_coord_t p1y, lv_coord_t p2x, lv_coord_t p2y, lv_draw_mask_line_side_t side); + +/** + *Initialize a line mask from a point and an angle. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param px X coordiante of a point of the line + * @param py X coordiante of a point of the line + * @param angle right 0 deg, bottom: 90 + * @param side and element of `lv_draw_mask_line_side_t` to describe which side to keep. + * With `LV_DRAW_MASK_LINE_SIDE_LEFT/RIGHT` and horizontal line all pixels are kept + * With `LV_DRAW_MASK_LINE_SIDE_TOP/BOTTOM` and vertical line all pixels are kept + */ +void lv_draw_mask_line_angle_init(lv_draw_mask_line_param_t * param, lv_coord_t p1x, lv_coord_t py, int16_t angle, lv_draw_mask_line_side_t side); + +/** + * Initialize an angle mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param vertex_x X coordinate of the angle vertex (absolute coordinates) + * @param vertex_y Y coordinate of the angle vertex (absolute coordinates) + * @param start_angle start angle in degrees. 0 deg on the right, 90 deg, on the bottom + * @param end_angle end angle + */ +void lv_draw_mask_angle_init(lv_draw_mask_angle_param_t * param, lv_coord_t vertex_x, lv_coord_t vertex_y, lv_coord_t start_angle, lv_coord_t end_angle); + +/** + * Initialize a fade mask. + * @param param param pointer to a `lv_draw_mask_param_t` to initialize + * @param rect coordinates of the rectangle to affect (absolute coordinates) + * @param radius radius of the rectangle + * @param inv: true: keep the pixels inside teh rectangle; keep teh pixels outside of the rectangle + */ +void lv_draw_mask_radius_init(lv_draw_mask_radius_param_t * param, const lv_area_t * rect, lv_coord_t radius, bool inv); + +/** + * Initialize a fade mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param coords coordinates of the area to affect (absolute coordinates) + * @param opa_top opacity on the top + * @param y_top at which coordinate start to change to opacity to `opa_bottom` + * @param opa_bottom opacity at the bottom + * @param y_bottom at which coordinate reach `opa_bottom`. + */ +void lv_draw_mask_fade_init(lv_draw_mask_fade_param_t * param, lv_area_t * coords, lv_opa_t opa_top, lv_coord_t y_top, lv_opa_t opa_bottom, lv_coord_t y_bottom); + +/** + * Initialize a map mask. + * @param param pointer to a `lv_draw_mask_param_t` to initialize + * @param coords coordinates of the map (absolute coordinates) + * @param map array of bytes with the mask values + */ +void lv_draw_mask_map_init(lv_draw_mask_map_param_t * param, lv_area_t * coords, const lv_opa_t * map); + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_MASK_H*/ diff --git a/src/lv_draw/lv_draw_rect.c b/src/lv_draw/lv_draw_rect.c index 0964a46aa..aa8f04cdf 100644 --- a/src/lv_draw/lv_draw_rect.c +++ b/src/lv_draw/lv_draw_rect.c @@ -7,6 +7,8 @@ * INCLUDES *********************/ #include "lv_draw_rect.h" +#include "lv_draw_blend.h" +#include "lv_draw_mask.h" #include "../lv_misc/lv_circ.h" #include "../lv_misc/lv_math.h" #include "../lv_core/lv_refr.h" @@ -14,15 +16,8 @@ /********************* * DEFINES *********************/ -/*Circle segment greater then this value will be anti-aliased by a non-linear (cos) opacity - * mapping*/ -#define CIRCLE_AA_NON_LINEAR_OPA_THRESHOLD 1 - -/*Calculate with 2^x bigger shadow opacity values to avoid rounding errors*/ -#define SHADOW_OPA_EXTRA_PRECISION 8 - -/*Add extra radius with LV_SHADOW_BOTTOM to cover anti-aliased corners*/ -#define SHADOW_BOTTOM_AA_EXTRA_RADIUS 3 +#define SHADOW_UPSACALE_SHIFT 6 +#define SHADOW_ENHANCE 1 /********************** * TYPEDEFS @@ -31,31 +26,12 @@ /********************** * STATIC PROTOTYPES **********************/ -static void lv_draw_rect_main_mid(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale); -static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale); -static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale); -static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale); - -#if LV_USE_SHADOW -static void lv_draw_shadow(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale); -static void lv_draw_shadow_full(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale); -static void lv_draw_shadow_bottom(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale); -static void lv_draw_shadow_full_straight(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - const lv_opa_t * map); -#endif - -static uint16_t lv_draw_cont_radius_corr(uint16_t r, lv_coord_t w, lv_coord_t h); - -#if LV_ANTIALIAS -static lv_opa_t antialias_get_opa_circ(lv_coord_t seg, lv_coord_t px_id, lv_opa_t opa); -#endif +static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale); +static void draw_border(const lv_area_t * coords, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale); +static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale); +static lv_color_t grad_get(const lv_style_t * style, lv_coord_t s, lv_coord_t i); +static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, lv_coord_t s, lv_coord_t r); +static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, lv_opa_t * res_buf, uint16_t * sh_ups_buf); /********************** * STATIC VARIABLES @@ -76,35 +52,44 @@ static lv_opa_t antialias_get_opa_circ(lv_coord_t seg, lv_coord_t px_id, lv_opa_ * @param style pointer to a style * @param opa_scale scale down all opacities by the factor */ -void lv_draw_rect(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa_scale) +void lv_draw_rect(const lv_area_t * coords, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale) { if(lv_area_get_height(coords) < 1 || lv_area_get_width(coords) < 1) return; -#if LV_USE_SHADOW - if(style->body.shadow.width != 0) { - lv_draw_shadow(coords, mask, style, opa_scale); - } -#endif + draw_shadow(coords, clip, style, opa_scale); + draw_bg(coords, clip, style, opa_scale); + draw_border(coords, clip, style, opa_scale); +} - /* If the object is out of the mask there is nothing to draw. - * Draw shadow before it because the shadow is out of `coords`*/ - if(lv_area_is_on(coords, mask) == false) return; +/** + * Draw a pixel + * @param point the coordinates of the point to draw + * @param mask the pixel will be drawn only in this mask + * @param style pointer to a style + * @param opa_scale scale down the opacity by the factor + */ +void lv_draw_px(const lv_point_t * point, const lv_area_t * clip_area, const lv_style_t * style, lv_opa_t opa_scale) +{ + lv_opa_t opa = style->body.opa; + if(opa_scale != LV_OPA_COVER) opa = (opa * opa_scale) >> 8; - if(style->body.opa > LV_OPA_MIN) { - lv_draw_rect_main_mid(coords, mask, style, opa_scale); + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; - if(style->body.radius != 0) { - lv_draw_rect_main_corner(coords, mask, style, opa_scale); - } - } + lv_area_t fill_area; + fill_area.x1 = point->x; + fill_area.y1 = point->y; + fill_area.x2 = point->x; + fill_area.y2 = point->y; - if(style->body.border.width != 0 && style->body.border.part != LV_BORDER_NONE && - style->body.border.opa >= LV_OPA_MIN) { - lv_draw_rect_border_straight(coords, mask, style, opa_scale); + uint8_t mask_cnt = lv_draw_mask_get_cnt(); - if(style->body.radius != 0) { - lv_draw_rect_border_corner(coords, mask, style, opa_scale); - } + if(mask_cnt == 0) { + lv_blend_fill(clip_area, &fill_area, style->body.main_color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa, style->body.blend_mode); + } else { + uint8_t mask_buf; + lv_draw_mask_res_t mask_res; + mask_res = lv_draw_mask_apply(&mask_buf, point->x, point->y, 1); + lv_blend_fill(clip_area, &fill_area, style->body.main_color, &mask_buf, mask_res, opa, style->body.blend_mode); } } @@ -112,1410 +97,928 @@ void lv_draw_rect(const lv_area_t * coords, const lv_area_t * mask, const lv_sty * STATIC FUNCTIONS **********************/ -/** - * Draw the middle part (rectangular) of a rectangle - * @param coords the coordinates of the original rectangle - * @param mask the rectangle will be drawn only on this area - * @param rects_p pointer to a rectangle style - * @param opa_scale scale down all opacities by the factor - */ -static void lv_draw_rect_main_mid(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale) +static void draw_bg(const lv_area_t * coords, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale) { - uint16_t radius = style->body.radius; - bool aa = lv_disp_get_antialiasing(lv_refr_get_disp_refreshing()); + lv_area_t coords_bg; + lv_area_copy(&coords_bg, coords); - lv_color_t mcolor = style->body.main_color; - lv_color_t gcolor = style->body.grad_color; - uint8_t mix; - lv_coord_t height = lv_area_get_height(coords); - lv_coord_t width = lv_area_get_width(coords); - lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->body.opa : (uint16_t)((uint16_t)style->body.opa * opa_scale) >> 8; - - radius = lv_draw_cont_radius_corr(radius, width, height); - - /*If the radius is too big then there is no body*/ - if(radius > height / 2) return; - - lv_area_t work_area; - work_area.x1 = coords->x1; - work_area.x2 = coords->x2; - - if(mcolor.full == gcolor.full) { - work_area.y1 = coords->y1 + radius; - work_area.y2 = coords->y2 - radius; - - if(style->body.radius != 0) { - - if(aa) { - work_area.y1 += 2; - work_area.y2 -= 2; - } else { - work_area.y1 += 1; - work_area.y2 -= 1; - } - } - - lv_draw_fill(&work_area, mask, mcolor, opa); - } else { - lv_coord_t row; - lv_coord_t row_start = coords->y1 + radius; - lv_coord_t row_end = coords->y2 - radius; - lv_color_t act_color; - - if(style->body.radius != 0) { - if(aa) { - row_start += 2; - row_end -= 2; - } else { - row_start += 1; - row_end -= 1; - } - } - if(row_start < 0) row_start = 0; - - for(row = row_start; row <= row_end; row++) { - work_area.y1 = row; - work_area.y2 = row; - mix = (uint32_t)((uint32_t)(coords->y2 - work_area.y1) * 255) / height; - act_color = lv_color_mix(mcolor, gcolor, mix); - - lv_draw_fill(&work_area, mask, act_color, opa); - } + /*If the border fully covers make the bg area 1px smaller to avoid artifacts on the corners*/ + if(style->body.border.width > 1 && style->body.border.opa >= LV_OPA_MAX && style->body.radius != 0) { + coords_bg.x1++; + coords_bg.y1++; + coords_bg.x2--; + coords_bg.y2--; } -} -/** - * Draw the top and bottom parts (corners) of a rectangle - * @param coords the coordinates of the original rectangle - * @param mask the rectangle will be drawn only on this area - * @param rects_p pointer to a rectangle style - * @param opa_scale scale down all opacities by the factor - */ -static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale) -{ - uint16_t radius = style->body.radius; - bool aa = lv_disp_get_antialiasing(lv_refr_get_disp_refreshing()); - lv_color_t mcolor = style->body.main_color; - lv_color_t gcolor = style->body.grad_color; - lv_color_t act_color; - lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->body.opa : (uint16_t)((uint16_t)style->body.opa * opa_scale) >> 8; - uint8_t mix; - lv_coord_t height = lv_area_get_height(coords); - lv_coord_t width = lv_area_get_width(coords); + lv_opa_t opa = style->body.opa; + if(opa_scale != LV_OPA_COVER) opa = (opa * opa_scale) >> 8; - radius = lv_draw_cont_radius_corr(radius, width, height); + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; - lv_point_t lt_origo; /*Left Top origo*/ - lv_point_t lb_origo; /*Left Bottom origo*/ - lv_point_t rt_origo; /*Right Top origo*/ - lv_point_t rb_origo; /*Left Bottom origo*/ + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + lv_disp_buf_t * vdb = lv_disp_get_buf(disp); - lt_origo.x = coords->x1 + radius + aa; - lt_origo.y = coords->y1 + radius + aa; + /* Get clipped fill area which is the real draw area. + * It is always the same or inside `fill_area` */ + lv_area_t draw_area; + bool is_common; + is_common = lv_area_intersect(&draw_area, &coords_bg, clip); + if(is_common == false) return; - lb_origo.x = coords->x1 + radius + aa; - lb_origo.y = coords->y2 - radius - aa; + const lv_area_t * disp_area = &vdb->area; - rt_origo.x = coords->x2 - radius - aa; - rt_origo.y = coords->y1 + radius + aa; + /* Now `draw_area` has absolute coordinates. + * Make it relative to `disp_area` to simplify draw to `disp_buf`*/ + draw_area.x1 -= disp_area->x1; + draw_area.y1 -= disp_area->y1; + draw_area.x2 -= disp_area->x1; + draw_area.y2 -= disp_area->y1; - rb_origo.x = coords->x2 - radius - aa; - rb_origo.y = coords->y2 - radius - aa; + lv_coord_t draw_area_w = lv_area_get_width(&draw_area); - lv_area_t edge_top_area; - lv_area_t mid_top_area; - lv_area_t mid_bot_area; - lv_area_t edge_bot_area; + /*Create a mask if there is a radius*/ + lv_opa_t * mask_buf = lv_mem_buf_get(draw_area_w); - lv_point_t cir; - lv_coord_t cir_tmp; - lv_circ_init(&cir, &cir_tmp, radius); + bool simple_mode = true; + if(lv_draw_mask_get_cnt()!= 0) simple_mode = false; + else if(style->body.border.part != LV_BORDER_PART_FULL) simple_mode = false; + else if(style->body.grad_dir == LV_GRAD_DIR_HOR) simple_mode = false; - /*Init the areas*/ - lv_area_set(&mid_bot_area, lb_origo.x + LV_CIRC_OCT4_X(cir), lb_origo.y + LV_CIRC_OCT4_Y(cir), - rb_origo.x + LV_CIRC_OCT1_X(cir), rb_origo.y + LV_CIRC_OCT1_Y(cir)); + int16_t mask_rout_id = LV_MASK_ID_INV; - lv_area_set(&edge_bot_area, lb_origo.x + LV_CIRC_OCT3_X(cir), lb_origo.y + LV_CIRC_OCT3_Y(cir), - rb_origo.x + LV_CIRC_OCT2_X(cir), rb_origo.y + LV_CIRC_OCT2_Y(cir)); + lv_coord_t coords_w = lv_area_get_width(&coords_bg); + lv_coord_t coords_h = lv_area_get_height(&coords_bg); - lv_area_set(&mid_top_area, lt_origo.x + LV_CIRC_OCT5_X(cir), lt_origo.y + LV_CIRC_OCT5_Y(cir), - rt_origo.x + LV_CIRC_OCT8_X(cir), rt_origo.y + LV_CIRC_OCT8_Y(cir)); + /*Get the real radius*/ + lv_coord_t rout = style->body.radius; + lv_coord_t short_side = LV_MATH_MIN(coords_w, coords_h); + if(rout > short_side >> 1) rout = short_side >> 1; - lv_area_set(&edge_top_area, lt_origo.x + LV_CIRC_OCT6_X(cir), lt_origo.y + LV_CIRC_OCT6_Y(cir), - rt_origo.x + LV_CIRC_OCT7_X(cir), rt_origo.y + LV_CIRC_OCT7_Y(cir)); -#if LV_ANTIALIAS - /*Store some internal states for anti-aliasing*/ - lv_coord_t out_y_seg_start = 0; - lv_coord_t out_y_seg_end = 0; - lv_coord_t out_x_last = radius; + /*Most simple case: just a plain rectangle*/ + if(simple_mode && rout == 0 && style->body.main_color.full == style->body.grad_color.full) { + lv_blend_fill(clip, &coords_bg, + style->body.main_color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa, + style->body.blend_mode); + } + /*More complex case: there is a radius, gradient or mask.*/ + else { + lv_draw_mask_radius_param_t mask_rout_param; + if(rout > 0) { + lv_draw_mask_radius_init(&mask_rout_param, &coords_bg, rout, false); + mask_rout_id = lv_draw_mask_add(&mask_rout_param, NULL); + } - lv_color_t aa_color_hor_top; - lv_color_t aa_color_hor_bottom; - lv_color_t aa_color_ver; -#endif + if(opa >= LV_OPA_MIN) { + /*Draw the background line by line*/ + lv_coord_t h; + lv_draw_mask_res_t mask_res = LV_DRAW_MASK_RES_FULL_COVER; + lv_color_t grad_color = style->body.main_color; - while(lv_circ_cont(&cir)) { -#if LV_ANTIALIAS - if(aa) { - /*New step in y on the outter circle*/ - if(out_x_last != cir.x) { - out_y_seg_end = cir.y; - lv_coord_t seg_size = out_y_seg_end - out_y_seg_start; - lv_point_t aa_p; - aa_p.x = out_x_last; - aa_p.y = out_y_seg_start; - - mix = (uint32_t)((uint32_t)(radius - out_x_last) * 255) / height; - aa_color_hor_top = lv_color_mix(gcolor, mcolor, mix); - aa_color_hor_bottom = lv_color_mix(mcolor, gcolor, mix); + lv_color_t * grad_map = NULL; + /*In case of horizontal gradient pre-compute a line with a gradient*/ + if(style->body.grad_dir == LV_GRAD_DIR_HOR && style->body.main_color.full != style->body.grad_color.full) { + grad_map = lv_mem_buf_get(coords_w * sizeof(lv_color_t)); lv_coord_t i; - for(i = 0; i < seg_size; i++) { - lv_opa_t aa_opa; - if(seg_size > CIRCLE_AA_NON_LINEAR_OPA_THRESHOLD) { /*Use non-linear opa mapping - on the first segment*/ - aa_opa = antialias_get_opa_circ(seg_size, i, opa); - } else { - aa_opa = opa - lv_draw_aa_get_opa(seg_size, i, opa); + for(i = 0; i < coords_w; i++) { + grad_map[i] = grad_get(style, coords_w, i); + } + } + + lv_area_t fill_area; + fill_area.x1 = coords_bg.x1; + fill_area.x2 = coords_bg.x2; + fill_area.y1 = disp_area->y1 + draw_area.y1; + fill_area.y2 = fill_area.y1; + for(h = draw_area.y1; h <= draw_area.y2; h++) { + lv_coord_t y = h + vdb->area.y1; + + /*In not corner areas apply the mask only if required*/ + if(y > coords_bg.y1 + rout + 1 && + y < coords_bg.y2 - rout - 1) { + mask_res = LV_DRAW_MASK_RES_FULL_COVER; + if(simple_mode == false) { + memset(mask_buf, LV_OPA_COVER, draw_area_w); + mask_res = lv_draw_mask_apply(mask_buf, vdb->area.x1 + draw_area.x1, vdb->area.y1 + h, draw_area_w); } - - lv_draw_px(rb_origo.x + LV_CIRC_OCT2_X(aa_p) + i, rb_origo.y + LV_CIRC_OCT2_Y(aa_p) + 1, mask, - aa_color_hor_bottom, aa_opa); - lv_draw_px(lb_origo.x + LV_CIRC_OCT3_X(aa_p) - i, lb_origo.y + LV_CIRC_OCT3_Y(aa_p) + 1, mask, - aa_color_hor_bottom, aa_opa); - lv_draw_px(lt_origo.x + LV_CIRC_OCT6_X(aa_p) - i, lt_origo.y + LV_CIRC_OCT6_Y(aa_p) - 1, mask, - aa_color_hor_top, aa_opa); - lv_draw_px(rt_origo.x + LV_CIRC_OCT7_X(aa_p) + i, rt_origo.y + LV_CIRC_OCT7_Y(aa_p) - 1, mask, - aa_color_hor_top, aa_opa); - - mix = (uint32_t)((uint32_t)(radius - out_y_seg_start + i) * 255) / height; - aa_color_ver = lv_color_mix(mcolor, gcolor, mix); - lv_draw_px(rb_origo.x + LV_CIRC_OCT1_X(aa_p) + 1, rb_origo.y + LV_CIRC_OCT1_Y(aa_p) + i, mask, - aa_color_ver, aa_opa); - lv_draw_px(lb_origo.x + LV_CIRC_OCT4_X(aa_p) - 1, lb_origo.y + LV_CIRC_OCT4_Y(aa_p) + i, mask, - aa_color_ver, aa_opa); - - aa_color_ver = lv_color_mix(gcolor, mcolor, mix); - lv_draw_px(lt_origo.x + LV_CIRC_OCT5_X(aa_p) - 1, lt_origo.y + LV_CIRC_OCT5_Y(aa_p) - i, mask, - aa_color_ver, aa_opa); - lv_draw_px(rt_origo.x + LV_CIRC_OCT8_X(aa_p) + 1, rt_origo.y + LV_CIRC_OCT8_Y(aa_p) - i, mask, - aa_color_ver, aa_opa); + } + /*In corner areas apply the mask anyway*/ + else { + memset(mask_buf, LV_OPA_COVER, draw_area_w); + mask_res = lv_draw_mask_apply(mask_buf, vdb->area.x1 + draw_area.x1, vdb->area.y1 + h, draw_area_w); } - out_x_last = cir.x; - out_y_seg_start = out_y_seg_end; + /*Get the current line color*/ + if(style->body.grad_dir == LV_GRAD_DIR_VER && style->body.main_color.full != style->body.grad_color.full) { + grad_color = grad_get(style, lv_area_get_height(&coords_bg), y - coords_bg.y1); + } + + /* If there is not other mask and drawing the corner area split the drawing to corner and middle areas + * because it the middle mask shuldn't be taken into account (therefore its faster)*/ + if(simple_mode && + (y < coords_bg.y1 + rout + 1 || + y > coords_bg.y2 - rout - 1)) { + + /*Left part*/ + lv_area_t fill_area2; + fill_area2.x1 = coords_bg.x1; + fill_area2.x2 = coords_bg.x1 + rout - 1; + fill_area2.y1 = fill_area.y1; + fill_area2.y2 = fill_area.y2; + + lv_blend_fill(clip, &fill_area2, + grad_color, mask_buf, mask_res, opa, style->body.blend_mode); + + + /*Central part*/ + fill_area2.x1 = coords_bg.x1 + rout; + fill_area2.x2 = coords_bg.x2 - rout; + + lv_blend_fill(clip, &fill_area2, + grad_color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa, style->body.blend_mode); + + fill_area2.x1 = coords_bg.x2 - rout + 1; + fill_area2.x2 = coords_bg.x2; + + lv_coord_t mask_ofs = (coords_bg.x2 - rout + 1) - (vdb->area.x1 + draw_area.x1); + if(mask_ofs < 0) mask_ofs = 0; + lv_blend_fill(clip, &fill_area2, + grad_color, mask_buf + mask_ofs, mask_res, opa, style->body.blend_mode); + } else { + if(grad_map == NULL) { + lv_blend_fill(clip, &fill_area, + grad_color,mask_buf, mask_res, opa, style->body.blend_mode); + } else { + lv_blend_map(clip, &fill_area, grad_map, mask_buf, mask_res, opa, style->body.blend_mode); + } + + } + fill_area.y1++; + fill_area.y2++; } - } -#endif - uint8_t edge_top_refr = 0; - uint8_t mid_top_refr = 0; - uint8_t mid_bot_refr = 0; - uint8_t edge_bot_refr = 0; - /* If a new row coming draw the previous - * The y coordinate can remain the same so wait for a new*/ - if(mid_bot_area.y1 != LV_CIRC_OCT4_Y(cir) + lb_origo.y) mid_bot_refr = 1; - - if(edge_bot_area.y1 != LV_CIRC_OCT2_Y(cir) + lb_origo.y) edge_bot_refr = 1; - - if(mid_top_area.y1 != LV_CIRC_OCT8_Y(cir) + lt_origo.y) mid_top_refr = 1; - - if(edge_top_area.y1 != LV_CIRC_OCT7_Y(cir) + lt_origo.y) edge_top_refr = 1; - - /*Draw the areas which are not disabled*/ - if(edge_top_refr != 0) { - if(mcolor.full == gcolor.full) - act_color = mcolor; - else { - mix = (uint32_t)((uint32_t)(coords->y2 - edge_top_area.y1) * 255) / height; - act_color = lv_color_mix(mcolor, gcolor, mix); - } - lv_draw_fill(&edge_top_area, mask, act_color, opa); + if(grad_map) lv_mem_buf_release(grad_map); } - if(mid_top_refr != 0) { - if(mcolor.full == gcolor.full) - act_color = mcolor; - else { - mix = (uint32_t)((uint32_t)(coords->y2 - mid_top_area.y1) * 255) / height; - act_color = lv_color_mix(mcolor, gcolor, mix); - } - lv_draw_fill(&mid_top_area, mask, act_color, opa); - } - - if(mid_bot_refr != 0) { - if(mcolor.full == gcolor.full) - act_color = mcolor; - else { - mix = (uint32_t)((uint32_t)(coords->y2 - mid_bot_area.y1) * 255) / height; - act_color = lv_color_mix(mcolor, gcolor, mix); - } - lv_draw_fill(&mid_bot_area, mask, act_color, opa); - } - - if(edge_bot_refr != 0) { - - if(mcolor.full == gcolor.full) - act_color = mcolor; - else { - mix = (uint32_t)((uint32_t)(coords->y2 - edge_bot_area.y1) * 255) / height; - act_color = lv_color_mix(mcolor, gcolor, mix); - } - lv_draw_fill(&edge_bot_area, mask, act_color, opa); - } - - /*Save the current coordinates*/ - lv_area_set(&mid_bot_area, lb_origo.x + LV_CIRC_OCT4_X(cir), lb_origo.y + LV_CIRC_OCT4_Y(cir), - rb_origo.x + LV_CIRC_OCT1_X(cir), rb_origo.y + LV_CIRC_OCT1_Y(cir)); - - lv_area_set(&edge_bot_area, lb_origo.x + LV_CIRC_OCT3_X(cir), lb_origo.y + LV_CIRC_OCT3_Y(cir), - rb_origo.x + LV_CIRC_OCT2_X(cir), rb_origo.y + LV_CIRC_OCT2_Y(cir)); - - lv_area_set(&mid_top_area, lt_origo.x + LV_CIRC_OCT5_X(cir), lt_origo.y + LV_CIRC_OCT5_Y(cir), - rt_origo.x + LV_CIRC_OCT8_X(cir), rt_origo.y + LV_CIRC_OCT8_Y(cir)); - - lv_area_set(&edge_top_area, lt_origo.x + LV_CIRC_OCT6_X(cir), lt_origo.y + LV_CIRC_OCT6_Y(cir), - rt_origo.x + LV_CIRC_OCT7_X(cir), rt_origo.y + LV_CIRC_OCT7_Y(cir)); - - lv_circ_next(&cir, &cir_tmp); + lv_draw_mask_remove_id(mask_rout_id); } - if(mcolor.full == gcolor.full) - act_color = mcolor; - else { - mix = (uint32_t)((uint32_t)(coords->y2 - edge_top_area.y1) * 255) / height; - act_color = lv_color_mix(mcolor, gcolor, mix); - } - lv_draw_fill(&edge_top_area, mask, act_color, opa); + lv_mem_buf_release(mask_buf); - if(edge_top_area.y1 != mid_top_area.y1) { - - if(mcolor.full == gcolor.full) - act_color = mcolor; - else { - mix = (uint32_t)((uint32_t)(coords->y2 - mid_top_area.y1) * 255) / height; - act_color = lv_color_mix(mcolor, gcolor, mix); - } - lv_draw_fill(&mid_top_area, mask, act_color, opa); - } - - if(mcolor.full == gcolor.full) - act_color = mcolor; - else { - mix = (uint32_t)((uint32_t)(coords->y2 - mid_bot_area.y1) * 255) / height; - act_color = lv_color_mix(mcolor, gcolor, mix); - } - lv_draw_fill(&mid_bot_area, mask, act_color, opa); - - if(edge_bot_area.y1 != mid_bot_area.y1) { - - if(mcolor.full == gcolor.full) - act_color = mcolor; - else { - mix = (uint32_t)((uint32_t)(coords->y2 - edge_bot_area.y1) * 255) / height; - act_color = lv_color_mix(mcolor, gcolor, mix); - } - lv_draw_fill(&edge_bot_area, mask, act_color, opa); - } - -#if LV_ANTIALIAS - if(aa) { - /*The first and the last line is not drawn*/ - edge_top_area.x1 = coords->x1 + radius + 2; - edge_top_area.x2 = coords->x2 - radius - 2; - edge_top_area.y1 = coords->y1; - edge_top_area.y2 = coords->y1; - lv_draw_fill(&edge_top_area, mask, style->body.main_color, opa); - - edge_top_area.y1 = coords->y2; - edge_top_area.y2 = coords->y2; - lv_draw_fill(&edge_top_area, mask, style->body.grad_color, opa); - - /*Last parts of the anti-alias*/ - out_y_seg_end = cir.y; - lv_coord_t seg_size = out_y_seg_end - out_y_seg_start; - lv_point_t aa_p; - - aa_p.x = out_x_last; - aa_p.y = out_y_seg_start; - - mix = (uint32_t)((uint32_t)(radius - out_x_last) * 255) / height; - aa_color_hor_bottom = lv_color_mix(gcolor, mcolor, mix); - aa_color_hor_top = lv_color_mix(mcolor, gcolor, mix); - - lv_coord_t i; - for(i = 0; i < seg_size; i++) { - lv_opa_t aa_opa = opa - lv_draw_aa_get_opa(seg_size, i, opa); - lv_draw_px(rb_origo.x + LV_CIRC_OCT2_X(aa_p) + i, rb_origo.y + LV_CIRC_OCT2_Y(aa_p) + 1, mask, - aa_color_hor_top, aa_opa); - lv_draw_px(lb_origo.x + LV_CIRC_OCT3_X(aa_p) - i, lb_origo.y + LV_CIRC_OCT3_Y(aa_p) + 1, mask, - aa_color_hor_top, aa_opa); - lv_draw_px(lt_origo.x + LV_CIRC_OCT6_X(aa_p) - i, lt_origo.y + LV_CIRC_OCT6_Y(aa_p) - 1, mask, - aa_color_hor_bottom, aa_opa); - lv_draw_px(rt_origo.x + LV_CIRC_OCT7_X(aa_p) + i, rt_origo.y + LV_CIRC_OCT7_Y(aa_p) - 1, mask, - aa_color_hor_bottom, aa_opa); - - mix = (uint32_t)((uint32_t)(radius - out_y_seg_start + i) * 255) / height; - aa_color_ver = lv_color_mix(mcolor, gcolor, mix); - lv_draw_px(rb_origo.x + LV_CIRC_OCT1_X(aa_p) + 1, rb_origo.y + LV_CIRC_OCT1_Y(aa_p) + i, mask, aa_color_ver, - aa_opa); - lv_draw_px(lb_origo.x + LV_CIRC_OCT4_X(aa_p) - 1, lb_origo.y + LV_CIRC_OCT4_Y(aa_p) + i, mask, aa_color_ver, - aa_opa); - - aa_color_ver = lv_color_mix(gcolor, mcolor, mix); - lv_draw_px(lt_origo.x + LV_CIRC_OCT5_X(aa_p) - 1, lt_origo.y + LV_CIRC_OCT5_Y(aa_p) - i, mask, aa_color_ver, - aa_opa); - lv_draw_px(rt_origo.x + LV_CIRC_OCT8_X(aa_p) + 1, rt_origo.y + LV_CIRC_OCT8_Y(aa_p) - i, mask, aa_color_ver, - aa_opa); - } - - /*In some cases the last pixel is not drawn*/ - if(LV_MATH_ABS(aa_p.x - aa_p.y) == seg_size) { - aa_p.x = out_x_last; - aa_p.y = out_x_last; - - mix = (uint32_t)((uint32_t)(out_x_last)*255) / height; - aa_color_hor_top = lv_color_mix(gcolor, mcolor, mix); - aa_color_hor_bottom = lv_color_mix(mcolor, gcolor, mix); - - lv_opa_t aa_opa = opa >> 1; - lv_draw_px(rb_origo.x + LV_CIRC_OCT2_X(aa_p), rb_origo.y + LV_CIRC_OCT2_Y(aa_p), mask, aa_color_hor_bottom, - aa_opa); - lv_draw_px(lb_origo.x + LV_CIRC_OCT4_X(aa_p), lb_origo.y + LV_CIRC_OCT4_Y(aa_p), mask, aa_color_hor_bottom, - aa_opa); - lv_draw_px(lt_origo.x + LV_CIRC_OCT6_X(aa_p), lt_origo.y + LV_CIRC_OCT6_Y(aa_p), mask, aa_color_hor_top, - aa_opa); - lv_draw_px(rt_origo.x + LV_CIRC_OCT8_X(aa_p), rt_origo.y + LV_CIRC_OCT8_Y(aa_p), mask, aa_color_hor_top, - aa_opa); - } - } -#endif } -/** - * Draw the straight parts of a rectangle border - * @param coords the coordinates of the original rectangle - * @param mask_ the rectangle will be drawn only on this area - * @param rstyle pointer to a rectangle style - * @param opa_scale scale down all opacities by the factor - */ -static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale) +static void draw_border(const lv_area_t * coords, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale) { - uint16_t radius = style->body.radius; - bool aa = lv_disp_get_antialiasing(lv_refr_get_disp_refreshing()); + lv_coord_t border_width = style->body.border.width; + if(border_width == 0) return; - lv_coord_t width = lv_area_get_width(coords); - lv_coord_t height = lv_area_get_height(coords); - lv_coord_t bwidth = style->body.border.width; - lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->body.border.opa - : (uint16_t)((uint16_t)style->body.border.opa * opa_scale) >> 8; - lv_border_part_t part = style->body.border.part; - lv_color_t color = style->body.border.color; - lv_area_t work_area; - lv_coord_t length_corr = 0; - lv_coord_t corner_size = 0; + lv_opa_t opa = style->body.border.opa; + if(opa_scale != LV_OPA_COVER) opa = (opa * opa_scale) >> 8; - /*the 0 px border width drawn as 1 px, so decrement the b_width*/ - bwidth--; + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; - radius = lv_draw_cont_radius_corr(radius, width, height); + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + lv_disp_buf_t * vdb = lv_disp_get_buf(disp); - if(radius < bwidth) { - length_corr = bwidth - radius - aa; - corner_size = bwidth; - } else { - corner_size = radius + aa; + /* Get clipped fill area which is the real draw area. + * It is always the same or inside `fill_area` */ + lv_area_t draw_area; + bool is_common; + is_common = lv_area_intersect(&draw_area, coords, clip); + if(is_common == false) return; + + const lv_area_t * disp_area = &vdb->area; + + /* Now `draw_area` has absolute coordinates. + * Make it relative to `disp_area` to simplify draw to `disp_buf`*/ + draw_area.x1 -= disp_area->x1; + draw_area.y1 -= disp_area->y1; + draw_area.x2 -= disp_area->x1; + draw_area.y2 -= disp_area->y1; + + lv_coord_t draw_area_w = lv_area_get_width(&draw_area); + + /*Create a mask if there is a radius*/ + lv_opa_t * mask_buf = lv_mem_buf_get(draw_area_w); + + bool simple_mode = true; + if(lv_draw_mask_get_cnt()!= 0) simple_mode = false; + else if(style->body.border.part != LV_BORDER_PART_FULL) simple_mode = false; + else if(style->body.grad_dir == LV_GRAD_DIR_HOR) simple_mode = false; + + int16_t mask_rout_id = LV_MASK_ID_INV; + + lv_coord_t coords_w = lv_area_get_width(coords); + lv_coord_t coords_h = lv_area_get_height(coords); + + /*Get the real radius*/ + lv_coord_t rout = style->body.radius; + lv_coord_t short_side = LV_MATH_MIN(coords_w, coords_h); + if(rout > short_side >> 1) rout = short_side >> 1; + + /*Get the outer area*/ + lv_draw_mask_radius_param_t mask_rout_param; + if(rout > 0) { + lv_draw_mask_radius_init(&mask_rout_param, coords, rout, false); + mask_rout_id = lv_draw_mask_add(&mask_rout_param, NULL); } - /*If radius == 0 is a special case*/ - if(style->body.radius == 0) { - /*Left top corner*/ - if(part & LV_BORDER_TOP) { - work_area.x1 = coords->x1; - work_area.x2 = coords->x2; - work_area.y1 = coords->y1; - work_area.y2 = coords->y1 + bwidth; - lv_draw_fill(&work_area, mask, color, opa); + + /*Get the inner radius*/ + lv_coord_t rin = rout - border_width; + if(rin < 0) rin = 0; + + /*Get the inner area*/ + lv_area_t area_small; + lv_area_copy(&area_small, coords); + area_small.x1 += ((style->body.border.part & LV_BORDER_PART_LEFT) ? border_width : - (border_width + rout)); + area_small.x2 -= ((style->body.border.part & LV_BORDER_PART_RIGHT) ? border_width : - (border_width + rout)); + area_small.y1 += ((style->body.border.part & LV_BORDER_PART_TOP) ? border_width : - (border_width + rout)); + area_small.y2 -= ((style->body.border.part & LV_BORDER_PART_BOTTOM) ? border_width : - (border_width + rout)); + + /*Create inner the mask*/ + lv_draw_mask_radius_param_t mask_rin_param; + lv_draw_mask_radius_init(&mask_rin_param, &area_small, rout - border_width, true); + int16_t mask_rin_id = lv_draw_mask_add(&mask_rin_param, NULL); + + lv_coord_t corner_size = LV_MATH_MAX(rout, border_width - 1); + + lv_coord_t h; + lv_draw_mask_res_t mask_res; + lv_area_t fill_area; + + /*Apply some optimization if there is no other mask*/ + if(simple_mode) { + /*Draw the upper corner area*/ + lv_coord_t upper_corner_end = coords->y1 - disp_area->y1 + corner_size; + + fill_area.x1 = coords->x1; + fill_area.x2 = coords->x2; + fill_area.y1 = disp_area->y1 + draw_area.y1; + fill_area.y2 = fill_area.y1; + for(h = draw_area.y1; h <= upper_corner_end; h++) { + memset(mask_buf, LV_OPA_COVER, draw_area_w); + mask_res = lv_draw_mask_apply(mask_buf, vdb->area.x1 + draw_area.x1, vdb->area.y1 + h, draw_area_w); + + lv_area_t fill_area2; + fill_area2.y1 = fill_area.y1; + fill_area2.y2 = fill_area.y2; + + fill_area2.x1 = coords->x1; + fill_area2.x2 = coords->x1 + rout - 1; + + lv_blend_fill(clip, &fill_area2, + style->body.border.color, mask_buf, mask_res, opa, style->body.border.blend_mode); + + if(fill_area2.y2 < coords->y1 + style->body.border.width) { + fill_area2.x1 = coords->x1 + rout; + fill_area2.x2 = coords->x2 - rout; + + lv_blend_fill(clip, &fill_area2, + style->body.border.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa, style->body.border.blend_mode); + } + + fill_area2.x1 = coords->x2 - rout + 1; + fill_area2.x2 = coords->x2; + + lv_coord_t mask_ofs = (coords->x2 - rout + 1) - (vdb->area.x1 + draw_area.x1); + if(mask_ofs < 0) mask_ofs = 0; + lv_blend_fill(clip, &fill_area2, + style->body.border.color, mask_buf + mask_ofs, mask_res, opa, style->body.border.blend_mode); + + fill_area.y1++; + fill_area.y2++; } - /*Right top corner*/ - if(part & LV_BORDER_RIGHT) { - work_area.x1 = coords->x2 - bwidth; - work_area.x2 = coords->x2; - work_area.y1 = coords->y1 + (part & LV_BORDER_TOP ? bwidth + 1 : 0); - work_area.y2 = coords->y2 - (part & LV_BORDER_BOTTOM ? bwidth + 1 : 0); - lv_draw_fill(&work_area, mask, color, opa); + /*Draw the lower corner area corner area*/ + if(style->body.border.part & LV_BORDER_PART_BOTTOM) { + lv_coord_t lower_corner_end = coords->y2 - disp_area->y1 - corner_size; + if(lower_corner_end <= upper_corner_end) lower_corner_end = upper_corner_end + 1; + fill_area.y1 = disp_area->y1 + lower_corner_end; + fill_area.y2 = fill_area.y1; + for(h = lower_corner_end; h <= draw_area.y2; h++) { + memset(mask_buf, LV_OPA_COVER, draw_area_w); + mask_res = lv_draw_mask_apply(mask_buf, vdb->area.x1 + draw_area.x1, vdb->area.y1 + h, draw_area_w); + + lv_area_t fill_area2; + fill_area2.x1 = coords->x1; + fill_area2.x2 = coords->x1 + rout - 1; + fill_area2.y1 = fill_area.y1; + fill_area2.y2 = fill_area.y2; + + lv_blend_fill(clip, &fill_area2, + style->body.border.color, mask_buf, mask_res, opa, style->body.border.blend_mode); + + + if(fill_area2.y2 > coords->y2 - style->body.border.width ) { + fill_area2.x1 = coords->x1 + rout; + fill_area2.x2 = coords->x2 - rout; + + lv_blend_fill(clip, &fill_area2, + style->body.border.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa, style->body.border.blend_mode); + } + fill_area2.x1 = coords->x2 - rout + 1; + fill_area2.x2 = coords->x2; + + lv_coord_t mask_ofs = (coords->x2 - rout + 1) - (vdb->area.x1 + draw_area.x1); + if(mask_ofs < 0) mask_ofs = 0; + lv_blend_fill(clip, &fill_area2, + style->body.border.color, mask_buf + mask_ofs, mask_res, opa, style->body.border.blend_mode); + + + fill_area.y1++; + fill_area.y2++; + } } - /*Left bottom corner*/ - if(part & LV_BORDER_LEFT) { - work_area.x1 = coords->x1; - work_area.x2 = coords->x1 + bwidth; - work_area.y1 = coords->y1 + (part & LV_BORDER_TOP ? bwidth + 1 : 0); - work_area.y2 = coords->y2 - (part & LV_BORDER_BOTTOM ? bwidth + 1 : 0); - lv_draw_fill(&work_area, mask, color, opa); - } + /*Draw the left vertical border part*/ + fill_area.y1 = coords->y1 + corner_size + 1; + fill_area.y2 = coords->y2 - corner_size - 1; + + fill_area.x1 = coords->x1; + fill_area.x2 = coords->x1 + border_width - 1; + lv_blend_fill(clip, &fill_area, + style->body.border.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa, style->body.border.blend_mode); + + /*Draw the right vertical border*/ + fill_area.x1 = coords->x2 - border_width + 1; + fill_area.x2 = coords->x2; + + lv_blend_fill(clip, &fill_area, + style->body.border.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa, style->body.border.blend_mode); + } + /*Process line by line if there is other mask too*/ + else { + fill_area.x1 = coords->x1; + fill_area.x2 = coords->x2; + fill_area.y1 = disp_area->y1 + draw_area.y1; + fill_area.y2 = fill_area.y1; + for(h = draw_area.y1; h <= draw_area.y2; h++) { + memset(mask_buf, LV_OPA_COVER, draw_area_w); + mask_res = lv_draw_mask_apply(mask_buf, vdb->area.x1 + draw_area.x1, vdb->area.y1 + h, draw_area_w); + + lv_blend_fill( clip, &fill_area, + style->body.border.color, mask_buf, mask_res, opa, style->body.border.blend_mode); + + fill_area.y1++; + fill_area.y2++; - /*Right bottom corner*/ - if(part & LV_BORDER_BOTTOM) { - work_area.x1 = coords->x1; - work_area.x2 = coords->x2; - work_area.y1 = coords->y2 - bwidth; - work_area.y2 = coords->y2; - lv_draw_fill(&work_area, mask, color, opa); } + } + lv_draw_mask_remove_id(mask_rin_id); + lv_draw_mask_remove_id(mask_rout_id); + lv_mem_buf_release(mask_buf); +} + +static lv_color_t grad_get(const lv_style_t * style, lv_coord_t s, lv_coord_t i) +{ + lv_coord_t min = (style->body.main_color_stop * s) >> 8; + if(i <= min) return style->body.main_color; + + lv_coord_t max = (style->body.grad_color_stop * s) >> 8; + if(i >= max) return style->body.grad_color; + + lv_coord_t d = style->body.grad_color_stop - style->body.main_color_stop; + d = (s * d) >> 8; + i -= min; + lv_opa_t mix = (i * 255) / d; + return lv_color_mix(style->body.grad_color, style->body.main_color, mix); +} + +static void draw_shadow(const lv_area_t * coords, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale) +{ + /*Check whether the shadow is visible*/ + if(style->body.shadow.width == 0) return; + + if(style->body.shadow.width == 1 && style->body.shadow.offset.x == 0 && + style->body.shadow.offset.y == 0 && style->body.shadow.spread <= 0) { return; } - /* Modify the corner_size if corner is drawn */ - corner_size++; + lv_coord_t sw = style->body.shadow.width; - /*Depending one which part's are drawn modify the area lengths */ - if(part & LV_BORDER_TOP) - work_area.y1 = coords->y1 + corner_size; - else - work_area.y1 = coords->y1 + radius; + lv_area_t sh_rect_area; + sh_rect_area.x1 = coords->x1 + style->body.shadow.offset.x - style->body.shadow.spread; + sh_rect_area.x2 = coords->x2 + style->body.shadow.offset.x + style->body.shadow.spread; + sh_rect_area.y1 = coords->y1 + style->body.shadow.offset.y - style->body.shadow.spread; + sh_rect_area.y2 = coords->y2 + style->body.shadow.offset.y + style->body.shadow.spread; - if(part & LV_BORDER_BOTTOM) - work_area.y2 = coords->y2 - corner_size; - else - work_area.y2 = coords->y2 - radius; + lv_area_t sh_area; + sh_area.x1 = sh_rect_area.x1 - sw / 2 - 1; + sh_area.x2 = sh_rect_area.x2 + sw / 2 + 1; + sh_area.y1 = sh_rect_area.y1 - sw / 2 - 1; + sh_area.y2 = sh_rect_area.y2 + sw / 2 + 1; - /*Left border*/ - if(part & LV_BORDER_LEFT) { - work_area.x1 = coords->x1; - work_area.x2 = work_area.x1 + bwidth; - lv_draw_fill(&work_area, mask, color, opa); + lv_opa_t opa = style->body.shadow.opa; + + if(opa_scale != LV_OPA_COVER) opa = (opa * opa_scale) >> 8; + + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + lv_disp_buf_t * vdb = lv_disp_get_buf(disp); + + /* Get clipped fill area which is the real draw area. + * It is always the same or inside `fill_area` */ + lv_area_t draw_area; + bool is_common; + is_common = lv_area_intersect(&draw_area, &sh_area, clip); + if(is_common == false) return; + + const lv_area_t * disp_area = &vdb->area; + + /* Now `draw_area` has absolute coordinates. + * Make it relative to `disp_area` to simplify draw to `disp_buf`*/ + draw_area.x1 -= disp_area->x1; + draw_area.y1 -= disp_area->y1; + draw_area.x2 -= disp_area->x1; + draw_area.y2 -= disp_area->y1; + + /*Consider 1 px smaller bg to be sure the edge will be covered by the shadow*/ + lv_area_t bg_coords; + lv_area_copy(&bg_coords, coords); + bg_coords.x1 += 1; + bg_coords.y1 += 1; + bg_coords.x2 -= 1; + bg_coords.y2 -= 1; + + /*Get the real radius*/ + lv_coord_t r_bg = style->body.radius; + lv_coord_t short_side = LV_MATH_MIN(lv_area_get_width(&bg_coords), lv_area_get_height(&bg_coords)); + if(r_bg > short_side >> 1) r_bg = short_side >> 1; + + lv_coord_t r_sh = style->body.radius; + short_side = LV_MATH_MIN(lv_area_get_width(&sh_rect_area), lv_area_get_height(&sh_rect_area)); + if(r_sh > short_side >> 1) r_sh = short_side >> 1; + + + lv_coord_t corner_size = sw + r_sh; + + lv_opa_t * sh_buf = lv_mem_buf_get(corner_size * corner_size); + shadow_draw_corner_buf(&sh_rect_area, sh_buf, style->body.shadow.width, r_sh); + + bool simple_mode = true; + if(lv_draw_mask_get_cnt() > 0) simple_mode = false; + else if(style->body.shadow.offset.x != 0 || style->body.shadow.offset.y != 0) simple_mode = false; + else if(style->body.shadow.spread != 0) simple_mode = false; + + lv_coord_t y_max; + + /*Create a mask*/ + lv_draw_mask_res_t mask_res; + lv_opa_t * mask_buf = lv_mem_buf_get(lv_area_get_width(&sh_rect_area)); + + lv_draw_mask_radius_param_t mask_rout_param; + lv_draw_mask_radius_init(&mask_rout_param, &bg_coords, r_bg, true); + + int16_t mask_rout_id = LV_MASK_ID_INV; + mask_rout_id = lv_draw_mask_add(&mask_rout_param, NULL); + + lv_area_t a; + + /*Draw the top right corner*/ + a.x2 = sh_area.x2; + a.x1 = a.x2 - corner_size + 1; + a.y1 = sh_area.y1; + a.y2 = a.y1; + + lv_coord_t first_px; + first_px = 0; + if(disp_area->x1 > a.x1) { + first_px = disp_area->x1 - a.x1; } - /*Right border*/ - if(part & LV_BORDER_RIGHT) { - work_area.x2 = coords->x2; - work_area.x1 = work_area.x2 - bwidth; - lv_draw_fill(&work_area, mask, color, opa); + lv_coord_t hor_mid_dist = (sh_area.x1 + lv_area_get_width(&sh_area) / 2) - (a.x1 + first_px); + if(hor_mid_dist > 0) { + first_px += hor_mid_dist; + } + a.x1 += first_px; + + lv_coord_t ver_mid_dist = (a.y1 + corner_size) - (sh_area.y1 + lv_area_get_height(&sh_area) / 2); + lv_coord_t ver_mid_corr = 0; + if(ver_mid_dist <= 0) ver_mid_dist = 0; + else { + if(lv_area_get_height(&sh_area) & 0x1) ver_mid_corr = 1; + } + lv_opa_t * sh_buf_tmp = sh_buf; + + lv_coord_t y; + for(y = 0; y < corner_size - ver_mid_dist + ver_mid_corr; y++) { + memcpy(mask_buf, sh_buf_tmp, corner_size); + mask_res = lv_draw_mask_apply(mask_buf + first_px, a.x1, a.y1, lv_area_get_width(&a)); + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask_res = LV_DRAW_MASK_RES_CHANGED; + + lv_blend_fill(clip, &a, + style->body.shadow.color, mask_buf + first_px, mask_res, opa, style->body.shadow.blend_mode); + a.y1++; + a.y2++; + sh_buf_tmp += corner_size; } - work_area.x1 = coords->x1 + corner_size - length_corr; - work_area.x2 = coords->x2 - corner_size + length_corr; + /*Draw the bottom right corner*/ + a.y1 = sh_area.y2; + a.y2 = a.y1; - /*Upper border*/ - if(part & LV_BORDER_TOP) { - work_area.y1 = coords->y1; - work_area.y2 = coords->y1 + bwidth; - lv_draw_fill(&work_area, mask, color, opa); + sh_buf_tmp = sh_buf ; + + for(y = 0; y < corner_size - ver_mid_dist; y++) { + memcpy(mask_buf, sh_buf_tmp, corner_size); + mask_res = lv_draw_mask_apply(mask_buf + first_px, a.x1, a.y1, lv_area_get_width(&a)); + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask_res = LV_DRAW_MASK_RES_CHANGED; + + lv_blend_fill(clip, &a, + style->body.shadow.color, mask_buf + first_px, mask_res, opa, style->body.shadow.blend_mode); + a.y1--; + a.y2--; + sh_buf_tmp += corner_size; } - /*Lower border*/ - if(part & LV_BORDER_BOTTOM) { - work_area.y2 = coords->y2; - work_area.y1 = work_area.y2 - bwidth; - lv_draw_fill(&work_area, mask, color, opa); - } + /*Fill the right side*/ + a.y1 = sh_area.y1 + corner_size; + a.y2 = a.y1; + sh_buf_tmp = sh_buf + corner_size * (corner_size - 1); - /*Draw the a remaining rectangles if the radius is smaller then bwidth */ - if(length_corr != 0) { - /*Left top correction*/ - if((part & LV_BORDER_TOP) && (part & LV_BORDER_LEFT)) { - work_area.x1 = coords->x1; - work_area.x2 = coords->x1 + radius + aa; - work_area.y1 = coords->y1 + radius + 1 + aa; - work_area.y2 = coords->y1 + bwidth; - lv_draw_fill(&work_area, mask, color, opa); - } + lv_coord_t x; - /*Right top correction*/ - if((part & LV_BORDER_TOP) && (part & LV_BORDER_RIGHT)) { - work_area.x1 = coords->x2 - radius - aa; - work_area.x2 = coords->x2; - work_area.y1 = coords->y1 + radius + 1 + aa; - work_area.y2 = coords->y1 + bwidth; - lv_draw_fill(&work_area, mask, color, opa); - } + if(simple_mode) { + /*Draw vertical lines*/ + lv_area_t va; + va.x1 = a.x1; + va.x2 = a.x1; + va.y1 = sh_area.y1 + corner_size; + va.y2 = sh_area.y2 - corner_size; - /*Left bottom correction*/ - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_LEFT)) { - work_area.x1 = coords->x1; - work_area.x2 = coords->x1 + radius + aa; - work_area.y1 = coords->y2 - bwidth; - work_area.y2 = coords->y2 - radius - 1 - aa; - lv_draw_fill(&work_area, mask, color, opa); - } - - /*Right bottom correction*/ - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_RIGHT)) { - work_area.x1 = coords->x2 - radius - aa; - work_area.x2 = coords->x2; - work_area.y1 = coords->y2 - bwidth; - work_area.y2 = coords->y2 - radius - 1 - aa; - lv_draw_fill(&work_area, mask, color, opa); - } - } - - /*If radius == 0 one px on the corners are not drawn by main drawer*/ - if(style->body.radius == 0) { - /*Left top corner*/ - if(part & (LV_BORDER_TOP | LV_BORDER_LEFT)) { - work_area.x1 = coords->x1; - work_area.x2 = coords->x1 + aa; - work_area.y1 = coords->y1; - work_area.y2 = coords->y1 + aa; - lv_draw_fill(&work_area, mask, color, opa); - } - - /*Right top corner*/ - if(part & (LV_BORDER_TOP | LV_BORDER_RIGHT)) { - work_area.x1 = coords->x2 - aa; - work_area.x2 = coords->x2; - work_area.y1 = coords->y1; - work_area.y2 = coords->y1 + aa; - lv_draw_fill(&work_area, mask, color, opa); - } - - /*Left bottom corner*/ - if(part & (LV_BORDER_BOTTOM | LV_BORDER_LEFT)) { - work_area.x1 = coords->x1; - work_area.x2 = coords->x1 + aa; - work_area.y1 = coords->y2 - aa; - work_area.y2 = coords->y2; - lv_draw_fill(&work_area, mask, color, opa); - } - - /*Right bottom corner*/ - if(part & (LV_BORDER_BOTTOM | LV_BORDER_RIGHT)) { - work_area.x1 = coords->x2 - aa; - work_area.x2 = coords->x2; - work_area.y1 = coords->y2 - aa; - work_area.y2 = coords->y2; - lv_draw_fill(&work_area, mask, color, opa); - } - } -} - -/** - * Draw the corners of a rectangle border - * @param coords the coordinates of the original rectangle - * @param mask the rectangle will be drawn only on this area - * @param style pointer to a style - * @param opa_scale scale down all opacities by the factor - */ -static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale) -{ - uint16_t radius = style->body.radius; - bool aa = lv_disp_get_antialiasing(lv_refr_get_disp_refreshing()); - lv_coord_t bwidth = style->body.border.width; - lv_color_t color = style->body.border.color; - lv_border_part_t part = style->body.border.part; - lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->body.border.opa - : (uint16_t)((uint16_t)style->body.border.opa * opa_scale) >> 8; - /*0 px border width drawn as 1 px, so decrement the bwidth*/ - bwidth--; - -#if LV_ANTIALIAS - if(aa) bwidth--; /*Because of anti-aliasing the border seems one pixel ticker*/ -#endif - - lv_coord_t width = lv_area_get_width(coords); - lv_coord_t height = lv_area_get_height(coords); - - radius = lv_draw_cont_radius_corr(radius, width, height); - - lv_point_t lt_origo; /*Left Top origo*/ - lv_point_t lb_origo; /*Left Bottom origo*/ - lv_point_t rt_origo; /*Right Top origo*/ - lv_point_t rb_origo; /*Left Bottom origo*/ - - lt_origo.x = coords->x1 + radius + aa; - lt_origo.y = coords->y1 + radius + aa; - - lb_origo.x = coords->x1 + radius + aa; - lb_origo.y = coords->y2 - radius - aa; - - rt_origo.x = coords->x2 - radius - aa; - rt_origo.y = coords->y1 + radius + aa; - - rb_origo.x = coords->x2 - radius - aa; - rb_origo.y = coords->y2 - radius - aa; - - lv_point_t cir_out; - lv_coord_t tmp_out; - lv_circ_init(&cir_out, &tmp_out, radius); - - lv_point_t cir_in; - lv_coord_t tmp_in; - lv_coord_t radius_in = radius - bwidth; - - if(radius_in < 0) { - radius_in = 0; - } - - lv_circ_init(&cir_in, &tmp_in, radius_in); - - lv_area_t circ_area; - lv_coord_t act_w1; - lv_coord_t act_w2; - -#if LV_ANTIALIAS - /*Store some internal states for anti-aliasing*/ - lv_coord_t out_y_seg_start = 0; - lv_coord_t out_y_seg_end = 0; - lv_coord_t out_x_last = radius; - - lv_coord_t in_y_seg_start = 0; - lv_coord_t in_y_seg_end = 0; - lv_coord_t in_x_last = radius - bwidth; -#endif - - while(cir_out.y <= cir_out.x) { - - /*Calculate the actual width to avoid overwriting pixels*/ - if(cir_in.y < cir_in.x) { - act_w1 = cir_out.x - cir_in.x; - act_w2 = act_w1; - } else { - act_w1 = cir_out.x - cir_out.y; - act_w2 = act_w1 - 1; - } - -#if LV_ANTIALIAS - if(aa) { - /*New step in y on the outter circle*/ - if(out_x_last != cir_out.x) { - out_y_seg_end = cir_out.y; - lv_coord_t seg_size = out_y_seg_end - out_y_seg_start; - lv_point_t aa_p; - - aa_p.x = out_x_last; - aa_p.y = out_y_seg_start; - - lv_coord_t i; - for(i = 0; i < seg_size; i++) { - lv_opa_t aa_opa; - - if(seg_size > CIRCLE_AA_NON_LINEAR_OPA_THRESHOLD) { /*Use non-linear opa mapping - on the first segment*/ - aa_opa = antialias_get_opa_circ(seg_size, i, opa); - } else { - aa_opa = opa - lv_draw_aa_get_opa(seg_size, i, opa); - } - - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rb_origo.x + LV_CIRC_OCT1_X(aa_p) + 1, rb_origo.y + LV_CIRC_OCT1_Y(aa_p) + i, mask, - style->body.border.color, aa_opa); - lv_draw_px(rb_origo.x + LV_CIRC_OCT2_X(aa_p) + i, rb_origo.y + LV_CIRC_OCT2_Y(aa_p) + 1, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lb_origo.x + LV_CIRC_OCT3_X(aa_p) - i, lb_origo.y + LV_CIRC_OCT3_Y(aa_p) + 1, mask, - style->body.border.color, aa_opa); - lv_draw_px(lb_origo.x + LV_CIRC_OCT4_X(aa_p) - 1, lb_origo.y + LV_CIRC_OCT4_Y(aa_p) + i, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lt_origo.x + LV_CIRC_OCT5_X(aa_p) - 1, lt_origo.y + LV_CIRC_OCT5_Y(aa_p) - i, mask, - style->body.border.color, aa_opa); - lv_draw_px(lt_origo.x + LV_CIRC_OCT6_X(aa_p) - i, lt_origo.y + LV_CIRC_OCT6_Y(aa_p) - 1, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rt_origo.x + LV_CIRC_OCT7_X(aa_p) + i, rt_origo.y + LV_CIRC_OCT7_Y(aa_p) - 1, mask, - style->body.border.color, aa_opa); - lv_draw_px(rt_origo.x + LV_CIRC_OCT8_X(aa_p) + 1, rt_origo.y + LV_CIRC_OCT8_Y(aa_p) - i, mask, - style->body.border.color, aa_opa); - } - } - - out_x_last = cir_out.x; - out_y_seg_start = out_y_seg_end; - } - - /*New step in y on the inner circle*/ - if(in_x_last != cir_in.x) { - in_y_seg_end = cir_out.y; - lv_coord_t seg_size = in_y_seg_end - in_y_seg_start; - lv_point_t aa_p; - - aa_p.x = in_x_last; - aa_p.y = in_y_seg_start; - - lv_coord_t i; - for(i = 0; i < seg_size; i++) { - lv_opa_t aa_opa; - - if(seg_size > CIRCLE_AA_NON_LINEAR_OPA_THRESHOLD) { /*Use non-linear opa mapping - on the first segment*/ - aa_opa = opa - antialias_get_opa_circ(seg_size, i, opa); - } else { - aa_opa = lv_draw_aa_get_opa(seg_size, i, opa); - } - - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rb_origo.x + LV_CIRC_OCT1_X(aa_p) - 1, rb_origo.y + LV_CIRC_OCT1_Y(aa_p) + i, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lb_origo.x + LV_CIRC_OCT3_X(aa_p) - i, lb_origo.y + LV_CIRC_OCT3_Y(aa_p) - 1, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lt_origo.x + LV_CIRC_OCT5_X(aa_p) + 1, lt_origo.y + LV_CIRC_OCT5_Y(aa_p) - i, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rt_origo.x + LV_CIRC_OCT7_X(aa_p) + i, rt_origo.y + LV_CIRC_OCT7_Y(aa_p) + 1, mask, - style->body.border.color, aa_opa); - } - - /*Be sure the pixels on the middle are not drawn twice*/ - if(LV_CIRC_OCT1_X(aa_p) - 1 != LV_CIRC_OCT2_X(aa_p) + i) { - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rb_origo.x + LV_CIRC_OCT2_X(aa_p) + i, rb_origo.y + LV_CIRC_OCT2_Y(aa_p) - 1, - mask, style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lb_origo.x + LV_CIRC_OCT4_X(aa_p) + 1, lb_origo.y + LV_CIRC_OCT4_Y(aa_p) + i, - mask, style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lt_origo.x + LV_CIRC_OCT6_X(aa_p) - i, lt_origo.y + LV_CIRC_OCT6_Y(aa_p) + 1, - mask, style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rt_origo.x + LV_CIRC_OCT8_X(aa_p) - 1, rt_origo.y + LV_CIRC_OCT8_Y(aa_p) - i, - mask, style->body.border.color, aa_opa); - } - } - } - - in_x_last = cir_in.x; - in_y_seg_start = in_y_seg_end; - } - } -#endif - - /*Draw the octets to the right bottom corner*/ - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_RIGHT)) { - circ_area.x1 = rb_origo.x + LV_CIRC_OCT1_X(cir_out) - act_w2; - circ_area.x2 = rb_origo.x + LV_CIRC_OCT1_X(cir_out); - circ_area.y1 = rb_origo.y + LV_CIRC_OCT1_Y(cir_out); - circ_area.y2 = rb_origo.y + LV_CIRC_OCT1_Y(cir_out); - lv_draw_fill(&circ_area, mask, color, opa); - - circ_area.x1 = rb_origo.x + LV_CIRC_OCT2_X(cir_out); - circ_area.x2 = rb_origo.x + LV_CIRC_OCT2_X(cir_out); - circ_area.y1 = rb_origo.y + LV_CIRC_OCT2_Y(cir_out) - act_w1; - circ_area.y2 = rb_origo.y + LV_CIRC_OCT2_Y(cir_out); - lv_draw_fill(&circ_area, mask, color, opa); - } - - /*Draw the octets to the left bottom corner*/ - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_LEFT)) { - circ_area.x1 = lb_origo.x + LV_CIRC_OCT3_X(cir_out); - circ_area.x2 = lb_origo.x + LV_CIRC_OCT3_X(cir_out); - circ_area.y1 = lb_origo.y + LV_CIRC_OCT3_Y(cir_out) - act_w2; - circ_area.y2 = lb_origo.y + LV_CIRC_OCT3_Y(cir_out); - lv_draw_fill(&circ_area, mask, color, opa); - - circ_area.x1 = lb_origo.x + LV_CIRC_OCT4_X(cir_out); - circ_area.x2 = lb_origo.x + LV_CIRC_OCT4_X(cir_out) + act_w1; - circ_area.y1 = lb_origo.y + LV_CIRC_OCT4_Y(cir_out); - circ_area.y2 = lb_origo.y + LV_CIRC_OCT4_Y(cir_out); - lv_draw_fill(&circ_area, mask, color, opa); - } - - /*Draw the octets to the left top corner*/ - if((part & LV_BORDER_TOP) && (part & LV_BORDER_LEFT)) { - if(lb_origo.y + LV_CIRC_OCT4_Y(cir_out) > lt_origo.y + LV_CIRC_OCT5_Y(cir_out)) { - /*Don't draw if the lines are common in the middle*/ - circ_area.x1 = lt_origo.x + LV_CIRC_OCT5_X(cir_out); - circ_area.x2 = lt_origo.x + LV_CIRC_OCT5_X(cir_out) + act_w2; - circ_area.y1 = lt_origo.y + LV_CIRC_OCT5_Y(cir_out); - circ_area.y2 = lt_origo.y + LV_CIRC_OCT5_Y(cir_out); - lv_draw_fill(&circ_area, mask, color, opa); - } - - circ_area.x1 = lt_origo.x + LV_CIRC_OCT6_X(cir_out); - circ_area.x2 = lt_origo.x + LV_CIRC_OCT6_X(cir_out); - circ_area.y1 = lt_origo.y + LV_CIRC_OCT6_Y(cir_out); - circ_area.y2 = lt_origo.y + LV_CIRC_OCT6_Y(cir_out) + act_w1; - lv_draw_fill(&circ_area, mask, color, opa); - } - - /*Draw the octets to the right top corner*/ - if((part & LV_BORDER_TOP) && (part & LV_BORDER_RIGHT)) { - circ_area.x1 = rt_origo.x + LV_CIRC_OCT7_X(cir_out); - circ_area.x2 = rt_origo.x + LV_CIRC_OCT7_X(cir_out); - circ_area.y1 = rt_origo.y + LV_CIRC_OCT7_Y(cir_out); - circ_area.y2 = rt_origo.y + LV_CIRC_OCT7_Y(cir_out) + act_w2; - lv_draw_fill(&circ_area, mask, color, opa); - - /*Don't draw if the lines are common in the middle*/ - if(rb_origo.y + LV_CIRC_OCT1_Y(cir_out) > rt_origo.y + LV_CIRC_OCT8_Y(cir_out)) { - circ_area.x1 = rt_origo.x + LV_CIRC_OCT8_X(cir_out) - act_w1; - circ_area.x2 = rt_origo.x + LV_CIRC_OCT8_X(cir_out); - circ_area.y1 = rt_origo.y + LV_CIRC_OCT8_Y(cir_out); - circ_area.y2 = rt_origo.y + LV_CIRC_OCT8_Y(cir_out); - lv_draw_fill(&circ_area, mask, color, opa); - } - } - lv_circ_next(&cir_out, &tmp_out); - - /*The internal circle will be ready faster - * so check it! */ - if(cir_in.y < cir_in.x) { - lv_circ_next(&cir_in, &tmp_in); - } - } - -#if LV_ANTIALIAS - if(aa) { - /*Last parts of the outer anti-alias*/ - out_y_seg_end = cir_out.y; - lv_coord_t seg_size = out_y_seg_end - out_y_seg_start; - lv_point_t aa_p; - - aa_p.x = out_x_last; - aa_p.y = out_y_seg_start; - - lv_coord_t i; - for(i = 0; i < seg_size; i++) { - lv_opa_t aa_opa = opa - lv_draw_aa_get_opa(seg_size, i, opa); - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rb_origo.x + LV_CIRC_OCT1_X(aa_p) + 1, rb_origo.y + LV_CIRC_OCT1_Y(aa_p) + i, mask, - style->body.border.color, aa_opa); - lv_draw_px(rb_origo.x + LV_CIRC_OCT2_X(aa_p) + i, rb_origo.y + LV_CIRC_OCT2_Y(aa_p) + 1, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lb_origo.x + LV_CIRC_OCT3_X(aa_p) - i, lb_origo.y + LV_CIRC_OCT3_Y(aa_p) + 1, mask, - style->body.border.color, aa_opa); - lv_draw_px(lb_origo.x + LV_CIRC_OCT4_X(aa_p) - 1, lb_origo.y + LV_CIRC_OCT4_Y(aa_p) + i, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lt_origo.x + LV_CIRC_OCT5_X(aa_p) - 1, lt_origo.y + LV_CIRC_OCT5_Y(aa_p) - i, mask, - style->body.border.color, aa_opa); - lv_draw_px(lt_origo.x + LV_CIRC_OCT6_X(aa_p) - i, lt_origo.y + LV_CIRC_OCT6_Y(aa_p) - 1, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rt_origo.x + LV_CIRC_OCT7_X(aa_p) + i, rt_origo.y + LV_CIRC_OCT7_Y(aa_p) - 1, mask, - style->body.border.color, aa_opa); - lv_draw_px(rt_origo.x + LV_CIRC_OCT8_X(aa_p) + 1, rt_origo.y + LV_CIRC_OCT8_Y(aa_p) - i, mask, - style->body.border.color, aa_opa); - } - } - - /*In some cases the last pixel in the outer middle is not drawn*/ - if(LV_MATH_ABS(aa_p.x - aa_p.y) == seg_size) { - aa_p.x = out_x_last; - aa_p.y = out_x_last; - - lv_opa_t aa_opa = opa >> 1; - - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rb_origo.x + LV_CIRC_OCT2_X(aa_p), rb_origo.y + LV_CIRC_OCT2_Y(aa_p), mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lb_origo.x + LV_CIRC_OCT4_X(aa_p), lb_origo.y + LV_CIRC_OCT4_Y(aa_p), mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lt_origo.x + LV_CIRC_OCT6_X(aa_p), lt_origo.y + LV_CIRC_OCT6_Y(aa_p), mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rt_origo.x + LV_CIRC_OCT8_X(aa_p), rt_origo.y + LV_CIRC_OCT8_Y(aa_p), mask, - style->body.border.color, aa_opa); - } - } - - /*Last parts of the inner anti-alias*/ - in_y_seg_end = cir_in.y; - aa_p.x = in_x_last; - aa_p.y = in_y_seg_start; - seg_size = in_y_seg_end - in_y_seg_start; - - for(i = 0; i < seg_size; i++) { - lv_opa_t aa_opa = lv_draw_aa_get_opa(seg_size, i, opa); - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rb_origo.x + LV_CIRC_OCT1_X(aa_p) - 1, rb_origo.y + LV_CIRC_OCT1_Y(aa_p) + i, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lb_origo.x + LV_CIRC_OCT3_X(aa_p) - i, lb_origo.y + LV_CIRC_OCT3_Y(aa_p) - 1, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lt_origo.x + LV_CIRC_OCT5_X(aa_p) + 1, lt_origo.y + LV_CIRC_OCT5_Y(aa_p) - i, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rt_origo.x + LV_CIRC_OCT7_X(aa_p) + i, rt_origo.y + LV_CIRC_OCT7_Y(aa_p) + 1, mask, - style->body.border.color, aa_opa); - } - - if(LV_CIRC_OCT1_X(aa_p) - 1 != LV_CIRC_OCT2_X(aa_p) + i) { - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rb_origo.x + LV_CIRC_OCT2_X(aa_p) + i, rb_origo.y + LV_CIRC_OCT2_Y(aa_p) - 1, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lb_origo.x + LV_CIRC_OCT4_X(aa_p) + 1, lb_origo.y + LV_CIRC_OCT4_Y(aa_p) + i, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_LEFT)) { - lv_draw_px(lt_origo.x + LV_CIRC_OCT6_X(aa_p) - i, lt_origo.y + LV_CIRC_OCT6_Y(aa_p) + 1, mask, - style->body.border.color, aa_opa); - } - - if((part & LV_BORDER_TOP) && (part & LV_BORDER_RIGHT)) { - lv_draw_px(rt_origo.x + LV_CIRC_OCT8_X(aa_p) - 1, rt_origo.y + LV_CIRC_OCT8_Y(aa_p) - i, mask, - style->body.border.color, aa_opa); + if(va.y1 <= va.y2) { + for(x = a.x1; x < a.x2; x++) { + if(x > coords->x2) { + lv_opa_t opa_tmp = sh_buf_tmp[x - a.x1 + first_px]; + if(opa_tmp != LV_OPA_COVER || opa != LV_OPA_COVER) opa_tmp = (opa * opa_tmp) >> 8; + lv_blend_fill(clip, &va, + style->body.shadow.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa_tmp, style->body.shadow.blend_mode); } + va.x1++; + va.x2++; } } } -#endif -} + else { + for(y = corner_size; y < lv_area_get_height(&sh_area) - corner_size; y++) { + memcpy(mask_buf, sh_buf_tmp, corner_size); + mask_res = lv_draw_mask_apply(mask_buf + first_px, a.x1, a.y1, lv_area_get_width(&a)); + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask_res = LV_DRAW_MASK_RES_CHANGED; -#if LV_USE_SHADOW - -/** - * Draw a shadow - * @param rect pointer to rectangle object - * @param mask pointer to a mask area (from the design functions) - * @param opa_scale scale down all opacities by the factor - */ -static void lv_draw_shadow(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale) -{ - /* If mask is in the middle of cords do not draw shadow*/ - lv_coord_t radius = style->body.radius; - lv_coord_t width = lv_area_get_width(coords); - lv_coord_t height = lv_area_get_height(coords); - radius = lv_draw_cont_radius_corr(radius, width, height); - lv_area_t area_tmp; - - /*Check horizontally without radius*/ - lv_area_copy(&area_tmp, coords); - area_tmp.x1 += radius; - area_tmp.x2 -= radius; - if(lv_area_is_in(mask, &area_tmp) != false) return; - - /*Check vertically without radius*/ - lv_area_copy(&area_tmp, coords); - area_tmp.y1 += radius; - area_tmp.y2 -= radius; - if(lv_area_is_in(mask, &area_tmp) != false) return; - - if(style->body.shadow.type == LV_SHADOW_FULL) { - lv_draw_shadow_full(coords, mask, style, opa_scale); - } else if(style->body.shadow.type == LV_SHADOW_BOTTOM) { - lv_draw_shadow_bottom(coords, mask, style, opa_scale); - } -} - -static void lv_draw_shadow_full(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale) -{ - - /* KNOWN ISSUE - * The algorithm calculates the shadow only above the middle point of the radius (speaking about - * the left top corner). It causes an error because it doesn't consider how long the straight - * edge is which effects the value of bottom of the corner shadow. In addition the straight - * shadow is drawn from the middles point of the radius however the ends of the straight parts - * still should be effected by the corner shadow. It also causes an issue in opacity. A smaller - * radius means smaller average shadow opacity. The solution should be to start `line` from `- - * swidth` and handle if the straight part is short (or zero) and the value is taken from the - * other corner. `col` also should start from `- swidth` - */ - - bool aa = lv_disp_get_antialiasing(lv_refr_get_disp_refreshing()); - - lv_coord_t radius = style->body.radius; - lv_coord_t swidth = style->body.shadow.width; - - lv_coord_t width = lv_area_get_width(coords); - lv_coord_t height = lv_area_get_height(coords); - - radius = lv_draw_cont_radius_corr(radius, width, height); - - radius += aa; - - /*Allocate a draw buffer the buffer required to draw the shadow*/ - int16_t filter_width = 2 * swidth + 1; - uint32_t curve_x_size = ((radius + swidth + 1) + 3) & ~0x3; /*Round to 4*/ - curve_x_size *= sizeof(lv_coord_t); - uint32_t line_1d_blur_size = (filter_width + 3) & ~0x3; /*Round to 4*/ - line_1d_blur_size *= sizeof(uint32_t); - uint32_t line_2d_blur_size = ((radius + swidth + 1) + 3) & ~0x3; /*Round to 4*/ - line_2d_blur_size *= sizeof(lv_opa_t); - - uint8_t * draw_buf = lv_draw_get_buf(curve_x_size + line_1d_blur_size + line_2d_blur_size); - - /*Divide the draw buffer*/ - lv_coord_t * curve_x = (lv_coord_t *)&draw_buf[0]; /*Stores the 'x' coordinates of a quarter circle.*/ - uint32_t * line_1d_blur = (uint32_t *)&draw_buf[curve_x_size]; - lv_opa_t * line_2d_blur = (lv_opa_t *)&draw_buf[curve_x_size + line_1d_blur_size]; - - memset(curve_x, 0, curve_x_size); - lv_point_t circ; - lv_coord_t circ_tmp; - lv_circ_init(&circ, &circ_tmp, radius); - while(lv_circ_cont(&circ)) { - curve_x[LV_CIRC_OCT1_Y(circ)] = LV_CIRC_OCT1_X(circ); - curve_x[LV_CIRC_OCT2_Y(circ)] = LV_CIRC_OCT2_X(circ); - lv_circ_next(&circ, &circ_tmp); - } - int16_t line; - /*1D Blur horizontally*/ - lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->body.opa : (uint16_t)((uint16_t)style->body.opa * opa_scale) >> 8; - for(line = 0; line < filter_width; line++) { - line_1d_blur[line] = (uint32_t)((uint32_t)(filter_width - line) * (opa * 2) << SHADOW_OPA_EXTRA_PRECISION) / - (filter_width * filter_width); + lv_blend_fill(clip, &a, + style->body.shadow.color, mask_buf+first_px, mask_res, opa, style->body.shadow.blend_mode); + a.y1++; + a.y2++; + } } - uint16_t col; + /*Invert the shadow corner buffer and draw the corners on the left*/ + sh_buf_tmp = sh_buf ; + for(y = 0; y < corner_size; y++) { + for(x = 0; x < corner_size / 2; x++) { + lv_opa_t tmp = sh_buf_tmp[x]; + sh_buf_tmp[x] = sh_buf_tmp[corner_size - x - 1]; + sh_buf_tmp[corner_size - x - 1] = tmp; + } + sh_buf_tmp += corner_size; + } - lv_point_t point_rt; - lv_point_t point_rb; - lv_point_t point_lt; - lv_point_t point_lb; - lv_point_t ofs_rb; - lv_point_t ofs_rt; - lv_point_t ofs_lb; - lv_point_t ofs_lt; - ofs_rb.x = coords->x2 - radius - aa; - ofs_rb.y = coords->y2 - radius - aa; + /*Draw the top left corner*/ + a.x1 = sh_area.x1; + a.x2 = a.x1 + corner_size - 1; + a.y1 = sh_area.y1; + a.y2 = a.y1; - ofs_rt.x = coords->x2 - radius - aa; - ofs_rt.y = coords->y1 + radius + aa; + if(a.x2 > sh_area.x1 + lv_area_get_width(&sh_area)/2 - 1) { + a.x2 = sh_area.x1 + lv_area_get_width(&sh_area)/2 -1 ; + } - ofs_lb.x = coords->x1 + radius + aa; - ofs_lb.y = coords->y2 - radius - aa; + first_px = 0; + if(disp_area->x1 >= a.x1) { + first_px = disp_area->x1 - a.x1; + a.x1 += first_px; + } - ofs_lt.x = coords->x1 + radius + aa; - ofs_lt.y = coords->y1 + radius + aa; - bool line_ready; - for(line = 0; line <= radius + swidth; line++) { /*Check all rows and make the 1D blur to 2D*/ - line_ready = false; - for(col = 0; col <= radius + swidth; col++) { /*Check all pixels in a 1D blur line (from the origo to last - shadow pixel (radius + swidth))*/ + sh_buf_tmp = sh_buf ; + for(y = 0; y < corner_size - ver_mid_dist + ver_mid_corr; y++) { + memcpy(mask_buf, sh_buf_tmp, corner_size); + mask_res = lv_draw_mask_apply(mask_buf + first_px, a.x1, a.y1, lv_area_get_width(&a)); + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask_res = LV_DRAW_MASK_RES_CHANGED; - /*Sum the opacities from the lines above and below this 'row'*/ - int16_t line_rel; - uint32_t px_opa_sum = 0; - for(line_rel = -swidth; line_rel <= swidth; line_rel++) { - /*Get the relative x position of the 'line_rel' to 'line'*/ - int16_t col_rel; - if(line + line_rel < 0) { /*Below the radius, here is the blur of the edge */ - col_rel = radius - curve_x[line] - col; - } else if(line + line_rel > radius) { /*Above the radius, here won't be more 1D blur*/ - break; - } else { /*Blur from the curve*/ - col_rel = curve_x[line + line_rel] - curve_x[line] - col; - } + lv_blend_fill(clip, &a, + style->body.shadow.color, mask_buf + first_px, mask_res, opa, style->body.shadow.blend_mode); + a.y1++; + a.y2++; + sh_buf_tmp += corner_size; + } - /*Add the value of the 1D blur on 'col_rel' position*/ - if(col_rel < -swidth) { /*Outside of the blurred area. */ - if(line_rel == -swidth) - line_ready = true; /*If no data even on the very first line then it wont't - be anything else in this line*/ - break; /*Break anyway because only smaller 'col_rel' values will come */ - } else if(col_rel > swidth) - px_opa_sum += line_1d_blur[0]; /*Inside the not blurred area*/ - else - px_opa_sum += line_1d_blur[swidth - col_rel]; /*On the 1D blur (+ swidth to align to the center)*/ - } + /*Draw the bottom left corner*/ + a.y1 = sh_area.y2; + a.y2 = a.y1; - line_2d_blur[col] = px_opa_sum >> SHADOW_OPA_EXTRA_PRECISION; - if(line_ready) { - col++; /*To make this line to the last one ( drawing will go to '< col')*/ - break; + sh_buf_tmp = sh_buf ; + + for(y = 0; y < corner_size - ver_mid_dist; y++) { + memcpy(mask_buf, sh_buf_tmp, corner_size); + mask_res = lv_draw_mask_apply(mask_buf + first_px, a.x1, a.y1, lv_area_get_width(&a)); + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask_res = LV_DRAW_MASK_RES_CHANGED; + + lv_blend_fill(clip, &a, + style->body.shadow.color, mask_buf + first_px, mask_res, opa, style->body.shadow.blend_mode); + a.y1--; + a.y2--; + sh_buf_tmp += corner_size; + } + + /*Fill the left side*/ + a.y1 = sh_area.y1+corner_size; + a.y2 = a.y1; + + sh_buf_tmp = sh_buf + corner_size * (corner_size - 1); + + if(simple_mode) { + /*Draw vertical lines*/ + lv_area_t va; + va.x1 = a.x1; + va.x2 = a.x1; + va.y1 = sh_area.y1 + corner_size; + va.y2 = sh_area.y2 - corner_size; + + if(va.y1 <= va.y2) { + for(x = a.x1; x < coords->x1; x++) { + lv_opa_t opa_tmp = sh_buf_tmp[x - a.x1 + first_px]; + if(opa_tmp != LV_OPA_COVER || opa != LV_OPA_COVER) opa_tmp = (opa * opa_tmp) >> 8; + lv_blend_fill(clip, &va, + style->body.shadow.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa_tmp, style->body.shadow.blend_mode); + va.x1++; + va.x2++; } } + } + else { + for(y = corner_size; y < lv_area_get_height(&sh_area) - corner_size; y++) { + memcpy(mask_buf, sh_buf_tmp, corner_size); + mask_res = lv_draw_mask_apply(mask_buf + first_px, a.x1, a.y1, lv_area_get_width(&a)); + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask_res = LV_DRAW_MASK_RES_CHANGED; - /*Flush the line*/ - point_rt.x = curve_x[line] + ofs_rt.x + 1; - point_rt.y = ofs_rt.y - line; + lv_blend_fill(clip, &a, + style->body.shadow.color, mask_buf + first_px, mask_res, opa, style->body.shadow.blend_mode); + a.y1++; + a.y2++; + } + } - point_rb.x = curve_x[line] + ofs_rb.x + 1; - point_rb.y = ofs_rb.y + line; + /*Fill the top side*/ - point_lt.x = ofs_lt.x - curve_x[line] - 1; - point_lt.y = ofs_lt.y - line; + a.x1 = sh_area.x1 + corner_size; + a.x2 = sh_area.x2 - corner_size; + a.y1 = sh_area.y1; + a.y2 = a.y1; - point_lb.x = ofs_lb.x - curve_x[line] - 1; - point_lb.y = ofs_lb.y + line; - uint16_t d; - for(d = 1; d < col; d++) { + first_px = 0; + if(disp_area->x1 > a.x1) { + first_px = disp_area->x1 - a.x1; + a.x1 += first_px; + } - if(point_lt.x < ofs_lt.x && point_lt.y < ofs_lt.y) { - lv_draw_px(point_lt.x, point_lt.y, mask, style->body.shadow.color, line_2d_blur[d]); - } + if(a.x1 <= a.x2) { - if(point_lb.x < ofs_lb.x && point_lb.y > ofs_lb.y) { - lv_draw_px(point_lb.x, point_lb.y, mask, style->body.shadow.color, line_2d_blur[d]); - } + sh_buf_tmp = sh_buf + corner_size - 1; - if(point_rt.x > ofs_rt.x && point_rt.y < ofs_rt.y) { - lv_draw_px(point_rt.x, point_rt.y, mask, style->body.shadow.color, line_2d_blur[d]); - } - - if(point_rb.x > ofs_rb.x && point_rb.y > ofs_rb.y) { - lv_draw_px(point_rb.x, point_rb.y, mask, style->body.shadow.color, line_2d_blur[d]); - } - - point_rb.x++; - point_lb.x--; - - point_rt.x++; - point_lt.x--; + y_max = corner_size - ver_mid_dist; + if(simple_mode) { + y_max = sw / 2 + 1; + if(y_max > corner_size - ver_mid_dist) y_max = corner_size - ver_mid_dist; } - /* Put the first line to the edges too. - * It is not correct because blur should be done below the corner too - * but is is simple, fast and gives a good enough result*/ - if(line == 0) lv_draw_shadow_full_straight(coords, mask, style, line_2d_blur); - } -} + for(y = 0; y < y_max; y++) { + if(simple_mode == false) { + memset(mask_buf, sh_buf_tmp[0], lv_area_get_width(&a)); + mask_res = lv_draw_mask_apply(mask_buf, a.x1, a.y1, lv_area_get_width(&a)); + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask_res = LV_DRAW_MASK_RES_CHANGED; -static void lv_draw_shadow_bottom(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - lv_opa_t opa_scale) -{ - bool aa = lv_disp_get_antialiasing(lv_refr_get_disp_refreshing()); - lv_coord_t radius = style->body.radius; - lv_coord_t swidth = style->body.shadow.width; - lv_coord_t width = lv_area_get_width(coords); - lv_coord_t height = lv_area_get_height(coords); - - radius = lv_draw_cont_radius_corr(radius, width, height); - radius += aa * SHADOW_BOTTOM_AA_EXTRA_RADIUS; - swidth += aa; - - uint32_t curve_x_size = ((radius + 1) + 3) & ~0x3; /*Round to 4*/ - curve_x_size *= sizeof(lv_coord_t); - lv_opa_t line_1d_blur_size = (swidth + 3) & ~0x3; /*Round to 4*/ - line_1d_blur_size *= sizeof(lv_opa_t); - - uint8_t * draw_buf = lv_draw_get_buf(curve_x_size + line_1d_blur_size); - - /*Divide the draw buffer*/ - lv_coord_t * curve_x = (lv_coord_t *)&draw_buf[0]; /*Stores the 'x' coordinates of a quarter circle.*/ - lv_opa_t * line_1d_blur = (lv_opa_t *)&draw_buf[curve_x_size]; - - lv_point_t circ; - lv_coord_t circ_tmp; - lv_circ_init(&circ, &circ_tmp, radius); - while(lv_circ_cont(&circ)) { - curve_x[LV_CIRC_OCT1_Y(circ)] = LV_CIRC_OCT1_X(circ); - curve_x[LV_CIRC_OCT2_Y(circ)] = LV_CIRC_OCT2_X(circ); - lv_circ_next(&circ, &circ_tmp); - } - - int16_t col; - - lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->body.opa : (uint16_t)((uint16_t)style->body.opa * opa_scale) >> 8; - for(col = 0; col < swidth; col++) { - line_1d_blur[col] = (uint32_t)((uint32_t)(swidth - col) * opa / 2) / (swidth); - } - - lv_point_t point_l; - lv_point_t point_r; - lv_area_t area_mid; - lv_point_t ofs_l; - lv_point_t ofs_r; - - ofs_l.x = coords->x1 + radius; - ofs_l.y = coords->y2 - radius + 1 - aa; - - ofs_r.x = coords->x2 - radius; - ofs_r.y = coords->y2 - radius + 1 - aa; - - for(col = 0; col <= radius; col++) { - point_l.x = ofs_l.x - col; - point_l.y = ofs_l.y + curve_x[col]; - - point_r.x = ofs_r.x + col; - point_r.y = ofs_r.y + curve_x[col]; - - lv_opa_t px_opa; - int16_t diff = col == 0 ? 0 : curve_x[col - 1] - curve_x[col]; - uint16_t d; - for(d = 0; d < swidth; d++) { - /*When stepping a pixel in y calculate the average with the pixel from the prev. column - * to make a blur */ - if(diff == 0) { - px_opa = line_1d_blur[d]; + lv_blend_fill(clip, &a, + style->body.shadow.color, mask_buf, mask_res, opa, style->body.shadow.blend_mode); } else { - px_opa = (uint16_t)((uint16_t)line_1d_blur[d] + line_1d_blur[d - diff]) >> 1; - } - lv_draw_px(point_l.x, point_l.y, mask, style->body.shadow.color, px_opa); - point_l.y++; - /*Don't overdraw the pixel on the middle*/ - if(point_r.x > ofs_l.x) { - lv_draw_px(point_r.x, point_r.y, mask, style->body.shadow.color, px_opa); + lv_opa_t opa_tmp = sh_buf_tmp[0]; + if(opa_tmp != LV_OPA_COVER || opa != LV_OPA_COVER) opa_tmp = (opa * opa_tmp) >> 8; + lv_blend_fill(clip, &a, + style->body.shadow.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa_tmp, style->body.shadow.blend_mode); } - point_r.y++; + + a.y1++; + a.y2++; + sh_buf_tmp += corner_size; + } + + /*Fill the bottom side*/ + lv_coord_t y_min = simple_mode ? (corner_size - (sh_area.y2 - coords->y2)) : ver_mid_dist; + if(y_min < 0) y_min = 0; + sh_buf_tmp = sh_buf + corner_size * (corner_size - y_min - 1 ) + corner_size - 1; + + a.y1 = sh_area.y2 - corner_size + 1 + y_min; + a.y2 = a.y1; + + for(y = y_min; y < corner_size; y++) { + if(simple_mode == false) { + memset(mask_buf, sh_buf_tmp[0], lv_area_get_width(&a)); + mask_res = lv_draw_mask_apply(mask_buf, a.x1, a.y1, lv_area_get_width(&a)); + if(mask_res == LV_DRAW_MASK_RES_FULL_COVER) mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_blend_fill(clip, &a, + style->body.shadow.color, mask_buf, mask_res, opa, style->body.shadow.blend_mode); + } else { + lv_opa_t opa_tmp = sh_buf_tmp[0]; + if(opa_tmp != LV_OPA_COVER || opa != LV_OPA_COVER) opa_tmp = (opa * opa_tmp) >> 8; + lv_blend_fill(clip, &a, + style->body.shadow.color, NULL, LV_DRAW_MASK_RES_FULL_COVER, opa_tmp, style->body.shadow.blend_mode); + } + + a.y1++; + a.y2++; + sh_buf_tmp -= corner_size; } } - area_mid.x1 = ofs_l.x + 1; - area_mid.y1 = ofs_l.y + radius; - area_mid.x2 = ofs_r.x - 1; - area_mid.y2 = area_mid.y1; + /*Finally fill the middle area*/ + if(simple_mode == false) { + a.y1 = sh_area.y1 + corner_size; + a.y2 = a.y1; + if(a.x1 <= a.x2) { + for(y = 0; y < lv_area_get_height(&sh_area) - corner_size * 2; y++) { + memset(mask_buf, 0xFF, lv_area_get_width(&a)); + mask_res = lv_draw_mask_apply(mask_buf, a.x1, a.y1, lv_area_get_width(&a)); + lv_blend_fill(clip, &a, + style->body.shadow.color, mask_buf, mask_res, opa, style->body.shadow.blend_mode); - uint16_t d; - for(d = 0; d < swidth; d++) { - lv_draw_fill(&area_mid, mask, style->body.shadow.color, line_1d_blur[d]); - area_mid.y1++; - area_mid.y2++; + a.y1++; + a.y2++; + } + } } + + lv_draw_mask_remove_id(mask_rout_id); + lv_mem_buf_release(mask_buf); + lv_mem_buf_release(sh_buf); } -static void lv_draw_shadow_full_straight(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, - const lv_opa_t * map) +static void shadow_draw_corner_buf(const lv_area_t * coords, lv_opa_t * sh_buf, lv_coord_t sw, lv_coord_t r) { - bool aa = lv_disp_get_antialiasing(lv_refr_get_disp_refreshing()); - lv_coord_t radius = style->body.radius; - lv_coord_t swidth = style->body.shadow.width; - lv_coord_t width = lv_area_get_width(coords); - lv_coord_t height = lv_area_get_height(coords); + lv_coord_t sw_ori = sw; + lv_coord_t size = sw_ori + r; - radius = lv_draw_cont_radius_corr(radius, width, height); - radius += aa; + lv_area_t sh_area; + lv_area_copy(&sh_area, coords); + sh_area.x2 = sw / 2 + r -1 - (sw & 1 ? 0 : 1); + sh_area.y1 = sw / 2 + 1; - lv_area_t right_area; - right_area.x1 = coords->x2 + 1 - aa; - right_area.y1 = coords->y1 + radius + aa; - right_area.x2 = right_area.x1; - right_area.y2 = coords->y2 - radius - aa; + sh_area.x1 = sh_area.x2 - lv_area_get_width(coords); + sh_area.y2 = sh_area.y1 + lv_area_get_height(coords); - lv_area_t left_area; - left_area.x1 = coords->x1 - 1 + aa; - left_area.y1 = coords->y1 + radius + aa; - left_area.x2 = left_area.x1; - left_area.y2 = coords->y2 - radius - aa; - - lv_area_t top_area; - top_area.x1 = coords->x1 + radius + aa; - top_area.y1 = coords->y1 - 1 + aa; - top_area.x2 = coords->x2 - radius - aa; - top_area.y2 = top_area.y1; - - lv_area_t bottom_area; - bottom_area.x1 = coords->x1 + radius + aa; - bottom_area.y1 = coords->y2 + 1 - aa; - bottom_area.x2 = coords->x2 - radius - aa; - bottom_area.y2 = bottom_area.y1; - - lv_opa_t opa_act; - int16_t d; - for(d = 1 /*+ LV_ANTIALIAS*/; d <= swidth /* - LV_ANTIALIAS*/; d++) { - opa_act = map[d]; - - lv_draw_fill(&right_area, mask, style->body.shadow.color, opa_act); - right_area.x1++; - right_area.x2++; - - lv_draw_fill(&left_area, mask, style->body.shadow.color, opa_act); - left_area.x1--; - left_area.x2--; - - lv_draw_fill(&top_area, mask, style->body.shadow.color, opa_act); - top_area.y1--; - top_area.y2--; - - lv_draw_fill(&bottom_area, mask, style->body.shadow.color, opa_act); - bottom_area.y1++; - bottom_area.y2++; - } -} + lv_draw_mask_radius_param_t mask_param; + lv_draw_mask_radius_init(&mask_param, &sh_area, r, false); +#if SHADOW_ENHANCE + /*Set half shadow width width because blur will be repeated*/ + if(sw_ori == 1) sw = 1; + else if(sw_ori == 2) sw = 2; + else if(sw_ori == 3) sw = 2; + else sw = sw_ori >> 1; #endif -static uint16_t lv_draw_cont_radius_corr(uint16_t r, lv_coord_t w, lv_coord_t h) + lv_draw_mask_res_t mask_res; + lv_coord_t y; + lv_opa_t * mask_line = lv_mem_buf_get(size); + uint16_t * sh_ups_buf = lv_mem_buf_get(size * size * sizeof(uint16_t)); + uint16_t * sh_ups_tmp_buf = sh_ups_buf; + for(y = 0; y < size; y++) { + memset(mask_line, 0xFF, size); + mask_res = mask_param.dsc.cb(mask_line, 0, y, size, &mask_param); + if(mask_res == LV_DRAW_MASK_RES_FULL_TRANSP) { + memset(sh_ups_tmp_buf, 0x00, size * sizeof(sh_ups_buf[0])); + } else { + lv_coord_t i; + sh_ups_tmp_buf[0] = (mask_line[0] << SHADOW_UPSACALE_SHIFT) / sw; + for(i = 1; i < size; i++) { + if(mask_line[i] == mask_line[i-1]) sh_ups_tmp_buf[i] = sh_ups_tmp_buf[i-1]; + else sh_ups_tmp_buf[i] = (mask_line[i] << SHADOW_UPSACALE_SHIFT) / sw; + } + } + + sh_ups_tmp_buf += size; + } + lv_mem_buf_release(mask_line); + + // uint32_t k; + // for(k = 0; k < size * size; k++) { + // sh_buf[k] = (sh_ups_buf[k] * sw) >> SHADOW_UPSACALE_SHIFT ; + // } + // return; + + if(sw == 1) { + lv_coord_t i; + for(i = 0; i < size * size; i++) { + sh_buf[i] = (sh_ups_buf[i] >> SHADOW_UPSACALE_SHIFT); + } + lv_mem_buf_release(sh_ups_buf); + return; + } + + shadow_blur_corner(size, sw, sh_buf, sh_ups_buf); + +#if SHADOW_ENHANCE + sw = sw_ori - sw; + if(sw <= 1) { + lv_mem_buf_release(sh_ups_buf); + return; + } + + uint32_t i; + sh_ups_buf[0] = (sh_buf[0] << SHADOW_UPSACALE_SHIFT) / sw; + for(i = 1; i < (uint32_t) size * size; i++) { + if(sh_buf[i] == sh_buf[i-1]) sh_ups_buf[i] = sh_ups_buf[i-1]; + else sh_ups_buf[i] = (sh_buf[i] << SHADOW_UPSACALE_SHIFT) / sw; + } + + shadow_blur_corner(size, sw, sh_buf, sh_ups_buf); +#endif + + lv_mem_buf_release(sh_ups_buf); + +} + +static void shadow_blur_corner(lv_coord_t size, lv_coord_t sw, lv_opa_t * res_buf, uint16_t * sh_ups_buf) { - bool aa = lv_disp_get_antialiasing(lv_refr_get_disp_refreshing()); + lv_coord_t s_left = sw >> 1; + lv_coord_t s_right = (sw >> 1); + if((sw & 1) == 0) s_left--; - if(r >= (w >> 1)) { - r = (w >> 1); - if(r != 0) r--; - } - if(r >= (h >> 1)) { - r = (h >> 1); - if(r != 0) r--; + /*Horizontal blur*/ + uint16_t * sh_ups_hor_buf = lv_mem_buf_get(size * size * sizeof(uint16_t)); + uint16_t * sh_ups_hor_buf_tmp; + + lv_coord_t x; + lv_coord_t y; + + uint16_t * sh_ups_tmp_buf = sh_ups_buf; + sh_ups_hor_buf_tmp = sh_ups_hor_buf; + + for(y = 0; y < size; y++) { + int32_t v = sh_ups_tmp_buf[size-1] * sw; + for(x = size - 1; x >=0; x--) { + sh_ups_hor_buf_tmp[x] = v; + + /*Forget the right pixel*/ + uint32_t right_val = 0; + if(x + s_right < size) right_val = sh_ups_tmp_buf[x + s_right]; + v -= right_val; + + /*Add the left pixel*/ + uint32_t left_val; + if(x - s_left - 1 < 0) left_val = sh_ups_tmp_buf[0]; + else left_val = sh_ups_tmp_buf[x - s_left - 1]; + v += left_val; + + } + sh_ups_tmp_buf += size; + sh_ups_hor_buf_tmp += size; } - if(r > 0) r -= aa; + /*Vertical blur*/ + uint32_t i; + sh_ups_hor_buf[0] = sh_ups_hor_buf[0] / sw; + for(i = 1; i < (uint32_t)size * size; i++) { + if(sh_ups_hor_buf[i] == sh_ups_hor_buf[i-1]) sh_ups_hor_buf[i] = sh_ups_hor_buf[i-1]; + else sh_ups_hor_buf[i] = sh_ups_hor_buf[i] / sw; + } - return r; + + + for(x = 0; x < size; x++) { + sh_ups_hor_buf_tmp = &sh_ups_hor_buf[x]; + lv_opa_t * sh_buf_tmp = &res_buf[x]; + int32_t v = sh_ups_hor_buf_tmp[0] * sw; + for(y = 0; y < size ; y++, sh_ups_hor_buf_tmp += size, sh_buf_tmp += size) { + sh_buf_tmp[0] = v < 0 ? 0 : (v >> SHADOW_UPSACALE_SHIFT); + + /*Forget the top pixel*/ + uint32_t top_val; + if(y - s_right <= 0) top_val = sh_ups_hor_buf_tmp[0]; + else top_val = sh_ups_hor_buf[(y - s_right) * size + x]; + v -= top_val; + + /*Add the bottom pixel*/ + uint32_t bottom_val; + if(y + s_left + 1 < size) bottom_val = sh_ups_hor_buf[(y + s_left + 1) * size + x]; + else bottom_val = sh_ups_hor_buf[(size - 1) * size + x]; + v += bottom_val; + } + } + + lv_mem_buf_release(sh_ups_hor_buf); } -#if LV_ANTIALIAS - -/** - * Approximate the opacity for anti-aliasing. - * Used the first segment of a circle which is the longest and have the most non-linearity (cos) - * @param seg length of the line segment - * @param px_id index of pixel on the line segment - * @param line_opa opacity of the lien (it will be the max opacity) - * @return the desired opacity of the pixel - */ -static lv_opa_t antialias_get_opa_circ(lv_coord_t seg, lv_coord_t px_id, lv_opa_t opa) -{ - /*Empirical non-linear values anti-aliasing values*/ - static const lv_opa_t opa_map2[2] = {210, 80}; - static const lv_opa_t opa_map3[3] = {230, 150, 60}; - static const lv_opa_t opa_map4[4] = {235, 185, 125, 50}; - static const lv_opa_t opa_map8[8] = {250, 242, 219, 191, 158, 117, 76, 40}; - -#if CIRCLE_AA_NON_LINEAR_OPA_THRESHOLD < 1 - if(seg == 1) return 170; -#endif - -#if CIRCLE_AA_NON_LINEAR_OPA_THRESHOLD < 2 - if(seg == 2) return (opa_map2[px_id] * opa) >> 8; -#endif - -#if CIRCLE_AA_NON_LINEAR_OPA_THRESHOLD < 3 - if(seg == 3) return (opa_map3[px_id] * opa) >> 8; -#endif - -#if CIRCLE_AA_NON_LINEAR_OPA_THRESHOLD < 4 - if(seg == 4) return (opa_map4[px_id] * opa) >> 8; -#endif - - uint8_t id = (uint32_t)((uint32_t)px_id * (sizeof(opa_map8) - 1)) / (seg - 1); - return (uint32_t)((uint32_t)opa_map8[id] * opa) >> 8; -} - -#endif diff --git a/src/lv_draw/lv_draw_rect.h b/src/lv_draw/lv_draw_rect.h index 852b72912..e3007addf 100644 --- a/src/lv_draw/lv_draw_rect.h +++ b/src/lv_draw/lv_draw_rect.h @@ -36,6 +36,15 @@ extern "C" { */ void lv_draw_rect(const lv_area_t * coords, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa_scale); +/** + * Draw a pixel + * @param point the coordinates of the point to draw + * @param mask the pixel will be drawn only in this mask + * @param style pointer to a style + * @param opa_scale scale down the opacity by the factor + */ +void lv_draw_px(const lv_point_t * point, const lv_area_t * clip_area, const lv_style_t * style, lv_opa_t opa_scale); + /********************** * MACROS **********************/ diff --git a/src/lv_draw/lv_draw_triangle.c b/src/lv_draw/lv_draw_triangle.c index e06af2b18..0d9b91bf4 100644 --- a/src/lv_draw/lv_draw_triangle.c +++ b/src/lv_draw/lv_draw_triangle.c @@ -8,6 +8,7 @@ *********************/ #include "lv_draw_triangle.h" #include "../lv_misc/lv_math.h" +#include "../lv_misc/lv_mem.h" /********************* * DEFINES @@ -20,9 +21,6 @@ /********************** * STATIC PROTOTYPES **********************/ -void tri_draw_flat(const lv_point_t * points, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa); -void tri_draw_tall(const lv_point_t * points, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa); -static void point_swap(lv_point_t * p1, lv_point_t * p2); /********************** * STATIC VARIABLES @@ -39,306 +37,131 @@ static void point_swap(lv_point_t * p1, lv_point_t * p2); /** * * @param points pointer to an array with 3 points - * @param mask the triangle will be drawn only in this mask + * @param clip_area the triangle will be drawn only in this area * @param style style for of the triangle * @param opa_scale scale down all opacities by the factor (0..255) */ -void lv_draw_triangle(const lv_point_t * points, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa_scale) +void lv_draw_triangle(const lv_point_t * points, const lv_area_t * clip_area, const lv_style_t * style, lv_opa_t opa_scale) { - - /*Return is the triangle is degenerated*/ - if(points[0].x == points[1].x && points[0].y == points[1].y) return; - if(points[1].x == points[2].x && points[1].y == points[2].y) return; - if(points[0].x == points[2].x && points[0].y == points[2].y) return; - - if(points[0].x == points[1].x && points[1].x == points[2].x) return; - if(points[0].y == points[1].y && points[1].y == points[2].y) return; - - lv_opa_t opa = opa_scale == LV_OPA_COVER ? style->body.opa : (uint16_t)((uint16_t)style->body.opa * opa_scale) >> 8; - - /*Is the triangle flat or tall?*/ - lv_coord_t x_min = LV_MATH_MIN(LV_MATH_MIN(points[0].x, points[1].x), points[2].x); - lv_coord_t x_max = LV_MATH_MAX(LV_MATH_MAX(points[0].x, points[1].x), points[2].x); - lv_coord_t y_min = LV_MATH_MIN(LV_MATH_MIN(points[0].y, points[1].y), points[2].y); - lv_coord_t y_max = LV_MATH_MAX(LV_MATH_MAX(points[0].y, points[1].y), points[2].y); - - /* Draw the tall rectangles from vertical lines - * and from the flat triangles from horizontal lines - * to minimize the number of lines. - * Some pixels are overdrawn on the common edges of the triangles - * so use it only if the triangle has no opacity*/ - - /* Draw from horizontal lines*/ - if(x_max - x_min < y_max - y_min) { - tri_draw_tall(points, mask, style, opa); - } - /*Else flat so draw from vertical lines*/ - else { - tri_draw_flat(points, mask, style, opa); - } + lv_draw_polygon(points, 3, clip_area, style, opa_scale); } /** - * Draw a polygon from triangles. Only convex polygons are supported + * Draw a polygon. Only convex polygons are supported * @param points an array of points * @param point_cnt number of points - * @param mask polygon will be drawn only in this mask + * @param clip_area polygon will be drawn only in this area * @param style style of the polygon * @param opa_scale scale down all opacities by the factor (0..255) */ -void lv_draw_polygon(const lv_point_t * points, uint32_t point_cnt, const lv_area_t * mask, const lv_style_t * style, +void lv_draw_polygon(const lv_point_t * points, uint16_t point_cnt, const lv_area_t * clip_area, const lv_style_t * style, lv_opa_t opa_scale) { if(point_cnt < 3) return; if(points == NULL) return; - uint32_t i; - lv_point_t tri[3]; - tri[0].x = points[0].x; - tri[0].y = points[0].y; - for(i = 0; i < point_cnt - 1; i++) { - tri[1].x = points[i].x; - tri[1].y = points[i].y; - tri[2].x = points[i + 1].x; - tri[2].y = points[i + 1].y; - lv_draw_triangle(tri, mask, style, opa_scale); + int16_t i; + lv_area_t poly_mask = {.x1 = LV_COORD_MAX, .y1 = LV_COORD_MAX, .x2 = LV_COORD_MIN, .y2 = LV_COORD_MIN}; + + for(i = 0; i < point_cnt; i++) { + poly_mask.x1 = LV_MATH_MIN(poly_mask.x1, points[i].x); + poly_mask.y1 = LV_MATH_MIN(poly_mask.y1, points[i].y); + poly_mask.x2 = LV_MATH_MAX(poly_mask.x2, points[i].x); + poly_mask.y2 = LV_MATH_MAX(poly_mask.y2, points[i].y); } + + + bool is_common; + is_common = lv_area_intersect(&poly_mask, &poly_mask, clip_area); + if(!is_common) return; + + /*Find the lowest point*/ + lv_coord_t y_min = points[0].y; + int16_t y_min_i = 0; + + for(i = 1; i < point_cnt; i++) { + if(points[i].y < y_min) { + y_min = points[i].y; + y_min_i = i; + } + } + + lv_draw_mask_line_param_t * mp = lv_mem_buf_get(sizeof(lv_draw_mask_line_param_t) * point_cnt); + lv_draw_mask_line_param_t * mp_next = mp; + + int32_t i_prev_left = y_min_i; + int32_t i_prev_right = y_min_i; + int32_t i_next_left; + int32_t i_next_right; + uint32_t mask_cnt = 0; + + /* Check if the order of points is inverted or not. + * The normal case is when the left point is on `y_min_i - 1`*/ + i_next_left = y_min_i - 1; + if(i_next_left < 0) i_next_left = point_cnt + i_next_left; + + i_next_right = y_min_i + 1; + if(i_next_right > point_cnt - 1) i_next_right = 0; + + bool inv = false; + if(points[i_next_left].x > points[i_next_right].x && points[i_next_left].y < points[i_next_right].y) inv = true; + + do { + if(!inv) { + i_next_left = i_prev_left - 1; + if(i_next_left < 0) i_next_left = point_cnt + i_next_left; + + i_next_right = i_prev_right + 1; + if(i_next_right > point_cnt - 1) i_next_right = 0; + } else { + i_next_left = i_prev_left + 1; + if(i_next_left > point_cnt - 1) i_next_left = 0; + + i_next_right = i_prev_right - 1; + if(i_next_right < 0) i_next_right = point_cnt + i_next_right; + } + + if(points[i_next_left].y >= points[i_prev_left].y) { + if(points[i_next_left].y != points[i_prev_left].y && + points[i_next_left].x != points[i_prev_left].x) { + lv_draw_mask_line_points_init(mp_next, points[i_prev_left].x, points[i_prev_left].y, + points[i_next_left].x, points[i_next_left].y, + LV_DRAW_MASK_LINE_SIDE_RIGHT); + lv_draw_mask_add(mp_next, mp); + mp_next++; + } + mask_cnt++; + i_prev_left = i_next_left; + } + + if(mask_cnt == point_cnt) break; + + if(points[i_next_right].y >= points[i_prev_right].y) { + if(points[i_next_right].y != points[i_prev_right].y && + points[i_next_right].x != points[i_prev_right].x) { + + lv_draw_mask_line_points_init(mp_next, points[i_prev_right].x, points[i_prev_right].y, + points[i_next_right].x, points[i_next_right].y, + LV_DRAW_MASK_LINE_SIDE_LEFT); + lv_draw_mask_add(mp_next, mp); + mp_next++; + } + mask_cnt++; + i_prev_right = i_next_right; + } + + }while( mask_cnt < point_cnt); + + + + lv_draw_rect(&poly_mask, &poly_mask, style, opa_scale); + + lv_draw_mask_remove_custom(mp); + + lv_mem_buf_release(mp); + } /********************** * STATIC FUNCTIONS **********************/ - -void tri_draw_flat(const lv_point_t * points, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa) -{ - /*Return if the points are out of the mask*/ - if(points[0].x < mask->x1 && points[1].x < mask->x1 && points[2].x < mask->x1) { - return; - } - - if(points[0].x > mask->x2 && points[1].x > mask->x2 && points[2].x > mask->x2) { - return; - } - - if(points[0].y < mask->y1 && points[1].y < mask->y1 && points[2].y < mask->y1) { - return; - } - - if(points[0].y > mask->y2 && points[1].y > mask->y2 && points[2].y > mask->y2) { - return; - } - - lv_point_t tri[3]; - - memcpy(tri, points, sizeof(tri)); - - /*Sort the vertices according to their y coordinate (0: y max, 1: y mid, 2:y min)*/ - if(tri[1].y < tri[0].y) point_swap(&tri[1], &tri[0]); - if(tri[2].y < tri[1].y) point_swap(&tri[2], &tri[1]); - if(tri[1].y < tri[0].y) point_swap(&tri[1], &tri[0]); - - /*Draw the triangle*/ - lv_point_t edge1; - lv_coord_t dx1 = LV_MATH_ABS(tri[0].x - tri[1].x); - lv_coord_t sx1 = tri[0].x < tri[1].x ? 1 : -1; - lv_coord_t dy1 = LV_MATH_ABS(tri[0].y - tri[1].y); - lv_coord_t sy1 = tri[0].y < tri[1].y ? 1 : -1; - lv_coord_t err1 = (dx1 > dy1 ? dx1 : -dy1) / 2; - lv_coord_t err_tmp1; - - lv_point_t edge2; - lv_coord_t dx2 = LV_MATH_ABS(tri[0].x - tri[2].x); - lv_coord_t sx2 = tri[0].x < tri[2].x ? 1 : -1; - lv_coord_t dy2 = LV_MATH_ABS(tri[0].y - tri[2].y); - lv_coord_t sy2 = tri[0].y < tri[2].y ? 1 : -1; - lv_coord_t err2 = (dx1 > dy2 ? dx2 : -dy2) / 2; - lv_coord_t err_tmp2; - - lv_coord_t y1_tmp; - lv_coord_t y2_tmp; - - edge1.x = tri[0].x; - edge1.y = tri[0].y; - edge2.x = tri[0].x; - edge2.y = tri[0].y; - lv_area_t act_area; - lv_area_t draw_area; - - while(1) { - act_area.x1 = edge1.x; - act_area.x2 = edge2.x; - act_area.y1 = edge1.y; - act_area.y2 = edge2.y; - - /* Get the area of a line. - * Adjust it a little bit to perfectly match (no redrawn pixels) with the adjacent triangles*/ - draw_area.x1 = LV_MATH_MIN(act_area.x1, act_area.x2) + 1; - draw_area.x2 = LV_MATH_MAX(act_area.x1, act_area.x2); - draw_area.y1 = LV_MATH_MIN(act_area.y1, act_area.y2) - 1; - draw_area.y2 = LV_MATH_MAX(act_area.y1, act_area.y2) - 1; - - lv_draw_fill(&draw_area, mask, style->body.main_color, opa); - - /*Calc. the next point of edge1*/ - y1_tmp = edge1.y; - do { - if(edge1.x == tri[1].x && edge1.y == tri[1].y) { - - dx1 = LV_MATH_ABS(tri[1].x - tri[2].x); - sx1 = tri[1].x < tri[2].x ? 1 : -1; - dy1 = LV_MATH_ABS(tri[1].y - tri[2].y); - sy1 = tri[1].y < tri[2].y ? 1 : -1; - err1 = (dx1 > dy1 ? dx1 : -dy1) / 2; - } else if(edge1.x == tri[2].x && edge1.y == tri[2].y) { - return; - } - err_tmp1 = err1; - if(err_tmp1 > -dx1) { - err1 -= dy1; - edge1.x += sx1; - } - if(err_tmp1 < dy1) { - err1 += dx1; - edge1.y += sy1; - } - } while(edge1.y == y1_tmp); - - /*Calc. the next point of edge2*/ - y2_tmp = edge2.y; - do { - if(edge2.x == tri[2].x && edge2.y == tri[2].y) return; - err_tmp2 = err2; - if(err_tmp2 > -dx2) { - err2 -= dy2; - edge2.x += sx2; - } - if(err_tmp2 < dy2) { - err2 += dx2; - edge2.y += sy2; - } - } while(edge2.y == y2_tmp); - } -} - -void tri_draw_tall(const lv_point_t * points, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa) -{ - /* - * Better to draw from vertical lines - * |\ - * | | - * | | - * | \ - * | | - * |___| - */ - - lv_point_t tri[3]; - - memcpy(tri, points, sizeof(tri)); - - /*Sort the vertices according to their x coordinate (0: x max, 1: x mid, 2:x min)*/ - if(tri[1].x < tri[0].x) point_swap(&tri[1], &tri[0]); - if(tri[2].x < tri[1].x) point_swap(&tri[2], &tri[1]); - if(tri[1].x < tri[0].x) point_swap(&tri[1], &tri[0]); - - /*Draw the triangle*/ - lv_point_t edge1; - lv_coord_t dx1 = LV_MATH_ABS(tri[0].x - tri[1].x); - lv_coord_t sx1 = tri[0].x < tri[1].x ? 1 : -1; - lv_coord_t dy1 = LV_MATH_ABS(tri[0].y - tri[1].y); - lv_coord_t sy1 = tri[0].y < tri[1].y ? 1 : -1; - lv_coord_t err1 = (dx1 > dy1 ? dx1 : -dy1) / 2; - lv_coord_t err_tmp1; - - lv_point_t edge2; - lv_coord_t dx2 = LV_MATH_ABS(tri[0].x - tri[2].x); - lv_coord_t sx2 = tri[0].x < tri[2].x ? 1 : -1; - lv_coord_t dy2 = LV_MATH_ABS(tri[0].y - tri[2].y); - lv_coord_t sy2 = tri[0].y < tri[2].y ? 1 : -1; - lv_coord_t err2 = (dx1 > dy2 ? dx2 : -dy2) / 2; - lv_coord_t err_tmp2; - - lv_coord_t x1_tmp; - lv_coord_t x2_tmp; - - edge1.x = tri[0].x; - edge1.y = tri[0].y; - edge2.x = tri[0].x; - edge2.y = tri[0].y; - lv_area_t act_area; - lv_area_t draw_area; - - while(1) { - act_area.x1 = edge1.x; - act_area.x2 = edge2.x; - act_area.y1 = edge1.y; - act_area.y2 = edge2.y; - - draw_area.x1 = LV_MATH_MIN(act_area.x1, act_area.x2); - draw_area.x2 = LV_MATH_MAX(act_area.x1, act_area.x2); - draw_area.y1 = LV_MATH_MIN(act_area.y1, act_area.y2); - draw_area.y2 = LV_MATH_MAX(act_area.y1, act_area.y2) - 1; - - lv_draw_fill(&draw_area, mask, style->body.main_color, opa); - - /*Calc. the next point of edge1*/ - x1_tmp = edge1.x; - do { - if(edge1.y == tri[1].y && edge1.x == tri[1].x) { - - dx1 = LV_MATH_ABS(tri[1].x - tri[2].x); - sx1 = tri[1].x < tri[2].x ? 1 : -1; - dy1 = LV_MATH_ABS(tri[1].y - tri[2].y); - sy1 = tri[1].y < tri[2].y ? 1 : -1; - err1 = (dx1 > dy1 ? dx1 : -dy1) / 2; - } else if(edge1.y == tri[2].y && edge1.x == tri[2].x) { - return; - } - err_tmp1 = err1; - if(err_tmp1 > -dx1) { - err1 -= dy1; - edge1.x += sx1; - } - if(err_tmp1 < dy1) { - err1 += dx1; - edge1.y += sy1; - } - } while(edge1.x == x1_tmp); - - /*Calc. the next point of edge2*/ - x2_tmp = edge2.x; - do { - if(edge2.y == tri[2].y && edge2.x == tri[2].x) { - return; - } - - err_tmp2 = err2; - if(err_tmp2 > -dx2) { - err2 -= dy2; - edge2.x += sx2; - } - if(err_tmp2 < dy2) { - err2 += dx2; - edge2.y += sy2; - } - } while(edge2.x == x2_tmp); - } -} - -/** - * Swap two points - * p1 pointer to the first point - * p2 pointer to the second point - */ -static void point_swap(lv_point_t * p1, lv_point_t * p2) -{ - lv_point_t tmp; - tmp.x = p1->x; - tmp.y = p1->y; - - p1->x = p2->x; - p1->y = p2->y; - - p2->x = tmp.x; - p2->y = tmp.y; -} diff --git a/src/lv_draw/lv_draw_triangle.h b/src/lv_draw/lv_draw_triangle.h index b6b230d97..020ff0d75 100644 --- a/src/lv_draw/lv_draw_triangle.h +++ b/src/lv_draw/lv_draw_triangle.h @@ -27,24 +27,25 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ + /** - * + * Draw a triangle * @param points pointer to an array with 3 points - * @param mask the triangle will be drawn only in this mask + * @param clip_area the triangle will be drawn only in this area * @param style style for of the triangle * @param opa_scale scale down all opacities by the factor (0..255) */ -void lv_draw_triangle(const lv_point_t * points, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa_scale); +void lv_draw_triangle(const lv_point_t * points, const lv_area_t * clip, const lv_style_t * style, lv_opa_t opa_scale); /** - * Draw a polygon from triangles. Only convex polygons are supported + * Draw a polygon. Only convex polygons are supported. * @param points an array of points * @param point_cnt number of points - * @param mask polygon will be drawn only in this mask + * @param clip_area polygon will be drawn only in this area * @param style style of the polygon * @param opa_scale scale down all opacities by the factor (0..255) */ -void lv_draw_polygon(const lv_point_t * points, uint32_t point_cnt, const lv_area_t * mask, const lv_style_t * style, +void lv_draw_polygon(const lv_point_t * points, uint16_t point_cnt, const lv_area_t * mask, const lv_style_t * style, lv_opa_t opa_scale); /********************** diff --git a/src/lv_draw/lv_img_buf.c b/src/lv_draw/lv_img_buf.c new file mode 100644 index 000000000..a627398b2 --- /dev/null +++ b/src/lv_draw/lv_img_buf.c @@ -0,0 +1,606 @@ +/** + * @file lv_img_buf.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include +#include "lv_img_buf.h" +#include "lv_draw_img.h" +#include "../lv_misc/lv_math.h" +#include "../lv_misc/lv_log.h" +#include "../lv_misc/lv_mem.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static inline bool transform_anti_alias(lv_img_transform_dsc_t * dsc); + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + + +/** + * Get the color of an image's pixel + * @param dsc an image descriptor + * @param x x coordinate of the point to get + * @param y x coordinate of the point to get + * @param color the color of the image. In case of `LV_IMG_CF_ALPHA_1/2/4/8` this color is used. + * Not used in other cases. + * @param safe true: check out of bounds + * @return color of the point + */ +lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t color) +{ + lv_color_t p_color = LV_COLOR_BLACK; + uint8_t * buf_u8 = (uint8_t *)dsc->data; + + if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR || dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED || + dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf) >> 3; + uint32_t px = dsc->header.w * y * px_size + x * px_size; + memcpy(&p_color, &buf_u8[px], sizeof(lv_color_t)); +#if LV_COLOR_SIZE == 32 + p_color.ch.alpha = 0xFF; /*Only the color should be get so use a deafult alpha value*/ +#endif + } else if(dsc->header.cf == LV_IMG_CF_INDEXED_1BIT) { + buf_u8 += 4 * 2; + uint8_t bit = x & 0x7; + x = x >> 3; + + /* Get the current pixel. + * dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned + * so the possible real width are 8, 16, 24 ...*/ + uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; + p_color.full = (buf_u8[px] & (1 << (7 - bit))) >> (7 - bit); + } else if(dsc->header.cf == LV_IMG_CF_INDEXED_2BIT) { + buf_u8 += 4 * 4; + uint8_t bit = (x & 0x3) * 2; + x = x >> 2; + + /* Get the current pixel. + * dsc->header.w + 3 means rounding up to 4 because the lines are byte aligned + * so the possible real width are 4, 8, 12 ...*/ + uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; + p_color.full = (buf_u8[px] & (3 << (6 - bit))) >> (6 - bit); + } else if(dsc->header.cf == LV_IMG_CF_INDEXED_4BIT) { + buf_u8 += 4 * 16; + uint8_t bit = (x & 0x1) * 4; + x = x >> 1; + + /* Get the current pixel. + * dsc->header.w + 1 means rounding up to 2 because the lines are byte aligned + * so the possible real width are 2, 4, 6 ...*/ + uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; + p_color.full = (buf_u8[px] & (0xF << (4 - bit))) >> (4 - bit); + } else if(dsc->header.cf == LV_IMG_CF_INDEXED_8BIT) { + buf_u8 += 4 * 256; + uint32_t px = dsc->header.w * y + x; + p_color.full = buf_u8[px]; + } else if(dsc->header.cf == LV_IMG_CF_ALPHA_1BIT || dsc->header.cf == LV_IMG_CF_ALPHA_2BIT || + dsc->header.cf == LV_IMG_CF_ALPHA_4BIT || dsc->header.cf == LV_IMG_CF_ALPHA_8BIT) { + p_color = color; + } + return p_color; +} + +/** + * Get the alpha value of an image's pixel + * @param dsc pointer to an image descriptor + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param safe true: check out of bounds + * @return alpha value of the point + */ +lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y) +{ + uint8_t * buf_u8 = (uint8_t *)dsc->data; + + if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { + uint32_t px = dsc->header.w * y * LV_IMG_PX_SIZE_ALPHA_BYTE + x * LV_IMG_PX_SIZE_ALPHA_BYTE; + return buf_u8[px + LV_IMG_PX_SIZE_ALPHA_BYTE - 1]; + } else if(dsc->header.cf == LV_IMG_CF_ALPHA_1BIT) { + uint8_t bit = x & 0x7; + x = x >> 3; + + /* Get the current pixel. + * dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned + * so the possible real width are 8 ,16, 24 ...*/ + uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; + uint8_t px_opa = (buf_u8[px] & (1 << (7 - bit))) >> (7 - bit); + return px_opa ? LV_OPA_TRANSP : LV_OPA_COVER; + } else if(dsc->header.cf == LV_IMG_CF_ALPHA_2BIT) { + const uint8_t opa_table[4] = {0, 85, 170, 255}; /*Opacity mapping with bpp = 2*/ + + uint8_t bit = (x & 0x3) * 2; + x = x >> 2; + + /* Get the current pixel. + * dsc->header.w + 4 means rounding up to 8 because the lines are byte aligned + * so the possible real width are 4 ,8, 12 ...*/ + uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; + uint8_t px_opa = (buf_u8[px] & (3 << (6 - bit))) >> (6 - bit); + return opa_table[px_opa]; + } else if(dsc->header.cf == LV_IMG_CF_ALPHA_4BIT) { + const uint8_t opa_table[16] = {0, 17, 34, 51, /*Opacity mapping with bpp = 4*/ + 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255}; + + uint8_t bit = (x & 0x1) * 4; + x = x >> 1; + + /* Get the current pixel. + * dsc->header.w + 1 means rounding up to 8 because the lines are byte aligned + * so the possible real width are 2 ,4, 6 ...*/ + uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; + uint8_t px_opa = (buf_u8[px] & (0xF << (4 - bit))) >> (4 - bit); + return opa_table[px_opa]; + } else if(dsc->header.cf == LV_IMG_CF_ALPHA_8BIT) { + uint32_t px = dsc->header.w * y + x; + return buf_u8[px]; + } + + return LV_OPA_COVER; +} + +/** + * Set the alpha value of a pixel of an image. The color won't be affected + * @param dsc pointer to an image descriptor + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param opa the desired opacity + * @param safe true: check out of bounds + */ +void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa) +{ + uint8_t * buf_u8 = (uint8_t *)dsc->data; + + if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf) >> 3; + uint32_t px = dsc->header.w * y * px_size + x * px_size; + buf_u8[px + px_size - 1] = opa; + } else if(dsc->header.cf == LV_IMG_CF_ALPHA_1BIT) { + opa = opa >> 7; /*opa -> [0,1]*/ + uint8_t bit = x & 0x7; + x = x >> 3; + + /* Get the current pixel. + * dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned + * so the possible real width are 8 ,16, 24 ...*/ + uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; + buf_u8[px] = buf_u8[px] & ~(1 << (7 - bit)); + buf_u8[px] = buf_u8[px] | ((opa & 0x1) << (7 - bit)); + } else if(dsc->header.cf == LV_IMG_CF_ALPHA_2BIT) { + opa = opa >> 6; /*opa -> [0,3]*/ + uint8_t bit = (x & 0x3) * 2; + x = x >> 2; + + /* Get the current pixel. + * dsc->header.w + 4 means rounding up to 8 because the lines are byte aligned + * so the possible real width are 4 ,8, 12 ...*/ + uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; + buf_u8[px] = buf_u8[px] & ~(3 << (6 - bit)); + buf_u8[px] = buf_u8[px] | ((opa & 0x3) << (6 - bit)); + } else if(dsc->header.cf == LV_IMG_CF_ALPHA_4BIT) { + opa = opa >> 4; /*opa -> [0,15]*/ + uint8_t bit = (x & 0x1) * 4; + x = x >> 1; + + /* Get the current pixel. + * dsc->header.w + 1 means rounding up to 8 because the lines are byte aligned + * so the possible real width are 2 ,4, 6 ...*/ + uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; + buf_u8[px] = buf_u8[px] & ~(0xF << (4 - bit)); + buf_u8[px] = buf_u8[px] | ((opa & 0xF) << (4 - bit)); + } else if(dsc->header.cf == LV_IMG_CF_ALPHA_8BIT) { + uint32_t px = dsc->header.w * y + x; + buf_u8[px] = opa; + } +} + +/** + * Set the color of a pixel of an image. The alpha channel won't be affected. + * @param dsc pointer to an image descriptor + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param c color of the point + * @param safe true: check out of bounds + */ +void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c) +{ + uint8_t * buf_u8 = (uint8_t *)dsc->data; + + if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR || dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf) >> 3; + uint32_t px = dsc->header.w * y * px_size + x * px_size; + memcpy(&buf_u8[px], &c, px_size); + } else if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA) { + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf) >> 3; + uint32_t px = dsc->header.w * y * px_size + x * px_size; + memcpy(&buf_u8[px], &c, px_size - 1); /*-1 to not overwrite the alpha value*/ + } else if(dsc->header.cf == LV_IMG_CF_INDEXED_1BIT) { + buf_u8 += sizeof(lv_color32_t) * 2; /*Skip the palette*/ + + uint8_t bit = x & 0x7; + x = x >> 3; + + /* Get the current pixel. + * dsc->header.w + 7 means rounding up to 8 because the lines are byte aligned + * so the possible real width are 8 ,16, 24 ...*/ + uint32_t px = ((dsc->header.w + 7) >> 3) * y + x; + buf_u8[px] = buf_u8[px] & ~(1 << (7 - bit)); + buf_u8[px] = buf_u8[px] | ((c.full & 0x1) << (7 - bit)); + } else if(dsc->header.cf == LV_IMG_CF_INDEXED_2BIT) { + buf_u8 += sizeof(lv_color32_t) * 4; /*Skip the palette*/ + uint8_t bit = (x & 0x3) * 2; + x = x >> 2; + + /* Get the current pixel. + * dsc->header.w + 3 means rounding up to 4 because the lines are byte aligned + * so the possible real width are 4, 8 ,12 ...*/ + uint32_t px = ((dsc->header.w + 3) >> 2) * y + x; + + buf_u8[px] = buf_u8[px] & ~(3 << (6 - bit)); + buf_u8[px] = buf_u8[px] | ((c.full & 0x3) << (6 - bit)); + } else if(dsc->header.cf == LV_IMG_CF_INDEXED_4BIT) { + buf_u8 += sizeof(lv_color32_t) * 16; /*Skip the palette*/ + uint8_t bit = (x & 0x1) * 4; + x = x >> 1; + + /* Get the current pixel. + * dsc->header.w + 1 means rounding up to 2 because the lines are byte aligned + * so the possible real width are 2 ,4, 6 ...*/ + uint32_t px = ((dsc->header.w + 1) >> 1) * y + x; + buf_u8[px] = buf_u8[px] & ~(0xF << (4 - bit)); + buf_u8[px] = buf_u8[px] | ((c.full & 0xF) << (4 - bit)); + } else if(dsc->header.cf == LV_IMG_CF_INDEXED_8BIT) { + buf_u8 += sizeof(lv_color32_t) * 256; /*Skip the palette*/ + uint32_t px = dsc->header.w * y + x; + buf_u8[px] = c.full; + } +} + +/** + * Set the palette color of an indexed image. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` + * @param dsc pointer to an image descriptor + * @param id the palette color to set: + * - for `LV_IMG_CF_INDEXED1`: 0..1 + * - for `LV_IMG_CF_INDEXED2`: 0..3 + * - for `LV_IMG_CF_INDEXED4`: 0..15 + * - for `LV_IMG_CF_INDEXED8`: 0..255 + * @param c the color to set + */ +void lv_img_buf_set_palette(lv_img_dsc_t * dsc, uint8_t id, lv_color_t c) +{ + if((dsc->header.cf == LV_IMG_CF_ALPHA_1BIT && id > 1) || (dsc->header.cf == LV_IMG_CF_ALPHA_2BIT && id > 3) || + (dsc->header.cf == LV_IMG_CF_ALPHA_4BIT && id > 15) || (dsc->header.cf == LV_IMG_CF_ALPHA_8BIT)) { + LV_LOG_WARN("lv_img_buf_set_px_alpha: invalid 'id'"); + return; + } + + lv_color32_t c32; + c32.full = lv_color_to32(c); + uint8_t * buf = (uint8_t *)dsc->data; + memcpy(&buf[id * sizeof(c32)], &c32, sizeof(c32)); +} + +/** + * Allocate an image buffer in RAM + * @param w width of image + * @param h height of image + * @param cf a color format (`LV_IMG_CF_...`) + * @return an allocated image, or NULL on failure + */ +lv_img_dsc_t *lv_img_buf_alloc(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) +{ + /* Allocate image descriptor */ + lv_img_dsc_t *dsc = lv_mem_alloc(sizeof(lv_img_dsc_t)); + if(dsc == NULL) + return NULL; + + memset(dsc, 0, sizeof(lv_img_dsc_t)); + + /* Get image data size */ + dsc->data_size = lv_img_buf_get_img_size(w, h, cf); + if(dsc->data_size == 0) { + lv_mem_free(dsc); + return NULL; + } + + /* Allocate raw buffer */ + dsc->data = lv_mem_alloc(dsc->data_size); + if(dsc->data == NULL) { + lv_mem_free(dsc); + return NULL; + } + memset((uint8_t *)dsc->data, 0, dsc->data_size); + + /* Fill in header */ + dsc->header.always_zero = 0; + dsc->header.w = w; + dsc->header.h = h; + dsc->header.cf = cf; + return dsc; +} + +/** + * Free an allocated image buffer + * @param dsc image buffer to free + */ +void lv_img_buf_free(lv_img_dsc_t *dsc) +{ + if(dsc != NULL) { + if(dsc->data != NULL) + lv_mem_free(dsc->data); + + lv_mem_free(dsc); + } +} + +/** + * Get the memory consumption of a raw bitmap, given color format and dimensions. + * @param w width + * @param h height + * @param cf color format + * @return size in bytes + */ +uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) +{ + switch(cf) { + case LV_IMG_CF_TRUE_COLOR: return LV_IMG_BUF_SIZE_TRUE_COLOR(w, h); + case LV_IMG_CF_TRUE_COLOR_ALPHA: return LV_IMG_BUF_SIZE_TRUE_COLOR_ALPHA(w, h); + case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: return LV_IMG_BUF_SIZE_TRUE_COLOR_CHROMA_KEYED(w, h); + case LV_IMG_CF_ALPHA_1BIT: return LV_IMG_BUF_SIZE_ALPHA_1BIT(w, h); + case LV_IMG_CF_ALPHA_2BIT: return LV_IMG_BUF_SIZE_ALPHA_2BIT(w, h); + case LV_IMG_CF_ALPHA_4BIT: return LV_IMG_BUF_SIZE_ALPHA_4BIT(w, h); + case LV_IMG_CF_ALPHA_8BIT: return LV_IMG_BUF_SIZE_ALPHA_8BIT(w, h); + case LV_IMG_CF_INDEXED_1BIT: return LV_IMG_BUF_SIZE_INDEXED_1BIT(w, h); + case LV_IMG_CF_INDEXED_2BIT: return LV_IMG_BUF_SIZE_INDEXED_2BIT(w, h); + case LV_IMG_CF_INDEXED_4BIT: return LV_IMG_BUF_SIZE_INDEXED_4BIT(w, h); + case LV_IMG_CF_INDEXED_8BIT: return LV_IMG_BUF_SIZE_INDEXED_8BIT(w, h); + default: return 0; + } +} + +/** + * Initialize a descriptor to tranform an image + * @param dsc pointer to an `lv_img_transform_dsc_t` variable whose `cfg` field is initialized + */ +void lv_img_buf_transform_init(lv_img_transform_dsc_t * dsc) +{ + dsc->tmp.pivot_x_256 = dsc->cfg.pivot_x * 256; + dsc->tmp.pivot_y_256 = dsc->cfg.pivot_y * 256; + dsc->tmp.sinma = lv_trigo_sin(-dsc->cfg.angle); + dsc->tmp.cosma = lv_trigo_sin(-dsc->cfg.angle + 90); + + dsc->tmp.chroma_keyed = lv_img_cf_is_chroma_keyed(dsc->cfg.cf) ? 1 : 0; + dsc->tmp.has_alpha = lv_img_cf_has_alpha(dsc->cfg.cf) ? 1 : 0; + if(dsc->cfg.cf == LV_IMG_CF_TRUE_COLOR || dsc->cfg.cf == LV_IMG_CF_TRUE_COLOR_ALPHA || dsc->cfg.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { + dsc->tmp.native_color = 1; + } + + dsc->tmp.img_dsc.data = dsc->cfg.src; + dsc->tmp.img_dsc.header.always_zero = 0; + dsc->tmp.img_dsc.header.cf = dsc->cfg.cf; + dsc->tmp.img_dsc.header.w = dsc->cfg.src_w; + dsc->tmp.img_dsc.header.h = dsc->cfg.src_h; + + dsc->tmp.zoom_inv = (256 * 256) / dsc->cfg.zoom; + + dsc->res.opa = LV_OPA_COVER; + dsc->res.color = dsc->cfg.color; +} + +/** + * Get which color and opa would come to a pixel if it were rotated + * @param dsc a descriptor initialized by `lv_img_buf_rotate_init` + * @param x the coordinate which color and opa should be get + * @param y the coordinate which color and opa should be get + * @return true: there is valid pixel on these x/y coordinates; false: the rotated pixel was out of the image + * @note the result is written back to `dsc->res_color` and `dsc->res_opa` + */ +bool lv_img_buf_transform(lv_img_transform_dsc_t * dsc, lv_coord_t x, lv_coord_t y) +{ + const uint8_t * src_u8 = dsc->cfg.src; + + /*Get the target point relative coordinates to the pivot*/ + int32_t xt = x - dsc->cfg.pivot_x; + int32_t yt = y - dsc->cfg.pivot_y; + + int32_t xs; + int32_t ys; + if(dsc->cfg.zoom == LV_IMG_ZOOM_NONE) { + /*Get the source pixel from the upscaled image*/ + xs = ((dsc->tmp.cosma * xt - dsc->tmp.sinma * yt) >> (LV_TRIGO_SHIFT - 8)) + dsc->tmp.pivot_x_256; + ys = ((dsc->tmp.sinma * xt + dsc->tmp.cosma * yt) >> (LV_TRIGO_SHIFT - 8)) + dsc->tmp.pivot_y_256; + } else { + xt *= dsc->tmp.zoom_inv; + yt *= dsc->tmp.zoom_inv; + xs = ((dsc->tmp.cosma * xt - dsc->tmp.sinma * yt) >> (LV_TRIGO_SHIFT)) + dsc->tmp.pivot_x_256; + ys = ((dsc->tmp.sinma * xt + dsc->tmp.cosma * yt) >> (LV_TRIGO_SHIFT)) + dsc->tmp.pivot_y_256; + + } + + /*Get the integer part of the source pixel*/ + int xs_int = xs >> 8; + int ys_int = ys >> 8; + + if(xs_int >= dsc->cfg.src_w) return false; + else if(xs_int < 0) return false; + + if(ys_int >= dsc->cfg.src_h) return false; + else if(ys_int < 0) return false; + + /* If the fractional < 0x70 mix the source pixel with the left/top pixel + * If the fractional > 0x90 mix the source pixel with the right/bottom pixel + * In the 0x70..0x90 range use the unchanged source pixel */ + + uint8_t px_size; + uint32_t pxi; + if(dsc->tmp.native_color) { + if(dsc->tmp.has_alpha == 0) { + px_size = LV_COLOR_SIZE >> 3; + + pxi = dsc->cfg.src_w * ys_int * px_size + xs_int * px_size; + memcpy(&dsc->res.color, &src_u8[pxi], px_size); + } else { + px_size = LV_IMG_PX_SIZE_ALPHA_BYTE; + pxi = dsc->cfg.src_w * ys_int * px_size + xs_int * px_size; + memcpy(&dsc->res.color, &src_u8[pxi], px_size - 1); + dsc->res.opa = src_u8[pxi + px_size - 1]; + } + } else { + pxi = 0; /*unused*/ + px_size = 0; /*unused*/ + dsc->res.color = lv_img_buf_get_px_color(&dsc->tmp.img_dsc, xs_int, ys_int, dsc->cfg.color); + dsc->res.opa = lv_img_buf_get_px_alpha(&dsc->tmp.img_dsc, xs_int, ys_int); + } + + if(dsc->tmp.chroma_keyed) { + lv_color_t ct = LV_COLOR_TRANSP; + if(dsc->res.color.full == ct.full) return false; + } + + + if(dsc->cfg.antialias == false) return true; + + dsc->tmp.xs = xs; + dsc->tmp.ys = ys; + dsc->tmp.xs_int = xs_int; + dsc->tmp.ys_int = ys_int; + dsc->tmp.pxi = pxi; + dsc->tmp.px_size = px_size; + + bool ret; + + ret = transform_anti_alias(dsc); + + return ret; +} + +/********************** + * STATIC FUNCTIONS + **********************/ +static inline bool transform_anti_alias(lv_img_transform_dsc_t * dsc) +{ + const uint8_t * src_u8 = dsc->cfg.src; + + /*Get the fractional part of the source pixel*/ + int xs_fract = dsc->tmp.xs & 0xff; + int ys_fract = dsc->tmp.ys & 0xff; + int32_t xn; /*x neightboor*/ + lv_opa_t xr; /*x mix ratio*/ + + if(xs_fract < 0x70) { + xn = - 1; + if(dsc->tmp.xs_int + xn < 0) return false; + xr = xs_fract + 0x80; + } else if(xs_fract > 0x90) { + xn = 1; + if(dsc->tmp.xs_int + xn >= dsc->cfg.src_w) return false; + xr = (0xFF - xs_fract) + 0x80; + } else { + xn = 0; + xr = 0xFF; + } + + int32_t yn; /*x neightboor*/ + lv_opa_t yr; /*x mix ratio*/ + + if(ys_fract < 0x70) { + yn = - 1; + if(dsc->tmp.ys_int + yn < 0) return false; + + yr = ys_fract + 0x80; + } else if(ys_fract > 0x90) { + yn = 1; + if(dsc->tmp.ys_int + yn >= dsc->cfg.src_h) return false; + + yr = (0xFF - ys_fract) + 0x80; + } else { + yn = 0; + yr = 0xFF; + } + + lv_color_t c00 = dsc->res.color; + lv_color_t c01; + lv_color_t c10; + lv_color_t c11; + + lv_opa_t a00 = dsc->res.opa; + lv_opa_t a10 = 0; + lv_opa_t a01 = 0; + lv_opa_t a11 = 0; + + if(dsc->tmp.native_color) { + memcpy(&c01, &src_u8[dsc->tmp.pxi + dsc->tmp.px_size * xn], sizeof(lv_color_t)); + memcpy(&c10, &src_u8[dsc->tmp.pxi + dsc->cfg.src_w * dsc->tmp.px_size * yn], sizeof(lv_color_t)); + memcpy(&c11, &src_u8[dsc->tmp.pxi + dsc->cfg.src_w * dsc->tmp.px_size * yn + dsc->tmp.px_size * xn], sizeof(lv_color_t)); + if(dsc->tmp.has_alpha) { + a10 = src_u8[dsc->tmp.pxi + dsc->tmp.px_size * xn + dsc->tmp.px_size - 1]; + a01 = src_u8[dsc->tmp.pxi + dsc->cfg.src_w * dsc->tmp.px_size * yn + dsc->tmp.px_size - 1]; + a11 = src_u8[dsc->tmp.pxi + dsc->cfg.src_w * dsc->tmp.px_size * yn + dsc->tmp.px_size * xn + dsc->tmp.px_size - 1]; + } + } else { + c01 = lv_img_buf_get_px_color(&dsc->tmp.img_dsc, dsc->tmp.xs_int + xn, dsc->tmp.ys_int, dsc->cfg.color); + c10 = lv_img_buf_get_px_color(&dsc->tmp.img_dsc, dsc->tmp.xs_int, dsc->tmp.ys_int + yn, dsc->cfg.color); + c11 = lv_img_buf_get_px_color(&dsc->tmp.img_dsc, dsc->tmp.xs_int + xn, dsc->tmp.ys_int + yn, dsc->cfg.color); + + if(dsc->tmp.has_alpha) { + a10 = lv_img_buf_get_px_alpha(&dsc->tmp.img_dsc, dsc->tmp.xs_int + xn, dsc->tmp.ys_int); + a01 = lv_img_buf_get_px_alpha(&dsc->tmp.img_dsc, dsc->tmp.xs_int, dsc->tmp.ys_int + yn); + a11 = lv_img_buf_get_px_alpha(&dsc->tmp.img_dsc, dsc->tmp.xs_int + xn, dsc->tmp.ys_int + yn); + } + + } + + lv_opa_t a0; + lv_opa_t a1; + lv_opa_t xr0 = xr; + lv_opa_t xr1 = xr; + if(dsc->tmp.has_alpha) { + a0 = (a00 * xr + (a10 * (255 - xr))) >> 8; + a1 = (a01 * xr + (a11 * (255 - xr))) >> 8; + dsc->res.opa = (a0 * yr + (a1 * (255 - yr))) >> 8; + + + if(a0 <= LV_OPA_MIN && a1 <= LV_OPA_MIN) return false; + if(a0 <= LV_OPA_MIN) yr = LV_OPA_TRANSP; + if(a1 <= LV_OPA_MIN) yr = LV_OPA_COVER; + if(a00 <= LV_OPA_MIN) xr0 = LV_OPA_TRANSP; + if(a10 <= LV_OPA_MIN) xr0 = LV_OPA_COVER; + if(a01 <= LV_OPA_MIN) xr1 = LV_OPA_TRANSP; + if(a11 <= LV_OPA_MIN) xr1 = LV_OPA_COVER; + + } else { + xr0 = xr; + xr1 = xr; + dsc->res.opa = LV_OPA_COVER; + } + + lv_color_t c0 = lv_color_mix(c00, c01, xr0); + lv_color_t c1 = lv_color_mix(c10, c11, xr1); + + dsc->res.color = lv_color_mix(c0, c1, yr); + + return true; +} diff --git a/src/lv_draw/lv_img_buf.h b/src/lv_draw/lv_img_buf.h new file mode 100644 index 000000000..2629b4655 --- /dev/null +++ b/src/lv_draw/lv_img_buf.h @@ -0,0 +1,281 @@ +/** + * @file lv_img_buf.h + * + */ + +#ifndef LV_IMG_BUF_H +#define LV_IMG_BUF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include +#include "../lv_misc/lv_color.h" + + +/********************* + * DEFINES + *********************/ +/*If image pixels contains alpha we need to know how much byte is a pixel*/ +#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8 +#define LV_IMG_PX_SIZE_ALPHA_BYTE 2 +#elif LV_COLOR_DEPTH == 16 +#define LV_IMG_PX_SIZE_ALPHA_BYTE 3 +#elif LV_COLOR_DEPTH == 32 +#define LV_IMG_PX_SIZE_ALPHA_BYTE 4 +#endif + + +#define LV_IMG_BUF_SIZE_TRUE_COLOR(w, h) ((LV_COLOR_SIZE / 8) * w * h) +#define LV_IMG_BUF_SIZE_TRUE_COLOR_CHROMA_KEYED(w, h) ((LV_COLOR_SIZE / 8) * w * h) +#define LV_IMG_BUF_SIZE_TRUE_COLOR_ALPHA(w, h) (LV_IMG_PX_SIZE_ALPHA_BYTE * w * h) + +/*+ 1: to be sure no fractional row*/ +#define LV_IMG_BUF_SIZE_ALPHA_1BIT(w, h) ((((w / 8) + 1) * h)) +#define LV_IMG_BUF_SIZE_ALPHA_2BIT(w, h) ((((w / 4) + 1) * h)) +#define LV_IMG_BUF_SIZE_ALPHA_4BIT(w, h) ((((w / 2) + 1) * h)) +#define LV_IMG_BUF_SIZE_ALPHA_8BIT(w, h) ((w * h)) + +/*4 * X: for palette*/ +#define LV_IMG_BUF_SIZE_INDEXED_1BIT(w, h) (LV_IMG_BUF_SIZE_ALPHA_1BIT(w, h) + 4 * 2) +#define LV_IMG_BUF_SIZE_INDEXED_2BIT(w, h) (LV_IMG_BUF_SIZE_ALPHA_2BIT(w, h) + 4 * 4) +#define LV_IMG_BUF_SIZE_INDEXED_4BIT(w, h) (LV_IMG_BUF_SIZE_ALPHA_4BIT(w, h) + 4 * 16) +#define LV_IMG_BUF_SIZE_INDEXED_8BIT(w, h) (LV_IMG_BUF_SIZE_ALPHA_8BIT(w, h) + 4 * 256) + +#define LV_IMG_ZOOM_NONE 256 + +/********************** + * TYPEDEFS + **********************/ + +/*Image color format*/ +enum { + LV_IMG_CF_UNKNOWN = 0, + + LV_IMG_CF_RAW, /**< Contains the file as it is. Needs custom decoder function*/ + LV_IMG_CF_RAW_ALPHA, /**< Contains the file as it is. The image has alpha. Needs custom decoder + function*/ + LV_IMG_CF_RAW_CHROMA_KEYED, /**< Contains the file as it is. The image is chroma keyed. Needs + custom decoder function*/ + + LV_IMG_CF_TRUE_COLOR, /**< Color format and depth should match with LV_COLOR settings*/ + LV_IMG_CF_TRUE_COLOR_ALPHA, /**< Same as `LV_IMG_CF_TRUE_COLOR` but every pixel has an alpha byte*/ + LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED, /**< Same as `LV_IMG_CF_TRUE_COLOR` but LV_COLOR_TRANSP pixels + will be transparent*/ + + LV_IMG_CF_INDEXED_1BIT, /**< Can have 2 different colors in a palette (always chroma keyed)*/ + LV_IMG_CF_INDEXED_2BIT, /**< Can have 4 different colors in a palette (always chroma keyed)*/ + LV_IMG_CF_INDEXED_4BIT, /**< Can have 16 different colors in a palette (always chroma keyed)*/ + LV_IMG_CF_INDEXED_8BIT, /**< Can have 256 different colors in a palette (always chroma keyed)*/ + + LV_IMG_CF_ALPHA_1BIT, /**< Can have one color and it can be drawn or not*/ + LV_IMG_CF_ALPHA_2BIT, /**< Can have one color but 4 different alpha value*/ + LV_IMG_CF_ALPHA_4BIT, /**< Can have one color but 16 different alpha value*/ + LV_IMG_CF_ALPHA_8BIT, /**< Can have one color but 256 different alpha value*/ + + LV_IMG_CF_RESERVED_15, /**< Reserved for further use. */ + LV_IMG_CF_RESERVED_16, /**< Reserved for further use. */ + LV_IMG_CF_RESERVED_17, /**< Reserved for further use. */ + LV_IMG_CF_RESERVED_18, /**< Reserved for further use. */ + LV_IMG_CF_RESERVED_19, /**< Reserved for further use. */ + LV_IMG_CF_RESERVED_20, /**< Reserved for further use. */ + LV_IMG_CF_RESERVED_21, /**< Reserved for further use. */ + LV_IMG_CF_RESERVED_22, /**< Reserved for further use. */ + LV_IMG_CF_RESERVED_23, /**< Reserved for further use. */ + + LV_IMG_CF_USER_ENCODED_0, /**< User holder encoding format. */ + LV_IMG_CF_USER_ENCODED_1, /**< User holder encoding format. */ + LV_IMG_CF_USER_ENCODED_2, /**< User holder encoding format. */ + LV_IMG_CF_USER_ENCODED_3, /**< User holder encoding format. */ + LV_IMG_CF_USER_ENCODED_4, /**< User holder encoding format. */ + LV_IMG_CF_USER_ENCODED_5, /**< User holder encoding format. */ + LV_IMG_CF_USER_ENCODED_6, /**< User holder encoding format. */ + LV_IMG_CF_USER_ENCODED_7, /**< User holder encoding format. */ +}; +typedef uint8_t lv_img_cf_t; + + +/** + * LittlevGL image header + */ +typedef struct +{ + + /* The first 8 bit is very important to distinguish the different source types. + * For more info see `lv_img_get_src_type()` in lv_img.c */ + uint32_t cf : 5; /* Color format: See `lv_img_color_format_t`*/ + uint32_t always_zero : 3; /*It the upper bits of the first byte. Always zero to look like a + non-printable character*/ + + uint32_t reserved : 2; /*Reserved to be used later*/ + + uint32_t w : 11; /*Width of the image map*/ + uint32_t h : 11; /*Height of the image map*/ +} lv_img_header_t; + + +/** Image header it is compatible with + * the result from image converter utility*/ +typedef struct +{ + lv_img_header_t header; + uint32_t data_size; + const uint8_t * data; +} lv_img_dsc_t; + +typedef struct { + struct { + const void * src; /*image source (array of pixels)*/ + lv_coord_t src_w; /*width of the image source*/ + lv_coord_t src_h; /*height of the image source*/ + lv_coord_t pivot_x; /*pivot x*/ + lv_coord_t pivot_y; /* pivot y*/ + int16_t angle; /*angle to rotate*/ + uint16_t zoom; /*256 no zoom, 128 half size, 512 double size*/ + lv_color_t color; /*a color used for `LV_IMG_CF_INDEXED_1/2/4/8BIT` color formats*/ + lv_img_cf_t cf; /*color format of the image to rotate*/ + bool antialias; + }cfg; + + struct { + lv_color_t color; + lv_opa_t opa; + }res; + + + struct { + lv_img_dsc_t img_dsc; + int32_t pivot_x_256; + int32_t pivot_y_256; + int32_t sinma; + int32_t cosma; + + uint8_t chroma_keyed :1; + uint8_t has_alpha :1; + uint8_t native_color :1; + + uint16_t zoom_inv; + + /*Runtime data*/ + lv_coord_t xs; + lv_coord_t ys; + lv_coord_t xs_int; + lv_coord_t ys_int; + uint32_t pxi; + uint8_t px_size; + }tmp; +}lv_img_transform_dsc_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Allocate an image buffer in RAM + * @param w width of image + * @param h height of image + * @param cf a color format (`LV_IMG_CF_...`) + * @return an allocated image, or NULL on failure + */ +lv_img_dsc_t *lv_img_buf_alloc(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf); + +/** + * Get the color of an image's pixel + * @param dsc an image descriptor + * @param x x coordinate of the point to get + * @param y x coordinate of the point to get + * @param color the color of the image. In case of `LV_IMG_CF_ALPHA_1/2/4/8` this color is used. + * Not used in other cases. + * @param safe true: check out of bounds + * @return color of the point + */ +lv_color_t lv_img_buf_get_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t color); + +/** + * Get the alpha value of an image's pixel + * @param dsc pointer to an image descriptor + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param safe true: check out of bounds + * @return alpha value of the point + */ +lv_opa_t lv_img_buf_get_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y); + +/** + * Set the color of a pixel of an image. The alpha channel won't be affected. + * @param dsc pointer to an image descriptor + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param c color of the point + * @param safe true: check out of bounds + */ +void lv_img_buf_set_px_color(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_color_t c); + +/** + * Set the alpha value of a pixel of an image. The color won't be affected + * @param dsc pointer to an image descriptor + * @param x x coordinate of the point to set + * @param y x coordinate of the point to set + * @param opa the desired opacity + * @param safe true: check out of bounds + */ +void lv_img_buf_set_px_alpha(lv_img_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_opa_t opa); + +/** + * Set the palette color of an indexed image. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` + * @param dsc pointer to an image descriptor + * @param id the palette color to set: + * - for `LV_IMG_CF_INDEXED1`: 0..1 + * - for `LV_IMG_CF_INDEXED2`: 0..3 + * - for `LV_IMG_CF_INDEXED4`: 0..15 + * - for `LV_IMG_CF_INDEXED8`: 0..255 + * @param c the color to set + */ +void lv_img_buf_set_palette(lv_img_dsc_t * dsc, uint8_t id, lv_color_t c); + +/** + * Free an allocated image buffer + * @param dsc image buffer to free + */ +void lv_img_buf_free(lv_img_dsc_t *dsc); + +/** + * Get the memory consumption of a raw bitmap, given color format and dimensions. + * @param w width + * @param h height + * @param cf color format + * @return size in bytes + */ +uint32_t lv_img_buf_get_img_size(lv_coord_t w, lv_coord_t h, lv_img_cf_t cf); + + +/** + * Initialize a descriptor to rotate an image + * @param dsc pointer to an `lv_img_transform_dsc_t` variable whose `cfg` field is initialized + */ +void lv_img_buf_transform_init(lv_img_transform_dsc_t * dsc); + +/** + * Get which color and opa would come to a pixel if it were rotated + * @param dsc a descriptor initialized by `lv_img_buf_rotate_init` + * @param x the coordinate which color and opa should be get + * @param y the coordinate which color and opa should be get + * @return true: there is valid pixel on these x/y coordinates; false: the rotated pixel was out of the image + * @note the result is written back to `dsc->res_color` and `dsc->res_opa` + */ +bool lv_img_buf_transform(lv_img_transform_dsc_t * dsc, lv_coord_t x, lv_coord_t y); + + +/********************** + * MACROS + **********************/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_IMG_BUF_H*/ diff --git a/src/lv_draw/lv_img_cache.c b/src/lv_draw/lv_img_cache.c index eab900c8e..5ca48e438 100644 --- a/src/lv_draw/lv_img_cache.c +++ b/src/lv_draw/lv_img_cache.c @@ -6,7 +6,10 @@ /********************* * INCLUDES *********************/ +#include "../lv_core/lv_debug.h" #include "lv_img_cache.h" +#include "lv_img_decoder.h" +#include "lv_draw_img.h" #include "../lv_hal/lv_hal_tick.h" #include "../lv_misc/lv_gc.h" @@ -79,7 +82,15 @@ lv_img_cache_entry_t * lv_img_cache_open(const void * src, const lv_style_t * st /*Is the image cached?*/ lv_img_cache_entry_t * cached_src = NULL; for(i = 0; i < entry_cnt; i++) { - if(cache[i].dec_dsc.src == src) { + bool match = false; + lv_img_src_t src_type = lv_img_src_get_type(cache[i].dec_dsc.src); + if(src_type == LV_IMG_SRC_VARIABLE) { + if(cache[i].dec_dsc.src == src) match = true; + } else if(src_type == LV_IMG_SRC_FILE) { + if(strcmp(cache[i].dec_dsc.src, src) == 0) match = true; + } + + if(match) { /* If opened increment its life. * Image difficult to open should live longer to keep avoid frequent their recaching. * Therefore increase `life` with `time_to_open`*/ @@ -152,7 +163,7 @@ void lv_img_cache_set_size(uint16_t new_entry_cnt) /*Reallocate the cache*/ LV_GC_ROOT(_lv_img_cache_array) = lv_mem_alloc(sizeof(lv_img_cache_entry_t) * new_entry_cnt); - lv_mem_assert(LV_GC_ROOT(_lv_img_cache_array)); + LV_ASSERT_MEM(LV_GC_ROOT(_lv_img_cache_array)); if(LV_GC_ROOT(_lv_img_cache_array) == NULL) { entry_cnt = 0; return; diff --git a/src/lv_draw/lv_img_decoder.c b/src/lv_draw/lv_img_decoder.c index 730739c16..6c130b2f3 100644 --- a/src/lv_draw/lv_img_decoder.c +++ b/src/lv_draw/lv_img_decoder.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ #include "lv_img_decoder.h" +#include "../lv_core/lv_debug.h" #include "../lv_draw/lv_draw_img.h" #include "../lv_misc/lv_ll.h" #include "../lv_misc/lv_color.h" @@ -31,6 +32,7 @@ typedef struct lv_fs_file_t * f; #endif lv_color_t * palette; + lv_opa_t * opa; } lv_img_decoder_built_in_data_t; /********************** @@ -68,7 +70,7 @@ void lv_img_decoder_init(void) decoder = lv_img_decoder_create(); if(decoder == NULL) { LV_LOG_WARN("lv_img_decoder_init: out of memory"); - lv_mem_assert(decoder); + LV_ASSERT_MEM(decoder); return; } @@ -118,10 +120,17 @@ lv_res_t lv_img_decoder_get_info(const char * src, lv_img_header_t * header) lv_res_t lv_img_decoder_open(lv_img_decoder_dsc_t * dsc, const void * src, const lv_style_t * style) { dsc->style = style; - dsc->src = src; dsc->src_type = lv_img_src_get_type(src); dsc->user_data = NULL; + if(dsc->src_type == LV_IMG_SRC_FILE) { + size_t fnlen = strlen(src); + dsc->src = lv_mem_alloc(fnlen + 1); + strcpy((char *)dsc->src, src); + } else { + dsc->src = src; + } + lv_res_t res = LV_RES_INV; lv_img_decoder_t * d; @@ -175,6 +184,11 @@ void lv_img_decoder_close(lv_img_decoder_dsc_t * dsc) { if(dsc->decoder) { if(dsc->decoder->close_cb) dsc->decoder->close_cb(dsc->decoder, dsc); + + if(dsc->src_type == LV_IMG_SRC_FILE) { + lv_mem_free(dsc->src); + dsc->src = NULL; + } } } @@ -186,7 +200,7 @@ lv_img_decoder_t * lv_img_decoder_create(void) { lv_img_decoder_t * decoder; decoder = lv_ll_ins_head(&LV_GC_ROOT(_lv_img_defoder_ll)); - lv_mem_assert(decoder); + LV_ASSERT_MEM(decoder); if(decoder == NULL) return NULL; memset(decoder, 0, sizeof(lv_img_decoder_t)); @@ -200,7 +214,7 @@ lv_img_decoder_t * lv_img_decoder_create(void) */ void lv_img_decoder_delete(lv_img_decoder_t * decoder) { - lv_ll_rem(&LV_GC_ROOT(_lv_img_defoder_ll), decoder); + lv_ll_remove(&LV_GC_ROOT(_lv_img_defoder_ll), decoder); lv_mem_free(decoder); } @@ -321,7 +335,7 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder dsc->user_data = lv_mem_alloc(sizeof(lv_img_decoder_built_in_data_t)); if(dsc->user_data == NULL) { LV_LOG_ERROR("img_decoder_built_in_open: out of memory"); - lv_mem_assert(dsc->user_data); + LV_ASSERT_MEM(dsc->user_data); } memset(dsc->user_data, 0, sizeof(lv_img_decoder_built_in_data_t)); } @@ -330,7 +344,7 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder user_data->f = lv_mem_alloc(sizeof(f)); if(user_data->f == NULL) { LV_LOG_ERROR("img_decoder_built_in_open: out of memory"); - lv_mem_assert(user_data->f); + LV_ASSERT_MEM(user_data->f); } memcpy(user_data->f, &f, sizeof(f)); @@ -339,6 +353,11 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder LV_LOG_WARN("Image built-in decoder cannot read file because LV_USE_FILESYSTEM = 0"); return LV_RES_INV; #endif + } else if(dsc->src_type == LV_IMG_SRC_VARIABLE) { + /*The variables should have valid data*/ + if(((lv_img_dsc_t *)dsc->src)->data == NULL) { + return LV_RES_INV; + } } lv_img_cf_t cf = dsc->header.cf; @@ -360,7 +379,7 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder cf == LV_IMG_CF_INDEXED_8BIT) { #if LV_IMG_CF_INDEXED - uint8_t px_size = lv_img_color_format_get_px_size(cf); + uint8_t px_size = lv_img_cf_get_px_size(cf); uint32_t palette_size = 1 << px_size; /*Allocate the palette*/ @@ -368,17 +387,18 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder dsc->user_data = lv_mem_alloc(sizeof(lv_img_decoder_built_in_data_t)); if(dsc->user_data == NULL) { LV_LOG_ERROR("img_decoder_built_in_open: out of memory"); - lv_mem_assert(dsc->user_data); + LV_ASSERT_MEM(dsc->user_data); } memset(dsc->user_data, 0, sizeof(lv_img_decoder_built_in_data_t)); } lv_img_decoder_built_in_data_t * user_data = dsc->user_data; user_data->palette = lv_mem_alloc(palette_size * sizeof(lv_color_t)); - if(user_data->palette == NULL) { + user_data->opa = lv_mem_alloc(palette_size * sizeof(lv_opa_t)); + if(user_data->palette == NULL || user_data->opa == NULL) { LV_LOG_ERROR("img_decoder_built_in_open: out of memory"); #if LV_USE_FILESYSTEM - lv_mem_assert(user_data->f); + LV_ASSERT_MEM(user_data->f); #endif } @@ -386,7 +406,13 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder /*Read the palette from file*/ #if LV_USE_FILESYSTEM lv_fs_seek(user_data->f, 4); /*Skip the header*/ - lv_fs_read(user_data->f, user_data->palette, palette_size * sizeof(lv_color_t), NULL); + lv_color32_t cur_color; + uint32_t i; + for(i = 0; i < palette_size; i++) { + lv_fs_read(user_data->f, &cur_color, sizeof(lv_color32_t), NULL); + user_data->palette[i] = lv_color_make(cur_color.ch.red, cur_color.ch.green, cur_color.ch.blue); + user_data->opa[i] = cur_color.ch.alpha; + } #else LV_LOG_WARN("Image built-in decoder can read the palette because LV_USE_FILESYSTEM = 0"); return LV_RES_INV; @@ -395,9 +421,11 @@ lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder /*The palette begins in the beginning of the image data. Just point to it.*/ lv_color32_t * palette_p = (lv_color32_t *)((lv_img_dsc_t *)dsc->src)->data; + uint32_t i; for(i = 0; i < palette_size; i++) { user_data->palette[i] = lv_color_make(palette_p[i].ch.red, palette_p[i].ch.green, palette_p[i].ch.blue); + user_data->opa[i] = palette_p[i].ch.alpha; } } @@ -487,6 +515,7 @@ void lv_img_decoder_built_in_close(lv_img_decoder_t * decoder, lv_img_decoder_ds } #endif if(user_data->palette) lv_mem_free(user_data->palette); + if(user_data->opa) lv_mem_free(user_data->opa); lv_mem_free(user_data); @@ -505,7 +534,7 @@ static lv_res_t lv_img_decoder_built_in_line_true_color(lv_img_decoder_dsc_t * d #if LV_USE_FILESYSTEM lv_img_decoder_built_in_data_t * user_data = dsc->user_data; lv_fs_res_t res; - uint8_t px_size = lv_img_color_format_get_px_size(dsc->header.cf); + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf); uint32_t pos = ((y * dsc->header.w + x) * px_size) >> 3; pos += 4; /*Skip the header*/ @@ -557,7 +586,7 @@ static lv_res_t lv_img_decoder_built_in_line_alpha(lv_img_decoder_dsc_t * dsc, l } const lv_opa_t * opa_table = NULL; - uint8_t px_size = lv_img_color_format_get_px_size(dsc->header.cf); + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf); uint16_t mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ lv_coord_t w = 0; @@ -594,7 +623,7 @@ static lv_res_t lv_img_decoder_built_in_line_alpha(lv_img_decoder_dsc_t * dsc, l #if LV_USE_FILESYSTEM lv_img_decoder_built_in_data_t * user_data = dsc->user_data; - uint8_t fs_buf[LV_HOR_RES_MAX]; + uint8_t * fs_buf = lv_mem_buf_get(w); #endif const uint8_t * data_tmp = NULL; @@ -628,7 +657,9 @@ static lv_res_t lv_img_decoder_built_in_line_alpha(lv_img_decoder_dsc_t * dsc, l data_tmp++; } } - +#if LV_USE_FILESYSTEM + lv_mem_buf_release(fs_buf); +#endif return LV_RES_OK; #else @@ -642,7 +673,7 @@ static lv_res_t lv_img_decoder_built_in_line_indexed(lv_img_decoder_dsc_t * dsc, { #if LV_IMG_CF_INDEXED - uint8_t px_size = lv_img_color_format_get_px_size(dsc->header.cf); + uint8_t px_size = lv_img_cf_get_px_size(dsc->header.cf); uint16_t mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/ lv_coord_t w = 0; @@ -681,7 +712,7 @@ static lv_res_t lv_img_decoder_built_in_line_indexed(lv_img_decoder_dsc_t * dsc, lv_img_decoder_built_in_data_t * user_data = dsc->user_data; #if LV_USE_FILESYSTEM - uint8_t fs_buf[LV_HOR_RES_MAX]; + uint8_t * fs_buf = lv_mem_buf_get(w); #endif const uint8_t * data_tmp = NULL; if(dsc->src_type == LV_IMG_SRC_VARIABLE) { @@ -699,13 +730,24 @@ static lv_res_t lv_img_decoder_built_in_line_indexed(lv_img_decoder_dsc_t * dsc, #endif } - uint8_t byte_act = 0; uint8_t val_act; lv_coord_t i; - lv_color_t * cbuf = (lv_color_t *)buf; for(i = 0; i < len; i++) { - val_act = (data_tmp[byte_act] & (mask << pos)) >> pos; - cbuf[i] = user_data->palette[val_act]; + val_act = (*data_tmp & (mask << pos)) >> pos; + + lv_color_t color = user_data->palette[val_act]; +#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1 + buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE] = color.full; +#elif LV_COLOR_DEPTH == 16 + /*Because of Alpha byte 16 bit color can start on odd address which can cause crash*/ + buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE] = color.full & 0xFF; + buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE + 1] = (color.full >> 8) & 0xFF; +#elif LV_COLOR_DEPTH == 32 + *((uint32_t *)&buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE]) = color.full; +#else +#error "Invalid LV_COLOR_DEPTH. Check it in lv_conf.h" +#endif + buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE + LV_IMG_PX_SIZE_ALPHA_BYTE - 1] = user_data->opa[val_act]; pos -= px_size; if(pos < 0) { @@ -713,7 +755,9 @@ static lv_res_t lv_img_decoder_built_in_line_indexed(lv_img_decoder_dsc_t * dsc, data_tmp++; } } - +#if LV_USE_FILESYSTEM + lv_mem_buf_release(fs_buf); +#endif return LV_RES_OK; #else LV_LOG_WARN("Image built-in indexed line reader failed because LV_IMG_CF_INDEXED is 0 in lv_conf.h"); diff --git a/src/lv_draw/lv_img_decoder.h b/src/lv_draw/lv_img_decoder.h index fb7af8324..a1713e0c0 100644 --- a/src/lv_draw/lv_img_decoder.h +++ b/src/lv_draw/lv_img_decoder.h @@ -20,6 +20,7 @@ extern "C" { #endif #include +#include "lv_img_buf.h" #include "../lv_misc/lv_fs.h" #include "../lv_misc/lv_types.h" #include "../lv_misc/lv_area.h" @@ -28,14 +29,6 @@ extern "C" { /********************* * DEFINES *********************/ -/*If image pixels contains alpha we need to know how much byte is a pixel*/ -#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8 -#define LV_IMG_PX_SIZE_ALPHA_BYTE 2 -#elif LV_COLOR_DEPTH == 16 -#define LV_IMG_PX_SIZE_ALPHA_BYTE 3 -#elif LV_COLOR_DEPTH == 32 -#define LV_IMG_PX_SIZE_ALPHA_BYTE 4 -#endif /********************** * TYPEDEFS @@ -51,78 +44,6 @@ enum { }; typedef uint8_t lv_img_src_t; -/** - * LittlevGL image header - */ -typedef struct -{ - - /* The first 8 bit is very important to distinguish the different source types. - * For more info see `lv_img_get_src_type()` in lv_img.c */ - uint32_t cf : 5; /* Color format: See `lv_img_color_format_t`*/ - uint32_t always_zero : 3; /*It the upper bits of the first byte. Always zero to look like a - non-printable character*/ - - uint32_t reserved : 2; /*Reserved to be used later*/ - - uint32_t w : 11; /*Width of the image map*/ - uint32_t h : 11; /*Height of the image map*/ -} lv_img_header_t; - -/*Image color format*/ -enum { - LV_IMG_CF_UNKNOWN = 0, - - LV_IMG_CF_RAW, /**< Contains the file as it is. Needs custom decoder function*/ - LV_IMG_CF_RAW_ALPHA, /**< Contains the file as it is. The image has alpha. Needs custom decoder - function*/ - LV_IMG_CF_RAW_CHROMA_KEYED, /**< Contains the file as it is. The image is chroma keyed. Needs - custom decoder function*/ - - LV_IMG_CF_TRUE_COLOR, /**< Color format and depth should match with LV_COLOR settings*/ - LV_IMG_CF_TRUE_COLOR_ALPHA, /**< Same as `LV_IMG_CF_TRUE_COLOR` but every pixel has an alpha byte*/ - LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED, /**< Same as `LV_IMG_CF_TRUE_COLOR` but LV_COLOR_TRANSP pixels - will be transparent*/ - - LV_IMG_CF_INDEXED_1BIT, /**< Can have 2 different colors in a palette (always chroma keyed)*/ - LV_IMG_CF_INDEXED_2BIT, /**< Can have 4 different colors in a palette (always chroma keyed)*/ - LV_IMG_CF_INDEXED_4BIT, /**< Can have 16 different colors in a palette (always chroma keyed)*/ - LV_IMG_CF_INDEXED_8BIT, /**< Can have 256 different colors in a palette (always chroma keyed)*/ - - LV_IMG_CF_ALPHA_1BIT, /**< Can have one color and it can be drawn or not*/ - LV_IMG_CF_ALPHA_2BIT, /**< Can have one color but 4 different alpha value*/ - LV_IMG_CF_ALPHA_4BIT, /**< Can have one color but 16 different alpha value*/ - LV_IMG_CF_ALPHA_8BIT, /**< Can have one color but 256 different alpha value*/ - - LV_IMG_CF_RESERVED_15, /**< Reserved for further use. */ - LV_IMG_CF_RESERVED_16, /**< Reserved for further use. */ - LV_IMG_CF_RESERVED_17, /**< Reserved for further use. */ - LV_IMG_CF_RESERVED_18, /**< Reserved for further use. */ - LV_IMG_CF_RESERVED_19, /**< Reserved for further use. */ - LV_IMG_CF_RESERVED_20, /**< Reserved for further use. */ - LV_IMG_CF_RESERVED_21, /**< Reserved for further use. */ - LV_IMG_CF_RESERVED_22, /**< Reserved for further use. */ - LV_IMG_CF_RESERVED_23, /**< Reserved for further use. */ - - LV_IMG_CF_USER_ENCODED_0, /**< User holder encoding format. */ - LV_IMG_CF_USER_ENCODED_1, /**< User holder encoding format. */ - LV_IMG_CF_USER_ENCODED_2, /**< User holder encoding format. */ - LV_IMG_CF_USER_ENCODED_3, /**< User holder encoding format. */ - LV_IMG_CF_USER_ENCODED_4, /**< User holder encoding format. */ - LV_IMG_CF_USER_ENCODED_5, /**< User holder encoding format. */ - LV_IMG_CF_USER_ENCODED_6, /**< User holder encoding format. */ - LV_IMG_CF_USER_ENCODED_7, /**< User holder encoding format. */ -}; -typedef uint8_t lv_img_cf_t; - -/** Image header it is compatible with - * the result from image converter utility*/ -typedef struct -{ - lv_img_header_t header; - uint32_t data_size; - const uint8_t * data; -} lv_img_dsc_t; /* Decoder function definitions */ diff --git a/src/lv_font/lv_font.h b/src/lv_font/lv_font.h index e639a54a3..27936274e 100644 --- a/src/lv_font/lv_font.h +++ b/src/lv_font/lv_font.h @@ -24,6 +24,7 @@ extern "C" { #include #include "lv_symbol_def.h" +#include "../lv_misc/lv_area.h" /********************* * DEFINES @@ -46,14 +47,25 @@ extern "C" { typedef struct { uint16_t adv_w; /**< The glyph needs this space. Draw the next glyph after this width. 8 bit integer, 4 bit fractional */ - uint8_t box_w; /**< Width of the glyph's bounding box*/ - uint8_t box_h; /**< Height of the glyph's bounding box*/ - int8_t ofs_x; /**< x offset of the bounding box*/ - int8_t ofs_y; /**< y offset of the bounding box*/ + uint16_t box_w; /**< Width of the glyph's bounding box*/ + uint16_t box_h; /**< Height of the glyph's bounding box*/ + int16_t ofs_x; /**< x offset of the bounding box*/ + int16_t ofs_y; /**< y offset of the bounding box*/ uint8_t bpp; /**< Bit-per-pixel: 1, 2, 4, 8*/ }lv_font_glyph_dsc_t; -/*Describe the properties of a font*/ + +/** The bitmaps might be upscaled by 3 to achieve subpixel rendering. */ +enum { + LV_FONT_SUBPX_NONE, + LV_FONT_SUBPX_HOR, + LV_FONT_SUBPX_VER, + LV_FONT_SUBPX_BOTH, +}; + +typedef uint8_t lv_font_subpx_t; + +/** Describe the properties of a font*/ typedef struct _lv_font_struct { /** Get a glyph's descriptor from a font*/ @@ -63,12 +75,15 @@ typedef struct _lv_font_struct const uint8_t * (*get_glyph_bitmap)(const struct _lv_font_struct *, uint32_t); /*Pointer to the font in a font pack (must have the same line height)*/ - uint8_t line_height; /**< The real line height where any text fits*/ - uint8_t base_line; /**< Base line measured from the top of the line_height*/ - void * dsc; /**< Store implementation specific data here*/ + lv_coord_t line_height; /**< The real line height where any text fits*/ + lv_coord_t base_line; /**< Base line measured from the top of the line_height*/ + uint8_t subpx :2; /**< An element of `lv_font_subpx_t`*/ + void * dsc; /**< Store implementation specific or run_time data or caching here*/ #if LV_USE_USER_DATA lv_font_user_data_t user_data; /**< Custom user data for font. */ #endif + + } lv_font_t; /********************** @@ -107,7 +122,7 @@ uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32 * @param font_p pointer to a font * @return the height of a font */ -static inline uint8_t lv_font_get_line_height(const lv_font_t * font_p) +static inline lv_coord_t lv_font_get_line_height(const lv_font_t * font_p) { return font_p->line_height; } diff --git a/src/lv_font/lv_font_fmt_txt.c b/src/lv_font/lv_font_fmt_txt.c index d491da1f8..5601cfaf6 100644 --- a/src/lv_font/lv_font_fmt_txt.c +++ b/src/lv_font/lv_font_fmt_txt.c @@ -8,9 +8,12 @@ *********************/ #include "lv_font.h" #include "lv_font_fmt_txt.h" +#include "../lv_core/lv_debug.h" +#include "../lv_draw/lv_draw.h" #include "../lv_misc/lv_types.h" #include "../lv_misc/lv_log.h" #include "../lv_misc/lv_utils.h" +#include "../lv_misc/lv_mem.h" /********************* * DEFINES @@ -19,6 +22,11 @@ /********************** * TYPEDEFS **********************/ +typedef enum { + RLE_STATE_SINGLE = 0, + RLE_STATE_REPEATE, + RLE_STATE_COUNTER, +}rle_state_t; /********************** * STATIC PROTOTYPES @@ -29,10 +37,25 @@ static int32_t unicode_list_compare(const void * ref, const void * element); static int32_t kern_pair_8_compare(const void * ref, const void * element); static int32_t kern_pair_16_compare(const void * ref, const void * element); +static void decompress(const uint8_t * in, uint8_t * out, lv_coord_t w, lv_coord_t h, uint8_t bpp); +static void decompress_line(uint8_t * out, lv_coord_t w); +static uint8_t get_bits(const uint8_t * in, uint32_t bit_pos, uint8_t len); +static void bits_write(uint8_t * out, uint32_t bit_pos, uint8_t val, uint8_t len); +static void rle_init(const uint8_t * in, uint8_t bpp); +static uint8_t rle_next(void); + + /********************** * STATIC VARIABLES **********************/ +static uint32_t rle_rdp; +static const uint8_t * rle_in; +static uint8_t rle_bpp; +static uint8_t rle_prev_v; +static uint8_t rle_cnt; +static rle_state_t rle_state; + /********************** * GLOBAL PROTOTYPES **********************/ @@ -53,13 +76,42 @@ static int32_t kern_pair_16_compare(const void * ref, const void * element); */ const uint8_t * lv_font_get_bitmap_fmt_txt(const lv_font_t * font, uint32_t unicode_letter) { + if(unicode_letter == '\t') unicode_letter = ' '; + lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *) font->dsc; uint32_t gid = get_glyph_dsc_id(font, unicode_letter); - if(!gid) return false; + if(!gid) return NULL; const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; - if(gdsc) return &fdsc->glyph_bitmap[gdsc->bitmap_index]; + if(fdsc->bitmap_format == LV_FONT_FMT_TXT_PLAIN) { + if(gdsc) return &fdsc->glyph_bitmap[gdsc->bitmap_index]; + } + /*Handle compressed bitmap*/ + else + { + static uint8_t * buf = NULL; + + uint32_t gsize = gdsc->box_w * gdsc->box_h; + if(gsize == 0) return NULL; + + uint32_t buf_size = gsize; + switch(fdsc->bpp) { + case 1: buf_size = gsize >> 3; break; + case 2: buf_size = gsize >> 2; break; + case 3: buf_size = gsize >> 1; break; + case 4: buf_size = gsize >> 1; break; + } + + if(lv_mem_get_size(buf) < buf_size) { + buf = lv_mem_realloc(buf, buf_size); + LV_ASSERT_MEM(buf); + if(buf == NULL) return NULL; + } + + decompress(&fdsc->glyph_bitmap[gdsc->bitmap_index], buf, gdsc->box_w , gdsc->box_h, (uint8_t)fdsc->bpp); + return buf; + } /*If not returned earlier then the letter is not found in this font*/ return NULL; @@ -75,6 +127,11 @@ const uint8_t * lv_font_get_bitmap_fmt_txt(const lv_font_t * font, uint32_t unic */ bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) { + bool is_tab = false; + if(unicode_letter == '\t') { + unicode_letter = ' '; + is_tab = true; + } lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *) font->dsc; uint32_t gid = get_glyph_dsc_id(font, unicode_letter); if(!gid) return false; @@ -90,7 +147,12 @@ bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * /*Put together a glyph dsc*/ const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; - uint32_t adv_w = gdsc->adv_w + ((int32_t)((int32_t)kvalue * fdsc->kern_scale) >> 4); + int32_t kv = ((int32_t)((int32_t)kvalue * fdsc->kern_scale) >> 4); + + uint32_t adv_w = gdsc->adv_w; + if(is_tab) adv_w *= 2; + + adv_w += kv; adv_w = (adv_w + (1 << 3)) >> 4; dsc_out->adv_w = adv_w; @@ -98,7 +160,9 @@ bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out->box_w = gdsc->box_w; dsc_out->ofs_x = gdsc->ofs_x; dsc_out->ofs_y = gdsc->ofs_y; - dsc_out->bpp = fdsc->bpp; + dsc_out->bpp = (uint8_t)fdsc->bpp; + + if(is_tab) dsc_out->box_w = dsc_out->box_w * 2; return true; } @@ -134,7 +198,7 @@ static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter) uint8_t * p = lv_utils_bsearch(&rcp, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); if(p) { - uint32_t ofs = (lv_uintptr_t)p - (lv_uintptr_t) fdsc->cmaps[i].unicode_list; + lv_uintptr_t ofs = (lv_uintptr_t)p - (lv_uintptr_t) fdsc->cmaps[i].unicode_list; ofs = ofs >> 1; /*The list stores `uint16_t` so the get the index divide by 2*/ glyph_id = fdsc->cmaps[i].glyph_id_start + ofs; } @@ -143,7 +207,7 @@ static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter) uint8_t * p = lv_utils_bsearch(&rcp, fdsc->cmaps[i].unicode_list, fdsc->cmaps[i].list_length, sizeof(fdsc->cmaps[i].unicode_list[0]), unicode_list_compare); if(p) { - uint32_t ofs = (lv_uintptr_t)p - (lv_uintptr_t) fdsc->cmaps[i].unicode_list; + lv_uintptr_t ofs = (lv_uintptr_t)p - (lv_uintptr_t) fdsc->cmaps[i].unicode_list; ofs = ofs >> 1; /*The list stores `uint16_t` so the get the index divide by 2*/ const uint8_t * gid_ofs_16 = fdsc->cmaps[i].glyph_id_ofs_list; glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_16[ofs]; @@ -180,7 +244,7 @@ static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t /*If the `g_id_both` were found get its index from the pointer*/ if(kid_p) { - uint32_t ofs = (lv_uintptr_t)kid_p - (lv_uintptr_t)g_ids; + lv_uintptr_t ofs = (lv_uintptr_t)kid_p - (lv_uintptr_t)g_ids; ofs = ofs >> 1; /*ofs is for pair, divide by 2 to refer as a single value*/ value = kdsc->values[ofs]; } @@ -188,12 +252,12 @@ static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t /* Use binary search to find the kern value. * The pairs are ordered left_id first, then right_id secondly. */ const uint16_t * g_ids = kdsc->glyph_ids; - uint32_t g_id_both = (uint32_t)((uint32_t)gid_right << 8) + gid_left; /*Create one number from the ids*/ + lv_uintptr_t g_id_both = (uint32_t)((uint32_t)gid_right << 8) + gid_left; /*Create one number from the ids*/ uint8_t * kid_p = lv_utils_bsearch(&g_id_both, g_ids, kdsc->pair_cnt, 4, kern_pair_16_compare); /*If the `g_id_both` were found get its index from the pointer*/ if(kid_p) { - uint32_t ofs = (lv_uintptr_t)kid_p - (lv_uintptr_t)g_ids; + lv_uintptr_t ofs = (lv_uintptr_t)kid_p - (lv_uintptr_t)g_ids; ofs = ofs >> 4; /*ofs is 4 byte pairs, divide by 4 to refer as a single value*/ value = kdsc->values[ofs]; } @@ -238,6 +302,178 @@ static int32_t kern_pair_16_compare(const void * ref, const void * element) else return (int32_t) ref16_p[1] - element16_p[1]; } +/** + * The compress a glyph's bitmap + * @param in the compressed bitmap + * @param out buffer to store the result + * @param px_num number of pixels in the glyph (width * height) + * @param bpp bit per pixel (bpp = 3 will be converted to bpp = 4) + */ +static void decompress(const uint8_t * in, uint8_t * out, lv_coord_t w, lv_coord_t h, uint8_t bpp) +{ + uint32_t wrp = 0; + uint8_t wr_size = bpp; + if(bpp == 3) wr_size = 4; + + rle_init(in, bpp); + + uint8_t * line_buf1 = lv_mem_buf_get(w); + uint8_t * line_buf2 = lv_mem_buf_get(w); + + decompress_line(line_buf1, w); + + lv_coord_t y; + lv_coord_t x; + for(x = 0; x < w; x++) { + bits_write(out,wrp, line_buf1[x], bpp); + wrp += wr_size; + } + + for(y = 1; y < h; y++) { + decompress_line(line_buf2, w); + + for(x = 0; x < w; x++) { + line_buf1[x] = line_buf2[x] ^ line_buf1[x]; + bits_write(out,wrp, line_buf1[x], bpp); + wrp += wr_size; + } + } + + lv_mem_buf_release(line_buf1); + lv_mem_buf_release(line_buf2); +} + +/** + * Decompress one line. Store one pixel per byte + * @param out output buffer + * @param w width of the line in pixel count + */ +static void decompress_line(uint8_t * out, lv_coord_t w) +{ + lv_coord_t i; + for(i = 0; i < w; i++) { + out[i] = rle_next(); + } +} + +/** + * Read bits from an input buffer. The read can cross byte boundary. + * @param in the input buffer to read from. + * @param bit_pos index of teh first bit to read. + * @param len number of bits to read (must be <= 8). + * @return the read bits + */ +static uint8_t get_bits(const uint8_t * in, uint32_t bit_pos, uint8_t len) +{ + uint8_t res = 0; + uint32_t byte_pos = bit_pos >> 3; + bit_pos = bit_pos & 0x7; + uint8_t bit_mask = (uint16_t)((uint16_t) 1 << len) - 1; + uint16_t in16 = (in[byte_pos] << 8) + in[byte_pos + 1]; + + res = (in16 >> (16 - bit_pos - len)) & bit_mask; + return res; +} + +/** + * Write `val` data to `bit_pos` position of `out`. The write can NOT cross byte boundary. + * @param out buffer where to write + * @param bit_pos bit index to write + * @param val value to write + * @param len length of bits to write from `val`. (Counted from the LSB). + * @note `len == 3` will be converted to `len = 4` and `val` will be upscaled too + */ +static void bits_write(uint8_t * out, uint32_t bit_pos, uint8_t val, uint8_t len) +{ + if(len == 3) { + len = 4; + switch(val) { + case 0: val = 0; break; + case 1: val = 2; break; + case 2: val = 4; break; + case 3: val = 6; break; + case 4: val = 9; break; + case 5: val = 11; break; + case 6: val = 13; break; + case 7: val = 15; break; + } + } + + uint16_t byte_pos = bit_pos >> 3; + bit_pos = bit_pos & 0x7; + bit_pos = 8 - bit_pos - len; + + uint8_t bit_mask = (uint16_t)((uint16_t) 1 << len) - 1; + out[byte_pos] &= ((~bit_mask) << bit_pos); + out[byte_pos] |= (val << bit_pos); +} + +static void rle_init(const uint8_t * in, uint8_t bpp) +{ + rle_in = in; + rle_bpp = bpp; + rle_state = RLE_STATE_SINGLE; + rle_rdp = 0; + rle_prev_v = 0; + rle_cnt = 0; +} + +static uint8_t rle_next(void) +{ + uint8_t v = 0; + uint8_t ret = 0; + + if(rle_state == RLE_STATE_SINGLE) { + ret = get_bits(rle_in, rle_rdp, rle_bpp); + if(rle_rdp != 0 && rle_prev_v == ret) { + rle_cnt = 0; + rle_state = RLE_STATE_REPEATE; + } + + rle_prev_v = ret; + rle_rdp += rle_bpp; + } + else if(rle_state == RLE_STATE_REPEATE) { + v = get_bits(rle_in, rle_rdp, 1); + rle_cnt++; + rle_rdp += 1; + if(v == 1) { + ret = rle_prev_v; + if(rle_cnt == 11) { + rle_cnt = get_bits(rle_in, rle_rdp, 6); + rle_rdp += 6; + if(rle_cnt != 0) { + rle_state = RLE_STATE_COUNTER; + } else { + ret = get_bits(rle_in, rle_rdp, rle_bpp); + rle_prev_v = ret; + rle_rdp += rle_bpp; + rle_state = RLE_STATE_SINGLE; + } + } + } else { + ret = get_bits(rle_in, rle_rdp, rle_bpp); + rle_prev_v = ret; + rle_rdp += rle_bpp; + rle_state = RLE_STATE_SINGLE; + } + + + } + else if(rle_state == RLE_STATE_COUNTER) { + ret = rle_prev_v; + rle_cnt--; + if(rle_cnt == 0) { + ret = get_bits(rle_in, rle_rdp, rle_bpp); + rle_prev_v = ret; + rle_rdp += rle_bpp; + rle_state = RLE_STATE_SINGLE; + } + } + + return ret; +} + /** Code Comparator. * * Compares the value of both input arguments. diff --git a/src/lv_font/lv_font_fmt_txt.h b/src/lv_font/lv_font_fmt_txt.h index 446a1067d..46b9d3985 100644 --- a/src/lv_font/lv_font_fmt_txt.h +++ b/src/lv_font/lv_font_fmt_txt.h @@ -38,14 +38,18 @@ typedef struct #if LV_FONT_FMT_TXT_LARGE == 0 uint32_t bitmap_index : 20; /**< Start index of the bitmap. A font can be max 1 MB. */ uint32_t adv_w :12; /**< Draw the next glyph after this width. 8.4 format (real_value * 16 is stored). */ -#else - uint32_t bitmap_index; /**< Start index of the bitmap. A font can be max 4 GB. */ - uint32_t adv_w; /**< Draw the next glyph after this width. 28.4 format (real_value * 16 is stored). */ -#endif uint8_t box_w; /**< Width of the glyph's bounding box*/ uint8_t box_h; /**< Height of the glyph's bounding box*/ int8_t ofs_x; /**< x offset of the bounding box*/ - uint8_t ofs_y; /**< y offset of the bounding box. Measured from the top of the line*/ + int8_t ofs_y; /**< y offset of the bounding box. Measured from the top of the line*/ +#else + uint32_t bitmap_index; /**< Start index of the bitmap. A font can be max 4 GB. */ + uint32_t adv_w; /**< Draw the next glyph after this width. 28.4 format (real_value * 16 is stored). */ + uint16_t box_w; /**< Width of the glyph's bounding box*/ + uint16_t box_h; /**< Height of the glyph's bounding box*/ + int16_t ofs_x; /**< x offset of the bounding box*/ + int16_t ofs_y; /**< y offset of the bounding box. Measured from the top of the line*/ +#endif }lv_font_fmt_txt_glyph_dsc_t; @@ -113,7 +117,7 @@ typedef struct { uint16_t list_length; /** Type of this character map*/ - lv_font_fmt_txt_cmap_type_t type :2; + lv_font_fmt_txt_cmap_type_t type; }lv_font_fmt_txt_cmap_t; /** A simple mapping of kern values from pairs*/ @@ -141,7 +145,7 @@ typedef struct { 3. value = class_pair_values[(left_class-1)*right_class_cnt + (righ_class-1)] */ - const uint8_t * class_pair_values; /*left_class_num * right_class_num value*/ + const int8_t * class_pair_values; /*left_class_num * right_class_num value*/ const uint8_t * left_class_mapping; /*Map the glyph_ids to classes: index -> glyph_id -> class_id*/ const uint8_t * right_class_mapping; /*Map the glyph_ids to classes: index -> glyph_id -> class_id*/ uint8_t left_class_cnt; @@ -180,7 +184,7 @@ typedef struct { /*Number of cmap tables*/ uint16_t cmap_num :10; - /*Bit per pixel: 1, 2, 4 or 8*/ + /*Bit per pixel: 1, 2, 3, 4*/ uint16_t bpp :3; /*Type of `kern_dsc`*/ diff --git a/src/lv_font/lv_font_roboto_12.c b/src/lv_font/lv_font_roboto_12.c index a3a08603a..3da8e899e 100644 --- a/src/lv_font/lv_font_roboto_12.c +++ b/src/lv_font/lv_font_roboto_12.c @@ -3,7 +3,7 @@ /******************************************************************************* * Size: 12 px * Bpp: 4 - * Opts: + * Opts: --no-compress --no-prefilter --bpp 4 --size 12 --font Roboto-Regular.woff -r 0x20-0x7F --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 lv_font_roboto_12.c --force-fast-kern-format ******************************************************************************/ #ifndef LV_FONT_ROBOTO_12 @@ -21,1001 +21,1140 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { /* U+20 " " */ /* U+21 "!" */ - 0x82, 0xf4, 0xf4, 0xf4, 0xf4, 0xf4, 0x41, 0x41, - 0xf4, + 0xf, 0x10, 0xf1, 0xf, 0x10, 0xf1, 0xf, 0x0, + 0xf0, 0x9, 0x0, 0x30, 0xe, 0x10, /* U+22 "\"" */ - 0x27, 0x46, 0x4f, 0x8c, 0x4b, 0x89, 0x23, 0x42, + 0x39, 0x93, 0x39, 0x92, 0x38, 0x91, 0x1, 0x10, /* U+23 "#" */ - 0x0, 0x6, 0x6, 0x20, 0x4, 0xb0, 0xd1, 0x0, - 0x78, 0xe, 0x3, 0xcf, 0xdd, 0xec, 0x0, 0xc1, - 0x78, 0x2, 0x3e, 0x3a, 0x62, 0x4a, 0xd8, 0xf8, - 0x40, 0x68, 0xe, 0x0, 0x9, 0x44, 0xb0, 0x0, + 0x0, 0x1b, 0xb, 0x10, 0x5, 0x70, 0xd0, 0x1e, + 0xfe, 0xef, 0xd0, 0xb, 0x15, 0x70, 0x0, 0xd0, + 0x84, 0x8, 0xef, 0xef, 0xe7, 0x4, 0x90, 0xd0, + 0x0, 0x66, 0xc, 0x0, 0x9, 0x43, 0xa0, 0x0, /* U+24 "$" */ - 0x0, 0xc, 0x0, 0x0, 0x7, 0xd6, 0x10, 0xa, - 0xd5, 0xbb, 0x0, 0xe4, 0x1, 0xf0, 0xb, 0x90, - 0x0, 0x0, 0x3d, 0xd7, 0x10, 0x0, 0x4, 0xcc, - 0x2, 0x70, 0x1, 0xf3, 0x1f, 0x30, 0x3f, 0x10, - 0x6f, 0xdf, 0x60, 0x0, 0xf, 0x0, 0x0, 0x0, - 0x40, 0x0, + 0x0, 0xd, 0x0, 0x0, 0x6, 0xf6, 0x0, 0xa, + 0xc7, 0xd8, 0x0, 0xf2, 0x3, 0xe0, 0xe, 0x30, + 0x5, 0x0, 0x6f, 0x81, 0x0, 0x0, 0x3a, 0xf5, + 0x0, 0x0, 0x4, 0xe0, 0x4d, 0x0, 0xf, 0x0, + 0xe7, 0x4a, 0xc0, 0x2, 0xaf, 0x91, 0x0, 0x0, + 0xd0, 0x0, /* U+25 "%" */ - 0x6, 0x84, 0x0, 0x0, 0x3, 0xb1, 0xd0, 0x16, - 0x0, 0x78, 0xc, 0x38, 0x50, 0x2, 0xc7, 0xc3, - 0xc0, 0x0, 0x2, 0x41, 0xb2, 0x0, 0x0, 0x0, - 0x78, 0x8c, 0x70, 0x0, 0x1c, 0x3c, 0xc, 0x30, - 0xb, 0x44, 0xa0, 0xa4, 0x0, 0x20, 0xc, 0x9c, + 0xb, 0xc8, 0x0, 0x0, 0x5, 0x70, 0xc0, 0x28, + 0x0, 0x58, 0xc, 0xb, 0x10, 0x0, 0x9c, 0x65, + 0x70, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x0, 0x0, + 0x94, 0x8c, 0x80, 0x0, 0x3a, 0x2b, 0xa, 0x30, + 0xb, 0x12, 0xa0, 0x93, 0x0, 0x0, 0x9, 0xca, 0x0, /* U+26 "&" */ - 0x1, 0x79, 0x40, 0x0, 0xb, 0xb5, 0xf3, 0x0, - 0xc, 0x50, 0xd4, 0x0, 0x9, 0xa9, 0xa0, 0x0, - 0x5, 0xfc, 0x0, 0x0, 0x4f, 0x5f, 0x60, 0xf0, - 0x89, 0x3, 0xf9, 0xc0, 0x7b, 0x0, 0x8f, 0x50, - 0xb, 0xdc, 0xeb, 0xc1, + 0x2, 0xcf, 0xa0, 0x0, 0x9, 0x90, 0xb6, 0x0, + 0xa, 0x80, 0xc4, 0x0, 0x3, 0xec, 0x70, 0x0, + 0x5, 0xee, 0x0, 0x30, 0x2f, 0x29, 0xb2, 0xd0, + 0x5b, 0x0, 0xcc, 0x90, 0x2e, 0x10, 0x5f, 0x50, + 0x5, 0xdd, 0xc7, 0xe1, /* U+27 "'" */ - 0x27, 0x4f, 0x4a, 0x23, + 0x67, 0x67, 0x66, 0x0, /* U+28 "(" */ - 0x0, 0x4, 0x0, 0x8a, 0x4, 0xe0, 0xa, 0x60, - 0xf, 0x20, 0x1f, 0x0, 0x4f, 0x0, 0x2f, 0x0, - 0xf, 0x10, 0xb, 0x60, 0x4, 0xc0, 0x0, 0xa6, - 0x0, 0x7, + 0x0, 0x2, 0x0, 0x5a, 0x1, 0xd0, 0x8, 0x70, + 0xd, 0x30, 0x1f, 0x0, 0x2e, 0x0, 0x3e, 0x0, + 0x2f, 0x0, 0xf, 0x10, 0xb, 0x50, 0x5, 0xa0, + 0x0, 0xc4, 0x0, 0x19, /* U+29 ")" */ - 0x40, 0x0, 0xa8, 0x0, 0xe, 0x20, 0x7, 0xa0, - 0x3, 0xf0, 0x0, 0xf0, 0x0, 0xf4, 0x0, 0xf1, - 0x2, 0xf0, 0x7, 0xa0, 0xd, 0x40, 0x79, 0x0, - 0x70, 0x0, + 0x20, 0x0, 0x87, 0x0, 0xd, 0x20, 0x6, 0x90, + 0x2, 0xe0, 0x0, 0xe2, 0x0, 0xd4, 0x0, 0xc4, + 0x0, 0xd3, 0x0, 0xf1, 0x3, 0xd0, 0x9, 0x60, + 0x2c, 0x0, 0x82, 0x0, /* U+2A "*" */ - 0x0, 0x30, 0x1, 0x2c, 0x12, 0x4d, 0xed, 0x60, - 0x9d, 0x90, 0x7, 0x7, 0x0, + 0x0, 0xd0, 0x4, 0x1c, 0x4, 0x7d, 0xfe, 0x90, + 0x6e, 0x80, 0x1d, 0x1d, 0x20, 0x10, 0x10, /* U+2B "+" */ - 0x0, 0x4f, 0x0, 0x0, 0x4, 0xf0, 0x0, 0x47, - 0x9f, 0x77, 0x24, 0x8a, 0xf8, 0x82, 0x0, 0x4f, - 0x0, 0x0, 0x4, 0xf0, 0x0, 0x0, 0x14, 0x0, + 0x0, 0x1b, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, + 0x2e, 0x0, 0x8, 0xff, 0xff, 0xf4, 0x12, 0x4e, + 0x22, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x2e, 0x0, 0x0, /* U+2C "," */ - 0x13, 0x4c, 0x4a, 0x23, + 0x4c, 0x5b, 0xa5, 0x0, /* U+2D "-" */ - 0x0, 0x0, 0xdd, 0xd5, + 0xbf, 0xf1, /* U+2E "." */ - 0x2, 0x0, 0xf1, + 0x4, 0x1, 0xe1, /* U+2F "/" */ - 0x0, 0x4, 0x40, 0x0, 0xc4, 0x0, 0x2e, 0x0, - 0x8, 0x70, 0x0, 0xe2, 0x0, 0x5b, 0x0, 0xa, - 0x50, 0x1, 0xf0, 0x0, 0x79, 0x0, 0x9, 0x20, + 0x0, 0x8, 0x60, 0x0, 0xd1, 0x0, 0x3b, 0x0, + 0x9, 0x50, 0x0, 0xd0, 0x0, 0x4a, 0x0, 0xa, + 0x40, 0x0, 0xd0, 0x0, 0x59, 0x0, 0xb, 0x30, 0x0, /* U+30 "0" */ - 0x1, 0x68, 0x50, 0xc, 0xa4, 0xd8, 0x3f, 0x0, - 0x3f, 0x4c, 0x0, 0xf, 0x4c, 0x0, 0xf, 0x4c, - 0x0, 0xf, 0x4c, 0x0, 0x1f, 0x1f, 0x30, 0x7c, - 0x6, 0xfc, 0xe3, 0x0, 0x1, 0x0, + 0x3, 0xdf, 0xb1, 0x0, 0xe5, 0x9, 0xa0, 0x3d, + 0x0, 0x2f, 0x5, 0xc0, 0x0, 0xf0, 0x5c, 0x0, + 0xf, 0x14, 0xc0, 0x0, 0xf0, 0x3e, 0x0, 0x2f, + 0x0, 0xe5, 0x9, 0xa0, 0x3, 0xdf, 0xb1, 0x0, /* U+31 "1" */ - 0x57, 0x83, 0x68, 0xf4, 0x0, 0xf4, 0x0, 0xf4, - 0x0, 0xf4, 0x0, 0xf4, 0x0, 0xf4, 0x0, 0xf4, - 0x0, 0xf4, + 0x5, 0xc4, 0xea, 0xe4, 0x10, 0xd4, 0x0, 0xd4, + 0x0, 0xd4, 0x0, 0xd4, 0x0, 0xd4, 0x0, 0xd4, + 0x0, 0xd4, /* U+32 "2" */ - 0x1, 0x69, 0x60, 0x0, 0xca, 0x4c, 0xa0, 0x2f, - 0x0, 0x4e, 0x0, 0x0, 0x8, 0xb0, 0x0, 0x2, - 0xe3, 0x0, 0x1, 0xc7, 0x0, 0x0, 0xaa, 0x0, - 0x0, 0x9c, 0x0, 0x0, 0xf, 0xff, 0xff, 0x40, + 0x5, 0xdf, 0xb2, 0x2, 0xe3, 0x9, 0xb0, 0x48, + 0x0, 0x3d, 0x0, 0x0, 0x7, 0x90, 0x0, 0x2, + 0xe1, 0x0, 0x1, 0xd4, 0x0, 0x0, 0xc6, 0x0, + 0x0, 0xb8, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, /* U+33 "3" */ - 0x1, 0x69, 0x61, 0xd, 0x94, 0xca, 0x3c, 0x0, - 0x4e, 0x0, 0x0, 0x7c, 0x0, 0x6d, 0xf2, 0x0, - 0x0, 0x8b, 0x13, 0x0, 0x1f, 0x3f, 0x30, 0x6f, - 0x6, 0xeb, 0xf4, + 0x5, 0xdf, 0xb1, 0x2e, 0x20, 0x99, 0x25, 0x0, + 0x4c, 0x0, 0x0, 0xa8, 0x0, 0xbf, 0xd1, 0x0, + 0x0, 0x9a, 0x24, 0x0, 0x2e, 0x3e, 0x20, 0x8b, + 0x6, 0xef, 0xb1, /* U+34 "4" */ - 0x0, 0x1, 0x72, 0x0, 0x0, 0xaf, 0x40, 0x0, - 0x4e, 0xf4, 0x0, 0xd, 0x4f, 0x40, 0x7, 0xb0, - 0xf4, 0x1, 0xe1, 0xf, 0x40, 0x8e, 0xbb, 0xfc, - 0x60, 0x0, 0xf, 0x40, 0x0, 0x0, 0xf4, 0x0, + 0x0, 0x3, 0xf4, 0x0, 0x0, 0xcf, 0x40, 0x0, + 0x6a, 0xc4, 0x0, 0x1d, 0x1c, 0x40, 0x9, 0x70, + 0xc4, 0x3, 0xd0, 0xc, 0x40, 0xaf, 0xff, 0xff, + 0x70, 0x0, 0xc, 0x40, 0x0, 0x0, 0xc4, 0x0, /* U+35 "5" */ - 0x47, 0x77, 0x69, 0xc8, 0x86, 0xc6, 0x0, 0xc, - 0x87, 0x50, 0xfb, 0x8e, 0x94, 0x0, 0x4f, 0x40, - 0x0, 0xff, 0x30, 0x7e, 0x6e, 0xbf, 0x40, + 0x6, 0xff, 0xff, 0x0, 0x88, 0x11, 0x10, 0x9, + 0x60, 0x0, 0x0, 0xbc, 0xec, 0x30, 0x6, 0x62, + 0x8e, 0x0, 0x0, 0x0, 0xe2, 0x7, 0x0, 0xd, + 0x30, 0xd6, 0x5, 0xe0, 0x2, 0xcf, 0xc3, 0x0, /* U+36 "6" */ - 0x0, 0x59, 0x83, 0x0, 0x7d, 0x55, 0x40, 0xf, - 0x20, 0x0, 0x3, 0xf2, 0x64, 0x0, 0x4f, 0xa8, - 0xda, 0x4, 0xf0, 0x1, 0xf2, 0x1f, 0x0, 0xf, - 0x40, 0xd7, 0x4, 0xf0, 0x3, 0xec, 0xf5, 0x0, + 0x0, 0x4c, 0xe0, 0x0, 0x4e, 0x51, 0x0, 0xd, + 0x40, 0x0, 0x1, 0xf9, 0xec, 0x20, 0x3f, 0x60, + 0x7d, 0x3, 0xe0, 0x0, 0xf1, 0x1f, 0x0, 0xf, + 0x10, 0xb8, 0x7, 0xc0, 0x1, 0xcf, 0xc2, 0x0, /* U+37 "7" */ - 0x47, 0x77, 0x77, 0x24, 0x88, 0x89, 0xf2, 0x0, - 0x0, 0xc6, 0x0, 0x0, 0x6c, 0x0, 0x0, 0xe, - 0x30, 0x0, 0x5, 0xd0, 0x0, 0x0, 0x89, 0x0, - 0x0, 0xa, 0x80, 0x0, 0x0, 0xc8, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x30, 0x0, 0x2, 0xd0, 0x0, + 0x0, 0x97, 0x0, 0x0, 0x1e, 0x0, 0x0, 0x7, + 0x90, 0x0, 0x0, 0xe2, 0x0, 0x0, 0x5b, 0x0, + 0x0, 0xc, 0x50, 0x0, 0x3, 0xe0, 0x0, 0x0, /* U+38 "8" */ - 0x1, 0x69, 0x60, 0x0, 0xda, 0x4d, 0x90, 0x1f, - 0x0, 0x4d, 0x0, 0xf5, 0x8, 0xb0, 0x4, 0xef, - 0xe2, 0x1, 0xe7, 0x8, 0xb0, 0x5c, 0x0, 0xf, - 0x13, 0xf1, 0x4, 0xf0, 0x8, 0xeb, 0xf5, 0x0, + 0x3, 0xdf, 0xb1, 0x0, 0xe5, 0x9, 0xa0, 0x1f, + 0x0, 0x3d, 0x0, 0xd5, 0x9, 0x90, 0x4, 0xff, + 0xe1, 0x1, 0xe4, 0x7, 0xb0, 0x4c, 0x0, 0xf, + 0x2, 0xf3, 0x6, 0xd0, 0x5, 0xdf, 0xc3, 0x0, /* U+39 "9" */ - 0x1, 0x78, 0x50, 0x1d, 0x85, 0xd6, 0x5d, 0x0, - 0x5c, 0x7c, 0x0, 0x4f, 0x3f, 0x10, 0x7f, 0x9, - 0xfc, 0xdf, 0x0, 0x1, 0x4e, 0x0, 0x0, 0xba, - 0xb, 0xbd, 0xb1, + 0x4, 0xdf, 0x90, 0x1f, 0x31, 0xc7, 0x5b, 0x0, + 0x4d, 0x5b, 0x0, 0x2e, 0x1f, 0x30, 0xae, 0x5, + 0xde, 0x8d, 0x0, 0x0, 0x79, 0x0, 0x6, 0xe2, + 0x3, 0xeb, 0x30, /* U+3A ":" */ - 0x4f, 0x0, 0x4, 0xf0, + 0x1e, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x40, 0x1e, 0x0, /* U+3B ";" */ - 0x4, 0xf, 0x0, 0x0, 0x0, 0x13, 0x4c, 0x4a, - 0x23, + 0x3d, 0x4, 0x0, 0x0, 0x0, 0x18, 0x3d, 0x79, + 0x51, /* U+3C "<" */ - 0x0, 0x2, 0x94, 0x4, 0xaf, 0x81, 0x7e, 0x60, - 0x0, 0x2a, 0xe7, 0x20, 0x0, 0x2a, 0xf3, 0x0, - 0x0, 0x11, + 0x0, 0x2, 0x93, 0x2, 0x9f, 0x91, 0x6e, 0x71, + 0x0, 0x4d, 0xa3, 0x0, 0x0, 0x6e, 0xc1, 0x0, + 0x0, 0x62, /* U+3D "=" */ - 0xcb, 0xbb, 0x94, 0x44, 0x43, 0x43, 0x33, 0x38, - 0x88, 0x86, + 0x1e, 0xee, 0xeb, 0x1, 0x11, 0x11, 0x0, 0x0, + 0x0, 0x1e, 0xee, 0xeb, 0x1, 0x11, 0x11, /* U+3E ">" */ - 0x37, 0x10, 0x0, 0x1a, 0xf9, 0x30, 0x0, 0x16, - 0xca, 0x0, 0x6b, 0xe5, 0x3e, 0xc4, 0x0, 0x22, + 0x3a, 0x20, 0x0, 0x8, 0xea, 0x30, 0x0, 0x6, + 0xd9, 0x0, 0x3a, 0xe6, 0x1c, 0xe7, 0x0, 0x26, 0x0, 0x0, /* U+3F "?" */ - 0x6, 0x97, 0x20, 0x6e, 0x59, 0xd0, 0x54, 0x0, - 0xf3, 0x0, 0x4, 0xf0, 0x0, 0x1e, 0x60, 0x0, - 0xc8, 0x0, 0x0, 0x82, 0x0, 0x0, 0x41, 0x0, - 0x0, 0xf4, 0x0, + 0x9, 0xfe, 0x60, 0x6c, 0x13, 0xf0, 0x11, 0x0, + 0xe2, 0x0, 0x5, 0xd0, 0x0, 0x4e, 0x20, 0x0, + 0xc5, 0x0, 0x0, 0x51, 0x0, 0x0, 0x30, 0x0, + 0x0, 0xc3, 0x0, /* U+40 "@" */ - 0x0, 0x0, 0x34, 0x30, 0x0, 0x0, 0x3, 0xc9, - 0x58, 0xb6, 0x0, 0x2, 0xc2, 0x0, 0x0, 0xa4, - 0x0, 0xa4, 0x5, 0xba, 0x21, 0xb0, 0xd, 0x4, - 0xe1, 0x86, 0xc, 0x4, 0xb0, 0xa6, 0x9, 0x40, - 0xc1, 0x48, 0xc, 0x40, 0xc4, 0xc, 0x14, 0xb0, - 0xc5, 0xd, 0x41, 0xb0, 0x1e, 0x5, 0xec, 0xab, - 0xd3, 0x0, 0xa7, 0x1, 0x0, 0x0, 0x0, 0x1, - 0xc6, 0x30, 0x42, 0x0, 0x0, 0x0, 0x58, 0xb7, - 0x20, 0x0, + 0x0, 0x6, 0xcd, 0xda, 0x10, 0x0, 0xa, 0x81, + 0x0, 0x4c, 0x10, 0x5, 0x90, 0x0, 0x0, 0x39, + 0x0, 0xc1, 0x5, 0xcb, 0x20, 0xb0, 0x1c, 0x2, + 0xc0, 0x86, 0xa, 0x14, 0x90, 0x95, 0x9, 0x40, + 0x92, 0x58, 0xc, 0x20, 0xa2, 0xb, 0x14, 0x90, + 0xb3, 0xe, 0x21, 0xb0, 0x1c, 0x4, 0xda, 0x5d, + 0xc2, 0x0, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xd3, 0x0, 0x11, 0x0, 0x0, 0x2, 0xad, 0xcc, + 0x30, 0x0, /* U+41 "A" */ - 0x0, 0x6, 0x30, 0x0, 0x0, 0x1f, 0xb0, 0x0, - 0x0, 0x6c, 0xf1, 0x0, 0x0, 0xd6, 0xb6, 0x0, - 0x2, 0xf0, 0x6b, 0x0, 0x7, 0xb3, 0x4f, 0x20, - 0xe, 0xdc, 0xce, 0x70, 0x3f, 0x0, 0x6, 0xc0, - 0x9a, 0x0, 0x1, 0xf2, + 0x0, 0xc, 0x90, 0x0, 0x0, 0x2e, 0xe0, 0x0, + 0x0, 0x79, 0xc4, 0x0, 0x0, 0xd4, 0x7a, 0x0, + 0x3, 0xe0, 0x1f, 0x10, 0x9, 0xa0, 0xc, 0x60, + 0xe, 0xff, 0xff, 0xc0, 0x4e, 0x0, 0x1, 0xf2, + 0xa8, 0x0, 0x0, 0xb7, /* U+42 "B" */ - 0x87, 0x77, 0x20, 0xf, 0x88, 0x9f, 0x30, 0xf0, - 0x0, 0xa8, 0xf, 0x0, 0x1d, 0x60, 0xff, 0xff, - 0xc1, 0xf, 0x0, 0x8, 0xd0, 0xf0, 0x0, 0xf, - 0x1f, 0x0, 0x6, 0xf0, 0xff, 0xff, 0xd4, 0x0, + 0xf, 0xff, 0xe8, 0x0, 0xf1, 0x2, 0xd5, 0xf, + 0x10, 0x9, 0x80, 0xf1, 0x2, 0xe4, 0xf, 0xff, + 0xfb, 0x0, 0xf1, 0x1, 0xb8, 0xf, 0x10, 0x5, + 0xc0, 0xf1, 0x1, 0xb9, 0xf, 0xff, 0xea, 0x0, /* U+43 "C" */ - 0x0, 0x58, 0x85, 0x0, 0x7e, 0x65, 0xd9, 0x1e, - 0x40, 0x2, 0xf4, 0xf0, 0x0, 0x4, 0x4c, 0x0, - 0x0, 0x4, 0xc0, 0x0, 0x0, 0x3f, 0x10, 0x0, - 0xc0, 0xc9, 0x0, 0x7d, 0x1, 0xcd, 0xdc, 0x30, + 0x0, 0x8e, 0xea, 0x10, 0x9, 0xb2, 0x19, 0xc0, + 0x1f, 0x10, 0x0, 0xe2, 0x3e, 0x0, 0x0, 0x0, + 0x4d, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x0, + 0x1f, 0x10, 0x0, 0xe2, 0x9, 0xb2, 0x18, 0xc0, + 0x0, 0x9f, 0xea, 0x10, /* U+44 "D" */ - 0x87, 0x75, 0x20, 0xf, 0xa8, 0x9e, 0x50, 0xf4, - 0x0, 0x4f, 0x1f, 0x40, 0x0, 0xe4, 0xf4, 0x0, - 0xc, 0x7f, 0x40, 0x0, 0xc5, 0xf4, 0x0, 0x1f, - 0x3f, 0x40, 0x1a, 0xb0, 0xff, 0xfe, 0x81, 0x0, + 0xf, 0xff, 0xd4, 0x0, 0xf, 0x10, 0x4e, 0x40, + 0xf, 0x10, 0x4, 0xd0, 0xf, 0x10, 0x0, 0xf1, + 0xf, 0x10, 0x0, 0xf2, 0xf, 0x10, 0x0, 0xf1, + 0xf, 0x10, 0x5, 0xd0, 0xf, 0x10, 0x4e, 0x40, + 0xf, 0xff, 0xd4, 0x0, /* U+45 "E" */ - 0x87, 0x77, 0x72, 0xf8, 0x88, 0x82, 0xf0, 0x0, - 0x0, 0xf0, 0x0, 0x0, 0xfb, 0xbb, 0x60, 0xf0, - 0x0, 0x0, 0xf0, 0x0, 0x0, 0xf0, 0x0, 0x0, - 0xff, 0xff, 0xf4, + 0xf, 0xff, 0xff, 0x50, 0xf1, 0x0, 0x0, 0xf, + 0x10, 0x0, 0x0, 0xf1, 0x0, 0x0, 0xf, 0xff, + 0xfd, 0x0, 0xf1, 0x0, 0x0, 0xf, 0x10, 0x0, + 0x0, 0xf1, 0x0, 0x0, 0xf, 0xff, 0xff, 0x60, /* U+46 "F" */ - 0x87, 0x77, 0x72, 0xf8, 0x88, 0x82, 0xf0, 0x0, - 0x0, 0xf0, 0x0, 0x0, 0xfb, 0xbb, 0x90, 0xf4, - 0x44, 0x30, 0xf0, 0x0, 0x0, 0xf0, 0x0, 0x0, - 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x40, 0xf1, 0x0, 0x0, 0xf, + 0x10, 0x0, 0x0, 0xf1, 0x0, 0x0, 0xf, 0xff, + 0xfa, 0x0, 0xf1, 0x0, 0x0, 0xf, 0x10, 0x0, + 0x0, 0xf1, 0x0, 0x0, 0xf, 0x10, 0x0, 0x0, /* U+47 "G" */ - 0x0, 0x48, 0x85, 0x0, 0x7, 0xe6, 0x5d, 0x90, - 0x1e, 0x30, 0x2, 0xf0, 0x4f, 0x0, 0x0, 0x0, - 0x4f, 0x0, 0x43, 0x31, 0x4f, 0x0, 0xcc, 0xf4, - 0x3f, 0x10, 0x0, 0xf4, 0xc, 0x90, 0x2, 0xf3, - 0x1, 0xbe, 0xbf, 0x60, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x8e, 0xfb, 0x20, 0x9, 0xb2, 0x7, 0xe0, + 0x1f, 0x20, 0x0, 0x61, 0x3e, 0x0, 0x0, 0x0, + 0x4d, 0x0, 0xcf, 0xf4, 0x3e, 0x0, 0x0, 0xd4, + 0xf, 0x20, 0x0, 0xd4, 0x8, 0xd2, 0x4, 0xf3, + 0x0, 0x7e, 0xfd, 0x60, /* U+48 "H" */ - 0x82, 0x0, 0x6, 0x4f, 0x40, 0x0, 0xc8, 0xf4, - 0x0, 0xc, 0x8f, 0x40, 0x0, 0xc8, 0xfc, 0xbb, - 0xbe, 0x8f, 0x74, 0x44, 0xd8, 0xf4, 0x0, 0xc, - 0x8f, 0x40, 0x0, 0xc8, 0xf4, 0x0, 0xc, 0x80, + 0xf, 0x10, 0x0, 0x98, 0xf, 0x10, 0x0, 0x98, + 0xf, 0x10, 0x0, 0x98, 0xf, 0x10, 0x0, 0x98, + 0xf, 0xff, 0xff, 0xf8, 0xf, 0x10, 0x0, 0x98, + 0xf, 0x10, 0x0, 0x98, 0xf, 0x10, 0x0, 0x98, + 0xf, 0x10, 0x0, 0x98, /* U+49 "I" */ - 0x72, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, - 0xe4, + 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, + 0xe3, /* U+4A "J" */ - 0x0, 0x0, 0x44, 0x0, 0x0, 0x88, 0x0, 0x0, - 0x88, 0x0, 0x0, 0x88, 0x0, 0x0, 0x88, 0x0, - 0x0, 0x88, 0x22, 0x0, 0x88, 0x7c, 0x0, 0xe7, - 0xc, 0xdd, 0xb0, + 0x0, 0x0, 0x7b, 0x0, 0x0, 0x7b, 0x0, 0x0, + 0x7b, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x7b, 0x0, + 0x0, 0x7b, 0x64, 0x0, 0x7a, 0x7c, 0x12, 0xd6, + 0x9, 0xee, 0x90, /* U+4B "K" */ - 0x80, 0x0, 0x37, 0xf, 0x0, 0x1d, 0x60, 0xf0, - 0xc, 0x90, 0xf, 0x9, 0xb0, 0x0, 0xfb, 0xf2, - 0x0, 0xf, 0x4c, 0x90, 0x0, 0xf0, 0x1e, 0x70, - 0xf, 0x0, 0x3f, 0x50, 0xf0, 0x0, 0x6f, 0x30, + 0xf, 0x10, 0x8, 0xc0, 0xf, 0x10, 0x5e, 0x10, + 0xf, 0x13, 0xe3, 0x0, 0xf, 0x4e, 0x40, 0x0, + 0xf, 0xef, 0x40, 0x0, 0xf, 0x85, 0xe1, 0x0, + 0xf, 0x10, 0x9b, 0x0, 0xf, 0x10, 0xd, 0x70, + 0xf, 0x10, 0x3, 0xf3, /* U+4C "L" */ - 0x82, 0x0, 0x0, 0xf4, 0x0, 0x0, 0xf4, 0x0, - 0x0, 0xf4, 0x0, 0x0, 0xf4, 0x0, 0x0, 0xf4, - 0x0, 0x0, 0xf4, 0x0, 0x0, 0xf4, 0x0, 0x0, - 0xff, 0xff, 0xf4, + 0xf, 0x20, 0x0, 0x0, 0xf2, 0x0, 0x0, 0xf, + 0x20, 0x0, 0x0, 0xf2, 0x0, 0x0, 0xf, 0x20, + 0x0, 0x0, 0xf2, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0x20, /* U+4D "M" */ - 0x85, 0x0, 0x0, 0x17, 0x4f, 0xd0, 0x0, 0x7, - 0xf8, 0xfe, 0x40, 0x0, 0xef, 0x8f, 0x6a, 0x0, - 0x4d, 0xc8, 0xf1, 0xf1, 0xa, 0x6c, 0x8f, 0xa, - 0x71, 0xf1, 0xc8, 0xf0, 0x3e, 0x7a, 0xc, 0x8f, - 0x0, 0xde, 0x30, 0xc8, 0xf0, 0x6, 0xd0, 0xc, - 0x80, + 0xf, 0xa0, 0x0, 0x2, 0xf7, 0xf, 0xf0, 0x0, + 0x8, 0xf7, 0xf, 0xb6, 0x0, 0xe, 0xb7, 0xf, + 0x5c, 0x0, 0x4c, 0x97, 0xf, 0x1e, 0x20, 0xb6, + 0x97, 0xf, 0x18, 0x81, 0xe0, 0xa7, 0xf, 0x12, + 0xe7, 0x90, 0xa7, 0xf, 0x10, 0xcf, 0x30, 0xa7, + 0xf, 0x10, 0x6d, 0x0, 0xa7, /* U+4E "N" */ - 0x83, 0x0, 0x6, 0x4f, 0xb0, 0x0, 0xc8, 0xff, - 0x70, 0xc, 0x8f, 0x7f, 0x20, 0xc8, 0xf4, 0x9a, - 0xc, 0x8f, 0x41, 0xe5, 0xc8, 0xf4, 0x4, 0xed, - 0x8f, 0x40, 0xb, 0xf8, 0xf4, 0x0, 0x1f, 0x80, + 0xf, 0x60, 0x0, 0x98, 0xf, 0xf1, 0x0, 0x98, + 0xf, 0xba, 0x0, 0x98, 0xf, 0x3e, 0x40, 0x98, + 0xf, 0x25, 0xd0, 0x98, 0xf, 0x20, 0xb8, 0x98, + 0xf, 0x20, 0x2f, 0xb8, 0xf, 0x20, 0x8, 0xf8, + 0xf, 0x20, 0x0, 0xd8, /* U+4F "O" */ - 0x0, 0x48, 0x85, 0x0, 0x7, 0xf7, 0x6d, 0x90, - 0x1e, 0x20, 0x1, 0xf3, 0x4e, 0x0, 0x0, 0xc7, - 0x4c, 0x0, 0x0, 0xc8, 0x4c, 0x0, 0x0, 0xc8, - 0x3f, 0x0, 0x0, 0xd5, 0xc, 0x90, 0x6, 0xe1, - 0x1, 0xce, 0xed, 0x30, + 0x0, 0x8e, 0xfa, 0x10, 0x8, 0xc3, 0x29, 0xc0, + 0xf, 0x20, 0x0, 0xd4, 0x3e, 0x0, 0x0, 0xa7, + 0x4d, 0x0, 0x0, 0x98, 0x3e, 0x0, 0x0, 0xa7, + 0xf, 0x20, 0x0, 0xd4, 0x8, 0xc2, 0x19, 0xc0, + 0x0, 0x8e, 0xfa, 0x10, /* U+50 "P" */ - 0x87, 0x77, 0x40, 0xf8, 0x88, 0xd9, 0xf0, 0x0, - 0x3f, 0xf0, 0x0, 0x2f, 0xf3, 0x35, 0xca, 0xf8, - 0x88, 0x60, 0xf0, 0x0, 0x0, 0xf0, 0x0, 0x0, - 0xf0, 0x0, 0x0, + 0xf, 0xff, 0xfb, 0x20, 0xf, 0x10, 0x8, 0xd0, + 0xf, 0x10, 0x0, 0xf1, 0xf, 0x10, 0x7, 0xe0, + 0xf, 0xff, 0xfc, 0x30, 0xf, 0x10, 0x0, 0x0, + 0xf, 0x10, 0x0, 0x0, 0xf, 0x10, 0x0, 0x0, + 0xf, 0x10, 0x0, 0x0, /* U+51 "Q" */ - 0x0, 0x48, 0x85, 0x0, 0x7, 0xf7, 0x6d, 0x90, - 0x1e, 0x20, 0x1, 0xf3, 0x4e, 0x0, 0x0, 0xc7, - 0x4c, 0x0, 0x0, 0xc8, 0x4c, 0x0, 0x0, 0xc8, - 0x3f, 0x0, 0x0, 0xd6, 0xc, 0x90, 0x6, 0xf1, - 0x1, 0xce, 0xed, 0xf6, 0x0, 0x0, 0x0, 0x39, + 0x0, 0x9e, 0xfa, 0x10, 0x9, 0xc2, 0x2a, 0xc0, + 0x1f, 0x10, 0x0, 0xe3, 0x4d, 0x0, 0x0, 0xb6, + 0x5c, 0x0, 0x0, 0xa7, 0x4d, 0x0, 0x0, 0xb7, + 0x1f, 0x10, 0x0, 0xe3, 0x9, 0xb2, 0x19, 0xc0, + 0x0, 0x8e, 0xff, 0x50, 0x0, 0x0, 0x5, 0xf3, + 0x0, 0x0, 0x0, 0x20, /* U+52 "R" */ - 0x87, 0x77, 0x40, 0xf, 0xa8, 0x8f, 0x70, 0xf4, - 0x0, 0x5c, 0xf, 0x40, 0x6, 0xb0, 0xf9, 0x7b, - 0xe3, 0xf, 0x74, 0x5d, 0x80, 0xf4, 0x0, 0x5c, - 0xf, 0x40, 0x4, 0xc0, 0xf4, 0x0, 0x3f, 0x10, + 0xf, 0xff, 0xe9, 0x0, 0xf, 0x10, 0x1b, 0x80, + 0xf, 0x10, 0x6, 0xc0, 0xf, 0x10, 0x1c, 0x80, + 0xf, 0xff, 0xf9, 0x0, 0xf, 0x10, 0xa8, 0x0, + 0xf, 0x10, 0x2e, 0x0, 0xf, 0x10, 0xb, 0x70, + 0xf, 0x10, 0x4, 0xe0, /* U+53 "S" */ - 0x0, 0x69, 0x72, 0x0, 0x9b, 0x47, 0xf3, 0xf, - 0x40, 0x9, 0x90, 0xd8, 0x0, 0x0, 0x3, 0xce, - 0x93, 0x0, 0x0, 0x28, 0xf5, 0x27, 0x0, 0x8, - 0xc1, 0xf4, 0x0, 0xb9, 0x4, 0xec, 0xdb, 0x10, + 0x3, 0xcf, 0xd6, 0x1, 0xf5, 0x3, 0xe4, 0x3e, + 0x0, 0x5, 0x60, 0xd9, 0x20, 0x0, 0x1, 0x8e, + 0xc4, 0x0, 0x0, 0x5, 0xe4, 0x57, 0x0, 0x8, + 0x93, 0xf4, 0x2, 0xc7, 0x4, 0xcf, 0xe8, 0x0, /* U+54 "T" */ - 0x67, 0x77, 0x77, 0x76, 0x88, 0xfa, 0x88, 0x0, - 0xf, 0x40, 0x0, 0x0, 0xf4, 0x0, 0x0, 0xf, - 0x40, 0x0, 0x0, 0xf4, 0x0, 0x0, 0xf, 0x40, - 0x0, 0x0, 0xf4, 0x0, 0x0, 0xf, 0x40, 0x0, + 0xbf, 0xff, 0xff, 0xe0, 0x0, 0xf2, 0x0, 0x0, + 0xf, 0x20, 0x0, 0x0, 0xf2, 0x0, 0x0, 0xf, + 0x20, 0x0, 0x0, 0xf2, 0x0, 0x0, 0xf, 0x20, + 0x0, 0x0, 0xf2, 0x0, 0x0, 0xf, 0x20, 0x0, /* U+55 "U" */ - 0x27, 0x0, 0x0, 0x62, 0x4f, 0x0, 0x0, 0xc4, - 0x4f, 0x0, 0x0, 0xc4, 0x4f, 0x0, 0x0, 0xc4, - 0x4f, 0x0, 0x0, 0xc4, 0x4f, 0x0, 0x0, 0xc4, - 0x1f, 0x10, 0x0, 0xf4, 0xd, 0x80, 0x6, 0xf0, - 0x3, 0xcd, 0xdd, 0x30, + 0x2f, 0x0, 0x2, 0xf2, 0xf0, 0x0, 0x2f, 0x2f, + 0x0, 0x2, 0xf2, 0xf0, 0x0, 0x2f, 0x2f, 0x0, + 0x2, 0xf2, 0xf0, 0x0, 0x2f, 0x1f, 0x0, 0x3, + 0xe0, 0xc8, 0x1, 0xb9, 0x2, 0xbf, 0xe9, 0x0, /* U+56 "V" */ - 0x64, 0x0, 0x0, 0x73, 0x8b, 0x0, 0x2, 0xf1, - 0x2f, 0x20, 0x7, 0xb0, 0xc, 0x70, 0xe, 0x60, - 0x6, 0xc0, 0x3f, 0x0, 0x1, 0xf2, 0x9a, 0x0, - 0x0, 0xa7, 0xe3, 0x0, 0x0, 0x4f, 0xe0, 0x0, - 0x0, 0xe, 0x70, 0x0, + 0xa8, 0x0, 0x0, 0xe4, 0x4d, 0x0, 0x3, 0xe0, + 0xe, 0x20, 0x8, 0x90, 0x9, 0x80, 0xd, 0x40, + 0x4, 0xd0, 0x3e, 0x0, 0x0, 0xe2, 0x88, 0x0, + 0x0, 0x87, 0xd3, 0x0, 0x0, 0x3e, 0xd0, 0x0, + 0x0, 0xd, 0x70, 0x0, /* U+57 "W" */ - 0x64, 0x0, 0x46, 0x0, 0x27, 0x9b, 0x0, 0xbf, - 0x0, 0x6e, 0x5e, 0x0, 0xfe, 0x50, 0x9a, 0x1f, - 0x23, 0xe9, 0x90, 0xd6, 0xd, 0x68, 0xa4, 0xc0, - 0xf2, 0x9, 0x9c, 0x50, 0xf6, 0xf0, 0x5, 0xcf, - 0x10, 0xbc, 0xb0, 0x1, 0xfc, 0x0, 0x6f, 0x70, - 0x0, 0xd7, 0x0, 0x2f, 0x30, + 0x89, 0x0, 0x3f, 0x0, 0xd, 0x44, 0xc0, 0x7, + 0xf4, 0x1, 0xf0, 0x1f, 0x0, 0xca, 0x80, 0x4d, + 0x0, 0xd3, 0xe, 0x3c, 0x7, 0x90, 0x9, 0x74, + 0xb0, 0xe0, 0xb5, 0x0, 0x6a, 0x86, 0xa, 0x5e, + 0x20, 0x2, 0xed, 0x20, 0x6a, 0xe0, 0x0, 0xe, + 0xd0, 0x1, 0xfa, 0x0, 0x0, 0xb9, 0x0, 0xd, + 0x70, 0x0, /* U+58 "X" */ - 0x37, 0x0, 0x3, 0x70, 0x1e, 0x70, 0xd, 0x80, - 0x4, 0xf1, 0x7e, 0x10, 0x0, 0x9a, 0xe4, 0x0, - 0x0, 0x1f, 0xa0, 0x0, 0x0, 0x5f, 0xf1, 0x0, - 0x1, 0xe4, 0xaa, 0x0, 0xb, 0xb0, 0x1f, 0x40, - 0x4f, 0x20, 0x7, 0xd1, + 0x4e, 0x10, 0x7, 0xd0, 0xb, 0x90, 0x1f, 0x30, + 0x2, 0xf2, 0x9a, 0x0, 0x0, 0x7d, 0xe1, 0x0, + 0x0, 0x1f, 0x90, 0x0, 0x0, 0x8d, 0xf1, 0x0, + 0x2, 0xf2, 0x9a, 0x0, 0xc, 0x90, 0x1e, 0x40, + 0x5e, 0x0, 0x6, 0xd0, /* U+59 "Y" */ - 0x56, 0x0, 0x1, 0x71, 0x4f, 0x20, 0x8, 0xc0, - 0xa, 0xa0, 0x1e, 0x40, 0x2, 0xf2, 0x8b, 0x0, - 0x0, 0xab, 0xf2, 0x0, 0x0, 0x1f, 0xa0, 0x0, - 0x0, 0xc, 0x40, 0x0, 0x0, 0xc, 0x40, 0x0, - 0x0, 0xc, 0x40, 0x0, + 0xa9, 0x0, 0x6, 0xd0, 0x2f, 0x10, 0xe, 0x40, + 0x9, 0x90, 0x6c, 0x0, 0x1, 0xe1, 0xd4, 0x0, + 0x0, 0x9c, 0xb0, 0x0, 0x0, 0x1f, 0x40, 0x0, + 0x0, 0xf, 0x20, 0x0, 0x0, 0xf, 0x20, 0x0, + 0x0, 0xf, 0x20, 0x0, /* U+5A "Z" */ - 0x27, 0x77, 0x77, 0x42, 0x88, 0x89, 0xf5, 0x0, - 0x0, 0xbb, 0x0, 0x0, 0x5f, 0x10, 0x0, 0x1e, - 0x50, 0x0, 0xb, 0x90, 0x0, 0x5, 0xe1, 0x0, - 0x1, 0xe4, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xc0, + 0x6f, 0xff, 0xff, 0x80, 0x0, 0x2, 0xf2, 0x0, + 0x0, 0xc7, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x2f, + 0x20, 0x0, 0xc, 0x70, 0x0, 0x7, 0xc0, 0x0, + 0x2, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xb0, /* U+5B "[" */ - 0x3b, 0xb4, 0xf4, 0x4f, 0x4, 0xf0, 0x4f, 0x4, - 0xf0, 0x4f, 0x4, 0xf0, 0x4f, 0x4, 0xf0, 0x4f, - 0x3, 0xcc, + 0x2f, 0xf0, 0x2f, 0x0, 0x2f, 0x0, 0x2f, 0x0, + 0x2f, 0x0, 0x2f, 0x0, 0x2f, 0x0, 0x2f, 0x0, + 0x2f, 0x0, 0x2f, 0x0, 0x2f, 0x0, 0x2f, 0x0, + 0x2f, 0xf0, /* U+5C "\\" */ - 0x53, 0x0, 0x6, 0xb0, 0x0, 0x1f, 0x20, 0x0, - 0xa7, 0x0, 0x3, 0xe0, 0x0, 0xe, 0x40, 0x0, - 0x7a, 0x0, 0x1, 0xf1, 0x0, 0xb, 0x60, 0x0, - 0x49, + 0x97, 0x0, 0x3, 0xc0, 0x0, 0xd, 0x20, 0x0, + 0x88, 0x0, 0x2, 0xd0, 0x0, 0xc, 0x30, 0x0, + 0x79, 0x0, 0x1, 0xe0, 0x0, 0xb, 0x40, 0x0, + 0x6a, /* U+5D "]" */ - 0xcb, 0x34, 0xd4, 0xc, 0x40, 0xc4, 0xc, 0x40, - 0xc4, 0xc, 0x40, 0xc4, 0xc, 0x40, 0xc4, 0xc, - 0x4c, 0xc3, + 0xef, 0x40, 0xd4, 0xd, 0x40, 0xd4, 0xd, 0x40, + 0xd4, 0xd, 0x40, 0xd4, 0xd, 0x40, 0xd4, 0xd, + 0x40, 0xd4, 0xef, 0x40, /* U+5E "^" */ - 0x0, 0x80, 0x0, 0x5f, 0x50, 0xc, 0xab, 0x2, - 0xe0, 0xe2, 0x67, 0x7, 0x60, + 0x0, 0x70, 0x0, 0x4f, 0x40, 0xa, 0x9a, 0x1, + 0xe0, 0xe1, 0x69, 0x9, 0x60, /* U+5F "_" */ - 0xde, 0xee, 0xe6, + 0xef, 0xff, 0xf5, /* U+60 "`" */ - 0x3e, 0x20, 0x38, + 0x4e, 0x0, 0x87, /* U+61 "a" */ - 0x0, 0x57, 0x30, 0xc, 0xb8, 0xf6, 0x8, 0x0, - 0x8c, 0x4, 0x9b, 0xdc, 0x3f, 0x40, 0x8c, 0x4c, - 0x1, 0xac, 0x1d, 0xde, 0x8c, + 0x4, 0xde, 0xb0, 0x1f, 0x30, 0xb7, 0x2, 0x0, + 0x7a, 0x5, 0xcd, 0xea, 0x3e, 0x10, 0x7a, 0x4e, + 0x12, 0xca, 0x9, 0xfd, 0x9b, /* U+62 "b" */ - 0x13, 0x0, 0x0, 0x4, 0xf0, 0x0, 0x0, 0x4f, - 0x0, 0x0, 0x4, 0xf2, 0x63, 0x0, 0x4f, 0xc8, - 0xe9, 0x4, 0xf1, 0x3, 0xf0, 0x4f, 0x0, 0xf, - 0x44, 0xf0, 0x0, 0xf4, 0x4f, 0x30, 0x4f, 0x4, - 0xdc, 0xcf, 0x60, + 0x2e, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x2e, + 0x0, 0x0, 0x2, 0xe9, 0xec, 0x20, 0x2f, 0x50, + 0x8c, 0x2, 0xe0, 0x0, 0xf1, 0x2e, 0x0, 0xe, + 0x22, 0xe0, 0x0, 0xf1, 0x2f, 0x50, 0x8c, 0x2, + 0xd9, 0xec, 0x20, /* U+63 "c" */ - 0x0, 0x46, 0x20, 0xa, 0xb8, 0xf5, 0x3f, 0x0, - 0x59, 0x7c, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x2f, - 0x30, 0x8a, 0x6, 0xfc, 0xd2, + 0x3, 0xdf, 0xb1, 0x1e, 0x40, 0x99, 0x5b, 0x0, + 0x16, 0x6a, 0x0, 0x0, 0x5b, 0x0, 0x3, 0x1e, + 0x40, 0x8a, 0x3, 0xdf, 0xa1, /* U+64 "d" */ - 0x0, 0x0, 0x13, 0x0, 0x0, 0x4f, 0x0, 0x0, - 0x4f, 0x0, 0x56, 0x5f, 0xc, 0xd8, 0xdf, 0x3f, - 0x10, 0x4f, 0x6c, 0x0, 0x4f, 0x6c, 0x0, 0x4f, - 0x2f, 0x30, 0x7f, 0x7, 0xfc, 0xaf, + 0x0, 0x0, 0x2e, 0x0, 0x0, 0x2e, 0x0, 0x0, + 0x2e, 0x4, 0xde, 0x9e, 0x1f, 0x50, 0x8e, 0x5c, + 0x0, 0x2e, 0x6a, 0x0, 0x2e, 0x5b, 0x0, 0x2e, + 0x1e, 0x30, 0x7e, 0x4, 0xdd, 0x9e, /* U+65 "e" */ - 0x0, 0x46, 0x20, 0xa, 0xc8, 0xf4, 0x3f, 0x10, - 0x7b, 0x7e, 0xbb, 0xcc, 0x6c, 0x0, 0x0, 0x2f, - 0x30, 0x1, 0x5, 0xfb, 0xd6, + 0x3, 0xcf, 0xa0, 0xe, 0x50, 0xa8, 0x4c, 0x0, + 0x3d, 0x6f, 0xff, 0xfe, 0x5b, 0x0, 0x0, 0x1e, + 0x40, 0x47, 0x3, 0xcf, 0xc3, /* U+66 "f" */ - 0x0, 0x33, 0x6, 0xfc, 0xc, 0x50, 0x3c, 0x62, - 0x6e, 0xa4, 0xc, 0x40, 0xc, 0x40, 0xc, 0x40, - 0xc, 0x40, 0xc, 0x40, + 0x1, 0xcf, 0x20, 0x8a, 0x0, 0xa, 0x70, 0x9, + 0xff, 0xb0, 0xa, 0x70, 0x0, 0xa7, 0x0, 0xa, + 0x70, 0x0, 0xa7, 0x0, 0xa, 0x70, 0x0, 0xa7, + 0x0, /* U+67 "g" */ - 0x0, 0x56, 0x14, 0xa, 0xd8, 0xcf, 0x2f, 0x10, - 0x4f, 0x4c, 0x0, 0x4f, 0x4c, 0x0, 0x4f, 0x2f, - 0x30, 0x7f, 0x6, 0xfb, 0xdf, 0x0, 0x0, 0x4f, - 0x7, 0x77, 0xc9, 0x2, 0x88, 0x60, + 0x4, 0xde, 0x8e, 0x1f, 0x50, 0x8e, 0x5c, 0x0, + 0x2e, 0x6a, 0x0, 0x2e, 0x5c, 0x0, 0x2e, 0x1f, + 0x50, 0x9e, 0x4, 0xde, 0x9e, 0x0, 0x0, 0x4d, + 0xb, 0x20, 0xb9, 0x6, 0xee, 0xa1, /* U+68 "h" */ - 0x13, 0x0, 0x0, 0x4f, 0x0, 0x0, 0x4f, 0x0, - 0x0, 0x4f, 0x16, 0x40, 0x4f, 0xb8, 0xda, 0x4f, - 0x0, 0x4f, 0x4f, 0x0, 0x4f, 0x4f, 0x0, 0x4f, - 0x4f, 0x0, 0x4f, 0x4f, 0x0, 0x4f, + 0x2e, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x2e, 0x0, + 0x0, 0x2e, 0x8f, 0xd2, 0x2f, 0x60, 0x9a, 0x2e, + 0x0, 0x4c, 0x2e, 0x0, 0x4d, 0x2e, 0x0, 0x4d, + 0x2e, 0x0, 0x4d, 0x2e, 0x0, 0x4d, /* U+69 "i" */ - 0x4f, 0x4, 0xff, 0xff, 0xff, + 0x1e, 0x0, 0x30, 0x1f, 0x1, 0xf0, 0x1f, 0x1, + 0xf0, 0x1f, 0x1, 0xf0, 0x1f, 0x0, /* U+6A "j" */ - 0x0, 0x41, 0x0, 0xf4, 0x0, 0x0, 0x0, 0x41, - 0x0, 0xf4, 0x0, 0xf4, 0x0, 0xf4, 0x0, 0xf4, - 0x0, 0xf4, 0x0, 0xf4, 0x0, 0xf3, 0x28, 0xf0, - 0x38, 0x30, + 0x2, 0xd0, 0x0, 0x30, 0x2, 0xf0, 0x2, 0xf0, + 0x2, 0xf0, 0x2, 0xf0, 0x2, 0xf0, 0x2, 0xf0, + 0x2, 0xf0, 0x2, 0xe0, 0x4, 0xd0, 0x5f, 0x60, /* U+6B "k" */ - 0x13, 0x0, 0x0, 0x4f, 0x0, 0x0, 0x4f, 0x0, - 0x0, 0x4f, 0x0, 0x33, 0x4f, 0x3, 0xe4, 0x4f, - 0xd, 0x80, 0x4f, 0xcd, 0x0, 0x4f, 0x1f, 0x50, - 0x4f, 0x5, 0xf1, 0x4f, 0x0, 0xba, + 0x2e, 0x0, 0x0, 0x2, 0xe0, 0x0, 0x0, 0x2e, + 0x0, 0x0, 0x2, 0xe0, 0x1d, 0x50, 0x2e, 0xc, + 0x80, 0x2, 0xea, 0xa0, 0x0, 0x2f, 0xfb, 0x0, + 0x2, 0xf2, 0xd6, 0x0, 0x2e, 0x3, 0xe1, 0x2, + 0xe0, 0x8, 0xb0, /* U+6C "l" */ - 0x2, 0x0, 0xf1, 0xf, 0x10, 0xf1, 0xf, 0x10, - 0xf1, 0xf, 0x10, 0xf1, 0xf, 0x10, 0xf1, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, /* U+6D "m" */ - 0x13, 0x16, 0x50, 0x27, 0x30, 0x4f, 0xb8, 0xfa, - 0xc9, 0xf4, 0x4f, 0x0, 0x7f, 0x0, 0x98, 0x4f, - 0x0, 0x4c, 0x0, 0x8c, 0x4f, 0x0, 0x4c, 0x0, - 0x8c, 0x4f, 0x0, 0x4c, 0x0, 0x8c, 0x4f, 0x0, - 0x4c, 0x0, 0x8c, + 0x3e, 0x9e, 0xd3, 0xbf, 0xc1, 0x3f, 0x50, 0x9f, + 0x40, 0xa8, 0x3e, 0x0, 0x4d, 0x0, 0x6b, 0x3e, + 0x0, 0x4c, 0x0, 0x6b, 0x3e, 0x0, 0x4c, 0x0, + 0x6b, 0x3e, 0x0, 0x4c, 0x0, 0x6b, 0x3e, 0x0, + 0x4c, 0x0, 0x6b, /* U+6E "n" */ - 0x13, 0x16, 0x40, 0x4f, 0xa8, 0xda, 0x4f, 0x0, - 0x4e, 0x4f, 0x0, 0x4f, 0x4f, 0x0, 0x4f, 0x4f, - 0x0, 0x4f, 0x4f, 0x0, 0x4f, + 0x2d, 0x8f, 0xd2, 0x2f, 0x60, 0x9a, 0x2e, 0x0, + 0x4c, 0x2e, 0x0, 0x4d, 0x2e, 0x0, 0x4d, 0x2e, + 0x0, 0x4d, 0x2e, 0x0, 0x4d, /* U+6F "o" */ - 0x0, 0x46, 0x30, 0x0, 0xad, 0x8d, 0x70, 0x3f, - 0x10, 0x2f, 0x7, 0xc0, 0x0, 0xf4, 0x5c, 0x0, - 0xf, 0x32, 0xf3, 0x7, 0xe0, 0x6, 0xfc, 0xe3, + 0x3, 0xdf, 0xb1, 0x0, 0xe5, 0x7, 0xc0, 0x5c, + 0x0, 0xe, 0x27, 0xa0, 0x0, 0xc4, 0x5c, 0x0, + 0xe, 0x20, 0xe5, 0x7, 0xc0, 0x3, 0xcf, 0xb2, 0x0, /* U+70 "p" */ - 0x13, 0x27, 0x30, 0x4, 0xeb, 0x8f, 0x90, 0x4f, - 0x10, 0x4f, 0x4, 0xf0, 0x0, 0xf4, 0x4f, 0x0, - 0xf, 0x34, 0xf3, 0x5, 0xf0, 0x4f, 0xbc, 0xf6, - 0x4, 0xf0, 0x0, 0x0, 0x4f, 0x0, 0x0, 0x2, - 0x80, 0x0, 0x0, + 0x2e, 0xae, 0xc2, 0x2, 0xf3, 0x7, 0xc0, 0x2e, + 0x0, 0xf, 0x12, 0xe0, 0x0, 0xe2, 0x2e, 0x0, + 0xf, 0x2, 0xf4, 0x8, 0xc0, 0x2e, 0xae, 0xc2, + 0x2, 0xe0, 0x0, 0x0, 0x2e, 0x0, 0x0, 0x2, + 0xe0, 0x0, 0x0, /* U+71 "q" */ - 0x0, 0x56, 0x14, 0xc, 0xd8, 0xcf, 0x3f, 0x10, - 0x4f, 0x6c, 0x0, 0x4f, 0x6c, 0x0, 0x4f, 0x2f, - 0x20, 0x7f, 0x7, 0xfc, 0xcf, 0x0, 0x0, 0x4f, - 0x0, 0x0, 0x4f, 0x0, 0x0, 0x28, + 0x4, 0xde, 0x8e, 0x1f, 0x50, 0x8e, 0x5c, 0x0, + 0x3e, 0x6a, 0x0, 0x3e, 0x5c, 0x0, 0x3e, 0x1f, + 0x40, 0x8e, 0x4, 0xde, 0xae, 0x0, 0x0, 0x3e, + 0x0, 0x0, 0x3e, 0x0, 0x0, 0x3e, /* U+72 "r" */ - 0x13, 0x27, 0x4f, 0xcb, 0x4f, 0x10, 0x4f, 0x0, - 0x4f, 0x0, 0x4f, 0x0, 0x4f, 0x0, + 0x2e, 0xbd, 0x2f, 0x50, 0x2e, 0x0, 0x2e, 0x0, + 0x2e, 0x0, 0x2e, 0x0, 0x2e, 0x0, /* U+73 "s" */ - 0x0, 0x56, 0x20, 0xd, 0xb9, 0xf3, 0x2f, 0x10, - 0x54, 0x9, 0xe9, 0x40, 0x0, 0x16, 0xd6, 0x4d, - 0x10, 0x9a, 0x9, 0xec, 0xe3, + 0x6, 0xee, 0x90, 0x1f, 0x21, 0xc6, 0x1f, 0x40, + 0x0, 0x4, 0xbe, 0x80, 0x12, 0x1, 0xb7, 0x4e, + 0x10, 0xa7, 0x7, 0xee, 0xa0, /* U+74 "t" */ - 0x9, 0x30, 0x3c, 0x62, 0x6e, 0xa4, 0xc, 0x40, - 0xc, 0x40, 0xc, 0x40, 0xc, 0x50, 0x8, 0xe7, + 0x6, 0x20, 0xc, 0x40, 0xdf, 0xe6, 0xc, 0x40, + 0xc, 0x40, 0xc, 0x40, 0xc, 0x40, 0xc, 0x60, + 0x5, 0xf7, /* U+75 "u" */ - 0x13, 0x0, 0x13, 0x4f, 0x0, 0x4f, 0x4f, 0x0, - 0x4f, 0x4f, 0x0, 0x4f, 0x4f, 0x0, 0x4f, 0xf, - 0x20, 0x7f, 0x8, 0xfc, 0x7f, + 0x3e, 0x0, 0x4c, 0x3e, 0x0, 0x4c, 0x3e, 0x0, + 0x4c, 0x3e, 0x0, 0x4c, 0x2e, 0x0, 0x4c, 0x1f, + 0x31, 0xbc, 0x7, 0xee, 0x9c, /* U+76 "v" */ - 0x32, 0x0, 0x23, 0x7b, 0x0, 0xa9, 0x1f, 0x10, - 0xf2, 0xb, 0x65, 0xd0, 0x5, 0xba, 0x70, 0x0, - 0xfd, 0x10, 0x0, 0x9b, 0x0, + 0xa7, 0x0, 0xa6, 0x5c, 0x0, 0xf1, 0xf, 0x14, + 0xc0, 0xa, 0x59, 0x70, 0x5, 0xad, 0x20, 0x0, + 0xfc, 0x0, 0x0, 0xa7, 0x0, /* U+77 "w" */ - 0x32, 0x0, 0x40, 0x2, 0x38, 0xb0, 0x3f, 0x40, - 0xa9, 0x3f, 0x9, 0xd9, 0xe, 0x40, 0xe3, 0xd4, - 0xe1, 0xf0, 0xa, 0x9d, 0xd, 0x8b, 0x0, 0x5d, - 0x90, 0x7e, 0x60, 0x1, 0xf3, 0x2, 0xf2, 0x0, + 0x97, 0x1, 0xf1, 0x7, 0x95, 0xa0, 0x5f, 0x50, + 0xb5, 0x1e, 0xa, 0x8a, 0xe, 0x10, 0xd2, 0xd0, + 0xe2, 0xc0, 0x9, 0x9a, 0xb, 0x98, 0x0, 0x4f, + 0x60, 0x6f, 0x40, 0x0, 0xf1, 0x2, 0xf0, 0x0, /* U+78 "x" */ - 0x23, 0x0, 0x32, 0x2f, 0x22, 0xf3, 0x8, 0xbc, - 0x80, 0x0, 0xee, 0x0, 0x2, 0xee, 0x20, 0xc, - 0x88, 0xb0, 0x7e, 0x0, 0xe7, + 0x6d, 0x0, 0xe5, 0xc, 0x67, 0xb0, 0x3, 0xee, + 0x20, 0x0, 0xcb, 0x0, 0x4, 0xde, 0x20, 0xd, + 0x56, 0xc0, 0x7c, 0x0, 0xd6, /* U+79 "y" */ - 0x32, 0x0, 0x23, 0x9b, 0x0, 0xb9, 0x2f, 0x11, - 0xf3, 0xc, 0x66, 0xd0, 0x6, 0xbb, 0x70, 0x1, - 0xff, 0x20, 0x0, 0xab, 0x0, 0x0, 0xc6, 0x0, - 0x28, 0xe0, 0x0, 0x38, 0x20, 0x0, + 0xb7, 0x0, 0xc6, 0x6c, 0x1, 0xf1, 0x1f, 0x15, + 0xc0, 0xc, 0x6a, 0x70, 0x6, 0xbe, 0x20, 0x1, + 0xfd, 0x0, 0x0, 0xc8, 0x0, 0x0, 0xc3, 0x0, + 0x4, 0xd0, 0x0, 0x7e, 0x30, 0x0, /* U+7A "z" */ - 0x23, 0x33, 0x32, 0x48, 0x89, 0xf5, 0x0, 0xb, - 0xa0, 0x0, 0x7d, 0x10, 0x3, 0xf3, 0x0, 0x1d, - 0x60, 0x0, 0x8f, 0xff, 0xf8, + 0x6f, 0xff, 0xf5, 0x0, 0x5, 0xd0, 0x0, 0x1e, + 0x40, 0x0, 0xb9, 0x0, 0x6, 0xd0, 0x0, 0x1e, + 0x30, 0x0, 0x7f, 0xff, 0xf8, /* U+7B "{" */ - 0x0, 0x2, 0x0, 0xb8, 0x4, 0xe0, 0x8, 0xc0, - 0x8, 0xc0, 0x1a, 0x80, 0x7e, 0x10, 0x9, 0xa0, - 0x8, 0xc0, 0x7, 0xc0, 0x3, 0xf1, 0x0, 0x8a, + 0x0, 0x27, 0x0, 0xe4, 0x4, 0xc0, 0x5, 0xb0, + 0x6, 0xa0, 0xa, 0x70, 0x9f, 0x10, 0xa, 0x70, + 0x6, 0xa0, 0x5, 0xb0, 0x4, 0xc0, 0x0, 0xd4, + 0x0, 0x27, /* U+7C "|" */ - 0x18, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, - 0x2f, 0x2f, 0x18, + 0xee, 0xee, 0xee, 0xee, 0xee, 0xe0, /* U+7D "}" */ - 0x30, 0x0, 0x7d, 0x0, 0xd, 0x50, 0xc, 0x80, - 0xc, 0x80, 0x8, 0xb1, 0x1, 0xea, 0x9, 0xa0, - 0xc, 0x80, 0xc, 0x80, 0xe, 0x30, 0xa9, 0x0, + 0x72, 0x0, 0x3e, 0x0, 0xb, 0x50, 0xa, 0x60, + 0xa, 0x60, 0x6, 0xb0, 0x0, 0xea, 0x6, 0xb0, + 0xa, 0x60, 0xa, 0x60, 0xb, 0x50, 0x4e, 0x0, + 0x72, 0x0, /* U+7E "~" */ - 0x5, 0xa6, 0x0, 0x42, 0x2e, 0x5b, 0xc5, 0xc3, - 0x12, 0x0, 0x6a, 0x50, + 0x5, 0xd9, 0x0, 0x85, 0xe, 0x3a, 0x90, 0xc2, + 0x2a, 0x0, 0xbf, 0x90, 0x0, 0x0, 0x0, 0x0, /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x26, 0x10, 0x0, 0x0, - 0x37, 0xcf, 0xf4, 0x0, 0x5, 0xdf, 0xff, 0xff, - 0x40, 0x0, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x8, - 0xff, 0xfb, 0x69, 0x40, 0x0, 0x8b, 0x50, 0x0, - 0x84, 0x0, 0x8, 0x40, 0x0, 0x8, 0x40, 0x0, - 0x84, 0x2, 0x77, 0xa4, 0x0, 0x8, 0x40, 0xff, - 0xff, 0x45, 0xbb, 0xc4, 0x8, 0xff, 0xb1, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x4, 0xac, 0x60, 0x0, - 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, + 0x0, 0x3, 0x7c, 0xff, 0x0, 0x0, 0x59, 0xef, + 0xff, 0xff, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xfd, 0x84, 0x8f, 0x0, 0xf, + 0xd7, 0x20, 0x0, 0x8f, 0x0, 0xf, 0x80, 0x0, + 0x0, 0x8f, 0x0, 0xf, 0x80, 0x0, 0x0, 0x8f, + 0x0, 0xf, 0x80, 0x0, 0x7b, 0xdf, 0x2, 0x3f, + 0x80, 0x6, 0xff, 0xff, 0xaf, 0xff, 0x80, 0x2, + 0xef, 0xf9, 0xef, 0xff, 0x60, 0x0, 0x2, 0x10, + 0x29, 0xa7, 0x0, 0x0, 0x0, 0x0, /* U+F008 "" */ - 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x2e, 0x8c, - 0xc8, 0x88, 0x88, 0xda, 0x8c, 0xd0, 0x88, 0x0, - 0x0, 0x8, 0x40, 0xcf, 0xce, 0x80, 0x0, 0x0, - 0x8e, 0xcc, 0xd0, 0x88, 0x0, 0x0, 0x8, 0x51, - 0xcf, 0x39, 0x93, 0x33, 0x33, 0xa7, 0x4c, 0xf8, - 0xdd, 0x88, 0x88, 0x8d, 0xb9, 0xcc, 0x8, 0x80, - 0x0, 0x0, 0x84, 0xc, 0xfb, 0xd8, 0x0, 0x0, - 0x8, 0xdb, 0xce, 0x4a, 0x80, 0x0, 0x0, 0x87, - 0x4c, 0xe3, 0x99, 0x33, 0x33, 0x3a, 0x63, 0xc7, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc6, + 0xb4, 0xdf, 0xff, 0xff, 0xfd, 0x4b, 0xe8, 0xe7, + 0x22, 0x22, 0x7e, 0x8e, 0xc0, 0xc5, 0x0, 0x0, + 0x6c, 0xc, 0xfc, 0xf6, 0x11, 0x11, 0x7f, 0xcf, + 0xc0, 0xcf, 0xff, 0xff, 0xfb, 0xc, 0xfc, 0xf6, + 0x11, 0x11, 0x7f, 0xcf, 0xc0, 0xc5, 0x0, 0x0, + 0x6c, 0xc, 0xe8, 0xe7, 0x22, 0x22, 0x7e, 0x8e, + 0xb4, 0xdf, 0xff, 0xff, 0xfd, 0x4b, /* U+F00B "" */ - 0x67, 0x71, 0x37, 0x77, 0x77, 0x75, 0xff, 0xf8, + 0xdf, 0xf6, 0x9f, 0xff, 0xff, 0xfd, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xef, 0xf6, 0xaf, 0xff, + 0xff, 0xfe, 0x13, 0x20, 0x3, 0x33, 0x33, 0x31, + 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, - 0xff, 0xff, 0x24, 0x30, 0x14, 0x44, 0x44, 0x42, - 0xff, 0xf6, 0xbf, 0xff, 0xff, 0xfe, 0xff, 0xf8, - 0xcf, 0xff, 0xff, 0xff, 0x78, 0x83, 0x58, 0x88, - 0x88, 0x87, 0x77, 0x73, 0x57, 0x77, 0x77, 0x76, - 0xff, 0xf8, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x13, 0x20, 0x3, 0x33, 0x33, 0x31, + 0xef, 0xf6, 0xaf, 0xff, 0xff, 0xfe, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xdf, 0xf6, 0xaf, 0xff, + 0xff, 0xfd, /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x3e, 0x60, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xf2, 0x3, 0x71, 0x0, 0x3e, - 0xff, 0x60, 0x1e, 0xfc, 0x13, 0xef, 0xf6, 0x0, - 0x1d, 0xff, 0xce, 0xff, 0x60, 0x0, 0x1, 0xdf, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x1, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x4d, 0x30, 0x0, 0x3f, 0xff, 0x40, + 0xef, 0xf3, 0x3, 0xff, 0xf4, 0x0, 0x4f, 0xff, + 0x6f, 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x3, 0xd3, 0x0, 0x0, 0x0, /* U+F00D "" */ - 0x6, 0xa1, 0x0, 0x68, 0x3, 0xff, 0xc1, 0x6f, - 0xf9, 0xa, 0xff, 0xdf, 0xff, 0x30, 0xa, 0xff, - 0xff, 0x30, 0x0, 0x6f, 0xff, 0xc1, 0x0, 0x6f, - 0xff, 0xff, 0xc1, 0x3f, 0xff, 0x3a, 0xff, 0xa0, - 0xaf, 0x30, 0xa, 0xf3, + 0x14, 0x0, 0x0, 0x22, 0xd, 0xf7, 0x0, 0x4f, + 0xf1, 0x9f, 0xf7, 0x4f, 0xfd, 0x0, 0xaf, 0xff, + 0xfd, 0x10, 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x4f, + 0xff, 0xf7, 0x0, 0x4f, 0xfd, 0xaf, 0xf7, 0xe, + 0xfd, 0x10, 0xaf, 0xf2, 0x5b, 0x10, 0x0, 0x99, + 0x0, /* U+F011 "" */ - 0x0, 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xe0, 0x0, 0x0, 0x1, 0x71, 0xcf, 0x7, 0x30, - 0x0, 0xdf, 0x6c, 0xf1, 0xfe, 0x30, 0x8f, 0xa0, - 0xcf, 0x5, 0xfb, 0xe, 0xf0, 0xc, 0xf0, 0xa, - 0xf2, 0xfc, 0x0, 0x69, 0x0, 0x8f, 0x4f, 0xc0, - 0x0, 0x0, 0x9, 0xf4, 0xaf, 0x40, 0x0, 0x1, - 0xef, 0x2, 0xfe, 0x40, 0x2, 0xcf, 0x70, 0x6, - 0xff, 0xfe, 0xff, 0xa0, 0x0, 0x2, 0x9c, 0xca, - 0x40, 0x0, + 0x0, 0x0, 0x7, 0x70, 0x0, 0x0, 0x0, 0x32, + 0xf, 0xf0, 0x24, 0x0, 0x5, 0xfc, 0xf, 0xf0, + 0xcf, 0x50, 0x1f, 0xf4, 0xf, 0xf0, 0x5f, 0xf1, + 0x7f, 0x80, 0xf, 0xf0, 0x8, 0xf7, 0xbf, 0x20, + 0xf, 0xf0, 0x2, 0xfb, 0xcf, 0x10, 0xe, 0xe0, + 0x1, 0xfc, 0xaf, 0x40, 0x1, 0x10, 0x4, 0xfa, + 0x5f, 0xb0, 0x0, 0x0, 0xb, 0xf6, 0xd, 0xfa, + 0x10, 0x1, 0xaf, 0xd0, 0x2, 0xdf, 0xfc, 0xcf, + 0xfd, 0x20, 0x0, 0x8, 0xef, 0xfe, 0x91, 0x0, + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, /* U+F013 "" */ - 0x0, 0x0, 0x67, 0x10, 0x0, 0x0, 0x15, 0xf, - 0xf4, 0x33, 0x0, 0xd, 0xfd, 0xff, 0xef, 0xe2, - 0x0, 0xaf, 0xff, 0xff, 0xfd, 0x10, 0x5b, 0xfe, - 0x21, 0xbf, 0xd4, 0x1f, 0xff, 0x80, 0x4, 0xff, - 0xf4, 0xce, 0xfa, 0x0, 0x6f, 0xfc, 0x30, 0x8f, - 0xfc, 0x9f, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xf3, 0x0, 0x6d, 0x5f, 0xf8, 0xaa, 0x0, 0x0, - 0x0, 0xbc, 0x30, 0x0, 0x0, - - /* U+F014 "" */ - 0x0, 0x7, 0x77, 0x20, 0x0, 0x0, 0x6c, 0x88, - 0xd0, 0x0, 0xcb, 0xec, 0xbb, 0xeb, 0xb6, 0x6d, - 0x44, 0x44, 0x47, 0xa1, 0x4c, 0x44, 0x62, 0x64, - 0x80, 0x4c, 0x88, 0xc4, 0xc4, 0x80, 0x4c, 0x88, - 0xc4, 0xc4, 0x80, 0x4c, 0x88, 0xc4, 0xc4, 0x80, - 0x4c, 0x66, 0x92, 0x94, 0x80, 0x2c, 0x0, 0x0, - 0x5, 0x80, 0xb, 0xcc, 0xcc, 0xcc, 0x30, + 0x0, 0x0, 0x14, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x3, 0x43, 0xdf, 0xfd, + 0x34, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xfb, 0xbf, 0xff, 0xf6, 0x1b, 0xff, + 0x70, 0x7, 0xff, 0xb1, 0x7, 0xff, 0x20, 0x2, + 0xff, 0x70, 0x1b, 0xff, 0x70, 0x7, 0xff, 0xb1, + 0x6f, 0xff, 0xfb, 0xbf, 0xff, 0xf6, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x3, 0x42, 0xcf, 0xfc, + 0x23, 0x30, 0x0, 0x0, 0x7f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x41, 0x0, 0x0, /* U+F015 "" */ - 0x0, 0x0, 0x17, 0x32, 0x74, 0x0, 0x0, 0x3d, - 0xcf, 0x7f, 0x80, 0x0, 0x5e, 0x89, 0x9f, 0xf8, - 0x0, 0x7f, 0x8d, 0xfe, 0x7f, 0xa0, 0x9e, 0x9e, - 0xff, 0xff, 0x7d, 0xb3, 0x4f, 0xff, 0xff, 0xff, - 0x84, 0x4, 0xff, 0xe8, 0xcf, 0xf8, 0x0, 0x4f, - 0xfc, 0x8, 0xff, 0x80, 0x4, 0xff, 0xc0, 0x8f, - 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x73, 0x3, 0x83, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x67, 0xf7, 0x0, 0x0, 0x3, + 0xee, 0x5a, 0xfe, 0xf7, 0x0, 0x0, 0x6f, 0xd3, + 0xb5, 0x7f, 0xf7, 0x0, 0x9, 0xfb, 0x3d, 0xff, + 0x85, 0xfe, 0x30, 0xbf, 0x95, 0xff, 0xff, 0xfb, + 0x3e, 0xf4, 0x76, 0x6f, 0xff, 0xff, 0xff, 0xd2, + 0xa1, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xfa, 0x2, 0xff, 0xf4, 0x0, 0x0, + 0xcf, 0xfa, 0x2, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xf8, 0x1, 0xff, 0xf3, 0x0, /* U+F019 "" */ - 0x0, 0x0, 0x23, 0x30, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, - 0x0, 0x9b, 0xef, 0xeb, 0xb0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x3, 0xff, 0xf6, - 0x0, 0x0, 0x67, 0x76, 0x3f, 0x67, 0x77, 0x60, - 0xff, 0xff, 0x93, 0x9f, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xfe, 0xaa, 0xe4, 0xff, 0xff, 0xff, 0xff, - 0xee, 0xf2, + 0x0, 0x0, 0x27, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, + 0x23, 0x33, 0x5f, 0xf5, 0x33, 0x32, 0xff, 0xff, + 0xa4, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x8f, + 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, /* U+F01C "" */ - 0x1, 0x77, 0x77, 0x77, 0x40, 0x0, 0x8f, 0xcc, - 0xcc, 0xec, 0x0, 0xf, 0x70, 0x0, 0x2, 0xf4, - 0x6, 0xf1, 0x0, 0x0, 0xc, 0xb0, 0xda, 0x0, - 0x0, 0x0, 0x5f, 0x2f, 0xcb, 0x80, 0x5, 0xbb, - 0xf4, 0xff, 0xff, 0x77, 0xdf, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, + 0xed, 0x88, 0x88, 0x89, 0xf8, 0x0, 0xa, 0xf2, + 0x0, 0x0, 0x0, 0xaf, 0x30, 0x5f, 0x70, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0xef, 0x88, 0x60, 0x0, + 0x28, 0x8b, 0xf6, 0xff, 0xff, 0xf3, 0x0, 0xbf, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, /* U+F021 "" */ - 0x0, 0x2, 0x46, 0x30, 0x0, 0x0, 0x19, 0xff, - 0xff, 0xd4, 0xc4, 0x1c, 0xfc, 0x65, 0xaf, 0xff, - 0x47, 0xfa, 0x0, 0x1, 0xdf, 0xf4, 0x9c, 0x0, - 0x0, 0x6c, 0xcc, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x77, 0x75, 0x0, 0x0, 0x57, 0xf, 0xff, - 0x90, 0x0, 0x1d, 0xe0, 0xff, 0xf4, 0x0, 0x2c, - 0xf5, 0xf, 0xcf, 0xff, 0xef, 0xf8, 0x0, 0x50, - 0x29, 0xcc, 0xa4, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x10, 0x0, 0x59, 0x0, 0x19, + 0xef, 0xfd, 0x70, 0x9f, 0x3, 0xef, 0xda, 0x9d, + 0xfe, 0xbf, 0xe, 0xf6, 0x0, 0x0, 0x5f, 0xff, + 0x7f, 0x70, 0x0, 0x3f, 0xff, 0xff, 0x69, 0x0, + 0x0, 0x2a, 0xaa, 0xa9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaa, 0xaa, 0xa2, 0x0, 0x0, 0xa6, + 0xff, 0xfe, 0xf3, 0x0, 0x7, 0xf7, 0xff, 0xf5, + 0x0, 0x0, 0x7f, 0xe0, 0xfb, 0xef, 0xd9, 0xad, + 0xfe, 0x30, 0xfa, 0x8, 0xef, 0xfe, 0x91, 0x0, + 0x95, 0x0, 0x1, 0x10, 0x0, 0x0, /* U+F026 "" */ - 0x0, 0x0, 0x30, 0x0, 0x6, 0xf4, 0x0, 0x6f, - 0xf4, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xf4, 0x78, 0xbf, 0xf4, 0x0, 0xa, 0xf4, - 0x0, 0x0, 0xb2, + 0x0, 0x0, 0x2a, 0x0, 0x2, 0xef, 0x78, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0x0, 0x7, 0xff, + 0x0, 0x0, 0x7f, 0x0, 0x0, 0x1, /* U+F027 "" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x6, 0xf4, 0x0, - 0x0, 0x6f, 0xf4, 0x0, 0xff, 0xff, 0xf4, 0xc3, - 0xff, 0xff, 0xf4, 0x5b, 0xff, 0xff, 0xf4, 0xa8, - 0x78, 0xbf, 0xf4, 0x30, 0x0, 0xa, 0xf4, 0x0, - 0x0, 0x0, 0xb2, 0x0, + 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x2e, 0xf0, + 0x0, 0x78, 0x8e, 0xff, 0x3, 0xf, 0xff, 0xff, + 0xf0, 0xba, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, + 0xff, 0xf0, 0xaa, 0xdf, 0xff, 0xff, 0x4, 0x0, + 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, /* U+F028 "" */ - 0x0, 0x0, 0x30, 0x6, 0xc2, 0x0, 0x0, 0x6, - 0xf4, 0x15, 0x4c, 0x10, 0x0, 0x6f, 0xf4, 0x1b, - 0x96, 0xa0, 0xff, 0xff, 0xf4, 0xc3, 0xc2, 0xd0, - 0xff, 0xff, 0xf4, 0x5b, 0x86, 0xc1, 0xff, 0xff, - 0xf4, 0xa8, 0x94, 0xd0, 0x78, 0xbf, 0xf4, 0x33, - 0xc2, 0xc0, 0x0, 0xa, 0xf4, 0x2c, 0x4c, 0x40, - 0x0, 0x0, 0xb2, 0x3, 0xc6, 0x0, 0x0, 0x0, - 0x0, 0x4, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, + 0x2a, 0x0, 0x11, 0x8e, 0x10, 0x0, 0x2, 0xef, + 0x0, 0x7d, 0x2b, 0x90, 0x78, 0x8e, 0xff, 0x3, + 0xa, 0xb3, 0xf0, 0xff, 0xff, 0xff, 0xb, 0xa1, + 0xf1, 0xe3, 0xff, 0xff, 0xff, 0x3, 0xf0, 0xe3, + 0xc5, 0xff, 0xff, 0xff, 0xb, 0xa1, 0xf1, 0xe3, + 0xdf, 0xff, 0xff, 0x3, 0xa, 0xb3, 0xf0, 0x0, + 0x7, 0xff, 0x0, 0x7d, 0x2b, 0x90, 0x0, 0x0, + 0x7f, 0x0, 0x11, 0x9e, 0x10, 0x0, 0x0, 0x1, + 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, /* U+F03E "" */ - 0x47, 0x77, 0x77, 0x77, 0x77, 0x77, 0x2d, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x8c, 0xc0, 0x98, 0x0, - 0x0, 0x0, 0x0, 0xcc, 0x4f, 0xf4, 0x0, 0x17, - 0x0, 0xc, 0xc1, 0xbb, 0x10, 0x1c, 0xf9, 0x0, - 0xcc, 0x0, 0x10, 0x1c, 0xff, 0xf9, 0xc, 0xc0, - 0x1c, 0x9c, 0xff, 0xff, 0xf4, 0xcc, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0x4c, 0xc4, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xcd, 0x14, 0x44, 0x44, 0x44, 0x44, - 0x1c, 0x9c, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x80, - - /* U+F040 "" */ - 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, - 0x6, 0xfc, 0x10, 0x0, 0x0, 0x4, 0xaf, 0xfc, - 0x0, 0x0, 0x6, 0xea, 0xaf, 0xf1, 0x0, 0x6, - 0xdb, 0xf9, 0x93, 0x0, 0x6, 0xdb, 0xff, 0xf2, - 0x0, 0x6, 0xdb, 0xff, 0xf3, 0x0, 0x6, 0xfb, - 0xff, 0xf3, 0x0, 0x0, 0xe2, 0xdf, 0xf3, 0x0, - 0x0, 0xf, 0x94, 0xf3, 0x0, 0x0, 0x0, 0xcc, - 0xc3, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfd, 0x5b, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x1, 0xff, 0xff, + 0xef, 0xff, 0xfb, 0x18, 0xff, 0xf6, 0x1c, 0xff, + 0xff, 0xfc, 0xff, 0x60, 0x1, 0xdf, 0xff, 0x60, + 0x96, 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfc, 0x88, 0x88, 0x88, 0x88, 0xcf, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, /* U+F048 "" */ - 0x75, 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x6c, 0xfc, - 0x0, 0x6f, 0xcf, 0xc0, 0x6f, 0xfc, 0xfc, 0x6f, - 0xff, 0xcf, 0xef, 0xff, 0xfc, 0xfc, 0xaf, 0xff, - 0xcf, 0xc0, 0xaf, 0xfc, 0xfc, 0x0, 0xaf, 0xcf, - 0xc0, 0x0, 0xac, 0xc9, 0x0, 0x0, 0x60, + 0x58, 0x0, 0x0, 0x35, 0x9f, 0x10, 0x5, 0xfe, + 0x9f, 0x10, 0x6f, 0xfe, 0x9f, 0x17, 0xff, 0xfe, + 0x9f, 0x9f, 0xff, 0xfe, 0x9f, 0xff, 0xff, 0xfe, + 0x9f, 0xef, 0xff, 0xfe, 0x9f, 0x2d, 0xff, 0xfe, + 0x9f, 0x10, 0xcf, 0xfe, 0x9f, 0x10, 0xb, 0xfe, + 0x8f, 0x0, 0x0, 0x9b, 0x0, 0x0, 0x0, 0x0, /* U+F04B "" */ - 0x60, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x40, 0x0, - 0x0, 0x0, 0xff, 0xfb, 0x20, 0x0, 0x0, 0xff, - 0xff, 0xf9, 0x10, 0x0, 0xff, 0xff, 0xff, 0xe7, - 0x10, 0xff, 0xff, 0xff, 0xff, 0xd3, 0xff, 0xff, - 0xff, 0xfe, 0x60, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xff, 0xff, 0x91, 0x0, 0x0, 0xff, 0xb2, 0x0, - 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, + 0x46, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x50, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0xf, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F04C "" */ - 0x77, 0x77, 0x10, 0x77, 0x77, 0x1f, 0xff, 0xf4, - 0xf, 0xff, 0xf4, 0xff, 0xff, 0x40, 0xff, 0xff, - 0x4f, 0xff, 0xf4, 0xf, 0xff, 0xf4, 0xff, 0xff, - 0x40, 0xff, 0xff, 0x4f, 0xff, 0xf4, 0xf, 0xff, - 0xf4, 0xff, 0xff, 0x40, 0xff, 0xff, 0x4f, 0xff, - 0xf4, 0xf, 0xff, 0xf4, 0xff, 0xff, 0x40, 0xff, - 0xff, 0x4f, 0xff, 0xf4, 0xf, 0xff, 0xf4, 0xcc, - 0xcc, 0x30, 0xcc, 0xcc, 0x30, + 0xaf, 0xfe, 0x30, 0xaf, 0xfe, 0x3f, 0xff, 0xf7, + 0xf, 0xff, 0xf7, 0xff, 0xff, 0x80, 0xff, 0xff, + 0x8f, 0xff, 0xf8, 0xf, 0xff, 0xf8, 0xff, 0xff, + 0x80, 0xff, 0xff, 0x8f, 0xff, 0xf8, 0xf, 0xff, + 0xf8, 0xff, 0xff, 0x80, 0xff, 0xff, 0x8f, 0xff, + 0xf8, 0xf, 0xff, 0xf8, 0xff, 0xff, 0x80, 0xff, + 0xff, 0x8f, 0xff, 0xf7, 0xf, 0xff, 0xf7, 0x48, + 0x98, 0x10, 0x48, 0x98, 0x10, /* U+F04D "" */ - 0x77, 0x77, 0x77, 0x77, 0x77, 0x1f, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0x30, + 0x48, 0x88, 0x88, 0x88, 0x88, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, + 0xff, 0xff, 0xff, 0xfe, 0x30, /* U+F051 "" */ - 0x30, 0x0, 0x5, 0x5f, 0x30, 0x0, 0xcc, 0xfe, - 0x30, 0xc, 0xcf, 0xfe, 0x30, 0xcc, 0xff, 0xfe, - 0x3c, 0xcf, 0xff, 0xfe, 0xdc, 0xff, 0xff, 0xac, - 0xcf, 0xff, 0xa0, 0xcc, 0xff, 0xa0, 0xc, 0xcf, - 0xa0, 0x0, 0xcc, 0x90, 0x0, 0x9, 0x90, + 0x26, 0x0, 0x0, 0x58, 0x7f, 0xa0, 0x0, 0xbf, + 0x8f, 0xfb, 0x0, 0xbf, 0x8f, 0xff, 0xc1, 0xbf, + 0x8f, 0xff, 0xfd, 0xcf, 0x8f, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xef, 0x8f, 0xff, 0xf4, 0xbf, + 0x8f, 0xff, 0x40, 0xbf, 0x8f, 0xe3, 0x0, 0xbf, + 0x5d, 0x20, 0x0, 0xae, 0x0, 0x0, 0x0, 0x0, /* U+F052 "" */ - 0x0, 0x0, 0x35, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xf6, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xf6, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x3e, 0xff, - 0xff, 0xff, 0xf6, 0x7, 0x88, 0x88, 0x88, 0x88, - 0x81, 0x87, 0x77, 0x77, 0x77, 0x77, 0x2f, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, + 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfa, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf8, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1, 0x34, 0x44, 0x44, 0x44, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xf5, /* U+F053 "" */ - 0x0, 0x0, 0x6e, 0x30, 0x0, 0x6f, 0xfe, 0x0, - 0x6f, 0xff, 0x30, 0x6f, 0xff, 0x30, 0x6f, 0xff, - 0x30, 0xd, 0xff, 0xa0, 0x0, 0x1d, 0xff, 0x90, - 0x0, 0x1d, 0xff, 0x90, 0x0, 0x1d, 0xff, 0x90, - 0x0, 0x1d, 0xfd, 0x0, 0x0, 0x1a, 0x10, + 0x0, 0x0, 0x3, 0x10, 0x0, 0x5, 0xfb, 0x0, + 0x5, 0xff, 0x40, 0x5, 0xff, 0x40, 0x5, 0xff, + 0x50, 0x3, 0xff, 0x50, 0x0, 0xb, 0xfc, 0x10, + 0x0, 0xb, 0xfc, 0x10, 0x0, 0xc, 0xfc, 0x10, + 0x0, 0xc, 0xfb, 0x0, 0x0, 0xa, 0x50, /* U+F054 "" */ - 0xa, 0xc1, 0x0, 0x0, 0x4f, 0xfc, 0x10, 0x0, - 0x6, 0xff, 0xc1, 0x0, 0x0, 0x6f, 0xfc, 0x10, - 0x0, 0x6, 0xff, 0xc1, 0x0, 0x1, 0xdf, 0xf7, - 0x0, 0x1c, 0xff, 0xa0, 0x1, 0xcf, 0xfa, 0x0, - 0x1c, 0xff, 0xa0, 0x0, 0x3f, 0xfa, 0x0, 0x0, - 0x3, 0x80, 0x0, 0x0, + 0x3, 0x10, 0x0, 0x3, 0xfc, 0x10, 0x0, 0xb, + 0xfc, 0x10, 0x0, 0xb, 0xfc, 0x10, 0x0, 0xb, + 0xfc, 0x10, 0x0, 0xd, 0xfb, 0x0, 0x5, 0xff, + 0x50, 0x5, 0xff, 0x50, 0x5, 0xff, 0x50, 0x3, + 0xff, 0x50, 0x0, 0xa, 0x50, 0x0, 0x0, /* U+F067 "" */ - 0x0, 0x3, 0x75, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x78, 0x8c, - 0xff, 0x88, 0x83, 0x0, 0x8, 0xff, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x7, 0xff, - 0x0, 0x0, + 0x0, 0x0, 0x69, 0x10, 0x0, 0x0, 0x0, 0xd, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, + 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, 0x58, 0x88, + 0xff, 0xb8, 0x88, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x9b, 0xbb, 0xff, 0xdb, 0xbb, 0x30, 0x0, + 0xe, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, + 0x0, 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9d, 0x20, 0x0, 0x0, /* U+F068 "" */ - 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x78, 0x88, 0x88, 0x88, 0x83, + 0x46, 0x66, 0x66, 0x66, 0x66, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, + 0x40, + + /* U+F06E "" */ + 0x0, 0x3, 0xad, 0xff, 0xc7, 0x0, 0x0, 0x0, + 0x9f, 0xe6, 0x24, 0xaf, 0xe3, 0x0, 0xb, 0xff, + 0x20, 0x77, 0x9, 0xff, 0x40, 0x7f, 0xf9, 0x0, + 0xcf, 0xa1, 0xff, 0xe1, 0xef, 0xf6, 0x7f, 0xff, + 0xf0, 0xef, 0xf7, 0x8f, 0xf9, 0x3f, 0xff, 0xc1, + 0xff, 0xe1, 0xb, 0xff, 0x26, 0xca, 0x19, 0xff, + 0x40, 0x0, 0x9f, 0xe6, 0x24, 0xaf, 0xe3, 0x0, + 0x0, 0x3, 0x9d, 0xff, 0xc7, 0x0, 0x0, + + /* U+F070 "" */ + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xf8, 0x4a, 0xef, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0x9f, 0xfd, 0x52, 0x5d, 0xfc, 0x10, 0x0, + 0x0, 0x5, 0xfe, 0x4a, 0x70, 0xcf, 0xe1, 0x0, + 0xb, 0x80, 0x2d, 0xff, 0xf7, 0x4f, 0xfb, 0x0, + 0x2f, 0xfb, 0x0, 0xaf, 0xfb, 0x2f, 0xff, 0x30, + 0xb, 0xff, 0x50, 0x7, 0xfe, 0x7f, 0xfb, 0x0, + 0x1, 0xdf, 0xc0, 0x0, 0x3e, 0xff, 0xe1, 0x0, + 0x0, 0x1b, 0xfc, 0x42, 0x1, 0xbf, 0xa0, 0x0, + 0x0, 0x0, 0x5b, 0xef, 0xb0, 0x8, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, /* U+F071 "" */ - 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, - 0x0, 0x9, 0xf4, 0x4f, 0x90, 0x0, 0x0, 0x2f, - 0xf0, 0xf, 0xf2, 0x0, 0x0, 0xaf, 0xf1, 0x2f, - 0xfa, 0x0, 0x4, 0xff, 0xf9, 0x9f, 0xff, 0x40, - 0xc, 0xff, 0xfa, 0xaf, 0xff, 0xb0, 0x4f, 0xff, - 0xf4, 0x4f, 0xff, 0xf4, 0xef, 0xff, 0xfc, 0xcf, - 0xff, 0xfd, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfd, 0xef, 0xa0, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x3, 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, + 0xc0, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0xdf, 0xfd, + 0x5, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xf8, + 0xcf, 0xff, 0xe1, 0x0, 0x1f, 0xff, 0xfc, 0x4, + 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xd2, 0x7f, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x0, /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x8, 0x60, 0x87, 0x51, - 0x0, 0x67, 0x7b, 0xf6, 0xff, 0xfc, 0x2a, 0xff, - 0xff, 0xfd, 0x34, 0x7f, 0x8f, 0xc4, 0x4a, 0xd1, - 0x0, 0x4, 0xef, 0x10, 0x5, 0x10, 0x0, 0x5, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf8, 0x40, - 0x8, 0x60, 0x87, 0xcf, 0x9e, 0xe8, 0x7b, 0xf6, - 0xff, 0xf9, 0x5, 0xef, 0xff, 0xfd, 0x34, 0x0, - 0x0, 0x2, 0x4a, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xc1, 0xff, 0xf8, 0x0, 0x2e, + 0xff, 0xfc, 0xcd, 0xff, 0x62, 0xef, 0xdf, 0xf9, + 0x0, 0x2c, 0x4e, 0xf9, 0xf, 0x90, 0x0, 0x2, + 0xef, 0x90, 0x7, 0x0, 0x0, 0x2e, 0xf8, 0x88, + 0xf, 0xa0, 0xcd, 0xff, 0x80, 0xdf, 0xdf, 0xf9, + 0xff, 0xf8, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x10, /* U+F077 "" */ - 0x0, 0x0, 0xa, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0x90, 0x0, 0x1, 0x9f, 0xfa, 0xaf, 0xf9, 0x0, - 0x1c, 0xff, 0xa0, 0xa, 0xff, 0x90, 0x4f, 0xfa, - 0x0, 0x0, 0xaf, 0xf4, 0x6, 0x90, 0x0, 0x0, - 0x9, 0x60, + 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xf9, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf9, 0x0, + 0x0, 0x2e, 0xf9, 0x2e, 0xf9, 0x0, 0x2e, 0xf9, + 0x0, 0x2e, 0xf9, 0xb, 0xf9, 0x0, 0x0, 0x2e, + 0xf4, 0x27, 0x0, 0x0, 0x0, 0x27, 0x0, /* U+F078 "" */ - 0x3, 0x80, 0x0, 0x0, 0x9, 0x50, 0x3e, 0xf9, - 0x0, 0x0, 0xaf, 0xf4, 0x1d, 0xff, 0x90, 0xa, - 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0xaf, 0xfd, 0x10, - 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x1, - 0xdf, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x1d, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + 0x27, 0x0, 0x0, 0x0, 0x27, 0xb, 0xf9, 0x0, + 0x0, 0x2e, 0xf4, 0x2e, 0xf9, 0x0, 0x2e, 0xf9, + 0x0, 0x2e, 0xf9, 0x2e, 0xf9, 0x0, 0x0, 0x2e, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x2e, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, 0x0, /* U+F079 "" */ - 0x0, 0xa1, 0x8b, 0xbb, 0xbb, 0xb2, 0x0, 0xaf, - 0xc1, 0xef, 0xff, 0xff, 0x40, 0x7f, 0xff, 0x90, - 0x0, 0x8, 0xf4, 0xb, 0xdf, 0xec, 0x0, 0x0, - 0x8f, 0x40, 0x4, 0xf8, 0x0, 0x1, 0x7b, 0xf9, - 0x50, 0x4f, 0x80, 0x0, 0x1f, 0xff, 0xf9, 0x4, - 0xfd, 0xbb, 0xb8, 0x3f, 0xfb, 0x0, 0x4f, 0xff, - 0xff, 0xf5, 0x6d, 0x10, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xc0, 0x7, 0x77, 0x77, 0x72, 0x0, + 0x3, 0xff, 0xfc, 0x2e, 0xff, 0xff, 0xf9, 0x0, + 0xf, 0xcf, 0xcf, 0xa0, 0x0, 0x0, 0xe9, 0x0, + 0x4, 0x1e, 0x93, 0x20, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0xb5, 0xe9, 0x97, + 0x0, 0xe, 0xc7, 0x77, 0x73, 0xbf, 0xff, 0xf6, + 0x0, 0xd, 0xff, 0xff, 0xfd, 0xb, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, /* U+F07B "" */ - 0x16, 0x77, 0x20, 0x0, 0x0, 0x0, 0xef, 0xff, - 0xe0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfc, 0xbb, - 0xbb, 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xa0, + 0xbf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x98, 0x88, 0x74, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, /* U+F093 "" */ - 0x0, 0x0, 0x1a, 0x30, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xe3, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, - 0x0, 0x0, 0x77, 0x75, 0x58, 0x55, 0x77, 0x70, - 0xff, 0xff, 0xcb, 0xbf, 0xff, 0xf4, 0xff, 0xff, - 0xff, 0xfd, 0xaa, 0xd4, 0xbc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xc1, + 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xe3, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfe, + 0x30, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x23, 0x32, 0x8f, 0xf8, 0x23, 0x32, 0xff, 0xfe, + 0x39, 0x93, 0xef, 0xff, 0xff, 0xff, 0xc9, 0x9c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x8f, + 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, /* U+F095 "" */ - 0x6, 0x20, 0x0, 0x0, 0x0, 0x9f, 0xb0, 0x0, - 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x9f, 0x60, 0x0, 0x0, - 0x0, 0x2f, 0xd1, 0x0, 0x0, 0x0, 0x7, 0xfc, - 0x10, 0x14, 0x0, 0x0, 0xaf, 0xd5, 0xcf, 0xb2, - 0x0, 0x7, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x29, - 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x1, + 0x0, 0x9, 0xff, 0x40, 0x1, 0x8e, 0xe1, 0x1a, + 0xff, 0x70, 0x0, 0xef, 0xff, 0xde, 0xff, 0x90, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x8f, 0xff, 0xe9, 0x10, 0x0, 0x0, 0x2, 0x76, + 0x30, 0x0, 0x0, 0x0, 0x0, /* U+F0C4 "" */ - 0x17, 0x73, 0x0, 0x0, 0x0, 0x0, 0xdb, 0x9f, - 0x70, 0x0, 0x2, 0x86, 0xf3, 0x3, 0xf1, 0x1, - 0x76, 0x19, 0x6f, 0x76, 0xf6, 0x57, 0x14, 0x70, - 0x4, 0xab, 0xa9, 0x50, 0x65, 0x0, 0x1, 0x45, - 0x76, 0x88, 0x91, 0x0, 0x3e, 0xdd, 0xe7, 0xb5, - 0x7, 0x40, 0xe6, 0x1, 0xf1, 0x4, 0x82, 0x56, - 0xf6, 0x4b, 0xc0, 0x0, 0x6, 0x88, 0x4c, 0xc8, - 0x0, 0x0, 0x0, 0x0, + 0x7, 0x93, 0x0, 0x0, 0x22, 0xa, 0xff, 0xf2, + 0x0, 0x8f, 0xf5, 0xf9, 0x1f, 0x70, 0x8f, 0xf9, + 0xc, 0xfc, 0xf8, 0x8f, 0xf9, 0x0, 0x1a, 0xef, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x7, 0xbf, 0xff, 0xf6, 0x0, 0xa, 0xff, + 0xfa, 0xbf, 0xf6, 0x0, 0xf9, 0x1f, 0x70, 0xbf, + 0xf6, 0xc, 0xfc, 0xf4, 0x0, 0xbf, 0xf4, 0x1a, + 0xc6, 0x0, 0x0, 0x56, 0x0, /* U+F0C5 "" */ - 0x0, 0x1, 0x33, 0x32, 0x0, 0x0, 0x0, 0x3e, - 0xa8, 0xac, 0x0, 0x0, 0x3, 0xeb, 0x40, 0x4c, - 0x0, 0x0, 0x3e, 0x38, 0x40, 0x4d, 0xbb, 0xba, - 0xed, 0xbd, 0x30, 0x7f, 0xa4, 0x4d, 0xc0, 0x0, - 0x6, 0xd5, 0x80, 0xc, 0xc0, 0x0, 0x5e, 0x46, - 0x80, 0xc, 0xc0, 0x0, 0xca, 0x88, 0x40, 0xc, - 0xc0, 0x0, 0xc4, 0x0, 0x0, 0xc, 0xeb, 0xbb, - 0xe4, 0x0, 0x0, 0xc, 0x24, 0x44, 0xd4, 0x0, - 0x0, 0xc, 0x0, 0x0, 0xc6, 0x33, 0x33, 0x3c, - 0x0, 0x0, 0x8c, 0xcc, 0xcc, 0xcb, + 0x0, 0x3, 0x44, 0x41, 0x20, 0x0, 0x0, 0xff, + 0xff, 0x5e, 0x40, 0x24, 0x1f, 0xff, 0xf5, 0xee, + 0x2f, 0xf4, 0xff, 0xff, 0xc8, 0x82, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0x5f, 0xf4, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0x4f, 0xff, 0xff, 0xff, 0x5f, 0xf4, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0x5f, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0x93, 0x44, 0x44, 0x43, 0xf, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x68, 0x88, 0x88, 0x71, 0x0, 0x0, /* U+F0C7 "" */ - 0x67, 0x77, 0x77, 0x74, 0x0, 0xe, 0xaf, 0xfa, - 0x8e, 0xd6, 0x0, 0xc4, 0xff, 0x40, 0xc1, 0xd6, - 0xc, 0x4f, 0xf4, 0xc, 0x1, 0xd3, 0xc3, 0xcc, - 0xcc, 0x90, 0x8, 0x4c, 0x0, 0x0, 0x0, 0x0, - 0x84, 0xc1, 0x77, 0x77, 0x77, 0x38, 0x4c, 0x4c, - 0x88, 0x88, 0xa8, 0x84, 0xc4, 0x80, 0x0, 0x4, - 0x88, 0x4c, 0x48, 0x0, 0x0, 0x48, 0x84, 0xbc, - 0xcc, 0xcc, 0xcc, 0xcc, 0x30, + 0x48, 0x88, 0x88, 0x87, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xf8, 0x0, 0x0, 0xb, 0xfb, + 0xf, 0x80, 0x0, 0x0, 0xbf, 0xf3, 0xfb, 0x77, + 0x77, 0x7d, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0x42, 0xdf, 0xff, 0x4f, 0xff, + 0xc0, 0x8, 0xff, 0xf4, 0xff, 0xfe, 0x0, 0xaf, + 0xff, 0x4f, 0xff, 0xfc, 0xaf, 0xff, 0xf4, 0xaf, + 0xff, 0xff, 0xff, 0xfd, 0x10, /* U+F0E7 "" */ - 0x5, 0x77, 0x10, 0xd, 0xfe, 0x0, 0x1f, 0xf9, - 0x0, 0x5f, 0xf4, 0x47, 0x9f, 0xff, 0xfa, 0xdf, - 0xff, 0xf2, 0x96, 0x3f, 0xc0, 0x0, 0x4f, 0x40, - 0x0, 0x8c, 0x0, 0x0, 0xc5, 0x0, 0x0, 0xe0, - 0x0, 0x3, 0x50, 0x0, + 0x1, 0xbb, 0xba, 0x10, 0x0, 0x5f, 0xff, 0xf1, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, + 0x60, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, + 0xff, 0xff, 0xf1, 0xe, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, 0xff, 0x50, + 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x7, 0xf3, + 0x0, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x2a, 0x50, 0x0, 0x0, 0xe, 0xff, 0x8f, + 0xff, 0x20, 0x0, 0xff, 0xf8, 0xff, 0xf4, 0x0, + 0xf, 0xff, 0xeb, 0xbb, 0x30, 0x0, 0xff, 0xf4, + 0x99, 0x92, 0x60, 0xf, 0xff, 0x5f, 0xff, 0x4f, + 0xa0, 0xff, 0xf5, 0xff, 0xf5, 0x56, 0x1f, 0xff, + 0x5f, 0xff, 0xff, 0xf4, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0x4e, 0xff, 0x5f, 0xff, 0xff, 0xf4, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x40, 0x0, 0x5f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x44, 0x44, 0x44, 0x0, /* U+F0F3 "" */ - 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x2a, 0xa2, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xf2, 0x0, - 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x9f, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xfc, 0x0, - 0x4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xd1, 0x7f, 0xff, 0xff, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0x9e, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x19, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xf1, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xf7, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0x50, 0x6f, 0xff, 0xff, 0xff, + 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x24, + 0x44, 0x44, 0x44, 0x43, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, /* U+F11C "" */ - 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x8d, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x4c, 0xc3, 0x66, 0x39, - 0x39, 0x66, 0xc4, 0xcc, 0x13, 0x23, 0x13, 0x12, - 0x2c, 0x4c, 0xc2, 0x84, 0x62, 0x62, 0x44, 0x82, - 0xcc, 0x24, 0x47, 0x77, 0x77, 0x46, 0x2c, 0xc1, - 0x22, 0x44, 0x44, 0x42, 0x31, 0xcc, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xfc, + 0x8e, 0x8e, 0x8e, 0x88, 0xe8, 0xf7, 0xf8, 0xc, + 0xc, 0xb, 0x0, 0xb0, 0xf8, 0xff, 0xec, 0xfc, + 0xec, 0xee, 0xcf, 0xf8, 0xff, 0xa0, 0xc0, 0xa0, + 0x77, 0x2f, 0xf8, 0xff, 0xec, 0xfc, 0xec, 0xee, + 0xcf, 0xf8, 0xf8, 0xc, 0x0, 0x0, 0x0, 0xb0, + 0xf8, 0xfc, 0x8e, 0x88, 0x88, 0x88, 0xe8, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x0, - 0x6d, 0xf2, 0x0, 0x0, 0x6d, 0xff, 0xa0, 0x0, - 0x6d, 0xff, 0xff, 0x20, 0x6d, 0xff, 0xff, 0xfa, - 0x0, 0x88, 0x88, 0xef, 0xf2, 0x0, 0x0, 0x0, - 0xcf, 0xa0, 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, - 0x0, 0x0, 0xca, 0x0, 0x0, 0x0, 0x0, 0x92, - 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xe0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x1, 0x34, 0x44, 0xdf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x0, 0x0, /* U+F15B "" */ - 0x33, 0x33, 0x33, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xf4, 0x60, 0x0, 0xff, 0xff, 0xff, 0x4f, 0x60, - 0xf, 0xff, 0xff, 0xf4, 0xff, 0x60, 0xff, 0xff, - 0xff, 0x24, 0x44, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0x20, + 0x9b, 0xbb, 0xb2, 0x70, 0xf, 0xff, 0xff, 0x4f, + 0x90, 0xff, 0xff, 0xf4, 0xff, 0x9f, 0xff, 0xff, + 0x54, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0x44, + 0x44, 0x44, 0x30, /* U+F1EB "" */ - 0x0, 0x0, 0x13, 0x64, 0x30, 0x0, 0x0, 0x0, - 0x6c, 0xff, 0xff, 0xff, 0x92, 0x0, 0x1b, 0xff, - 0xb7, 0x44, 0x8d, 0xff, 0x70, 0x8f, 0xb3, 0x6a, - 0xbb, 0x94, 0x4d, 0xf4, 0x5, 0x4e, 0xff, 0xef, - 0xff, 0xc3, 0x50, 0x0, 0xaf, 0x82, 0x33, 0x2b, - 0xf5, 0x0, 0x0, 0x2, 0x9f, 0xff, 0xe6, 0x20, - 0x0, 0x0, 0x0, 0xae, 0x89, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xa8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x9b, 0xcb, 0x95, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xef, + 0xfa, 0x53, 0x23, 0x5a, 0xff, 0xe3, 0xdf, 0xa1, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xd2, 0x60, 0x5, + 0xbe, 0xfe, 0xb5, 0x0, 0x52, 0x0, 0x1c, 0xff, + 0xfe, 0xff, 0xfc, 0x10, 0x0, 0x2, 0xec, 0x40, + 0x0, 0x4c, 0xe2, 0x0, 0x0, 0x1, 0x0, 0x1, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd6, 0x0, + 0x0, 0x0, /* U+F240 "" */ - 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x10, - 0xe4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0x80, - 0xc3, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x94, 0xa1, - 0xc4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0xc7, - 0xc4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x88, - 0xc4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x88, - 0xc4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc4, 0xe4, - 0xc1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x34, 0x80, - 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0x50, + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xcf, 0xf8, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0xcc, 0xcc, 0xc3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, /* U+F241 "" */ - 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x10, - 0xe4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0x80, - 0xc3, 0xbb, 0xbb, 0xbb, 0xbb, 0x30, 0x4, 0xa1, - 0xc4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x2, 0xc7, - 0xc4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x88, - 0xc4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x88, - 0xc4, 0xff, 0xff, 0xff, 0xff, 0x40, 0x4, 0xe4, - 0xc1, 0x44, 0x44, 0x44, 0x44, 0x10, 0x4, 0x80, - 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0x50, + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x44, 0x43, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0xff, 0xc0, 0x2, 0xcf, 0xf8, 0xcf, + 0xff, 0xff, 0xfc, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0xcc, 0x90, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, /* U+F242 "" */ - 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x10, - 0xe4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0x80, - 0xc3, 0xbb, 0xbb, 0xb9, 0x0, 0x0, 0x4, 0xa1, - 0xc4, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2, 0xc7, - 0xc4, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x88, - 0xc4, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x88, - 0xc4, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x4, 0xe4, - 0xc1, 0x44, 0x44, 0x43, 0x0, 0x0, 0x4, 0x80, - 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0x50, + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x42, 0x0, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0x80, 0x0, 0x2, 0xcf, 0xf8, 0xcf, + 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0x60, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, /* U+F243 "" */ - 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x10, - 0xe4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0x80, - 0xc3, 0xbb, 0xb3, 0x0, 0x0, 0x0, 0x4, 0xa1, - 0xc4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x2, 0xc7, - 0xc4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x88, - 0xc4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x88, - 0xc4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x4, 0xe4, - 0xc1, 0x44, 0x41, 0x0, 0x0, 0x0, 0x4, 0x80, - 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0x50, + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x41, 0x0, 0x0, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0x40, 0x0, 0x0, 0x2, 0xcf, 0xf8, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0x30, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, /* U+F244 "" */ - 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x10, - 0xe4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0x80, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xa1, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc7, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x88, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x88, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe4, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x80, - 0xdb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0x50, + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xdf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xcb, 0xfe, 0x0, 0x0, 0x0, + 0x1, 0x0, 0xd, 0x10, 0x42, 0x0, 0x0, 0x0, + 0x9f, 0xd1, 0x68, 0x0, 0x0, 0x0, 0x68, 0x0, + 0xff, 0xfe, 0xee, 0xed, 0xdd, 0xdd, 0xef, 0xc0, + 0x9f, 0xd1, 0x0, 0xb3, 0x0, 0x0, 0x68, 0x0, + 0x1, 0x0, 0x0, 0x3b, 0x5, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xbe, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F293 "" */ - 0x0, 0x1, 0x33, 0x20, 0x0, 0x0, 0x9f, 0xff, - 0xfb, 0x10, 0x7, 0xff, 0xc6, 0xff, 0xb0, 0xe, - 0xff, 0xc0, 0x6f, 0xf2, 0x1f, 0xa6, 0xc4, 0x57, - 0xf6, 0x4f, 0xf6, 0x32, 0x2c, 0xf8, 0x4f, 0xff, - 0x50, 0xdf, 0xf8, 0x4f, 0xfd, 0x10, 0x6f, 0xf8, - 0x3f, 0xd2, 0x94, 0x57, 0xf8, 0xf, 0xec, 0xc2, - 0x2c, 0xf4, 0xa, 0xff, 0xc1, 0xcf, 0xf0, 0x2, - 0xff, 0xdc, 0xff, 0x50, 0x0, 0x17, 0xcc, 0x92, - 0x0 + 0x0, 0x0, 0x34, 0x20, 0x0, 0x0, 0x6e, 0xfe, + 0xfd, 0x20, 0x4, 0xff, 0xf3, 0xff, 0xd0, 0xc, + 0xff, 0xf0, 0x4f, 0xf5, 0xf, 0xd5, 0xf2, 0x95, + 0xf8, 0x2f, 0xf7, 0x41, 0x3c, 0xfa, 0x3f, 0xff, + 0x60, 0xaf, 0xfb, 0x3f, 0xfe, 0x20, 0x4f, 0xfb, + 0x2f, 0xe2, 0x92, 0x75, 0xfa, 0xf, 0xeb, 0xf1, + 0x49, 0xf8, 0x9, 0xff, 0xf0, 0x9f, 0xf2, 0x1, + 0xdf, 0xf9, 0xff, 0x90, 0x0, 0x6, 0xab, 0x95, + 0x0, + + /* U+F2ED "" */ + 0x0, 0x4, 0x88, 0x70, 0x0, 0xb, 0xcc, 0xff, + 0xff, 0xdc, 0xc5, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x52, 0x88, 0x88, 0x88, 0x88, 0x60, 0x4f, 0xff, + 0xff, 0xff, 0xfc, 0x4, 0xfa, 0xae, 0x6f, 0x5f, + 0xc0, 0x4f, 0xaa, 0xe6, 0xf4, 0xfc, 0x4, 0xfa, + 0xae, 0x6f, 0x4f, 0xc0, 0x4f, 0xaa, 0xe6, 0xf4, + 0xfc, 0x4, 0xfa, 0xae, 0x6f, 0x4f, 0xc0, 0x4f, + 0xaa, 0xe6, 0xf5, 0xfc, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6, 0x88, 0x88, 0x88, 0x72, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd1, 0x0, 0x0, 0x0, + 0x1, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xea, + 0x5f, 0xfd, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x5d, + 0x20, 0x0, 0x2, 0xef, 0xff, 0xf8, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x2, 0xef, + 0xff, 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xd, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x6, 0x64, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5, + 0xff, 0xff, 0x91, 0xdd, 0x19, 0xff, 0xf5, 0xff, + 0xff, 0xfd, 0x11, 0x11, 0xdf, 0xff, 0xef, 0xff, + 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xf5, 0xff, 0xff, + 0xfd, 0x11, 0x11, 0xdf, 0xff, 0x5, 0xff, 0xff, + 0x91, 0xdd, 0x19, 0xff, 0xf0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F7C2 "" */ + 0x0, 0x17, 0x88, 0x87, 0x20, 0x2d, 0xff, 0xff, + 0xfd, 0x2e, 0xa0, 0xb3, 0x78, 0xfe, 0xfa, 0xb, + 0x37, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0x4, 0x44, + 0x44, 0x44, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf0, 0x0, 0x69, 0x0, + 0x0, 0x0, 0xdf, 0x0, 0x7f, 0xc0, 0x0, 0x0, + 0xd, 0xf0, 0x8f, 0xff, 0xdd, 0xdd, 0xdd, 0xff, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0 }; @@ -1024,152 +1163,159 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { *--------------------*/ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_h = 0, .box_w = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 48, .box_h = 0, .box_w = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 51, .box_h = 9, .box_w = 2, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 9, .adv_w = 69, .box_h = 4, .box_w = 4, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 17, .adv_w = 120, .box_h = 9, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 49, .adv_w = 112, .box_h = 12, .box_w = 7, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 91, .adv_w = 140, .box_h = 9, .box_w = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 132, .adv_w = 120, .box_h = 9, .box_w = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 168, .adv_w = 42, .box_h = 4, .box_w = 2, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 172, .adv_w = 64, .box_h = 13, .box_w = 4, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 198, .adv_w = 64, .box_h = 13, .box_w = 4, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 224, .adv_w = 83, .box_h = 5, .box_w = 5, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 237, .adv_w = 109, .box_h = 7, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 262, .adv_w = 43, .box_h = 4, .box_w = 2, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 266, .adv_w = 87, .box_h = 2, .box_w = 4, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 270, .adv_w = 51, .box_h = 2, .box_w = 3, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 273, .adv_w = 80, .box_h = 10, .box_w = 5, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 298, .adv_w = 108, .box_h = 10, .box_w = 6, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 328, .adv_w = 108, .box_h = 9, .box_w = 4, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 346, .adv_w = 108, .box_h = 9, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 378, .adv_w = 108, .box_h = 9, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 405, .adv_w = 108, .box_h = 9, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 437, .adv_w = 108, .box_h = 9, .box_w = 5, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 460, .adv_w = 108, .box_h = 9, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 492, .adv_w = 108, .box_h = 9, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 524, .adv_w = 108, .box_h = 9, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 556, .adv_w = 108, .box_h = 9, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 583, .adv_w = 48, .box_h = 7, .box_w = 1, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 587, .adv_w = 49, .box_h = 9, .box_w = 2, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 596, .adv_w = 98, .box_h = 6, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 614, .adv_w = 108, .box_h = 4, .box_w = 5, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 624, .adv_w = 101, .box_h = 6, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 642, .adv_w = 91, .box_h = 9, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 669, .adv_w = 172, .box_h = 12, .box_w = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 735, .adv_w = 121, .box_h = 9, .box_w = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 771, .adv_w = 121, .box_h = 9, .box_w = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 803, .adv_w = 122, .box_h = 9, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 835, .adv_w = 130, .box_h = 9, .box_w = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 867, .adv_w = 105, .box_h = 9, .box_w = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 894, .adv_w = 105, .box_h = 9, .box_w = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 921, .adv_w = 130, .box_h = 10, .box_w = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 961, .adv_w = 135, .box_h = 9, .box_w = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 993, .adv_w = 54, .box_h = 9, .box_w = 2, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1002, .adv_w = 105, .box_h = 9, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1029, .adv_w = 121, .box_h = 9, .box_w = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1061, .adv_w = 105, .box_h = 9, .box_w = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1088, .adv_w = 165, .box_h = 9, .box_w = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1129, .adv_w = 135, .box_h = 9, .box_w = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1161, .adv_w = 131, .box_h = 9, .box_w = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1197, .adv_w = 121, .box_h = 9, .box_w = 6, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1224, .adv_w = 134, .box_h = 10, .box_w = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1264, .adv_w = 122, .box_h = 9, .box_w = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1296, .adv_w = 117, .box_h = 9, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1328, .adv_w = 115, .box_h = 9, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1360, .adv_w = 130, .box_h = 9, .box_w = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1396, .adv_w = 121, .box_h = 9, .box_w = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1432, .adv_w = 165, .box_h = 9, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1477, .adv_w = 121, .box_h = 9, .box_w = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1513, .adv_w = 121, .box_h = 9, .box_w = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1549, .adv_w = 115, .box_h = 9, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1581, .adv_w = 52, .box_h = 12, .box_w = 3, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1599, .adv_w = 79, .box_h = 10, .box_w = 5, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1624, .adv_w = 52, .box_h = 12, .box_w = 3, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1642, .adv_w = 80, .box_h = 5, .box_w = 5, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 1655, .adv_w = 87, .box_h = 1, .box_w = 6, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1658, .adv_w = 60, .box_h = 2, .box_w = 3, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 1661, .adv_w = 106, .box_h = 7, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1682, .adv_w = 109, .box_h = 10, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1717, .adv_w = 101, .box_h = 7, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1738, .adv_w = 109, .box_h = 10, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1768, .adv_w = 101, .box_h = 7, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1789, .adv_w = 59, .box_h = 10, .box_w = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1809, .adv_w = 109, .box_h = 10, .box_w = 6, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 1839, .adv_w = 109, .box_h = 10, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1869, .adv_w = 48, .box_h = 10, .box_w = 1, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1874, .adv_w = 50, .box_h = 13, .box_w = 4, .ofs_x = -1, .ofs_y = -3}, - {.bitmap_index = 1900, .adv_w = 98, .box_h = 10, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1930, .adv_w = 48, .box_h = 10, .box_w = 3, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1945, .adv_w = 168, .box_h = 7, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1980, .adv_w = 109, .box_h = 7, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2001, .adv_w = 109, .box_h = 7, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2026, .adv_w = 109, .box_h = 10, .box_w = 7, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2061, .adv_w = 109, .box_h = 10, .box_w = 6, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2091, .adv_w = 67, .box_h = 7, .box_w = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2105, .adv_w = 100, .box_h = 7, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2126, .adv_w = 61, .box_h = 8, .box_w = 4, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2142, .adv_w = 109, .box_h = 7, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2163, .adv_w = 97, .box_h = 7, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2184, .adv_w = 145, .box_h = 7, .box_w = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2216, .adv_w = 97, .box_h = 7, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2237, .adv_w = 97, .box_h = 10, .box_w = 6, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2267, .adv_w = 97, .box_h = 7, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2288, .adv_w = 65, .box_h = 12, .box_w = 4, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2312, .adv_w = 48, .box_h = 11, .box_w = 2, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2323, .adv_w = 65, .box_h = 12, .box_w = 4, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2347, .adv_w = 130, .box_h = 3, .box_w = 8, .ofs_x = 0, .ofs_y = 2}, - {.bitmap_index = 2359, .adv_w = 165, .box_h = 12, .box_w = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2425, .adv_w = 206, .box_h = 12, .box_w = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2503, .adv_w = 192, .box_h = 10, .box_w = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2563, .adv_w = 192, .box_h = 8, .box_w = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2611, .adv_w = 151, .box_h = 8, .box_w = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2647, .adv_w = 165, .box_h = 12, .box_w = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2713, .adv_w = 165, .box_h = 11, .box_w = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2774, .adv_w = 151, .box_h = 11, .box_w = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2829, .adv_w = 178, .box_h = 9, .box_w = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2879, .adv_w = 178, .box_h = 11, .box_w = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2945, .adv_w = 165, .box_h = 9, .box_w = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2995, .adv_w = 165, .box_h = 11, .box_w = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3056, .adv_w = 82, .box_h = 9, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3083, .adv_w = 123, .box_h = 9, .box_w = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3119, .adv_w = 178, .box_h = 10, .box_w = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3179, .adv_w = 206, .box_h = 11, .box_w = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3251, .adv_w = 165, .box_h = 11, .box_w = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3312, .adv_w = 110, .box_h = 11, .box_w = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3351, .adv_w = 151, .box_h = 11, .box_w = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3406, .adv_w = 165, .box_h = 11, .box_w = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3467, .adv_w = 165, .box_h = 11, .box_w = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3528, .adv_w = 110, .box_h = 11, .box_w = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3567, .adv_w = 165, .box_h = 9, .box_w = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3617, .adv_w = 137, .box_h = 11, .box_w = 7, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3656, .adv_w = 137, .box_h = 11, .box_w = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3700, .adv_w = 151, .box_h = 10, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3750, .adv_w = 151, .box_h = 3, .box_w = 10, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 3765, .adv_w = 192, .box_h = 12, .box_w = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3837, .adv_w = 192, .box_h = 11, .box_w = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3903, .adv_w = 192, .box_h = 7, .box_w = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3945, .adv_w = 192, .box_h = 8, .box_w = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3993, .adv_w = 206, .box_h = 8, .box_w = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4045, .adv_w = 178, .box_h = 10, .box_w = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4105, .adv_w = 178, .box_h = 11, .box_w = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4171, .adv_w = 151, .box_h = 10, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4221, .adv_w = 192, .box_h = 10, .box_w = 12, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4281, .adv_w = 192, .box_h = 13, .box_w = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4359, .adv_w = 165, .box_h = 11, .box_w = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4420, .adv_w = 96, .box_h = 12, .box_w = 6, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4456, .adv_w = 192, .box_h = 13, .box_w = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4534, .adv_w = 206, .box_h = 8, .box_w = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4586, .adv_w = 151, .box_h = 10, .box_w = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 4636, .adv_w = 165, .box_h = 13, .box_w = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4708, .adv_w = 219, .box_h = 10, .box_w = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4778, .adv_w = 247, .box_h = 9, .box_w = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4850, .adv_w = 247, .box_h = 9, .box_w = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4922, .adv_w = 247, .box_h = 9, .box_w = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4994, .adv_w = 247, .box_h = 9, .box_w = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5066, .adv_w = 247, .box_h = 9, .box_w = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5138, .adv_w = 165, .box_h = 13, .box_w = 10, .ofs_x = 0, .ofs_y = -2} + {.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 = 48, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 49, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14, .adv_w = 61, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 22, .adv_w = 120, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 54, .adv_w = 108, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 96, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 137, .adv_w = 119, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 173, .adv_w = 33, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 177, .adv_w = 66, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 205, .adv_w = 67, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 233, .adv_w = 83, .box_w = 5, .box_h = 6, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 248, .adv_w = 109, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 273, .adv_w = 38, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 277, .adv_w = 53, .box_w = 4, .box_h = 1, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 279, .adv_w = 51, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 282, .adv_w = 79, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 307, .adv_w = 108, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 339, .adv_w = 108, .box_w = 4, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 357, .adv_w = 108, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 389, .adv_w = 108, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 416, .adv_w = 108, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 448, .adv_w = 108, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 480, .adv_w = 108, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 512, .adv_w = 108, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 544, .adv_w = 108, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 576, .adv_w = 108, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 603, .adv_w = 47, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 614, .adv_w = 41, .box_w = 2, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 623, .adv_w = 98, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 641, .adv_w = 105, .box_w = 6, .box_h = 5, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 656, .adv_w = 100, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 674, .adv_w = 91, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 701, .adv_w = 172, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 767, .adv_w = 125, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 803, .adv_w = 120, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 835, .adv_w = 125, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 871, .adv_w = 126, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 907, .adv_w = 109, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 939, .adv_w = 106, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 971, .adv_w = 131, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1007, .adv_w = 137, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1043, .adv_w = 52, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1052, .adv_w = 106, .box_w = 6, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1079, .adv_w = 120, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1115, .adv_w = 103, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1147, .adv_w = 168, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1192, .adv_w = 137, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1228, .adv_w = 132, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1264, .adv_w = 121, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1300, .adv_w = 132, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1344, .adv_w = 118, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1380, .adv_w = 114, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1412, .adv_w = 115, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1444, .adv_w = 125, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1476, .adv_w = 122, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1512, .adv_w = 170, .box_w = 11, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1562, .adv_w = 120, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1598, .adv_w = 115, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1634, .adv_w = 115, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1666, .adv_w = 51, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1692, .adv_w = 79, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1717, .adv_w = 51, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1737, .adv_w = 80, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 1750, .adv_w = 87, .box_w = 6, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1753, .adv_w = 59, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 1756, .adv_w = 104, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1777, .adv_w = 108, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1812, .adv_w = 101, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1833, .adv_w = 108, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1863, .adv_w = 102, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1884, .adv_w = 67, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1909, .adv_w = 108, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1939, .adv_w = 106, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1969, .adv_w = 47, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1983, .adv_w = 46, .box_w = 4, .box_h = 12, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 2007, .adv_w = 97, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2042, .adv_w = 47, .box_w = 2, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2052, .adv_w = 168, .box_w = 10, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2087, .adv_w = 106, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2108, .adv_w = 110, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2133, .adv_w = 108, .box_w = 7, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2168, .adv_w = 109, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2198, .adv_w = 65, .box_w = 4, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2212, .adv_w = 99, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2233, .adv_w = 63, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2251, .adv_w = 106, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2272, .adv_w = 93, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2293, .adv_w = 144, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2325, .adv_w = 95, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2346, .adv_w = 91, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2376, .adv_w = 95, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2397, .adv_w = 65, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2423, .adv_w = 47, .box_w = 1, .box_h = 11, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 2429, .adv_w = 65, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2455, .adv_w = 131, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 2471, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2549, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2603, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2669, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2723, .adv_w = 132, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2764, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2842, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2920, .adv_w = 216, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2997, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3075, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3138, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3216, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3246, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3291, .adv_w = 216, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3382, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3436, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3484, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3556, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3617, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3678, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3726, .adv_w = 168, .box_w = 12, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 3792, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3831, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3870, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3931, .adv_w = 168, .box_w = 11, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 3948, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4011, .adv_w = 240, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4115, .adv_w = 216, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4213, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4279, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4318, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4357, .adv_w = 240, .box_w = 16, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4437, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4491, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4569, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4654, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4715, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4787, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4848, .adv_w = 120, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4907, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4979, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5051, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5114, .adv_w = 192, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5205, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5264, .adv_w = 240, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5354, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5422, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5490, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5558, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5626, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5694, .adv_w = 240, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5782, .adv_w = 168, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5847, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5919, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6004, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6072, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6131, .adv_w = 193, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0} }; /*--------------------- @@ -1177,25 +1323,26 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { *--------------------*/ static const uint16_t unicode_list_1[] = { - 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x13, - 0x14, 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, - 0x3f, 0x47, 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, - 0x53, 0x66, 0x67, 0x70, 0x73, 0x76, 0x77, 0x78, - 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xe6, 0xf2, - 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, 0x240, 0x241, 0x242, - 0x243, 0x292 + 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x14, + 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, 0x47, + 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, 0x53, 0x66, + 0x67, 0x6d, 0x6f, 0x70, 0x73, 0x76, 0x77, 0x78, + 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xe6, 0xe9, + 0xf2, 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, 0x240, 0x241, + 0x242, 0x243, 0x286, 0x292, 0x2ec, 0x303, 0x559, 0x7c1, + 0x8a1 }; /*Collect the unicode lists and glyph_id offsets*/ static const lv_font_fmt_txt_cmap_t cmaps[] = { { - .range_start = 32, .range_length = 95, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY, - .glyph_id_start = 1, .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0 + .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 = 61441, .range_length = 659, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY, - .glyph_id_start = 96, .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 50 + .range_start = 61441, .range_length = 2210, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 57, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; @@ -1204,569 +1351,245 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = *----------------*/ -/*Pair left and right glyphs for kerning*/ -static const uint8_t kern_pair_glyph_ids[] = +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { - 9, 43, - 9, 55, - 9, 56, - 9, 58, - 17, 17, - 17, 18, - 17, 20, - 17, 21, - 17, 22, - 17, 23, - 17, 24, - 17, 26, - 18, 19, - 18, 20, - 18, 22, - 18, 24, - 19, 17, - 19, 18, - 19, 19, - 19, 22, - 19, 23, - 19, 24, - 19, 25, - 19, 26, - 20, 18, - 20, 19, - 20, 20, - 20, 21, - 20, 22, - 20, 23, - 20, 24, - 20, 25, - 20, 26, - 21, 17, - 21, 19, - 21, 21, - 21, 22, - 21, 23, - 21, 24, - 21, 25, - 22, 18, - 22, 19, - 22, 20, - 22, 21, - 22, 22, - 22, 23, - 22, 24, - 22, 25, - 22, 26, - 23, 17, - 23, 18, - 23, 19, - 23, 21, - 23, 22, - 23, 23, - 23, 24, - 23, 25, - 24, 18, - 24, 21, - 24, 22, - 24, 23, - 24, 24, - 24, 25, - 24, 26, - 25, 17, - 25, 18, - 25, 20, - 25, 21, - 25, 22, - 25, 23, - 26, 17, - 26, 18, - 26, 19, - 26, 21, - 26, 22, - 26, 23, - 26, 24, - 26, 26, - 34, 36, - 34, 40, - 34, 48, - 34, 50, - 34, 53, - 34, 54, - 34, 55, - 34, 56, - 34, 58, - 34, 66, - 34, 68, - 34, 69, - 34, 70, - 34, 72, - 34, 80, - 34, 82, - 34, 84, - 34, 85, - 34, 86, - 34, 87, - 34, 88, - 34, 91, - 35, 58, - 35, 66, - 35, 74, - 35, 77, - 35, 80, - 35, 83, - 35, 86, - 35, 90, - 36, 36, - 36, 40, - 36, 48, - 36, 50, - 36, 74, - 36, 83, - 36, 86, - 36, 90, - 36, 91, - 37, 55, - 37, 56, - 37, 66, - 37, 70, - 37, 80, - 37, 86, - 38, 55, - 38, 56, - 38, 58, - 38, 67, - 38, 68, - 38, 69, - 38, 70, - 38, 71, - 38, 72, - 38, 74, - 38, 75, - 38, 76, - 38, 77, - 38, 78, - 38, 79, - 38, 80, - 38, 81, - 38, 82, - 38, 83, - 38, 85, - 38, 86, - 38, 87, - 38, 88, - 38, 89, - 38, 90, - 38, 91, - 39, 13, - 39, 15, - 39, 34, - 39, 66, - 39, 70, - 39, 74, - 39, 77, - 39, 80, - 39, 83, - 39, 86, - 39, 90, - 40, 66, - 40, 70, - 40, 79, - 40, 80, - 40, 83, - 40, 86, - 40, 90, - 41, 66, - 41, 70, - 41, 80, - 41, 86, - 41, 90, - 42, 66, - 42, 68, - 42, 69, - 42, 71, - 42, 72, - 42, 78, - 42, 79, - 42, 80, - 42, 81, - 42, 83, - 42, 84, - 42, 85, - 42, 86, - 42, 87, - 42, 88, - 42, 90, - 43, 66, - 43, 80, - 44, 36, - 44, 40, - 44, 48, - 44, 50, - 44, 66, - 44, 70, - 44, 74, - 44, 80, - 44, 83, - 44, 86, - 44, 88, - 44, 90, - 45, 34, - 45, 36, - 45, 40, - 45, 48, - 45, 50, - 45, 53, - 45, 54, - 45, 55, - 45, 56, - 45, 58, - 45, 75, - 45, 86, - 45, 88, - 45, 90, - 46, 66, - 46, 70, - 46, 75, - 46, 79, - 46, 80, - 46, 86, - 46, 90, - 47, 70, - 47, 80, - 47, 90, - 48, 34, - 48, 53, - 48, 55, - 48, 56, - 48, 57, - 48, 58, - 48, 68, - 48, 69, - 48, 70, - 48, 71, - 48, 72, - 48, 75, - 48, 80, - 48, 81, - 48, 82, - 48, 84, - 48, 85, - 48, 86, - 48, 89, - 48, 90, - 48, 91, - 49, 13, - 49, 15, - 49, 34, - 49, 38, - 49, 41, - 49, 42, - 49, 66, - 49, 70, - 49, 73, - 49, 74, - 49, 77, - 49, 79, - 49, 80, - 49, 83, - 49, 84, - 49, 85, - 49, 90, - 50, 34, - 50, 53, - 50, 54, - 50, 55, - 50, 56, - 50, 57, - 50, 58, - 50, 66, - 50, 86, - 51, 36, - 51, 40, - 51, 48, - 51, 50, - 51, 53, - 51, 54, - 51, 55, - 51, 56, - 51, 58, - 51, 66, - 51, 70, - 51, 80, - 51, 86, - 51, 90, - 52, 66, - 52, 70, - 52, 75, - 52, 78, - 52, 79, - 52, 80, - 52, 81, - 52, 82, - 52, 86, - 52, 88, - 52, 90, - 53, 13, - 53, 14, - 53, 15, - 53, 27, - 53, 28, - 53, 34, - 53, 36, - 53, 40, - 53, 48, - 53, 50, - 53, 52, - 53, 53, - 53, 55, - 53, 56, - 53, 57, - 53, 58, - 53, 66, - 53, 70, - 53, 74, - 53, 78, - 53, 80, - 53, 83, - 53, 84, - 53, 86, - 53, 88, - 53, 90, - 53, 91, - 54, 34, - 54, 69, - 54, 71, - 54, 72, - 54, 78, - 54, 79, - 54, 81, - 54, 83, - 54, 84, - 54, 85, - 54, 89, - 54, 91, - 55, 10, - 55, 13, - 55, 14, - 55, 15, - 55, 27, - 55, 28, - 55, 34, - 55, 36, - 55, 40, - 55, 48, - 55, 50, - 55, 62, - 55, 66, - 55, 70, - 55, 80, - 55, 83, - 55, 86, - 55, 90, - 55, 94, - 56, 10, - 56, 13, - 56, 14, - 56, 15, - 56, 27, - 56, 28, - 56, 34, - 56, 36, - 56, 40, - 56, 48, - 56, 50, - 56, 53, - 56, 62, - 56, 66, - 56, 70, - 56, 80, - 56, 83, - 56, 86, - 56, 90, - 56, 94, - 57, 36, - 57, 40, - 57, 48, - 57, 50, - 57, 70, - 57, 86, - 57, 90, - 58, 10, - 58, 13, - 58, 14, - 58, 15, - 58, 27, - 58, 28, - 58, 34, - 58, 36, - 58, 40, - 58, 48, - 58, 50, - 58, 53, - 58, 55, - 58, 56, - 58, 57, - 58, 58, - 58, 62, - 58, 66, - 58, 70, - 58, 80, - 58, 82, - 58, 85, - 58, 86, - 58, 87, - 58, 94, - 59, 34, - 59, 36, - 59, 40, - 59, 48, - 59, 50, - 59, 66, - 59, 70, - 59, 74, - 59, 80, - 59, 86, - 59, 88, - 59, 90, - 60, 43, - 67, 87, - 67, 88, - 67, 90, - 70, 90, - 71, 3, - 71, 8, - 71, 10, - 71, 62, - 71, 72, - 71, 94, - 76, 70, - 80, 87, - 80, 88, - 80, 89, - 80, 90, - 81, 88, - 83, 13, - 83, 15, - 83, 68, - 83, 69, - 83, 70, - 83, 71, - 83, 76, - 83, 80, - 83, 82, - 83, 85, - 83, 86, - 83, 87, - 83, 88, - 83, 89, - 83, 90, - 83, 91, - 87, 13, - 87, 15, - 87, 66, - 87, 68, - 87, 69, - 87, 70, - 87, 80, - 87, 82, - 88, 13, - 88, 15, - 88, 68, - 88, 69, - 88, 70, - 88, 82, - 89, 68, - 89, 69, - 89, 70, - 89, 80, - 89, 82, - 90, 13, - 90, 15, - 90, 68, - 90, 69, - 90, 70, - 90, 80, - 90, 82, - 91, 68, - 91, 69, - 91, 70, - 91, 80, - 92, 43 + 0, 1, 0, 2, 0, 0, 0, 0, + 2, 3, 0, 0, 0, 4, 0, 4, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 7, 8, 9, 10, 11, + 0, 12, 12, 13, 14, 15, 12, 12, + 9, 16, 17, 18, 0, 19, 13, 20, + 21, 22, 23, 24, 25, 0, 0, 0, + 0, 0, 26, 27, 28, 0, 29, 30, + 0, 31, 0, 0, 32, 0, 31, 31, + 33, 27, 0, 34, 0, 35, 0, 36, + 37, 38, 36, 39, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; -/* Kerning between the respective left and right glyphs - * 4.4 format which needs to scaled with `kern_scale`*/ -static const int8_t kern_pair_values[] = +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { - -9, 4, 3, 4, 0, -3, 0, 0, - 0, 0, -4, 1, -1, -1, -1, 0, - -2, -2, 1, -1, -2, -2, -2, 0, - -2, 0, 1, 1, 0, 0, -3, 0, - 0, 0, -3, 3, 2, 0, -8, 2, - 0, -2, 1, 2, 0, 0, 0, 1, - -3, 0, -4, -2, 2, 1, 0, -4, - 1, 3, -15, -3, -4, 4, -2, -1, - 0, -2, 1, 2, 1, 0, 0, -4, - -1, 0, 0, 0, -4, 0, -4, -4, - -4, -4, -14, -4, -14, -9, -15, 0, - -2, -3, -2, -1, -2, -1, 0, -6, - -2, -8, -6, 2, -15, 1, 0, 0, - 1, 0, 0, 0, -1, -1, -1, -1, - -1, -1, -1, 1, -1, -4, -2, 0, - 0, 0, 0, 2, 2, 2, -1, -4, - -4, -4, -3, -3, -1, -1, -1, -1, - -2, -2, -4, -1, -3, -1, -4, -3, - -5, -4, 0, -5, 1, -29, -29, -11, - -6, -4, -1, -1, -4, -5, -4, -5, - 0, 0, 0, 0, 0, 0, 0, -1, - -1, -1, -1, 0, -1, -1, -2, -1, - -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, 0, -1, -1, -1, -5, -6, - -6, -6, -1, -5, -1, -5, -1, -4, - -7, -8, 4, -4, -4, -5, -4, -15, - -5, -17, -10, -17, 0, -3, -8, -10, - -1, -1, -1, -1, -1, -1, 0, -1, - -1, 0, -4, -5, -4, -2, -4, -5, + 0, 1, 0, 2, 0, 0, 0, 3, + 2, 0, 4, 5, 0, 6, 7, 6, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 10, 0, 11, 0, 0, 0, + 11, 0, 0, 12, 0, 0, 0, 0, + 11, 0, 11, 0, 13, 14, 15, 16, + 17, 18, 19, 20, 0, 0, 21, 0, + 0, 0, 22, 0, 23, 23, 23, 24, + 23, 0, 0, 0, 0, 0, 25, 25, + 26, 25, 23, 27, 28, 29, 30, 31, + 32, 33, 31, 34, 0, 0, 35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, -6, 0, -2, -6, 0, -7, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, 0, 0, 0, 0, 0, 0, -6, + 0, -1, 0, 0, -12, -2, -8, -6, + 0, -9, 0, 0, 0, 0, 0, 0, + -1, 0, 0, -2, -1, -5, -3, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -2, 0, 0, -5, 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, -3, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, -2, 0, 0, 0, -3, 0, -2, + 0, -2, -4, -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, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -2, -2, 0, -2, 0, 0, 0, + -2, -2, -2, 0, 0, 0, 0, 0, + 0, 0, 0, -22, 0, 0, 0, -16, + 0, -25, 0, 2, 0, 0, 0, 0, + 0, 0, 0, -3, -2, 0, 0, -2, + -2, 0, 0, -2, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, -3, 0, + 0, 0, 2, -3, 0, 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, 0, 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, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, -2, + -3, 0, 0, 0, -2, -4, -6, 0, + 0, 0, 0, -31, 0, 0, 0, 0, + 0, 0, 0, 2, -6, 0, 0, -26, + -5, -16, -13, 0, -22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -12, -9, 0, 0, 0, 0, 0, 0, + 0, 0, -30, 0, 0, 0, -13, 0, + -19, 0, 0, 0, 0, 0, -3, 0, + -2, 0, -1, -1, 0, 0, -1, 0, + 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, -3, + -2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, -2, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, -20, -22, 0, 0, -7, + -3, -22, -1, 2, 0, 2, 1, 0, + 2, 0, 0, -11, -9, 0, -10, -9, + -7, -11, 0, -9, -7, -5, -7, -6, + 0, 0, 0, 0, 2, 0, -21, -3, + 0, 0, -7, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -4, -4, + 0, 0, -4, -3, 0, 0, -3, -1, + 0, 0, 0, 2, 0, 0, 0, 1, + 0, -12, -6, 0, 0, -4, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 1, -3, -3, 0, 0, -3, -2, 0, + 0, -2, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, -2, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + -2, 0, 0, 0, -2, -3, 0, 0, + 0, 0, 0, 0, -3, 2, -5, -20, + -5, 0, 0, -9, -3, -9, -1, 2, + -9, 2, 2, 1, 2, 0, 2, -7, + -6, -2, -4, -6, -4, -5, -2, -4, + -2, 0, -2, -3, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, 0, 0, -2, 0, + 0, 0, -2, -3, -3, 0, 0, 0, + 0, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 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, -3, + 0, 0, 0, 0, 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, + 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, 0, 0, -1, 0, 0, - 0, 0, 0, 0, -1, 1, -1, -31, - -31, -10, -1, -1, -1, -2, -2, 0, - -1, -1, -1, -2, 0, -1, 3, 3, - 3, -6, -1, -5, -4, 2, -7, 0, - 0, -1, -1, -1, -1, -4, -1, -4, - -3, -9, 0, -1, -1, -1, 0, 0, - 0, -1, -1, -1, 0, 0, 0, 0, - 1, 0, -15, -15, -15, -14, -15, -15, - -5, -5, -5, -5, -3, 3, 3, 3, - 2, 3, -15, -15, -1, -13, -15, -13, - -15, -13, -9, -9, -12, -4, -1, 0, - -1, -1, -1, -1, -1, -1, 0, -1, - -2, 4, -17, -7, -16, -6, -6, -14, - -4, -4, -4, -4, 3, -9, -9, -9, - -6, -5, -2, 4, 3, -11, -4, -11, - -4, -4, -10, -3, -3, -3, -3, 3, - 2, -6, -6, -6, -4, -4, -1, 3, - -4, -4, -5, -4, -5, -4, -6, 4, - -18, -10, -18, -8, -8, -16, -5, -5, - -6, -5, 3, 3, 3, 3, 3, 3, - -12, -13, -13, -12, -4, -7, -4, 4, - 3, -4, -5, -5, -5, 0, -4, -1, - -4, -4, -5, -5, -3, -2, -1, -2, - -2, 3, 3, 4, 3, -5, 4, -4, - -3, -2, -4, -3, -1, -12, -12, -4, - -3, -4, 3, 0, -4, -3, 3, 0, - 3, 3, 2, 3, 1, -11, -11, -3, - -3, -3, -3, -3, -3, -9, -8, -2, - -2, -2, -2, -4, -3, -4, -4, -3, - -13, -12, -3, -3, -3, -3, -4, -3, - -3, -3, -3, -4 + 0, 0, 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, + 2, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, -10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 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, + -2, -1, 0, 0, 2, 0, 0, 0, + -12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, -2, 1, 0, -2, 0, 0, 5, + 0, 2, 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, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -1, + 1, 0, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 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, 0, 0, 0, 0, 0, 0, 0, + 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, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, + 0, 0, 0, 0, 0, 0, 0, 0 }; -/*Collect the kern pair's data in one place*/ -static const lv_font_fmt_txt_kern_pair_t kern_pairs = + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = { - .glyph_ids = kern_pair_glyph_ids, - .values = kern_pair_values, - .pair_cnt = 484, - .glyph_ids_size = 0 + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 40, + .right_class_cnt = 35, }; /*-------------------- @@ -1778,12 +1601,12 @@ 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_scale = 16, - .kern_dsc = &kern_pairs, - .kern_classes = 0 + .kern_classes = 1, + .bitmap_format = 0 }; @@ -1793,11 +1616,13 @@ static lv_font_fmt_txt_dsc_t font_dsc = { /*Initialize a public general font descriptor*/ lv_font_t lv_font_roboto_12 = { - .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ .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 = 14, /*The maximum line height required by the font*/ .base_line = 3, /*Baseline measured from the bottom of the line*/ + .subpx = LV_FONT_SUBPX_NONE, + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; #endif /*#if LV_FONT_ROBOTO_12*/ + diff --git a/src/lv_font/lv_font_roboto_12_subpx.c b/src/lv_font/lv_font_roboto_12_subpx.c new file mode 100644 index 000000000..4565b99c1 --- /dev/null +++ b/src/lv_font/lv_font_roboto_12_subpx.c @@ -0,0 +1,3419 @@ +#include "../../lvgl.h" + +/******************************************************************************* + * Size: 12 px + * Bpp: 4 + * Opts: --no-compress --no-prefilter --bpp 4 --size 12 --font Roboto-Regular.woff -r 0x20-0x7F --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 lv_font_roboto_12_subpx.c --force-fast-kern-format --lcd + ******************************************************************************/ + +#ifndef LV_FONT_ROBOTO_12_SUBPX +#define LV_FONT_ROBOTO_12_SUBPX 1 +#endif + +#if LV_FONT_ROBOTO_12_SUBPX + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { + /* U+20 " " */ + + /* U+21 "!" */ + 0x0, 0x5a, 0xfc, 0x61, 0x0, 0x5, 0xaf, 0xc6, + 0x10, 0x0, 0x5a, 0xfb, 0x61, 0x0, 0x4, 0xaf, + 0xb6, 0x10, 0x0, 0x4a, 0xfb, 0x60, 0x0, 0x4, + 0x9f, 0xb5, 0x0, 0x0, 0x26, 0x97, 0x30, 0x0, + 0x0, 0x23, 0x21, 0x0, 0x0, 0x49, 0xeb, 0x61, + 0x0, + + /* U+22 "\"" */ + 0x3, 0x8d, 0x94, 0x49, 0xc8, 0x30, 0x3, 0x8c, + 0x93, 0x49, 0xc7, 0x20, 0x3, 0x8b, 0x82, 0x49, + 0xb6, 0x10, 0x0, 0x11, 0x10, 0x1, 0x10, 0x0, + + /* U+23 "#" */ + 0x0, 0x0, 0x0, 0x1, 0x7c, 0xb6, 0x0, 0x16, + 0xbc, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xac, 0x72, 0x0, 0x4a, 0xd8, 0x30, 0x0, 0x0, + 0x1, 0x6b, 0xee, 0xef, 0xff, 0xee, 0xee, 0xff, + 0xfe, 0xed, 0x83, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xc6, 0x10, 0x5, 0xbc, 0x72, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0x93, 0x0, 0x38, 0xd9, + 0x40, 0x0, 0x0, 0x0, 0x38, 0xce, 0xee, 0xff, + 0xee, 0xee, 0xef, 0xfe, 0xee, 0xb7, 0x20, 0x0, + 0x0, 0x0, 0x49, 0xd9, 0x30, 0x3, 0x8d, 0xa4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6c, 0xb6, + 0x10, 0x5, 0xbc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9d, 0x94, 0x0, 0x38, 0xda, 0x50, + 0x0, 0x0, 0x0, 0x0, + + /* U+24 "$" */ + 0x0, 0x0, 0x0, 0x0, 0x49, 0xd9, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x69, 0xdf, + 0xd9, 0x63, 0x10, 0x0, 0x0, 0x0, 0x5, 0xae, + 0xec, 0x97, 0x77, 0xad, 0xfd, 0x83, 0x0, 0x0, + 0x4, 0xaf, 0xc7, 0x20, 0x0, 0x0, 0x38, 0xde, + 0x94, 0x0, 0x0, 0x49, 0xee, 0x93, 0x0, 0x0, + 0x0, 0x23, 0x53, 0x10, 0x0, 0x0, 0x26, 0xbe, + 0xfd, 0xa8, 0x63, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x68, 0xad, 0xef, 0xda, 0x52, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x49, 0xee, 0x94, 0x0, 0x4, 0x9f, 0xd7, 0x20, + 0x0, 0x0, 0x0, 0x5b, 0xfb, 0x50, 0x0, 0x4, + 0xae, 0xeb, 0x75, 0x44, 0x46, 0xad, 0xfc, 0x72, + 0x0, 0x0, 0x0, 0x25, 0x8a, 0xce, 0xfd, 0xb9, + 0x74, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xbd, 0x82, 0x0, 0x0, 0x0, 0x0, + + /* U+25 "%" */ + 0x0, 0x37, 0xbc, 0xcc, 0xcb, 0x84, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xc7, + 0x20, 0x1, 0x7c, 0xb6, 0x0, 0x2, 0x7a, 0x83, + 0x0, 0x0, 0x0, 0x5, 0xad, 0x83, 0x0, 0x27, + 0xcb, 0x50, 0x16, 0xbb, 0x61, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x59, 0xbc, 0xcb, 0xa6, 0x21, 0x5a, + 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x14, 0xac, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xc9, 0x42, 0x48, 0xab, 0xcc, 0xb8, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, 0xa5, 0x12, + 0x7c, 0xb5, 0x0, 0x5, 0xac, 0x83, 0x0, 0x0, + 0x0, 0x17, 0xbb, 0x61, 0x0, 0x28, 0xca, 0x50, + 0x0, 0x49, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x9c, 0xcc, 0xcc, 0xa6, + 0x20, 0x0, + + /* U+26 "&" */ + 0x0, 0x0, 0x25, 0x9c, 0xee, 0xfe, 0xda, 0x63, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xd9, + 0x40, 0x1, 0x6b, 0xfb, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xd8, 0x20, 0x2, 0x7c, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xde, + 0xcb, 0xcd, 0xc7, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x59, 0xde, 0xff, 0xe9, 0x40, 0x0, + 0x1, 0x33, 0x20, 0x0, 0x2, 0x7c, 0xfc, 0x72, + 0x14, 0x9d, 0xeb, 0x51, 0x27, 0xdd, 0x82, 0x0, + 0x5, 0xbf, 0xb6, 0x0, 0x0, 0x2, 0x7c, 0xed, + 0xcd, 0xe9, 0x40, 0x0, 0x2, 0x7d, 0xea, 0x51, + 0x0, 0x0, 0x15, 0xaf, 0xff, 0xb5, 0x10, 0x0, + 0x0, 0x2, 0x59, 0xbd, 0xdd, 0xde, 0xdc, 0xa8, + 0x7a, 0xde, 0xb5, 0x10, + + /* U+27 "'" */ + 0x16, 0xbc, 0x72, 0x16, 0xbc, 0x71, 0x16, 0xbb, + 0x60, 0x0, 0x0, 0x0, + + /* U+28 "(" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x5a, 0xda, 0x51, 0x0, 0x0, + 0x0, 0x15, 0xbd, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xdd, 0x72, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xdd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7d, 0xe8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x38, 0xde, 0x83, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xfa, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xae, 0xa5, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6c, 0xd9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x99, 0x61, + 0x0, + + /* U+29 ")" */ + 0x0, 0x1, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xcb, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8d, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6b, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xd7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xdf, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x7c, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xde, 0x83, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xaf, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x3, 0x9e, + 0xd7, 0x20, 0x0, 0x0, 0x0, 0x4, 0x9d, 0xc6, + 0x10, 0x0, 0x0, 0x0, 0x27, 0xcc, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x58, 0xa5, 0x20, 0x0, 0x0, + 0x0, + + /* U+2A "*" */ + 0x0, 0x0, 0x0, 0x0, 0x28, 0xdb, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x24, 0x53, 0x12, 0x7c, + 0xa5, 0x2, 0x44, 0x30, 0x0, 0x0, 0x3, 0x7a, + 0xcd, 0xef, 0xff, 0xee, 0xdc, 0x95, 0x20, 0x0, + 0x0, 0x0, 0x2, 0x6b, 0xde, 0xdc, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xbd, 0xa4, 0x13, + 0x8d, 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x0, 0x0, 0x12, 0x10, 0x0, 0x0, + + /* U+2B "+" */ + 0x0, 0x0, 0x0, 0x1, 0x59, 0xb7, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xde, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7d, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x3, + 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x40, 0x1, 0x12, 0x22, 0x24, 0x8d, 0xea, + 0x52, 0x22, 0x22, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xde, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7d, 0xe9, 0x40, 0x0, 0x0, + 0x0, 0x0, + + /* U+2C "," */ + 0x0, 0x0, 0x49, 0xec, 0x72, 0x0, 0x0, 0x0, + 0x5a, 0xfb, 0x60, 0x0, 0x0, 0x5, 0xad, 0xa5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+2D "-" */ + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xfb, 0x61, 0x0, + + /* U+2E "." */ + 0x0, 0x13, 0x43, 0x10, 0x0, 0x15, 0xbe, 0xb6, + 0x10, + + /* U+2F "/" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xdb, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, + 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xdb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9d, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xda, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9d, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xad, 0x93, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5a, 0xd9, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbd, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+30 "0" */ + 0x0, 0x1, 0x37, 0xbd, 0xee, 0xfe, 0xdb, 0x84, + 0x10, 0x0, 0x0, 0x4, 0x9e, 0xea, 0x51, 0x0, + 0x14, 0x9d, 0xfa, 0x50, 0x0, 0x3, 0x8e, 0xd8, + 0x30, 0x0, 0x0, 0x2, 0x7d, 0xfa, 0x40, 0x0, + 0x5a, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x6, 0xbf, + 0xb6, 0x0, 0x5, 0xaf, 0xc7, 0x10, 0x0, 0x0, + 0x0, 0x5b, 0xfb, 0x61, 0x0, 0x4a, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x6, 0xbf, 0xb5, 0x0, 0x3, + 0x8e, 0xe8, 0x30, 0x0, 0x0, 0x2, 0x7d, 0xf9, + 0x40, 0x0, 0x4, 0x9e, 0xea, 0x52, 0x0, 0x14, + 0x9d, 0xfa, 0x50, 0x0, 0x0, 0x1, 0x37, 0xad, + 0xef, 0xfe, 0xdb, 0x84, 0x10, 0x0, 0x0, + + /* U+31 "1" */ + 0x0, 0x0, 0x1, 0x35, 0x7a, 0xcd, 0x84, 0x0, + 0x4, 0x9e, 0xec, 0xaa, 0xce, 0xf9, 0x40, 0x0, + 0x1, 0x10, 0x0, 0x27, 0xdf, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7d, 0xf9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xdf, 0x94, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7d, 0xf9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xdf, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7d, 0xf9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xdf, 0x94, 0x0, + + /* U+32 "2" */ + 0x0, 0x2, 0x59, 0xbd, 0xef, 0xfe, 0xdb, 0x95, + 0x20, 0x0, 0x0, 0x27, 0xde, 0xb7, 0x31, 0x0, + 0x14, 0x9d, 0xfb, 0x61, 0x0, 0x4, 0x8b, 0x84, + 0x0, 0x0, 0x0, 0x3, 0x8e, 0xd8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xce, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0xad, 0xd9, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8c, 0xeb, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x6b, 0xdc, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x94, 0x0, + + /* U+33 "3" */ + 0x0, 0x2, 0x59, 0xcd, 0xef, 0xfe, 0xdb, 0x84, + 0x10, 0x0, 0x0, 0x27, 0xce, 0xb7, 0x20, 0x0, + 0x14, 0x9d, 0xe9, 0x40, 0x0, 0x2, 0x47, 0x53, + 0x0, 0x0, 0x0, 0x4, 0x9f, 0xc7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xd8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xff, 0xff, + 0xfd, 0x94, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x9d, 0xea, 0x51, 0x0, 0x2, + 0x46, 0x42, 0x0, 0x0, 0x0, 0x2, 0x7d, 0xe9, + 0x30, 0x0, 0x38, 0xee, 0xa5, 0x20, 0x0, 0x13, + 0x8c, 0xeb, 0x61, 0x0, 0x0, 0x3, 0x6a, 0xce, + 0xef, 0xfe, 0xdb, 0x84, 0x10, 0x0, 0x0, + + /* U+34 "4" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, + 0xff, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xef, 0xff, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xda, 0x78, + 0xcf, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xdb, 0x61, 0x27, 0xcf, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xdc, 0x72, 0x0, 0x27, + 0xcf, 0x94, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdd, + 0x83, 0x0, 0x0, 0x27, 0xcf, 0x94, 0x0, 0x0, + 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xcf, 0x94, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0x94, 0x0, 0x0, + + /* U+35 "5" */ + 0x0, 0x1, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x50, 0x0, 0x0, 0x28, 0xdd, 0x83, 0x11, + 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x4, 0x9e, + 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6b, 0xfd, 0xcc, 0xde, 0xed, 0xca, 0x63, + 0x0, 0x0, 0x0, 0x3, 0x69, 0x86, 0x32, 0x23, + 0x58, 0xcf, 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x9e, 0xd8, 0x20, 0x0, + 0x25, 0x74, 0x20, 0x0, 0x0, 0x0, 0x38, 0xdd, + 0x83, 0x0, 0x2, 0x7d, 0xea, 0x62, 0x0, 0x2, + 0x5a, 0xee, 0x94, 0x0, 0x0, 0x0, 0x26, 0xac, + 0xee, 0xfe, 0xec, 0xa7, 0x31, 0x0, 0x0, + + /* U+36 "6" */ + 0x0, 0x0, 0x0, 0x24, 0x7a, 0xcd, 0xee, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x14, 0x9e, 0xeb, 0x85, + 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, 0x27, 0xde, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xcf, 0xca, 0x9c, 0xde, 0xee, 0xca, 0x62, + 0x0, 0x0, 0x3, 0x8d, 0xfe, 0xa6, 0x31, 0x1, + 0x37, 0xcf, 0xd8, 0x20, 0x0, 0x38, 0xee, 0x83, + 0x0, 0x0, 0x0, 0x4, 0xaf, 0xc6, 0x10, 0x1, + 0x6c, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x4a, 0xfb, + 0x61, 0x0, 0x1, 0x6b, 0xfc, 0x83, 0x10, 0x2, + 0x7b, 0xec, 0x72, 0x0, 0x0, 0x0, 0x14, 0x8c, + 0xef, 0xfe, 0xdc, 0x95, 0x20, 0x0, 0x0, + + /* U+37 "7" */ + 0x38, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xdd, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xec, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xea, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9e, 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0xbe, 0xb6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xce, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xee, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+38 "8" */ + 0x0, 0x1, 0x37, 0xbd, 0xef, 0xfe, 0xdb, 0x84, + 0x10, 0x0, 0x0, 0x3, 0x9e, 0xea, 0x51, 0x0, + 0x14, 0x9d, 0xfa, 0x50, 0x0, 0x1, 0x6c, 0xfa, + 0x40, 0x0, 0x0, 0x3, 0x9e, 0xd8, 0x20, 0x0, + 0x3, 0x8d, 0xda, 0x52, 0x0, 0x14, 0x9d, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x49, 0xdf, 0xff, 0xff, + 0xfe, 0xa4, 0x10, 0x0, 0x0, 0x15, 0xbe, 0xc8, + 0x41, 0x0, 0x13, 0x7c, 0xeb, 0x61, 0x0, 0x4, + 0xaf, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x6b, 0xfb, + 0x50, 0x0, 0x27, 0xcf, 0xc7, 0x30, 0x0, 0x2, + 0x6b, 0xed, 0x83, 0x0, 0x0, 0x2, 0x59, 0xbd, + 0xef, 0xfe, 0xdc, 0xa6, 0x30, 0x0, 0x0, + + /* U+39 "9" */ + 0x0, 0x1, 0x48, 0xbd, 0xef, 0xfe, 0xc9, 0x52, + 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc8, 0x31, 0x1, + 0x37, 0xce, 0xc7, 0x20, 0x0, 0x5, 0xaf, 0xb6, + 0x0, 0x0, 0x0, 0x4, 0x9e, 0xd7, 0x20, 0x0, + 0x5a, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x27, 0xde, + 0x94, 0x0, 0x1, 0x6c, 0xfc, 0x83, 0x10, 0x2, + 0x5a, 0xdf, 0xe9, 0x40, 0x0, 0x0, 0x25, 0x9c, + 0xde, 0xfe, 0xc9, 0x8a, 0xed, 0x82, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xce, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x36, 0x9d, + 0xec, 0x62, 0x0, 0x0, 0x0, 0x0, 0x38, 0xde, + 0xed, 0xb9, 0x63, 0x10, 0x0, 0x0, 0x0, + + /* U+3A ":" */ + 0x1, 0x6b, 0xea, 0x50, 0x0, 0x1, 0x34, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x34, 0x31, 0x0, 0x1, 0x6b, 0xea, 0x50, 0x0, + + /* U+3B ";" */ + 0x0, 0x0, 0x38, 0xdd, 0x83, 0x0, 0x0, 0x0, + 0x2, 0x44, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x15, 0x88, 0x51, 0x0, 0x0, 0x0, 0x38, 0xed, + 0x82, 0x0, 0x0, 0x2, 0x7c, 0xe9, 0x40, 0x0, + 0x0, 0x2, 0x56, 0x41, 0x0, 0x0, + + /* U+3C "<" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x79, 0xa7, + 0x30, 0x0, 0x0, 0x24, 0x79, 0xce, 0xfd, 0xb9, + 0x63, 0x10, 0x26, 0xbe, 0xec, 0xa7, 0x52, 0x10, + 0x0, 0x0, 0x0, 0x14, 0x8b, 0xde, 0xda, 0x86, + 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x36, + 0x9b, 0xef, 0xec, 0x95, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x36, 0x75, 0x20, + + /* U+3D "=" */ + 0x1, 0x6b, 0xee, 0xee, 0xee, 0xee, 0xee, 0xee, + 0xb6, 0x10, 0x0, 0x0, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xbe, 0xee, 0xee, 0xee, 0xee, 0xee, 0xeb, + 0x61, 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x10, 0x0, 0x0, + + /* U+3E ">" */ + 0x3, 0x7a, 0xa7, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x58, 0xad, 0xee, 0xda, + 0x85, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x68, 0xbd, 0xed, 0x95, 0x10, 0x0, + 0x0, 0x0, 0x1, 0x35, 0x7a, 0xce, 0xec, 0xa6, + 0x30, 0x0, 0x1, 0x59, 0xce, 0xfe, 0xc9, 0x74, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x25, 0x76, 0x31, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+3F "?" */ + 0x0, 0x25, 0x9c, 0xef, 0xff, 0xec, 0xa6, 0x20, + 0x0, 0x16, 0xbf, 0xc8, 0x31, 0x1, 0x38, 0xdf, + 0xb5, 0x0, 0x1, 0x22, 0x10, 0x0, 0x0, 0x4, + 0x9e, 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xed, 0x82, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9d, 0xeb, 0x62, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x7c, 0xfb, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x35, 0x53, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xd8, 0x30, 0x0, 0x0, + 0x0, + + /* U+40 "@" */ + 0x0, 0x0, 0x0, 0x0, 0x13, 0x69, 0xbc, 0xdd, + 0xdd, 0xdd, 0xdb, 0xa7, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0xac, 0xc8, 0x52, 0x10, + 0x0, 0x0, 0x0, 0x24, 0x7b, 0xca, 0x51, 0x0, + 0x0, 0x0, 0x1, 0x5b, 0xc9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, 0x94, + 0x0, 0x0, 0x2, 0x7c, 0xb6, 0x10, 0x0, 0x2, + 0x59, 0xbc, 0xdc, 0xba, 0x62, 0x0, 0x2, 0x7b, + 0x94, 0x0, 0x1, 0x6c, 0xc7, 0x10, 0x0, 0x27, + 0xcc, 0x83, 0x0, 0x28, 0xdb, 0x60, 0x0, 0x4, + 0xab, 0x71, 0x0, 0x49, 0xe9, 0x40, 0x0, 0x39, + 0xea, 0x50, 0x0, 0x4, 0x9d, 0x94, 0x0, 0x0, + 0x49, 0xc7, 0x20, 0x5, 0xad, 0x83, 0x0, 0x16, + 0xcd, 0x82, 0x0, 0x0, 0x5a, 0xd8, 0x20, 0x0, + 0x5, 0xbb, 0x61, 0x0, 0x49, 0xd9, 0x40, 0x0, + 0x6b, 0xe9, 0x30, 0x0, 0x4a, 0xed, 0x82, 0x0, + 0x16, 0xbb, 0x71, 0x0, 0x1, 0x6c, 0xc7, 0x10, + 0x1, 0x48, 0xcd, 0xcb, 0xa7, 0x45, 0x9c, 0xdc, + 0xcc, 0xa6, 0x20, 0x0, 0x0, 0x1, 0x6b, 0xd8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0xcd, 0xb6, 0x31, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0x8a, 0xcc, 0xdc, 0xcc, 0xcd, 0xcb, + 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+41 "A" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6c, 0xfe, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xee, 0xee, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x7c, 0xe9, 0x67, 0xcf, 0xa4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xe9, 0x40, + 0x17, 0xcf, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8d, 0xea, 0x40, 0x0, 0x17, 0xcf, + 0xb5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9e, + 0xea, 0x40, 0x0, 0x0, 0x17, 0xcf, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x4, 0x9e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0x10, 0x0, 0x0, + 0x4, 0x9e, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xcf, 0xc7, 0x20, 0x0, 0x5, 0xaf, 0xd8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xd7, 0x20, + + /* U+42 "B" */ + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, + 0x85, 0x20, 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x2, 0x49, 0xdf, 0xa5, 0x10, 0x0, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x4, + 0x9e, 0xd8, 0x30, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x2, 0x5a, 0xee, 0x94, 0x0, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xb6, 0x20, 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x1, 0x26, 0xbe, 0xd8, 0x30, 0x0, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xfc, 0x61, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x1, 0x37, 0xbe, 0xe9, 0x30, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xec, + 0xa6, 0x30, 0x0, 0x0, + + /* U+43 "C" */ + 0x0, 0x0, 0x1, 0x48, 0xbd, 0xef, 0xfe, 0xec, + 0xa8, 0x41, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xeb, + 0x74, 0x21, 0x1, 0x24, 0x9c, 0xfc, 0x72, 0x0, + 0x1, 0x6b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9e, 0xc7, 0x20, 0x3, 0x8e, 0xe8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9f, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8e, 0xe8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9e, 0xc7, 0x20, 0x0, 0x4, 0x9e, 0xeb, + 0x74, 0x21, 0x1, 0x24, 0x8c, 0xfc, 0x72, 0x0, + 0x0, 0x0, 0x2, 0x59, 0xbd, 0xff, 0xfe, 0xdc, + 0xa7, 0x41, 0x0, 0x0, + + /* U+44 "D" */ + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xed, 0xb8, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x1, 0x24, 0x7b, 0xee, 0xa4, 0x10, 0x0, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xed, 0x82, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, 0xc6, 0x10, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xaf, 0xd7, 0x20, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, 0xc6, 0x10, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xed, 0x82, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x1, 0x24, 0x7b, 0xee, 0xa4, 0x10, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xed, 0xa7, + 0x41, 0x0, 0x0, 0x0, + + /* U+45 "E" */ + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb5, 0x0, 0x5, 0xbf, 0xc7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xfc, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd7, 0x20, 0x0, 0x5, 0xbf, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xc7, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x10, + + /* U+46 "F" */ + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x94, 0x0, 0x5, 0xbf, 0xc7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xfc, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5, 0xbf, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xc7, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+47 "G" */ + 0x0, 0x0, 0x2, 0x58, 0xbd, 0xef, 0xff, 0xed, + 0xb9, 0x62, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xeb, + 0x74, 0x21, 0x0, 0x13, 0x7b, 0xee, 0x94, 0x0, + 0x1, 0x5b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x46, 0x63, 0x10, 0x3, 0x8d, 0xe9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9f, 0xd8, 0x20, 0x0, 0x2, 0x7c, 0xff, + 0xff, 0xff, 0xfa, 0x40, 0x3, 0x8e, 0xe9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xfa, 0x40, + 0x0, 0x5a, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8d, 0xfa, 0x40, 0x0, 0x3, 0x8d, 0xfd, + 0x95, 0x21, 0x0, 0x1, 0x47, 0xcf, 0xe9, 0x30, + 0x0, 0x0, 0x1, 0x37, 0xac, 0xef, 0xff, 0xfe, + 0xdb, 0x96, 0x30, 0x0, + + /* U+48 "H" */ + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xee, 0x83, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xee, 0x83, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xee, 0x83, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xee, 0x83, + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x83, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xee, 0x83, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xee, 0x83, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xee, 0x83, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xee, 0x83, + + /* U+49 "I" */ + 0x0, 0x49, 0xee, 0x83, 0x0, 0x4, 0x9e, 0xe8, + 0x30, 0x0, 0x49, 0xee, 0x83, 0x0, 0x4, 0x9e, + 0xe8, 0x30, 0x0, 0x49, 0xee, 0x83, 0x0, 0x4, + 0x9e, 0xe8, 0x30, 0x0, 0x49, 0xee, 0x83, 0x0, + 0x4, 0x9e, 0xe8, 0x30, 0x0, 0x49, 0xee, 0x83, + 0x0, + + /* U+4A "J" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x7c, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7c, 0xfb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x7c, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7c, 0xfb, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x7c, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7c, 0xfb, 0x60, 0x0, + 0x0, 0x3, 0x69, 0x74, 0x10, 0x0, 0x0, 0x2, + 0x7d, 0xfa, 0x50, 0x0, 0x0, 0x2, 0x7c, 0xfc, + 0x83, 0x10, 0x2, 0x49, 0xdf, 0xb6, 0x10, 0x0, + 0x0, 0x0, 0x2, 0x69, 0xcd, 0xef, 0xfe, 0xdb, + 0x95, 0x20, 0x0, 0x0, + + /* U+4B "K" */ + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x3, + 0x8c, 0xec, 0x83, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x25, 0xbe, 0xea, 0x51, 0x0, 0x0, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x38, 0xde, 0xc7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x74, + 0x6b, 0xee, 0xa4, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xfe, 0xee, 0xff, 0xfe, 0x94, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xc8, + 0x32, 0x5a, 0xee, 0xa5, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x49, 0xee, + 0xb6, 0x10, 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x39, 0xdf, 0xc7, 0x20, 0x0, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xdf, 0xc7, 0x30, + + /* U+4C "L" */ + 0x0, 0x5b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xbf, 0xc7, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xfc, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xc7, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, + + /* U+4D "M" */ + 0x0, 0x5b, 0xff, 0xea, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xfd, 0x72, 0x0, + 0x5b, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8d, 0xff, 0xfd, 0x72, 0x0, 0x5b, + 0xfc, 0xbb, 0xfb, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xed, 0xbb, 0xed, 0x72, 0x0, 0x5b, 0xfb, + 0x65, 0xae, 0xc7, 0x10, 0x0, 0x0, 0x4, 0xae, + 0xc7, 0x59, 0xed, 0x72, 0x0, 0x5b, 0xfc, 0x61, + 0x49, 0xed, 0x72, 0x0, 0x0, 0x5b, 0xfb, 0x61, + 0x49, 0xfd, 0x72, 0x0, 0x5b, 0xfc, 0x61, 0x3, + 0x8d, 0xd8, 0x30, 0x16, 0xbe, 0xa5, 0x0, 0x4a, + 0xfd, 0x72, 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x27, + 0xde, 0x95, 0x7c, 0xe9, 0x40, 0x0, 0x5a, 0xfd, + 0x72, 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x1, 0x7c, + 0xff, 0xfe, 0x83, 0x0, 0x0, 0x5a, 0xfd, 0x72, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x16, 0xbf, + 0xd8, 0x20, 0x0, 0x0, 0x5a, 0xfd, 0x72, + + /* U+4E "N" */ + 0x0, 0x5b, 0xff, 0xc6, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xee, 0x83, 0x0, 0x5b, 0xff, 0xff, + 0xb6, 0x10, 0x0, 0x0, 0x0, 0x49, 0xee, 0x83, + 0x0, 0x5b, 0xfd, 0xbb, 0xee, 0xa5, 0x10, 0x0, + 0x0, 0x49, 0xee, 0x83, 0x0, 0x5b, 0xfc, 0x73, + 0x5a, 0xee, 0x94, 0x0, 0x0, 0x49, 0xee, 0x83, + 0x0, 0x5b, 0xfc, 0x72, 0x1, 0x5b, 0xed, 0x93, + 0x0, 0x49, 0xee, 0x83, 0x0, 0x5b, 0xfc, 0x72, + 0x0, 0x1, 0x6b, 0xfd, 0x83, 0x49, 0xee, 0x83, + 0x0, 0x5b, 0xfc, 0x72, 0x0, 0x0, 0x2, 0x7c, + 0xfc, 0xbb, 0xee, 0x83, 0x0, 0x5b, 0xfc, 0x72, + 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, 0xfe, 0x83, + 0x0, 0x5b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8d, 0xfe, 0x83, + + /* U+4F "O" */ + 0x0, 0x0, 0x2, 0x58, 0xbd, 0xef, 0xff, 0xed, + 0xa8, 0x41, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xec, + 0x85, 0x31, 0x12, 0x35, 0x9d, 0xfc, 0x72, 0x0, + 0x0, 0x5b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8d, 0xe9, 0x40, 0x3, 0x8e, 0xe9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xfc, 0x71, + 0x4, 0xaf, 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x39, 0xed, 0x83, 0x3, 0x8e, 0xe9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xfc, 0x71, + 0x0, 0x5b, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8d, 0xe9, 0x40, 0x0, 0x3, 0x8d, 0xec, + 0x84, 0x21, 0x11, 0x35, 0x9c, 0xfc, 0x72, 0x0, + 0x0, 0x0, 0x1, 0x48, 0xbd, 0xef, 0xff, 0xed, + 0xa7, 0x31, 0x0, 0x0, + + /* U+50 "P" */ + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xb9, 0x52, 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x24, 0x8c, 0xfd, 0x83, 0x0, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xbf, 0xb6, 0x10, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x13, 0x7b, 0xee, 0x83, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xca, 0x63, 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+51 "Q" */ + 0x0, 0x0, 0x2, 0x59, 0xbd, 0xef, 0xff, 0xec, + 0xa7, 0x41, 0x0, 0x0, 0x0, 0x4, 0x9e, 0xec, + 0x84, 0x21, 0x12, 0x36, 0xad, 0xfc, 0x61, 0x0, + 0x1, 0x6b, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9e, 0xe8, 0x30, 0x4, 0x9e, 0xd8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xfb, 0x61, + 0x5, 0xaf, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xfd, 0x72, 0x4, 0x9e, 0xd8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xfc, 0x71, + 0x1, 0x6b, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x9e, 0xe9, 0x30, 0x0, 0x4, 0x9e, 0xeb, + 0x74, 0x21, 0x11, 0x36, 0x9d, 0xec, 0x72, 0x0, + 0x0, 0x0, 0x2, 0x58, 0xbd, 0xef, 0xff, 0xff, + 0xfe, 0xa5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x5a, 0xdf, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x32, 0x0, + + /* U+52 "R" */ + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdc, + 0x96, 0x30, 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x1, 0x37, 0xbe, 0xe8, 0x30, 0x0, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0xfc, 0x61, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x1, 0x37, 0xce, 0xd8, 0x30, 0x0, + 0x0, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x95, 0x20, 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x5a, 0xed, 0x83, 0x0, 0x0, 0x0, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x2, 0x8d, + 0xea, 0x50, 0x0, 0x0, 0x0, 0x5b, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, + 0x0, 0x5b, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xee, 0x94, 0x0, + + /* U+53 "S" */ + 0x0, 0x1, 0x37, 0xac, 0xde, 0xff, 0xed, 0xb9, + 0x63, 0x0, 0x0, 0x15, 0xbf, 0xd9, 0x52, 0x10, + 0x1, 0x36, 0xae, 0xea, 0x41, 0x3, 0x8e, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x2, 0x59, 0x96, 0x20, + 0x3, 0x8d, 0xfd, 0x96, 0x32, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x68, 0xbd, 0xef, + 0xec, 0xa7, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x58, 0xbe, 0xea, 0x41, 0x15, + 0x8a, 0x73, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, + 0xf9, 0x40, 0x38, 0xdf, 0xc8, 0x42, 0x10, 0x0, + 0x24, 0x8c, 0xfc, 0x72, 0x0, 0x2, 0x48, 0xac, + 0xef, 0xff, 0xfe, 0xdb, 0x85, 0x20, 0x0, + + /* U+54 "T" */ + 0x0, 0x6, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xfd, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xaf, 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xfd, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xaf, 0xd7, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xfd, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, + 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xfd, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xd7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+55 "U" */ + 0x2, 0x8d, 0xf9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xdf, 0xa5, 0x0, 0x2, 0x8d, 0xf9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xdf, 0xa5, 0x0, + 0x2, 0x8d, 0xf9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xdf, 0xa5, 0x0, 0x2, 0x8d, 0xf9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xdf, 0xa5, 0x0, + 0x2, 0x8d, 0xf9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xdf, 0xa5, 0x0, 0x2, 0x8d, 0xf9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xdf, 0xa5, 0x0, + 0x1, 0x6c, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xee, 0x93, 0x0, 0x0, 0x27, 0xcf, 0xc8, + 0x42, 0x0, 0x1, 0x37, 0xbe, 0xe9, 0x40, 0x0, + 0x0, 0x0, 0x24, 0x8b, 0xce, 0xff, 0xfe, 0xdb, + 0x95, 0x20, 0x0, 0x0, + + /* U+56 "V" */ + 0x0, 0x5, 0xaf, 0xd8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x39, 0xef, 0xa4, 0x0, 0x0, 0x4, + 0xaf, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xee, 0xa4, 0x0, 0x0, 0x0, 0x4, 0xae, 0xd8, + 0x20, 0x0, 0x0, 0x0, 0x38, 0xee, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x9e, 0xd8, 0x20, 0x0, + 0x0, 0x38, 0xde, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xd7, 0x20, 0x0, 0x38, 0xde, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x9e, 0xc7, 0x20, 0x28, 0xdd, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xc7, + 0x48, 0xdd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8d, 0xee, 0xed, 0x82, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xfd, 0x72, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+57 "W" */ + 0x38, 0xde, 0x94, 0x0, 0x0, 0x0, 0x3, 0x8e, + 0xfa, 0x50, 0x0, 0x0, 0x0, 0x28, 0xdf, 0x94, + 0x0, 0x4a, 0xfc, 0x72, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xe9, 0x40, 0x0, 0x0, 0x16, 0xbf, 0xb5, + 0x0, 0x1, 0x6b, 0xfb, 0x50, 0x0, 0x1, 0x6c, + 0xea, 0xac, 0xd8, 0x30, 0x0, 0x4, 0x9f, 0xd7, + 0x20, 0x0, 0x2, 0x8d, 0xe9, 0x30, 0x0, 0x5b, + 0xea, 0x43, 0x8d, 0xc7, 0x10, 0x2, 0x7d, 0xe9, + 0x40, 0x0, 0x0, 0x4, 0x9e, 0xc7, 0x20, 0x49, + 0xeb, 0x50, 0x3, 0x9e, 0xb6, 0x0, 0x6b, 0xfa, + 0x50, 0x0, 0x0, 0x0, 0x6, 0xbf, 0xa5, 0x48, + 0xeb, 0x61, 0x0, 0x5, 0xae, 0xa5, 0x49, 0xec, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x27, 0xde, 0xbb, + 0xdd, 0x72, 0x0, 0x0, 0x16, 0xbd, 0xaa, 0xce, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xef, + 0xfd, 0x83, 0x0, 0x0, 0x0, 0x16, 0xcf, 0xff, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, 0x28, 0xdf, + 0xc7, 0x10, 0x0, 0x0, 0x0, + + /* U+58 "X" */ + 0x4, 0x9e, 0xea, 0x51, 0x0, 0x0, 0x0, 0x2, + 0x7c, 0xfd, 0x82, 0x0, 0x0, 0x15, 0xbe, 0xe9, + 0x40, 0x0, 0x1, 0x6b, 0xfd, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x26, 0xcf, 0xd7, 0x21, 0x49, 0xee, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xdd, 0xde, 0xb5, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6b, 0xff, 0xe9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xdf, 0xdd, 0xef, 0xb6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xcf, 0xd7, 0x21, 0x49, 0xee, + 0xa5, 0x10, 0x0, 0x0, 0x0, 0x26, 0xcf, 0xd9, + 0x30, 0x0, 0x1, 0x5b, 0xee, 0x94, 0x0, 0x0, + 0x15, 0xbf, 0xea, 0x40, 0x0, 0x0, 0x0, 0x2, + 0x6c, 0xfd, 0x93, 0x0, + + /* U+59 "Y" */ + 0x0, 0x5, 0xae, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x16, 0xcf, 0xd8, 0x20, 0x0, 0x0, 0x2, + 0x7c, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x39, 0xee, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xee, + 0x93, 0x0, 0x1, 0x6b, 0xfc, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xce, 0xb6, 0x13, + 0x8d, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x9d, 0xdc, 0xce, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6b, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, + 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4a, 0xfd, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xaf, 0xd7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+5A "Z" */ + 0x16, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x7c, 0xfc, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xfc, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7c, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7c, 0xfc, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xfc, 0x72, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xfc, 0x72, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfb, 0x60, 0x0, + + /* U+5B "[" */ + 0x2, 0x7c, 0xff, 0xff, 0xb6, 0x0, 0x2, 0x7d, + 0xfa, 0x40, 0x0, 0x0, 0x2, 0x7d, 0xfa, 0x40, + 0x0, 0x0, 0x2, 0x7d, 0xfa, 0x40, 0x0, 0x0, + 0x2, 0x7d, 0xfa, 0x40, 0x0, 0x0, 0x2, 0x7d, + 0xfa, 0x40, 0x0, 0x0, 0x2, 0x7d, 0xfa, 0x40, + 0x0, 0x0, 0x2, 0x7d, 0xfa, 0x40, 0x0, 0x0, + 0x2, 0x7d, 0xfa, 0x40, 0x0, 0x0, 0x2, 0x7d, + 0xfa, 0x40, 0x0, 0x0, 0x2, 0x7d, 0xfa, 0x40, + 0x0, 0x0, 0x2, 0x7d, 0xfa, 0x40, 0x0, 0x0, + 0x2, 0x7c, 0xff, 0xff, 0xb6, 0x0, + + /* U+5C "\\" */ + 0x0, 0x4, 0x9e, 0xc7, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8e, 0xc7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x8d, 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8d, 0xd8, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7d, 0xd8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7c, 0xe8, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7c, 0xe9, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6c, + 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6b, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xea, 0x50, + 0x0, + + /* U+5D "]" */ + 0x0, 0x49, 0xef, 0xff, 0xe9, 0x40, 0x0, 0x0, + 0x2, 0x7d, 0xf9, 0x40, 0x0, 0x0, 0x2, 0x7d, + 0xf9, 0x40, 0x0, 0x0, 0x2, 0x7d, 0xf9, 0x40, + 0x0, 0x0, 0x2, 0x7d, 0xf9, 0x40, 0x0, 0x0, + 0x2, 0x7d, 0xf9, 0x40, 0x0, 0x0, 0x2, 0x7d, + 0xf9, 0x40, 0x0, 0x0, 0x2, 0x7d, 0xf9, 0x40, + 0x0, 0x0, 0x2, 0x7d, 0xf9, 0x40, 0x0, 0x0, + 0x2, 0x7d, 0xf9, 0x40, 0x0, 0x0, 0x2, 0x7d, + 0xf9, 0x40, 0x0, 0x0, 0x2, 0x7d, 0xf9, 0x40, + 0x0, 0x49, 0xef, 0xff, 0xe9, 0x40, + + /* U+5E "^" */ + 0x0, 0x0, 0x2, 0x57, 0x52, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xfe, 0x94, 0x0, 0x0, 0x0, + 0x5, 0xae, 0xa9, 0xae, 0xa5, 0x0, 0x0, 0x15, + 0xbe, 0x94, 0x4, 0x9e, 0xb5, 0x10, 0x16, 0xce, + 0x93, 0x0, 0x3, 0x9e, 0xc6, 0x10, + + /* U+5F "_" */ + 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x0, + + /* U+60 "`" */ + 0x14, 0x9e, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x3, + 0x8d, 0xc7, 0x20, 0x0, + + /* U+61 "a" */ + 0x0, 0x1, 0x48, 0xbd, 0xee, 0xee, 0xdb, 0x73, + 0x0, 0x0, 0x0, 0x15, 0xbf, 0xc8, 0x30, 0x0, + 0x26, 0xbf, 0xd7, 0x20, 0x0, 0x0, 0x12, 0x21, + 0x0, 0x0, 0x0, 0x27, 0xcf, 0xa5, 0x0, 0x0, + 0x0, 0x25, 0x8a, 0xcc, 0xdd, 0xdd, 0xef, 0xfa, + 0x50, 0x0, 0x3, 0x8d, 0xea, 0x51, 0x0, 0x0, + 0x17, 0xcf, 0xa5, 0x0, 0x0, 0x49, 0xfe, 0xa4, + 0x10, 0x12, 0x48, 0xce, 0xfa, 0x50, 0x0, 0x0, + 0x25, 0x9c, 0xef, 0xff, 0xdb, 0x89, 0xad, 0xb6, + 0x10, 0x0, + + /* U+62 "b" */ + 0x2, 0x8d, 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xde, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xe9, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xde, 0xb9, 0x9c, 0xee, 0xee, 0xca, 0x62, + 0x0, 0x0, 0x2, 0x8d, 0xfd, 0xa5, 0x20, 0x1, + 0x48, 0xcf, 0xc7, 0x10, 0x0, 0x28, 0xde, 0x93, + 0x0, 0x0, 0x0, 0x5, 0xbf, 0xb6, 0x10, 0x2, + 0x8d, 0xe9, 0x30, 0x0, 0x0, 0x0, 0x39, 0xed, + 0x72, 0x0, 0x28, 0xde, 0x93, 0x0, 0x0, 0x0, + 0x5, 0xaf, 0xb6, 0x10, 0x2, 0x8d, 0xfe, 0xa5, + 0x20, 0x1, 0x48, 0xcf, 0xc7, 0x10, 0x0, 0x28, + 0xdd, 0xa8, 0x9c, 0xee, 0xfe, 0xca, 0x62, 0x0, + 0x0, + + /* U+63 "c" */ + 0x0, 0x1, 0x37, 0xbd, 0xef, 0xfe, 0xdb, 0x83, + 0x10, 0x0, 0x0, 0x15, 0xae, 0xd8, 0x41, 0x0, + 0x14, 0x9d, 0xe9, 0x40, 0x0, 0x5, 0xaf, 0xb6, + 0x10, 0x0, 0x0, 0x1, 0x36, 0x63, 0x10, 0x1, + 0x6c, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xaf, 0xb6, 0x10, 0x0, 0x0, + 0x0, 0x23, 0x32, 0x0, 0x0, 0x15, 0xae, 0xd8, + 0x41, 0x0, 0x13, 0x8c, 0xea, 0x40, 0x0, 0x0, + 0x1, 0x37, 0xbd, 0xef, 0xfe, 0xda, 0x73, 0x10, + 0x0, 0x0, + + /* U+64 "d" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, + 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xde, 0x93, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8d, 0xe9, 0x30, 0x0, + 0x0, 0x14, 0x8b, 0xde, 0xfe, 0xca, 0x9a, 0xee, + 0x93, 0x0, 0x1, 0x5b, 0xfd, 0x95, 0x21, 0x1, + 0x48, 0xcf, 0xe9, 0x30, 0x0, 0x5a, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x28, 0xde, 0x93, 0x0, 0x16, + 0xbf, 0xa5, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xe9, + 0x30, 0x0, 0x5a, 0xfb, 0x61, 0x0, 0x0, 0x0, + 0x28, 0xde, 0x93, 0x0, 0x1, 0x5a, 0xec, 0x83, + 0x0, 0x0, 0x27, 0xcf, 0xe9, 0x30, 0x0, 0x0, + 0x14, 0x8b, 0xde, 0xed, 0xcb, 0x9b, 0xde, 0x93, + 0x0, + + /* U+65 "e" */ + 0x0, 0x0, 0x36, 0xac, 0xef, 0xfe, 0xda, 0x62, + 0x0, 0x0, 0x0, 0x4, 0x9e, 0xd9, 0x51, 0x0, + 0x25, 0xae, 0xd8, 0x30, 0x0, 0x4, 0xaf, 0xc7, + 0x10, 0x0, 0x0, 0x3, 0x8e, 0xd7, 0x20, 0x1, + 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x93, 0x0, 0x5, 0xaf, 0xb6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, 0xd9, + 0x42, 0x0, 0x2, 0x47, 0x97, 0x30, 0x0, 0x0, + 0x1, 0x37, 0xac, 0xee, 0xff, 0xec, 0xa6, 0x30, + 0x0, 0x0, + + /* U+66 "f" */ + 0x0, 0x0, 0x14, 0x8c, 0xef, 0xfc, 0x72, 0x0, + 0x0, 0x28, 0xde, 0xa6, 0x10, 0x0, 0x0, 0x0, + 0x4, 0xaf, 0xc7, 0x10, 0x0, 0x0, 0x4, 0x9e, + 0xef, 0xff, 0xfe, 0xeb, 0x61, 0x0, 0x0, 0x5, + 0xaf, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, + 0xc7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xfc, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xfc, 0x71, + 0x0, 0x0, 0x0, + + /* U+67 "g" */ + 0x0, 0x1, 0x48, 0xbd, 0xef, 0xec, 0xa8, 0x9d, + 0xe9, 0x40, 0x0, 0x15, 0xbf, 0xd9, 0x52, 0x10, + 0x14, 0x8c, 0xfe, 0x94, 0x0, 0x5, 0xaf, 0xc7, + 0x10, 0x0, 0x0, 0x2, 0x8d, 0xe9, 0x40, 0x1, + 0x6b, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x28, 0xde, + 0x94, 0x0, 0x5, 0xaf, 0xc7, 0x10, 0x0, 0x0, + 0x2, 0x8d, 0xe9, 0x40, 0x0, 0x15, 0xbf, 0xd9, + 0x52, 0x0, 0x14, 0x9d, 0xfe, 0x94, 0x0, 0x0, + 0x1, 0x48, 0xbd, 0xef, 0xed, 0xa9, 0xbe, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xed, 0x82, 0x0, 0x0, 0x39, 0xba, 0x52, + 0x0, 0x2, 0x6b, 0xee, 0x94, 0x0, 0x0, 0x0, + 0x26, 0x9c, 0xef, 0xfe, 0xec, 0xa7, 0x31, 0x0, + 0x0, + + /* U+68 "h" */ + 0x2, 0x8d, 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xde, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xe9, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xde, 0xa8, 0x8b, 0xef, 0xfe, 0xdb, 0x62, + 0x0, 0x0, 0x2, 0x8d, 0xfe, 0xb6, 0x21, 0x1, + 0x49, 0xdf, 0xa5, 0x0, 0x0, 0x28, 0xde, 0x93, + 0x0, 0x0, 0x0, 0x49, 0xfc, 0x71, 0x0, 0x2, + 0x8d, 0xe9, 0x30, 0x0, 0x0, 0x4, 0x9f, 0xd7, + 0x20, 0x0, 0x28, 0xde, 0x93, 0x0, 0x0, 0x0, + 0x49, 0xfd, 0x72, 0x0, 0x2, 0x8d, 0xe9, 0x30, + 0x0, 0x0, 0x4, 0x9f, 0xd7, 0x20, 0x0, 0x28, + 0xde, 0x93, 0x0, 0x0, 0x0, 0x49, 0xfd, 0x72, + 0x0, + + /* U+69 "i" */ + 0x1, 0x5b, 0xea, 0x40, 0x0, 0x1, 0x23, 0x20, + 0x0, 0x1, 0x6c, 0xfa, 0x50, 0x0, 0x16, 0xcf, + 0xa5, 0x0, 0x1, 0x6c, 0xfa, 0x50, 0x0, 0x16, + 0xcf, 0xa5, 0x0, 0x1, 0x6c, 0xfa, 0x50, 0x0, + 0x16, 0xcf, 0xa5, 0x0, 0x1, 0x6c, 0xfa, 0x50, + 0x0, + + /* U+6A "j" */ + 0x0, 0x0, 0x27, 0xcd, 0x83, 0x0, 0x0, 0x0, + 0x1, 0x33, 0x20, 0x0, 0x0, 0x0, 0x27, 0xdf, + 0x94, 0x0, 0x0, 0x0, 0x27, 0xdf, 0x94, 0x0, + 0x0, 0x0, 0x27, 0xdf, 0x94, 0x0, 0x0, 0x0, + 0x27, 0xdf, 0x94, 0x0, 0x0, 0x0, 0x27, 0xdf, + 0x94, 0x0, 0x0, 0x0, 0x27, 0xdf, 0x94, 0x0, + 0x0, 0x0, 0x27, 0xdf, 0x94, 0x0, 0x0, 0x0, + 0x27, 0xde, 0x94, 0x0, 0x0, 0x1, 0x49, 0xed, + 0x83, 0x0, 0x5, 0xaf, 0xfe, 0xb6, 0x20, 0x0, + + /* U+6B "k" */ + 0x2, 0x8d, 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xde, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xe9, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0xde, 0x93, 0x0, 0x1, 0x4a, 0xde, 0xa5, + 0x10, 0x0, 0x2, 0x8d, 0xe9, 0x30, 0x37, 0xce, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x28, 0xde, 0xa8, + 0xae, 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x8d, 0xff, 0xff, 0xfe, 0xb6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x28, 0xdf, 0xb5, 0x24, 0x9d, 0xeb, + 0x61, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xe9, 0x30, + 0x0, 0x38, 0xde, 0xb6, 0x10, 0x0, 0x0, 0x28, + 0xde, 0x93, 0x0, 0x0, 0x3, 0x8d, 0xeb, 0x61, + 0x0, + + /* U+6C "l" */ + 0x1, 0x6c, 0xfa, 0x50, 0x0, 0x16, 0xcf, 0xa5, + 0x0, 0x1, 0x6c, 0xfa, 0x50, 0x0, 0x16, 0xcf, + 0xa5, 0x0, 0x1, 0x6c, 0xfa, 0x50, 0x0, 0x16, + 0xcf, 0xa5, 0x0, 0x1, 0x6c, 0xfa, 0x50, 0x0, + 0x16, 0xcf, 0xa5, 0x0, 0x1, 0x6c, 0xfa, 0x50, + 0x0, 0x16, 0xcf, 0xa5, 0x0, + + /* U+6D "m" */ + 0x3, 0x8d, 0xea, 0x89, 0xcd, 0xef, 0xed, 0xa6, + 0x33, 0x7b, 0xdf, 0xff, 0xec, 0x94, 0x10, 0x0, + 0x0, 0x38, 0xdf, 0xd9, 0x51, 0x0, 0x15, 0x9d, + 0xff, 0xd9, 0x41, 0x0, 0x16, 0xae, 0xe8, 0x30, + 0x0, 0x3, 0x8d, 0xe9, 0x30, 0x0, 0x0, 0x4, + 0xaf, 0xd7, 0x20, 0x0, 0x0, 0x16, 0xbf, 0xb5, + 0x0, 0x0, 0x38, 0xde, 0x93, 0x0, 0x0, 0x0, + 0x49, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x6b, 0xfb, + 0x60, 0x0, 0x3, 0x8d, 0xe9, 0x30, 0x0, 0x0, + 0x4, 0x9f, 0xc7, 0x20, 0x0, 0x0, 0x6, 0xbf, + 0xb6, 0x0, 0x0, 0x38, 0xde, 0x93, 0x0, 0x0, + 0x0, 0x49, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x6b, + 0xfb, 0x60, 0x0, 0x3, 0x8d, 0xe9, 0x30, 0x0, + 0x0, 0x4, 0x9f, 0xc7, 0x20, 0x0, 0x0, 0x6, + 0xbf, 0xb6, 0x0, 0x0, + + /* U+6E "n" */ + 0x2, 0x8d, 0xd9, 0x78, 0xbe, 0xff, 0xed, 0xb6, + 0x20, 0x0, 0x0, 0x28, 0xdf, 0xeb, 0x62, 0x10, + 0x14, 0x9d, 0xfa, 0x50, 0x0, 0x2, 0x8d, 0xe9, + 0x30, 0x0, 0x0, 0x4, 0x9f, 0xc7, 0x10, 0x0, + 0x28, 0xde, 0x93, 0x0, 0x0, 0x0, 0x49, 0xfd, + 0x72, 0x0, 0x2, 0x8d, 0xe9, 0x30, 0x0, 0x0, + 0x4, 0x9f, 0xd7, 0x20, 0x0, 0x28, 0xde, 0x93, + 0x0, 0x0, 0x0, 0x49, 0xfd, 0x72, 0x0, 0x2, + 0x8d, 0xe9, 0x30, 0x0, 0x0, 0x4, 0x9f, 0xd7, + 0x20, 0x0, + + /* U+6F "o" */ + 0x0, 0x0, 0x36, 0xad, 0xef, 0xff, 0xdb, 0x84, + 0x10, 0x0, 0x0, 0x4, 0xae, 0xda, 0x52, 0x0, + 0x13, 0x7c, 0xec, 0x72, 0x0, 0x5, 0xaf, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x49, 0xed, 0x72, 0x1, + 0x7c, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xf9, 0x40, 0x5, 0xaf, 0xc6, 0x10, 0x0, 0x0, + 0x0, 0x49, 0xed, 0x82, 0x0, 0x4, 0xae, 0xd9, + 0x52, 0x0, 0x13, 0x7b, 0xec, 0x72, 0x0, 0x0, + 0x1, 0x37, 0xac, 0xee, 0xfe, 0xdb, 0x95, 0x20, + 0x0, 0x0, + + /* U+70 "p" */ + 0x2, 0x8d, 0xeb, 0x9a, 0xcd, 0xee, 0xec, 0x96, + 0x20, 0x0, 0x0, 0x28, 0xdf, 0xc8, 0x30, 0x0, + 0x3, 0x7c, 0xfc, 0x71, 0x0, 0x2, 0x8d, 0xe9, + 0x30, 0x0, 0x0, 0x0, 0x5b, 0xfb, 0x61, 0x0, + 0x28, 0xde, 0x93, 0x0, 0x0, 0x0, 0x4, 0x9e, + 0xd7, 0x20, 0x2, 0x8d, 0xe9, 0x30, 0x0, 0x0, + 0x0, 0x6b, 0xfb, 0x60, 0x0, 0x28, 0xdf, 0xd8, + 0x41, 0x0, 0x14, 0x8d, 0xfc, 0x61, 0x0, 0x2, + 0x8d, 0xeb, 0xaa, 0xce, 0xee, 0xec, 0xa6, 0x20, + 0x0, 0x0, 0x28, 0xde, 0x93, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xe9, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xde, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+71 "q" */ + 0x0, 0x1, 0x48, 0xbd, 0xee, 0xed, 0xa8, 0xad, + 0xe9, 0x30, 0x0, 0x15, 0xbf, 0xd9, 0x52, 0x0, + 0x13, 0x8c, 0xfe, 0x93, 0x0, 0x5, 0xaf, 0xc7, + 0x10, 0x0, 0x0, 0x3, 0x8d, 0xe9, 0x30, 0x1, + 0x6b, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x38, 0xde, + 0x93, 0x0, 0x5, 0xaf, 0xc6, 0x10, 0x0, 0x0, + 0x3, 0x8d, 0xe9, 0x30, 0x0, 0x15, 0xbf, 0xd9, + 0x41, 0x0, 0x14, 0x8c, 0xfe, 0x93, 0x0, 0x0, + 0x1, 0x48, 0xbd, 0xef, 0xed, 0xba, 0xbe, 0xe9, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xde, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x8d, 0xe9, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xde, 0x93, + 0x0, + + /* U+72 "r" */ + 0x2, 0x8d, 0xeb, 0xab, 0xde, 0xd8, 0x30, 0x0, + 0x28, 0xdf, 0xea, 0x52, 0x0, 0x0, 0x0, 0x2, + 0x8d, 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xde, 0x93, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, + 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x28, 0xde, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xe9, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+73 "s" */ + 0x0, 0x3, 0x6a, 0xce, 0xff, 0xed, 0xc9, 0x52, + 0x0, 0x1, 0x6c, 0xfb, 0x62, 0x0, 0x13, 0x8c, + 0xfb, 0x61, 0x1, 0x6c, 0xfc, 0x84, 0x21, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x1, 0x47, 0x9b, 0xde, + 0xed, 0xb8, 0x52, 0x0, 0x1, 0x23, 0x21, 0x0, + 0x0, 0x13, 0x7b, 0xfc, 0x72, 0x4, 0x9e, 0xea, + 0x41, 0x0, 0x1, 0x6a, 0xec, 0x72, 0x0, 0x13, + 0x7a, 0xce, 0xef, 0xee, 0xca, 0x73, 0x0, + + /* U+74 "t" */ + 0x0, 0x0, 0x1, 0x36, 0x75, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xcf, 0xa4, 0x0, 0x0, 0x0, + 0x49, 0xde, 0xff, 0xff, 0xee, 0xb6, 0x20, 0x0, + 0x0, 0x27, 0xcf, 0xa4, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7c, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xcf, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x7c, 0xfa, 0x40, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xcf, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x25, + 0xad, 0xff, 0xc7, 0x20, + + /* U+75 "u" */ + 0x3, 0x8e, 0xe8, 0x30, 0x0, 0x0, 0x4, 0xaf, + 0xc7, 0x20, 0x0, 0x38, 0xee, 0x83, 0x0, 0x0, + 0x0, 0x4a, 0xfc, 0x72, 0x0, 0x3, 0x8e, 0xe8, + 0x30, 0x0, 0x0, 0x4, 0xaf, 0xc7, 0x20, 0x0, + 0x38, 0xee, 0x83, 0x0, 0x0, 0x0, 0x4a, 0xfc, + 0x72, 0x0, 0x2, 0x8d, 0xe9, 0x30, 0x0, 0x0, + 0x4, 0xaf, 0xc7, 0x20, 0x0, 0x15, 0xbf, 0xc8, + 0x30, 0x1, 0x26, 0xbe, 0xfc, 0x72, 0x0, 0x0, + 0x3, 0x7b, 0xde, 0xff, 0xec, 0x99, 0xbf, 0xc7, + 0x20, 0x0, + + /* U+76 "v" */ + 0x0, 0x5, 0xaf, 0xc7, 0x10, 0x0, 0x0, 0x5, + 0xaf, 0xc6, 0x10, 0x0, 0x5, 0xaf, 0xc6, 0x10, + 0x0, 0x4, 0xaf, 0xc6, 0x10, 0x0, 0x0, 0x5, + 0xaf, 0xb6, 0x10, 0x4, 0x9e, 0xc7, 0x10, 0x0, + 0x0, 0x0, 0x5, 0xae, 0xb5, 0x3, 0x9e, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5, 0xae, 0xa8, + 0x9d, 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xaf, 0xff, 0xc7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaf, 0xc7, 0x20, 0x0, + 0x0, 0x0, + + /* U+77 "w" */ + 0x0, 0x4, 0x9e, 0xc7, 0x10, 0x0, 0x1, 0x6c, + 0xfb, 0x61, 0x0, 0x0, 0x27, 0xce, 0x94, 0x0, + 0x0, 0x0, 0x5, 0xaf, 0xa5, 0x0, 0x0, 0x5b, + 0xff, 0xfa, 0x50, 0x0, 0x5, 0xbf, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x16, 0xce, 0x94, 0x0, 0x5a, + 0xd9, 0x8a, 0xea, 0x50, 0x4, 0x9e, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xdd, 0x72, 0x49, + 0xda, 0x40, 0x5a, 0xe9, 0x42, 0x7d, 0xc7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xeb, 0x99, + 0xda, 0x50, 0x0, 0x6b, 0xd9, 0x9b, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, + 0xfb, 0x61, 0x0, 0x1, 0x6c, 0xff, 0xe9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5b, + 0xfc, 0x71, 0x0, 0x0, 0x2, 0x7c, 0xfb, 0x50, + 0x0, 0x0, 0x0, 0x0, + + /* U+78 "x" */ + 0x0, 0x1, 0x6b, 0xfd, 0x82, 0x0, 0x0, 0x49, + 0xee, 0xa5, 0x10, 0x0, 0x0, 0x0, 0x2, 0x7c, + 0xeb, 0x61, 0x27, 0xce, 0xb6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8d, 0xed, 0xde, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xcf, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x9e, 0xdc, 0xce, 0xd7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, + 0xea, 0x51, 0x16, 0xbe, 0xc7, 0x20, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xfc, 0x72, 0x0, 0x0, 0x28, + 0xdf, 0xb6, 0x10, 0x0, + + /* U+79 "y" */ + 0x0, 0x16, 0xbf, 0xc7, 0x20, 0x0, 0x0, 0x17, + 0xcf, 0xb6, 0x10, 0x0, 0x16, 0xbf, 0xc7, 0x10, + 0x0, 0x16, 0xbf, 0xb6, 0x10, 0x0, 0x0, 0x16, + 0xbf, 0xb6, 0x10, 0x5, 0xaf, 0xc6, 0x10, 0x0, + 0x0, 0x0, 0x16, 0xcf, 0xb6, 0x14, 0xaf, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x16, 0xcf, 0xb9, + 0xae, 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x17, 0xcf, 0xff, 0xd7, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xcf, 0xd8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6c, 0xd8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x24, + 0x9d, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xcf, 0xeb, 0x73, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+7A "z" */ + 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xed, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5b, 0xed, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5b, 0xed, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xed, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xed, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, + + /* U+7B "{" */ + 0x0, 0x0, 0x0, 0x2, 0x47, 0x75, 0x10, 0x0, + 0x0, 0x0, 0x49, 0xed, 0x94, 0x10, 0x0, 0x0, + 0x0, 0x49, 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xbf, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x1, 0x5a, + 0xec, 0x72, 0x0, 0x0, 0x0, 0x49, 0xff, 0xfb, + 0x51, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5a, 0xec, + 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, 0xfa, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, 0xbf, 0xb6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xfc, 0x71, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdd, 0x94, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0x47, 0x75, + 0x10, 0x0, + + /* U+7C "|" */ + 0x0, 0x4a, 0xe9, 0x30, 0x0, 0x4, 0xae, 0x93, + 0x0, 0x0, 0x4a, 0xe9, 0x30, 0x0, 0x4, 0xae, + 0x93, 0x0, 0x0, 0x4a, 0xe9, 0x30, 0x0, 0x4, + 0xae, 0x93, 0x0, 0x0, 0x4a, 0xe9, 0x30, 0x0, + 0x4, 0xae, 0x93, 0x0, 0x0, 0x4a, 0xe9, 0x30, + 0x0, 0x4, 0xae, 0x93, 0x0, 0x0, 0x4a, 0xe9, + 0x30, 0x0, + + /* U+7D "}" */ + 0x0, 0x14, 0x78, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x8d, 0xea, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6b, 0xfa, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xaf, 0xb6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x4a, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6c, 0xeb, 0x61, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xef, 0xfa, 0x50, 0x0, 0x0, 0x1, + 0x6c, 0xeb, 0x61, 0x0, 0x0, 0x0, 0x0, 0x4a, + 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, + 0xb6, 0x10, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xfa, + 0x50, 0x0, 0x0, 0x0, 0x14, 0x8d, 0xea, 0x40, + 0x0, 0x0, 0x0, 0x14, 0x77, 0x42, 0x0, 0x0, + 0x0, 0x0, + + /* U+7E "~" */ + 0x0, 0x1, 0x59, 0xcd, 0xdc, 0x95, 0x20, 0x0, + 0x0, 0x38, 0xca, 0x50, 0x0, 0x4a, 0xeb, 0x73, + 0x36, 0xad, 0xd9, 0x41, 0x2, 0x7c, 0xd7, 0x20, + 0x2, 0x7c, 0xa6, 0x10, 0x0, 0x2, 0x6b, 0xef, + 0xff, 0xd9, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x46, 0x79, 0xbc, 0xef, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x56, 0x89, 0xbc, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x9e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xed, 0xca, 0x87, 0x54, 0x23, 0x8d, 0xff, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, + 0xff, 0xda, 0x87, 0x53, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xff, 0xa5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaf, 0xfd, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, + 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xaf, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8d, 0xff, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, 0xfd, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x24, 0x79, 0xbb, + 0xbc, 0xdf, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, + 0x12, 0x33, 0x37, 0xbf, 0xfd, 0x82, 0x0, 0x0, + 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa5, 0x0, 0x0, 0x15, 0xad, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x2, 0x6b, + 0xef, 0xff, 0xff, 0xff, 0xd9, 0x41, 0x0, 0x0, + 0x39, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x32, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x89, + 0xab, 0xaa, 0x87, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F008 "" */ + 0x0, 0x39, 0xb9, 0x54, 0x59, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x95, 0x45, 0x9b, 0x93, 0x0, 0x0, 0x5a, 0xeb, + 0x88, 0x9b, 0xef, 0xb7, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x23, 0x7c, 0xfe, 0xb8, 0x88, 0xbe, + 0xa5, 0x0, 0x0, 0x5a, 0xc7, 0x10, 0x17, 0xcf, + 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xfc, 0x61, 0x1, 0x7c, 0xa5, 0x0, 0x0, + 0x5a, 0xfd, 0xcc, 0xce, 0xff, 0xb6, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x12, 0x7c, 0xff, 0xdc, + 0xcc, 0xef, 0xa5, 0x0, 0x0, 0x5a, 0xc6, 0x10, + 0x17, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x61, 0x1, 0x6c, 0xa5, + 0x0, 0x0, 0x5a, 0xfd, 0xcc, 0xce, 0xff, 0xb6, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x7c, + 0xff, 0xdc, 0xcc, 0xef, 0xa5, 0x0, 0x0, 0x5a, + 0xc7, 0x10, 0x17, 0xcf, 0xb5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x6b, 0xfc, 0x61, 0x1, + 0x7c, 0xa5, 0x0, 0x0, 0x5a, 0xeb, 0x88, 0x9b, + 0xef, 0xb7, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x23, 0x7c, 0xfe, 0xb8, 0x88, 0xbe, 0xa5, 0x0, + 0x0, 0x49, 0xb9, 0x54, 0x59, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x95, 0x45, 0x9b, 0x93, 0x0, + + /* U+F00B "" */ + 0x0, 0x38, 0xdf, 0xff, 0xff, 0xfe, 0xb6, 0x25, + 0x9e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xd8, 0x46, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa5, 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, + 0xc6, 0x25, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x94, 0x0, 0x0, + 0x0, 0x12, 0x33, 0x33, 0x22, 0x10, 0x0, 0x1, + 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x21, 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, + 0xff, 0xff, 0xc7, 0x26, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, + 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xd8, + 0x46, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x4a, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x26, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x0, 0x12, 0x33, 0x33, + 0x22, 0x10, 0x0, 0x1, 0x23, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x21, 0x0, 0x0, + 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xc6, 0x25, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x94, 0x0, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xd8, 0x46, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa5, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xff, 0xfe, + 0xb6, 0x25, 0xae, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, 0x0, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7c, 0xdc, 0x94, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xcf, 0xff, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, + 0xff, 0xff, 0xff, 0xfd, 0x84, 0x10, 0x0, 0x0, + 0x1, 0x49, 0xcd, 0xc7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xcf, 0xff, 0xff, 0xff, 0xd8, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x39, 0xef, 0xff, + 0xff, 0xfc, 0x83, 0x0, 0x0, 0x3, 0x8c, 0xff, + 0xff, 0xff, 0xfd, 0x84, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x48, 0xdf, 0xff, 0xff, 0xff, + 0xc8, 0x68, 0xcf, 0xff, 0xff, 0xff, 0xd8, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x84, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x48, 0xcf, 0xff, 0xff, 0xff, 0xc8, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x8c, + 0xdc, 0x83, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x0, 0x0, 0x13, 0x44, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x24, 0x42, 0x10, 0x0, 0x0, + 0x27, 0xdf, 0xff, 0xfc, 0x73, 0x0, 0x0, 0x0, + 0x14, 0x8d, 0xff, 0xff, 0xb6, 0x10, 0x0, 0x14, + 0x9d, 0xff, 0xff, 0xff, 0xc7, 0x32, 0x48, 0xdf, + 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd9, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xbf, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x48, 0xdf, 0xff, 0xff, + 0xfd, 0x98, 0xad, 0xff, 0xff, 0xff, 0xc7, 0x30, + 0x0, 0x0, 0x39, 0xef, 0xff, 0xff, 0xd9, 0x41, + 0x0, 0x1, 0x5a, 0xdf, 0xff, 0xff, 0xd7, 0x20, + 0x0, 0x2, 0x59, 0xbb, 0x84, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x15, 0x9b, 0xb9, 0x51, 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x47, 0x99, 0x74, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x36, 0x52, 0x0, 0x4, 0x9f, 0xff, + 0xf9, 0x40, 0x0, 0x25, 0x64, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x9d, 0xff, + 0xfc, 0x71, 0x4, 0x9f, 0xff, 0xf9, 0x40, 0x17, + 0xcf, 0xff, 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x15, 0xaf, 0xff, 0xfd, 0x94, 0x10, 0x4, + 0x9f, 0xff, 0xf9, 0x40, 0x1, 0x59, 0xdf, 0xff, + 0xfb, 0x51, 0x0, 0x0, 0x0, 0x2, 0x7d, 0xff, + 0xfd, 0x83, 0x0, 0x0, 0x4, 0x9f, 0xff, 0xf9, + 0x40, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xc7, 0x20, + 0x0, 0x0, 0x16, 0xbf, 0xff, 0xd8, 0x20, 0x0, + 0x0, 0x4, 0x9f, 0xff, 0xf9, 0x40, 0x0, 0x0, + 0x2, 0x8d, 0xff, 0xfb, 0x60, 0x0, 0x0, 0x17, + 0xcf, 0xff, 0xc6, 0x10, 0x0, 0x0, 0x3, 0x9e, + 0xff, 0xe9, 0x30, 0x0, 0x0, 0x1, 0x6c, 0xff, + 0xfc, 0x71, 0x0, 0x0, 0x5, 0xaf, 0xff, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x1, 0x11, 0x10, 0x0, + 0x0, 0x0, 0x4, 0x9e, 0xff, 0xfa, 0x50, 0x0, + 0x0, 0x1, 0x5a, 0xff, 0xff, 0xb6, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xff, 0xff, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x3, + 0x8d, 0xff, 0xff, 0xda, 0x63, 0x10, 0x0, 0x0, + 0x0, 0x1, 0x36, 0xad, 0xff, 0xff, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5a, 0xdf, + 0xff, 0xff, 0xfe, 0xdc, 0xcc, 0xcd, 0xef, 0xff, + 0xff, 0xfd, 0xa5, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x68, 0xad, 0xef, + 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x96, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, + 0x44, 0x44, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x27, 0xdf, 0xff, 0xff, 0xfd, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x64, + 0x11, 0x36, 0xad, 0xff, 0xff, 0xff, 0xff, 0xda, + 0x63, 0x11, 0x46, 0x53, 0x0, 0x0, 0x0, 0x49, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x94, 0x0, + 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xba, 0xab, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x61, 0x1, 0x37, 0xbe, 0xff, 0xff, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, + 0xff, 0xeb, 0x73, 0x10, 0x0, 0x2, 0x7c, 0xff, + 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xdf, 0xff, 0xff, 0xd7, 0x20, 0x0, 0x1, 0x37, + 0xbe, 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, 0x0, + 0x2, 0x7c, 0xff, 0xff, 0xff, 0xeb, 0x73, 0x10, + 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xba, 0xab, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x61, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x35, 0x64, + 0x11, 0x25, 0x9c, 0xff, 0xff, 0xff, 0xff, 0xc9, + 0x52, 0x11, 0x36, 0x53, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xff, + 0xfd, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x44, 0x44, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x77, 0x63, 0x10, 0x0, 0x3, + 0x68, 0x88, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, + 0xdf, 0xff, 0xff, 0xfe, 0xb6, 0x32, 0x7c, 0xff, + 0xfc, 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x13, 0x7c, 0xef, 0xfe, 0xc8, + 0x54, 0x6a, 0xdf, 0xff, 0xee, 0xef, 0xff, 0xc7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xad, 0xff, 0xfd, 0xa5, 0x34, 0x8b, 0xc9, + 0x53, 0x47, 0xbe, 0xff, 0xff, 0xfc, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x59, 0xcf, 0xff, + 0xeb, 0x74, 0x36, 0xad, 0xff, 0xff, 0xff, 0xec, + 0x84, 0x35, 0x9d, 0xff, 0xfe, 0xb6, 0x30, 0x0, + 0x0, 0x2, 0x6b, 0xef, 0xff, 0xc9, 0x53, 0x59, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xb7, 0x33, 0x6b, 0xef, 0xff, 0xd8, 0x40, 0x0, + 0x3, 0x7a, 0x96, 0x33, 0x6b, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd9, 0x42, 0x48, 0xa9, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x16, 0xcf, 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, + 0x2, 0x7d, 0xff, 0xff, 0xff, 0xfe, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6c, + 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xae, 0xff, + 0xff, 0xff, 0xd8, 0x30, 0x0, 0x1, 0x6b, 0xff, + 0xff, 0xff, 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0x67, 0x77, 0x76, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7d, 0xff, 0xff, + 0xff, 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xff, 0xff, 0xff, 0xd8, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, + 0xff, 0xff, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x8d, 0xff, 0xff, 0xff, + 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x49, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd9, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x23, 0x33, 0x33, 0x33, 0x33, 0x22, + 0x59, 0xdf, 0xff, 0xfd, 0x95, 0x22, 0x33, 0x33, + 0x33, 0x33, 0x32, 0x10, 0x0, 0x0, 0x4a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x34, 0x77, + 0x43, 0x5a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xec, 0xaa, 0xce, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x56, 0xbc, 0x75, + 0x8d, 0xff, 0xa5, 0x0, 0x0, 0x25, 0x9a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, 0x52, + 0x0, + + /* U+F01C "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x49, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xb7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x15, 0xae, 0xff, 0xda, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x9b, 0xef, + 0xfc, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xef, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0xae, 0xff, + 0xd7, 0x30, 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x4a, 0xef, 0xfc, + 0x82, 0x0, 0x0, 0x38, 0xef, 0xff, 0xda, 0x88, + 0x88, 0x88, 0x63, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x78, 0x88, 0x88, 0x9b, 0xef, 0xff, 0xb6, + 0x10, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x30, 0x0, 0x0, 0x1, 0x5b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd8, 0x20, 0x5, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x72, 0x0, 0x26, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x84, 0x0, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x58, 0x99, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x69, 0xbd, 0xef, 0xff, 0xff, + 0xff, 0xfd, 0xb9, 0x74, 0x20, 0x4, 0x9f, 0xff, + 0xa5, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, 0xef, + 0xff, 0xff, 0xdc, 0xaa, 0x99, 0x9a, 0xcd, 0xff, + 0xff, 0xfd, 0xaa, 0xbf, 0xff, 0xa5, 0x0, 0x0, + 0x0, 0x4, 0x9e, 0xff, 0xfe, 0xa6, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x59, 0xcf, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x2, 0x7c, 0xff, + 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xef, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x3, 0x6a, 0xa9, 0x73, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x9a, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa9, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x36, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xa9, 0x52, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xaa, 0xa6, 0x30, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xff, + 0xfe, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xc7, 0x20, 0x0, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xfc, 0x95, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x7b, 0xef, 0xff, 0xe9, 0x40, + 0x0, 0x0, 0x0, 0x5a, 0xff, 0xfb, 0xaa, 0xdf, + 0xff, 0xff, 0xdb, 0xa9, 0x99, 0xaa, 0xcd, 0xff, + 0xff, 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xff, 0xfa, 0x40, 0x2, 0x47, 0x9c, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xdb, 0x96, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0x99, 0x85, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xaa, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x6b, 0xef, 0xff, 0xa5, 0x0, + 0x0, 0x14, 0x78, 0x88, 0x88, 0x89, 0xce, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, + 0x0, 0x38, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xcf, 0xff, 0xff, 0xa5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7c, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x10, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x26, 0xaa, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0xbe, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x78, 0x88, 0x88, 0x89, 0xce, + 0xff, 0xff, 0xff, 0xa5, 0x0, 0x13, 0x31, 0x0, + 0x0, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x50, 0x16, 0xbe, 0xea, + 0x51, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x3, 0x8d, + 0xfa, 0x40, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x50, 0x15, 0xae, + 0xea, 0x51, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x24, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8c, 0xff, 0xff, 0xfa, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8c, 0xff, 0xa4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xfd, + 0xa5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xaa, 0x72, + 0x0, 0x0, 0x0, 0x12, 0x11, 0x14, 0x8c, 0xfe, + 0x94, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0xbe, 0xff, 0xfa, 0x50, 0x0, + 0x0, 0x27, 0xcf, 0xda, 0x52, 0x16, 0xbe, 0xe9, + 0x40, 0x0, 0x0, 0x14, 0x78, 0x88, 0x88, 0x89, + 0xce, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x23, 0x32, + 0x1, 0x4a, 0xdf, 0xb6, 0x13, 0x8d, 0xfa, 0x50, + 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x15, 0xbe, 0xea, 0x51, + 0x16, 0xbf, 0xc6, 0x13, 0x9e, 0xe9, 0x30, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x0, 0x3, 0x8d, 0xfa, 0x40, 0x39, + 0xee, 0x83, 0x17, 0xcf, 0xa5, 0x0, 0x5, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x50, 0x15, 0xbe, 0xea, 0x51, 0x16, 0xcf, 0xc6, + 0x13, 0x8e, 0xe9, 0x30, 0x0, 0x38, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, + 0x23, 0x31, 0x1, 0x5a, 0xef, 0xb6, 0x13, 0x8d, + 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7c, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, + 0x27, 0xcf, 0xda, 0x52, 0x16, 0xbf, 0xe9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7c, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x12, + 0x11, 0x15, 0x9d, 0xfe, 0x94, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, + 0xfd, 0xa5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xeb, 0x62, 0x0, 0x0, 0x5a, 0xff, + 0xfd, 0xa7, 0x56, 0x7b, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xb5, 0x0, 0x0, + 0x1, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x5a, 0xff, 0xeb, 0x63, 0x12, 0x38, 0xcf, 0xff, + 0xff, 0xff, 0xfe, 0xa6, 0x20, 0x13, 0x8c, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xfe, 0xcc, 0xdf, 0xff, 0xff, 0xea, 0x62, + 0x0, 0x0, 0x0, 0x1, 0x38, 0xdf, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xff, 0xea, 0x62, 0x0, + 0x15, 0x9b, 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xe9, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, + 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xec, 0x98, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x89, 0xce, 0xff, 0xa5, 0x0, + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xeb, 0x62, 0x0, + + /* U+F048 "" */ + 0x25, 0x78, 0x86, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x67, 0x52, 0x0, 0x4, 0x9f, 0xff, + 0xc6, 0x10, 0x0, 0x0, 0x0, 0x15, 0x9d, 0xff, + 0xfe, 0x83, 0x0, 0x49, 0xff, 0xfc, 0x61, 0x0, + 0x0, 0x26, 0xae, 0xff, 0xff, 0xff, 0xe9, 0x30, + 0x4, 0x9f, 0xff, 0xc6, 0x10, 0x37, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x93, 0x0, 0x49, 0xff, + 0xfd, 0xa9, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x30, 0x4, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x93, + 0x0, 0x49, 0xff, 0xfe, 0xee, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x30, 0x4, 0x9f, + 0xff, 0xc6, 0x24, 0x9d, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x93, 0x0, 0x49, 0xff, 0xfc, 0x61, + 0x0, 0x3, 0x7c, 0xef, 0xff, 0xff, 0xff, 0xe9, + 0x30, 0x4, 0x9f, 0xff, 0xc6, 0x10, 0x0, 0x0, + 0x2, 0x6b, 0xef, 0xff, 0xfe, 0x93, 0x0, 0x38, + 0xdf, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x59, 0xde, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x1, 0x46, 0x76, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0xda, + 0x74, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xa7, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdb, 0x74, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xeb, 0x84, 0x10, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x61, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x73, 0x10, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb8, 0x42, 0x0, + 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdb, 0x74, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xa7, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xff, 0xff, 0xff, 0xda, 0x74, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x36, 0x76, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x15, 0xad, 0xef, 0xff, 0xff, 0xfe, 0xc8, + 0x30, 0x0, 0x15, 0xad, 0xef, 0xff, 0xff, 0xfe, + 0xc8, 0x30, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x72, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x72, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x82, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x72, 0x0, 0x4a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x2, 0x47, 0x88, + 0x99, 0x99, 0x88, 0x63, 0x10, 0x0, 0x2, 0x47, + 0x88, 0x99, 0x99, 0x88, 0x63, 0x10, + + /* U+F04D "" */ + 0x0, 0x2, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x63, 0x10, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x82, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x72, 0x0, 0x15, 0xad, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xc8, 0x30, + + /* U+F051 "" */ + 0x2, 0x57, 0x64, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x25, 0x88, 0x85, 0x20, 0x2, 0x7d, 0xff, + 0xfd, 0xa5, 0x20, 0x0, 0x0, 0x0, 0x5, 0xbf, + 0xff, 0xa5, 0x0, 0x28, 0xdf, 0xff, 0xff, 0xfe, + 0xb7, 0x30, 0x0, 0x0, 0x5b, 0xff, 0xfa, 0x50, + 0x2, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc8, + 0x31, 0x5, 0xbf, 0xff, 0xa5, 0x0, 0x28, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0xac, + 0xff, 0xfa, 0x50, 0x2, 0x8d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, + 0x0, 0x28, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xee, 0xff, 0xfa, 0x50, 0x2, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x25, + 0xbf, 0xff, 0xa5, 0x0, 0x28, 0xdf, 0xff, 0xff, + 0xff, 0xfc, 0x84, 0x10, 0x0, 0x5b, 0xff, 0xfa, + 0x50, 0x2, 0x8d, 0xff, 0xff, 0xeb, 0x73, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xff, 0xa5, 0x0, 0x15, + 0xae, 0xda, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5a, 0xef, 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x36, 0x77, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x38, 0xcf, 0xff, 0xff, 0xea, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x26, 0xbe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd9, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xb7, 0x20, 0x0, + 0x0, 0x0, 0x2, 0x6c, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x27, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, + 0x0, 0x0, 0x1, 0x23, 0x34, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, + 0x31, 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x51, 0x0, 0x0, + 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x20, 0x0, 0x0, 0x27, 0xce, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x51, 0x0, 0x0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x34, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0xae, 0xff, 0xfb, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x5a, 0xef, 0xff, + 0xfd, 0x94, 0x10, 0x0, 0x0, 0x0, 0x0, 0x25, + 0xae, 0xff, 0xff, 0xd9, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x5a, 0xef, 0xff, 0xfd, 0x94, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, + 0xeb, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xbe, 0xff, 0xff, 0xc8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xef, 0xff, 0xfc, 0x83, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xce, 0xff, 0xff, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x7c, 0xef, 0xff, 0xfa, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0xab, 0x95, 0x10, 0x0, + + /* U+F054 "" */ + 0x0, 0x2, 0x34, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8e, 0xff, 0xfc, + 0x83, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xbe, 0xff, 0xff, 0xc8, 0x31, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7b, + 0xef, 0xff, 0xfc, 0x83, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xbe, 0xff, 0xff, + 0xc8, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x8d, 0xff, 0xff, 0xfb, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x5a, 0xef, 0xff, + 0xfd, 0x95, 0x10, 0x0, 0x0, 0x0, 0x0, 0x25, + 0xae, 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x5a, 0xef, 0xff, 0xfd, 0x95, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, + 0xd9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x37, 0xab, 0x85, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x69, 0xa9, 0x84, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xdf, 0xff, 0xfb, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xef, 0xff, 0xfb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xef, 0xff, + 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x57, 0x88, 0x88, 0x88, 0x88, 0x9c, + 0xff, 0xff, 0xfd, 0xb8, 0x88, 0x88, 0x88, 0x88, + 0x74, 0x10, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x72, 0x0, 0x15, 0x9b, 0xbb, + 0xbb, 0xbb, 0xbb, 0xce, 0xff, 0xff, 0xfe, 0xdb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xa7, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, 0xef, 0xff, + 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xef, 0xff, 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xef, 0xff, 0xfb, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x9c, 0xdd, 0xb7, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x0, 0x2, 0x45, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x53, 0x10, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x26, 0xac, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xc8, 0x40, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x58, + 0xab, 0xcd, 0xef, 0xff, 0xff, 0xed, 0xca, 0x97, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x49, 0xcf, 0xff, 0xfe, 0xc9, + 0x64, 0x32, 0x23, 0x45, 0x7a, 0xdf, 0xff, 0xfe, + 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x6b, 0xef, 0xff, 0xff, 0xc6, 0x20, 0x0, 0x3, + 0x79, 0x87, 0x52, 0x0, 0x49, 0xdf, 0xff, 0xff, + 0xd9, 0x41, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, + 0xff, 0xfe, 0x93, 0x0, 0x0, 0x2, 0x7c, 0xff, + 0xff, 0xea, 0x51, 0x16, 0xbf, 0xff, 0xff, 0xfe, + 0xa5, 0x10, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, + 0xc6, 0x12, 0x7c, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x40, 0x49, 0xef, 0xff, 0xff, 0xff, 0xc7, + 0x10, 0x0, 0x38, 0xdf, 0xff, 0xff, 0xfe, 0x93, + 0x3, 0x9e, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x61, + 0x16, 0xbf, 0xff, 0xff, 0xfe, 0xa4, 0x10, 0x0, + 0x0, 0x2, 0x6b, 0xef, 0xff, 0xff, 0xc6, 0x20, + 0x26, 0x9b, 0xcc, 0xca, 0x84, 0x11, 0x49, 0xdf, + 0xff, 0xff, 0xd8, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x59, 0xcf, 0xff, 0xfe, 0xc9, 0x64, + 0x32, 0x23, 0x45, 0x7a, 0xdf, 0xff, 0xfe, 0xb7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x57, 0x9b, 0xcd, 0xef, 0xff, + 0xff, 0xed, 0xca, 0x97, 0x42, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x1, 0x35, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8d, 0xff, 0xfd, 0x95, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x8c, 0xef, + 0xff, 0xc8, 0x53, 0x46, 0x8a, 0xbd, 0xee, 0xff, + 0xff, 0xed, 0xcb, 0x97, 0x53, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x59, 0xcf, 0xff, 0xff, 0xff, 0xda, 0x75, + 0x43, 0x23, 0x45, 0x79, 0xdf, 0xff, 0xfe, 0xc8, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x9d, 0xff, 0xfe, + 0xb7, 0x44, 0x7a, 0xa9, 0x74, 0x10, 0x28, 0xcf, + 0xff, 0xff, 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbd, 0xc8, 0x41, 0x0, 0x2, + 0x6a, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, + 0x4, 0xaf, 0xff, 0xff, 0xff, 0xb6, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xdf, 0xff, 0xff, 0xeb, + 0x73, 0x0, 0x0, 0x26, 0xad, 0xff, 0xff, 0xff, + 0xfb, 0x60, 0x27, 0xdf, 0xff, 0xff, 0xff, 0xe8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x15, 0xbe, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xef, 0xff, 0xeb, 0x67, 0xaf, 0xff, 0xff, 0xff, + 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x49, 0xdf, 0xff, 0xff, 0xc8, 0x30, 0x0, 0x0, + 0x0, 0x1, 0x37, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x37, 0xbe, 0xff, 0xff, 0xc9, + 0x64, 0x32, 0x22, 0x10, 0x0, 0x14, 0x8b, 0xef, + 0xff, 0xea, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x57, + 0x9b, 0xcd, 0xef, 0xff, 0xfe, 0xb7, 0x30, 0x0, + 0x1, 0x48, 0xce, 0xff, 0xfc, 0x94, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x14, 0x8c, 0xff, 0xfe, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x45, 0x41, 0x0, 0x0, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x33, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xef, 0xff, 0xd8, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xae, 0xff, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb5, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x7c, 0xff, 0xff, 0xee, 0xdd, 0xde, 0xff, + 0xff, 0xea, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, + 0xff, 0xff, 0xd7, 0x20, 0x0, 0x5a, 0xff, 0xff, + 0xfd, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x4a, 0xef, 0xff, 0xff, + 0xfd, 0x72, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, + 0xc7, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x9d, 0xff, 0xff, 0xff, 0xff, 0xd7, + 0x20, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xda, 0x87, + 0x8b, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa4, + 0x10, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, 0x4a, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0x30, + 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x95, 0x21, 0x37, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x72, 0x0, + 0x4, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x61, 0x0, 0x1, + 0x46, 0x77, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x87, 0x75, 0x20, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x46, + 0x63, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaf, 0xff, 0xc8, 0x31, + 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xc8, 0x30, 0x0, 0x0, 0x0, 0x26, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, + 0x48, 0xcd, 0xdd, 0xde, 0xff, 0xff, 0xeb, 0x62, + 0x2, 0x6b, 0xef, 0xff, 0xfe, 0xde, 0xff, 0xff, + 0xff, 0xd9, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xac, 0xa6, 0x46, 0xbe, 0xff, 0xff, + 0xd9, 0x41, 0x5, 0xaf, 0xfd, 0x95, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x10, 0x0, 0x1, + 0x47, 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0xbe, 0xff, 0xff, 0xd8, + 0x55, 0x8b, 0xc8, 0x41, 0x5, 0xaf, 0xfd, 0xa5, + 0x10, 0x0, 0x0, 0x0, 0x48, 0xcd, 0xdd, 0xde, + 0xff, 0xff, 0xfc, 0x84, 0x10, 0x49, 0xdf, 0xff, + 0xfe, 0xde, 0xff, 0xff, 0xff, 0xd9, 0x41, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xc8, 0x41, + 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaf, 0xff, 0xc8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x46, 0x63, 0x10, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x25, 0x77, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd9, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x12, + 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x26, 0xbe, 0xff, 0xff, 0xd9, 0x41, + 0x0, 0x0, 0x0, 0x26, 0xbe, 0xff, 0xff, 0xd9, + 0x41, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xfd, 0x94, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6b, + 0xef, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x25, 0x77, + 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0x77, 0x41, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x25, 0x77, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x77, + 0x41, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xfd, 0x94, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6b, + 0xef, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x26, 0xbe, + 0xff, 0xff, 0xd9, 0x41, 0x0, 0x0, 0x0, 0x26, + 0xbe, 0xff, 0xff, 0xd9, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x12, + 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0x41, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x6b, 0xef, 0xff, 0xfd, 0x94, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0x76, 0x41, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x38, 0xcf, 0xff, + 0xc8, 0x30, 0x0, 0x3, 0x57, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x76, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x38, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xc8, 0x32, 0x5a, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x93, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, + 0xcc, 0xcf, 0xfe, 0xcc, 0xdf, 0xff, 0xa4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xef, + 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x45, 0x31, 0x49, 0xef, 0xe9, 0x41, 0x35, 0x42, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9e, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0x9e, 0xfe, 0x94, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xef, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xef, 0xe9, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7b, 0xb9, 0x55, 0x9e, 0xfe, 0x95, 0x59, 0xbb, + 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9e, + 0xff, 0xc9, 0x77, 0x77, 0x77, 0x77, 0x77, 0x76, + 0x53, 0x36, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x38, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd7, 0x20, 0x37, 0xbe, 0xff, 0xff, + 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0xac, 0xa6, 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xa6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb, + 0x98, 0x88, 0x88, 0x88, 0x88, 0x88, 0x77, 0x64, + 0x10, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xeb, 0x62, 0x0, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x44, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xce, 0xff, + 0xec, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7c, 0xef, 0xff, 0xff, 0xff, 0xfe, 0xc7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xce, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x73, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x39, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x93, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8d, 0xff, 0xff, 0xff, 0xd8, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x8d, 0xff, + 0xff, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x8d, 0xff, 0xff, 0xff, 0xd8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x23, 0x33, 0x33, 0x33, 0x32, 0x13, + 0x8d, 0xff, 0xff, 0xff, 0xd8, 0x31, 0x23, 0x33, + 0x33, 0x33, 0x32, 0x10, 0x0, 0x0, 0x4a, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x94, 0x36, 0x99, 0x99, + 0x99, 0x63, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xa4, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xca, 0x99, 0x99, 0x99, 0xac, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe9, 0x56, 0xbc, 0x75, + 0x8d, 0xff, 0xa5, 0x0, 0x0, 0x25, 0x9a, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, 0x52, + 0x0, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x76, + 0x53, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, 0xff, 0xfe, + 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x93, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x5a, 0xdf, 0xff, 0xff, 0xff, 0xe9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xef, 0xff, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, 0xd7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x11, 0x0, 0x0, 0x0, 0x0, 0x1, 0x49, + 0xdf, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x13, 0x58, 0xac, 0xef, 0xfe, 0xb5, + 0x10, 0x1, 0x36, 0xad, 0xff, 0xff, 0xff, 0xc7, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x39, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0xce, 0xff, + 0xff, 0xff, 0xfc, 0x94, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xa6, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, + 0xb9, 0x63, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x77, + 0x76, 0x65, 0x43, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x0, 0x0, 0x2, 0x57, 0x89, 0x98, 0x63, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, 0x32, + 0x10, 0x0, 0x0, 0x15, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xd7, 0x20, 0x0, 0x0, 0x1, 0x48, 0xcf, + 0xff, 0xff, 0xea, 0x50, 0x0, 0x49, 0xff, 0xe9, + 0x40, 0x17, 0xcf, 0xfc, 0x71, 0x0, 0x14, 0x8c, + 0xff, 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, 0x17, + 0xcf, 0xff, 0xdb, 0xce, 0xff, 0xfd, 0x84, 0x48, + 0xcf, 0xff, 0xff, 0xfd, 0x95, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x8a, 0xcd, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd9, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9e, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x57, + 0x89, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0xae, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa7, 0x8b, + 0xef, 0xff, 0xff, 0xeb, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xff, 0xe9, 0x40, 0x17, 0xcf, 0xfc, + 0x71, 0x0, 0x27, 0xbe, 0xff, 0xff, 0xfe, 0xb6, + 0x20, 0x0, 0x0, 0x17, 0xcf, 0xff, 0xdb, 0xce, + 0xff, 0xe9, 0x40, 0x0, 0x0, 0x2, 0x6b, 0xef, + 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x14, 0x8a, + 0xcc, 0xcb, 0x96, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x13, 0x56, 0x66, 0x41, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x31, 0x12, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x49, + 0xed, 0x94, 0x10, 0x0, 0x0, 0x1, 0x23, 0x44, + 0x32, 0x15, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa5, 0x49, 0xef, 0xfe, 0xc7, 0x20, 0x0, 0x4a, + 0xff, 0xff, 0xe9, 0x45, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xec, 0x98, 0x88, 0x88, 0x85, 0x20, + 0x0, 0x5a, 0xff, 0xff, 0xe9, 0x45, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x50, 0x0, 0x5a, 0xff, 0xff, 0xe9, 0x45, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x0, 0x5a, 0xff, 0xff, + 0xe9, 0x45, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x5a, + 0xff, 0xff, 0xe9, 0x45, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x50, + 0x0, 0x5a, 0xff, 0xff, 0xe9, 0x45, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x50, 0x0, 0x5a, 0xff, 0xff, 0xe9, 0x45, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x40, 0x0, 0x5a, 0xff, 0xff, + 0xfd, 0x95, 0x33, 0x34, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x43, 0x21, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x14, 0x67, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x76, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F0C7 "" */ + 0x0, 0x2, 0x47, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x87, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xb6, 0x20, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xd8, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x6b, 0xff, 0xff, 0xeb, 0x62, 0x0, 0x0, 0x5a, + 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6b, 0xff, 0xff, 0xff, 0xe9, 0x30, + 0x0, 0x5a, 0xff, 0xeb, 0x97, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0xad, 0xff, 0xff, 0xff, + 0xf9, 0x40, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x40, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd9, 0x42, 0x12, 0x5a, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x40, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, + 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x40, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x94, + 0x0, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x40, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xca, 0x9a, 0xce, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x40, 0x0, 0x16, 0xad, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xed, 0x95, 0x10, + + /* U+F0E7 "" */ + 0x0, 0x0, 0x15, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, + 0xa8, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb6, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc6, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0xb6, 0x10, 0x3, 0x8e, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, + 0x10, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x27, 0xcf, 0xff, 0xff, + 0xe9, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xaf, 0xff, 0xfe, 0xa5, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8e, + 0xff, 0xfc, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x8a, 0xa8, + 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x38, 0xef, 0xff, 0xff, 0xff, + 0xb8, 0x8c, 0xff, 0xff, 0xff, 0xfc, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xb8, 0x8c, 0xff, 0xff, 0xff, 0xff, + 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdc, 0xbb, 0xbb, + 0xbb, 0xba, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xfc, 0x74, 0x58, + 0x99, 0x99, 0x99, 0x99, 0x52, 0x25, 0x64, 0x10, + 0x0, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xfa, + 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x94, 0x4a, + 0xff, 0xda, 0x52, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xfa, 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xa5, 0x23, 0x56, 0x66, 0x53, 0x10, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xfa, 0x55, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x40, + 0x0, 0x5a, 0xff, 0xff, 0xff, 0xfa, 0x55, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x40, 0x0, 0x49, 0xef, 0xff, 0xff, 0xfa, + 0x55, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x31, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x65, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9d, 0xff, 0xb6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x26, 0xad, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x8d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, + 0x0, 0x2, 0x6b, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x93, 0x0, 0x0, 0x39, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x61, 0x0, 0x1, 0x23, 0x34, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x43, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x7c, 0xff, 0xff, + 0xfe, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x46, 0x76, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F11C "" */ + 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x84, 0x0, 0x5, + 0xaf, 0xfe, 0xc9, 0x88, 0xad, 0xeb, 0x88, 0x8b, + 0xed, 0xa8, 0x8b, 0xee, 0xb8, 0x88, 0x8b, 0xee, + 0xb8, 0x8a, 0xdf, 0xfd, 0x72, 0x0, 0x5a, 0xff, + 0xd8, 0x30, 0x5, 0xbc, 0x71, 0x1, 0x7c, 0xb5, + 0x1, 0x6b, 0xb6, 0x0, 0x0, 0x6b, 0xb6, 0x10, + 0x5b, 0xff, 0xd8, 0x20, 0x5, 0xaf, 0xff, 0xff, + 0xfe, 0xdc, 0xcd, 0xef, 0xed, 0xcc, 0xde, 0xed, + 0xcc, 0xce, 0xff, 0xec, 0xcc, 0xef, 0xff, 0xff, + 0xfd, 0x82, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xa4, + 0x0, 0x38, 0xc8, 0x30, 0x5, 0xaa, 0x40, 0x2, + 0x7d, 0xd7, 0x20, 0x27, 0xcf, 0xff, 0xff, 0xd8, + 0x20, 0x5, 0xaf, 0xff, 0xff, 0xfe, 0xdc, 0xcd, + 0xef, 0xed, 0xcc, 0xde, 0xed, 0xcc, 0xce, 0xff, + 0xec, 0xcc, 0xef, 0xff, 0xff, 0xfd, 0x82, 0x0, + 0x5a, 0xff, 0xd8, 0x30, 0x5, 0xbc, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6b, + 0xb6, 0x10, 0x5b, 0xff, 0xd8, 0x20, 0x5, 0xaf, + 0xfe, 0xc9, 0x88, 0xad, 0xeb, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x8b, 0xde, 0xb8, + 0x8a, 0xdf, 0xfd, 0x72, 0x0, 0x26, 0xbe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x84, 0x0, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x24, 0x66, 0x53, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x35, 0x8a, 0xde, 0xff, 0xff, 0xfe, + 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x47, 0x9c, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x68, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, + 0x79, 0xce, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0x20, 0x0, + 0x0, 0x0, 0x26, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x38, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x33, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x9d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb6, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xea, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6c, 0xff, + 0xff, 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6c, 0xff, 0xff, 0xff, 0xb5, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6b, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x46, 0x64, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F15B "" */ + 0x0, 0x26, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xba, 0x62, 0x36, 0x74, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe9, 0x45, 0xaf, 0xfd, 0x94, 0x10, 0x0, + 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x94, 0x5a, 0xff, 0xff, 0xfd, 0x94, + 0x10, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x52, 0x34, 0x44, 0x44, 0x44, + 0x31, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x50, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x50, 0x0, 0x5, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x0, 0x5, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x5, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x2, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x31, 0x0, 0x0, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x35, 0x67, 0x99, 0xab, 0xbb, 0xcb, 0xbb, + 0xa9, 0x97, 0x65, 0x31, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, + 0x8b, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x85, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x7b, + 0xef, 0xff, 0xff, 0xfe, 0xca, 0x87, 0x54, 0x33, + 0x22, 0x22, 0x23, 0x34, 0x57, 0x8a, 0xce, 0xff, + 0xff, 0xff, 0xeb, 0x73, 0x10, 0x0, 0x0, 0x28, + 0xdf, 0xff, 0xfd, 0xa7, 0x31, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x37, 0xad, 0xff, 0xff, 0xd8, 0x30, 0x0, + 0x0, 0x2, 0x57, 0x63, 0x0, 0x0, 0x1, 0x25, + 0x79, 0xbc, 0xde, 0xff, 0xff, 0xfe, 0xdc, 0xb9, + 0x75, 0x21, 0x0, 0x0, 0x3, 0x57, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x8c, + 0xef, 0xff, 0xff, 0xff, 0xfe, 0xee, 0xee, 0xff, + 0xff, 0xff, 0xff, 0xec, 0x84, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x6b, 0xef, 0xfc, 0x96, 0x42, 0x10, 0x0, 0x0, + 0x0, 0x12, 0x46, 0x9c, 0xef, 0xeb, 0x62, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x10, 0x0, 0x0, 0x0, 0x1, 0x21, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x5a, 0xef, 0xff, 0xea, 0x51, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0xff, 0xff, 0xff, 0xf9, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x26, 0xac, 0xdc, 0xa6, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x1, 0x35, 0x67, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x65, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x83, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xd8, 0x32, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x21, 0x49, + 0xef, 0xff, 0xd8, 0x30, 0x0, 0x5, 0xaf, 0xfd, + 0x84, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x52, 0x59, 0xce, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xd8, 0x46, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x0, 0x28, 0xdf, 0xfa, 0x50, 0x0, + 0x5, 0xaf, 0xfd, 0x83, 0x59, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xc8, 0x43, 0x8e, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xeb, 0x87, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfc, + 0x94, 0x10, 0x0, 0x2, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "" */ + 0x0, 0x1, 0x35, 0x67, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x65, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x83, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xd8, 0x32, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x43, 0x21, 0x0, 0x0, 0x0, 0x49, + 0xef, 0xff, 0xd8, 0x30, 0x0, 0x5, 0xaf, 0xfd, + 0x84, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc6, 0x10, 0x0, 0x0, + 0x2, 0x59, 0xce, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xd8, 0x46, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x61, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xfa, 0x50, 0x0, + 0x5, 0xaf, 0xfd, 0x83, 0x59, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x95, + 0x0, 0x0, 0x0, 0x3, 0x8e, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xeb, 0x87, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfc, + 0x94, 0x10, 0x0, 0x2, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x0, 0x1, 0x35, 0x67, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x65, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x83, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xd8, 0x32, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x32, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xef, 0xff, 0xd8, 0x30, 0x0, 0x5, 0xaf, 0xfd, + 0x84, 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x59, 0xce, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xd8, 0x46, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xfa, 0x50, 0x0, + 0x5, 0xaf, 0xfd, 0x83, 0x59, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xca, 0x62, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8e, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xeb, 0x87, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfc, + 0x94, 0x10, 0x0, 0x2, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x0, 0x1, 0x35, 0x67, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x65, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x83, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xd8, 0x32, + 0x34, 0x44, 0x44, 0x43, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xef, 0xff, 0xd8, 0x30, 0x0, 0x5, 0xaf, 0xfd, + 0x84, 0x6c, 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x59, 0xce, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xd8, 0x46, 0xcf, 0xff, 0xff, 0xfe, 0x94, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xfa, 0x50, 0x0, + 0x5, 0xaf, 0xfd, 0x83, 0x59, 0xcc, 0xcc, 0xcc, + 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8e, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xeb, 0x87, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfc, + 0x94, 0x10, 0x0, 0x2, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x0, 0x1, 0x35, 0x67, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x65, 0x20, 0x0, + 0x0, 0x0, 0x4, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x83, 0x0, 0x0, 0x0, 0x5a, 0xff, 0xd8, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0xef, 0xff, 0xd8, 0x30, 0x0, 0x5, 0xaf, 0xfd, + 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x59, 0xce, 0xff, 0xa5, 0x0, 0x0, 0x5a, + 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xfa, 0x50, 0x0, + 0x5, 0xaf, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0x8e, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x5a, 0xff, 0xeb, 0x87, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x9c, 0xff, 0xfc, + 0x94, 0x10, 0x0, 0x2, 0x6c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xea, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0x33, 0x59, 0xdf, + 0xfe, 0xb6, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xad, 0xca, 0x9b, + 0xdf, 0xff, 0xfe, 0x93, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x11, 0x10, 0x0, 0x0, 0x0, 0x38, 0xdb, 0x51, + 0x0, 0x1, 0x24, 0x54, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x9d, 0xff, 0xff, 0xd9, 0x41, 0x1, 0x6b, 0xd8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x6a, 0xb8, 0x52, 0x0, 0x0, 0x0, + 0x4, 0xaf, 0xff, 0xff, 0xff, 0xfe, 0xed, 0xee, + 0xee, 0xee, 0xee, 0xed, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xde, 0xff, 0xff, 0xfc, 0x72, + 0x0, 0x0, 0x4, 0x9d, 0xff, 0xff, 0xd9, 0x41, + 0x0, 0x0, 0x0, 0x16, 0xbd, 0x83, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x6a, 0xb8, 0x52, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8c, 0xb6, + 0x10, 0x3, 0x57, 0x77, 0x77, 0x42, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x49, 0xcc, 0xba, 0xce, 0xff, 0xff, 0xfb, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x12, 0x49, 0xdf, 0xff, 0xff, + 0xb5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x23, 0x34, + 0x43, 0x32, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0x6a, 0xde, 0xff, 0xfe, + 0xee, 0xff, 0xff, 0xed, 0xa5, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x4a, 0xef, 0xff, 0xff, 0xff, + 0xa5, 0x37, 0xcf, 0xff, 0xff, 0xfd, 0x93, 0x0, + 0x0, 0x0, 0x1, 0x7c, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x40, 0x1, 0x48, 0xdf, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x0, 0x5b, 0xff, 0xfd, 0x84, 0x59, + 0xdf, 0xa4, 0x27, 0xa8, 0x42, 0x5b, 0xff, 0xfe, + 0x83, 0x0, 0x0, 0x28, 0xdf, 0xff, 0xff, 0xc7, + 0x32, 0x44, 0x21, 0x34, 0x33, 0x7c, 0xff, 0xff, + 0xfa, 0x50, 0x0, 0x3, 0x8e, 0xff, 0xff, 0xff, + 0xff, 0xc6, 0x20, 0x1, 0x5a, 0xef, 0xff, 0xff, + 0xff, 0xb6, 0x0, 0x0, 0x38, 0xef, 0xff, 0xff, + 0xfe, 0xb6, 0x20, 0x0, 0x1, 0x49, 0xdf, 0xff, + 0xff, 0xfb, 0x60, 0x0, 0x2, 0x7c, 0xff, 0xfe, + 0xb6, 0x22, 0x59, 0x84, 0x26, 0x97, 0x32, 0x5a, + 0xef, 0xff, 0xa5, 0x0, 0x0, 0x4, 0x9f, 0xff, + 0xec, 0xab, 0xdf, 0xfa, 0x41, 0x46, 0x42, 0x59, + 0xdf, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x4, 0x9e, + 0xff, 0xff, 0xff, 0xff, 0xa4, 0x1, 0x5a, 0xdf, + 0xff, 0xff, 0xd8, 0x20, 0x0, 0x0, 0x0, 0x1, + 0x49, 0xdf, 0xff, 0xff, 0xfb, 0xaa, 0xdf, 0xff, + 0xff, 0xfd, 0x94, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x68, 0x9a, 0xab, 0xbb, 0xa9, + 0x87, 0x52, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x67, + 0x88, 0x88, 0x87, 0x75, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x37, 0xbb, 0xcc, 0xcc, 0xcc, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xed, 0xcc, + 0xcc, 0xcc, 0xb9, 0x51, 0x0, 0x37, 0xbb, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xb9, 0x51, 0x0, 0x0, + 0x24, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, 0x30, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x61, 0x0, 0x0, 0x0, 0x49, 0xef, 0xff, 0xa5, + 0x5a, 0xff, 0xe9, 0x56, 0xbf, 0xfd, 0x85, 0x8d, + 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x49, 0xef, + 0xff, 0xa4, 0x4a, 0xff, 0xe8, 0x46, 0xbf, 0xfc, + 0x74, 0x7c, 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, + 0x49, 0xef, 0xff, 0xa4, 0x4a, 0xff, 0xe8, 0x46, + 0xbf, 0xfc, 0x74, 0x7c, 0xff, 0xfc, 0x61, 0x0, + 0x0, 0x0, 0x49, 0xef, 0xff, 0xa4, 0x4a, 0xff, + 0xe8, 0x46, 0xbf, 0xfc, 0x74, 0x7c, 0xff, 0xfc, + 0x61, 0x0, 0x0, 0x0, 0x49, 0xef, 0xff, 0xa4, + 0x4a, 0xff, 0xe8, 0x46, 0xbf, 0xfc, 0x74, 0x7c, + 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x49, 0xef, + 0xff, 0xa5, 0x5a, 0xff, 0xe9, 0x56, 0xbf, 0xfd, + 0x85, 0x8d, 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, + 0x38, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x60, 0x0, + 0x0, 0x0, 0x1, 0x36, 0x77, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x87, 0x76, 0x42, + 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x67, + 0x63, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x5a, 0xef, 0xff, 0xff, 0xd9, 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x25, 0x9d, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x5a, 0xef, 0xda, 0x53, 0x5a, 0xdf, 0xff, + 0xff, 0xfd, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0xae, 0xff, 0xff, + 0xff, 0xfd, 0xa5, 0x35, 0xad, 0xda, 0x52, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x5a, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0xae, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xea, 0x52, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5a, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xa5, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x25, 0xae, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xea, 0x52, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa5, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xea, 0x52, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4a, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x67, 0x76, + 0x55, 0x44, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x9c, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x84, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x15, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x94, 0x1, + 0x49, 0xdf, 0xfd, 0x94, 0x10, 0x39, 0xdf, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x0, 0x0, 0x15, 0xad, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x94, 0x10, 0x1, 0x22, 0x10, 0x1, 0x49, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x39, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x61, 0x0, 0x0, 0x15, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, + 0x0, 0x15, 0xad, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x94, 0x10, 0x1, 0x33, 0x10, + 0x1, 0x49, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x15, 0xad, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x94, 0x11, 0x49, 0xdf, + 0xfd, 0x94, 0x10, 0x49, 0xdf, 0xff, 0xff, 0xff, + 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x14, 0x9c, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xec, 0x84, 0x0, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x67, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x77, 0x64, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x25, 0xad, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x83, + 0x0, 0x0, 0x0, 0x26, 0xbe, 0xff, 0xa4, 0x0, + 0x5b, 0xb6, 0x3, 0x9b, 0x72, 0x28, 0xdf, 0xfa, + 0x50, 0x0, 0x4, 0x9e, 0xff, 0xff, 0xfa, 0x40, + 0x5, 0xbb, 0x60, 0x39, 0xb7, 0x22, 0x8d, 0xff, + 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x50, 0x0, 0x5, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x50, 0x0, 0x5, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x50, 0x0, 0x5, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa5, 0x0, 0x0, 0x5a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, 0x2, 0x6c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x62, 0x0, 0x0, 0x0, + 0x1, 0x34, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x31, 0x0, 0x0, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x12, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x48, 0xdf, + 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6a, + 0xc9, 0x51, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x27, 0xdf, 0xff, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xce, 0xff, 0xfc, 0x72, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, + 0xdf, 0xff, 0xb6, 0x0, 0x0, 0x3, 0x8c, 0xff, + 0xff, 0xff, 0xff, 0xed, 0xdd, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xde, 0xff, 0xff, 0xb6, + 0x0, 0x0, 0x16, 0xbe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa4, 0x0, 0x0, 0x0, + 0x2, 0x6b, 0xef, 0xff, 0xfc, 0x72, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, + 0xad, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 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 = 48, .box_w = 6, .box_h = 0, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 49, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 41, .adv_w = 61, .box_w = 12, .box_h = 4, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 65, .adv_w = 120, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 173, .adv_w = 108, .box_w = 21, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 299, .adv_w = 141, .box_w = 27, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 421, .adv_w = 119, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 529, .adv_w = 33, .box_w = 6, .box_h = 4, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 541, .adv_w = 66, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 646, .adv_w = 67, .box_w = 15, .box_h = 14, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 751, .adv_w = 83, .box_w = 21, .box_h = 6, .ofs_x = -1, .ofs_y = 3}, + {.bitmap_index = 814, .adv_w = 109, .box_w = 21, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 888, .adv_w = 38, .box_w = 12, .box_h = 4, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 912, .adv_w = 53, .box_w = 15, .box_h = 1, .ofs_x = -1, .ofs_y = 3}, + {.bitmap_index = 920, .adv_w = 51, .box_w = 9, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 929, .adv_w = 79, .box_w = 18, .box_h = 10, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1019, .adv_w = 108, .box_w = 21, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1114, .adv_w = 108, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1182, .adv_w = 108, .box_w = 21, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1277, .adv_w = 108, .box_w = 21, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1372, .adv_w = 108, .box_w = 24, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1480, .adv_w = 108, .box_w = 21, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1575, .adv_w = 108, .box_w = 21, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1670, .adv_w = 108, .box_w = 21, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1765, .adv_w = 108, .box_w = 21, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1860, .adv_w = 108, .box_w = 21, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1955, .adv_w = 47, .box_w = 9, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1987, .adv_w = 41, .box_w = 12, .box_h = 9, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 2041, .adv_w = 98, .box_w = 18, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 2095, .adv_w = 105, .box_w = 21, .box_h = 5, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 2148, .adv_w = 100, .box_w = 21, .box_h = 6, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 2211, .adv_w = 91, .box_w = 18, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2292, .adv_w = 172, .box_w = 33, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2490, .adv_w = 125, .box_w = 27, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2612, .adv_w = 120, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2720, .adv_w = 125, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2828, .adv_w = 126, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2936, .adv_w = 109, .box_w = 21, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3031, .adv_w = 106, .box_w = 21, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3126, .adv_w = 131, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3234, .adv_w = 137, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3342, .adv_w = 52, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3383, .adv_w = 106, .box_w = 24, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3491, .adv_w = 120, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3599, .adv_w = 103, .box_w = 21, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3694, .adv_w = 168, .box_w = 30, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3829, .adv_w = 137, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3937, .adv_w = 132, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4045, .adv_w = 121, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4153, .adv_w = 132, .box_w = 24, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4285, .adv_w = 118, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4393, .adv_w = 114, .box_w = 21, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4488, .adv_w = 115, .box_w = 27, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4610, .adv_w = 125, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4718, .adv_w = 122, .box_w = 27, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4840, .adv_w = 170, .box_w = 33, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4989, .adv_w = 120, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5097, .adv_w = 115, .box_w = 27, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 5219, .adv_w = 115, .box_w = 24, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5327, .adv_w = 51, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5405, .adv_w = 79, .box_w = 21, .box_h = 10, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 5510, .adv_w = 51, .box_w = 12, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5588, .adv_w = 80, .box_w = 15, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 5626, .adv_w = 87, .box_w = 21, .box_h = 1, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 5637, .adv_w = 59, .box_w = 12, .box_h = 2, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 5649, .adv_w = 104, .box_w = 21, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5723, .adv_w = 108, .box_w = 21, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5828, .adv_w = 101, .box_w = 21, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5902, .adv_w = 108, .box_w = 21, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6007, .adv_w = 102, .box_w = 21, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6081, .adv_w = 67, .box_w = 15, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6156, .adv_w = 108, .box_w = 21, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6261, .adv_w = 106, .box_w = 21, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6366, .adv_w = 47, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6407, .adv_w = 46, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 6479, .adv_w = 97, .box_w = 21, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6584, .adv_w = 47, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6629, .adv_w = 168, .box_w = 33, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6745, .adv_w = 106, .box_w = 21, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6819, .adv_w = 110, .box_w = 21, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6893, .adv_w = 108, .box_w = 21, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6998, .adv_w = 109, .box_w = 21, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7103, .adv_w = 65, .box_w = 15, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7156, .adv_w = 99, .box_w = 18, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7219, .adv_w = 63, .box_w = 15, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7287, .adv_w = 106, .box_w = 21, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7361, .adv_w = 93, .box_w = 21, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7435, .adv_w = 144, .box_w = 33, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7551, .adv_w = 95, .box_w = 24, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 7635, .adv_w = 91, .box_w = 21, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 7740, .adv_w = 95, .box_w = 18, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7803, .adv_w = 65, .box_w = 15, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7901, .adv_w = 47, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7951, .adv_w = 65, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 8049, .adv_w = 131, .box_w = 24, .box_h = 4, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 8097, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8370, .adv_w = 192, .box_w = 42, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8559, .adv_w = 192, .box_w = 42, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 8790, .adv_w = 192, .box_w = 42, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 8979, .adv_w = 132, .box_w = 30, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 9114, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 9387, .adv_w = 192, .box_w = 36, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9621, .adv_w = 216, .box_w = 45, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 9869, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 10142, .adv_w = 216, .box_w = 45, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 10345, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 10618, .adv_w = 96, .box_w = 24, .box_h = 10, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 10738, .adv_w = 144, .box_w = 33, .box_h = 10, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 10903, .adv_w = 216, .box_w = 45, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 11196, .adv_w = 192, .box_w = 42, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 11385, .adv_w = 168, .box_w = 27, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11547, .adv_w = 168, .box_w = 36, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 11781, .adv_w = 168, .box_w = 36, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 11979, .adv_w = 168, .box_w = 36, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 12177, .adv_w = 168, .box_w = 27, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 12339, .adv_w = 168, .box_w = 39, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 12554, .adv_w = 120, .box_w = 24, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12686, .adv_w = 120, .box_w = 24, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 12818, .adv_w = 168, .box_w = 36, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 13016, .adv_w = 168, .box_w = 36, .box_h = 3, .ofs_x = -1, .ofs_y = 3}, + {.bitmap_index = 13070, .adv_w = 216, .box_w = 45, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 13273, .adv_w = 240, .box_w = 51, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 13605, .adv_w = 216, .box_w = 45, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 13898, .adv_w = 192, .box_w = 42, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 14129, .adv_w = 168, .box_w = 36, .box_h = 7, .ofs_x = -1, .ofs_y = 1}, + {.bitmap_index = 14255, .adv_w = 168, .box_w = 36, .box_h = 7, .ofs_x = -1, .ofs_y = 1}, + {.bitmap_index = 14381, .adv_w = 240, .box_w = 51, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 14636, .adv_w = 192, .box_w = 42, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 14825, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 15098, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 15371, .adv_w = 168, .box_w = 36, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 15569, .adv_w = 168, .box_w = 36, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 15803, .adv_w = 168, .box_w = 36, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 16001, .adv_w = 120, .box_w = 27, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 16177, .adv_w = 168, .box_w = 36, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 16411, .adv_w = 168, .box_w = 36, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 16645, .adv_w = 216, .box_w = 45, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 16848, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 17121, .adv_w = 144, .box_w = 33, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 17336, .adv_w = 240, .box_w = 51, .box_h = 12, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 17642, .adv_w = 240, .box_w = 51, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 17872, .adv_w = 240, .box_w = 51, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18102, .adv_w = 240, .box_w = 51, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18332, .adv_w = 240, .box_w = 51, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18562, .adv_w = 240, .box_w = 51, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 18792, .adv_w = 240, .box_w = 51, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 19073, .adv_w = 168, .box_w = 33, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 19288, .adv_w = 168, .box_w = 36, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 19522, .adv_w = 192, .box_w = 42, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 19795, .adv_w = 240, .box_w = 51, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 20025, .adv_w = 144, .box_w = 33, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 20240, .adv_w = 193, .box_w = 42, .box_h = 9, .ofs_x = -1, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x14, + 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, 0x47, + 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, 0x53, 0x66, + 0x67, 0x6d, 0x6f, 0x70, 0x73, 0x76, 0x77, 0x78, + 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xe6, 0xe9, + 0xf2, 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, 0x240, 0x241, + 0x242, 0x243, 0x286, 0x292, 0x2ec, 0x303, 0x559, 0x7c1, + 0x8a1 +}; + +/*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 = 61441, .range_length = 2210, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 57, .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, 1, 0, 2, 0, 0, 0, 0, + 2, 3, 0, 0, 0, 4, 0, 4, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 7, 8, 9, 10, 11, + 0, 12, 12, 13, 14, 15, 12, 12, + 9, 16, 17, 18, 0, 19, 13, 20, + 21, 22, 23, 24, 25, 0, 0, 0, + 0, 0, 26, 27, 28, 0, 29, 30, + 0, 31, 0, 0, 32, 0, 31, 31, + 33, 27, 0, 34, 0, 35, 0, 36, + 37, 38, 36, 39, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 1, 0, 2, 0, 0, 0, 3, + 2, 0, 4, 5, 0, 6, 7, 6, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 10, 0, 11, 0, 0, 0, + 11, 0, 0, 12, 0, 0, 0, 0, + 11, 0, 11, 0, 13, 14, 15, 16, + 17, 18, 19, 20, 0, 0, 21, 0, + 0, 0, 22, 0, 23, 23, 23, 24, + 23, 0, 0, 0, 0, 0, 25, 25, + 26, 25, 23, 27, 28, 29, 30, 31, + 32, 33, 31, 34, 0, 0, 35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -10, 0, 0, 0, + 0, 0, 0, 0, -11, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, -6, 0, -2, -6, 0, -7, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -16, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -21, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, 0, 0, 0, 0, 0, 0, -6, + 0, -1, 0, 0, -12, -2, -8, -6, + 0, -9, 0, 0, 0, 0, 0, 0, + -1, 0, 0, -2, -1, -5, -3, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -2, 0, 0, -5, 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, -3, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, -2, 0, 0, 0, -3, 0, -2, + 0, -2, -4, -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, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, -2, -2, 0, -2, 0, 0, 0, + -2, -2, -2, 0, 0, 0, 0, 0, + 0, 0, 0, -22, 0, 0, 0, -16, + 0, -25, 0, 2, 0, 0, 0, 0, + 0, 0, 0, -3, -2, 0, 0, -2, + -2, 0, 0, -2, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, -3, 0, + 0, 0, 2, -3, 0, 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, 0, 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, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, -2, + -3, 0, 0, 0, -2, -4, -6, 0, + 0, 0, 0, -31, 0, 0, 0, 0, + 0, 0, 0, 2, -6, 0, 0, -26, + -5, -16, -13, 0, -22, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + -12, -9, 0, 0, 0, 0, 0, 0, + 0, 0, -30, 0, 0, 0, -13, 0, + -19, 0, 0, 0, 0, 0, -3, 0, + -2, 0, -1, -1, 0, 0, -1, 0, + 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, -3, + -2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, 0, -2, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -4, 0, + 0, 0, 0, -20, -22, 0, 0, -7, + -3, -22, -1, 2, 0, 2, 1, 0, + 2, 0, 0, -11, -9, 0, -10, -9, + -7, -11, 0, -9, -7, -5, -7, -6, + 0, 0, 0, 0, 2, 0, -21, -3, + 0, 0, -7, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -4, -4, + 0, 0, -4, -3, 0, 0, -3, -1, + 0, 0, 0, 2, 0, 0, 0, 1, + 0, -12, -6, 0, 0, -4, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 1, -3, -3, 0, 0, -3, -2, 0, + 0, -2, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, -2, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + -2, 0, 0, 0, -2, -3, 0, 0, + 0, 0, 0, 0, -3, 2, -5, -20, + -5, 0, 0, -9, -3, -9, -1, 2, + -9, 2, 2, 1, 2, 0, 2, -7, + -6, -2, -4, -6, -4, -5, -2, -4, + -2, 0, -2, -3, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -2, 0, 0, -2, 0, + 0, 0, -2, -3, -3, 0, 0, 0, + 0, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -6, 0, 0, 0, + 0, 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, -3, + 0, 0, 0, 0, 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, + 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, 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, -1, 0, 0, 0, 0, 0, + 2, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, -10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 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, + -2, -1, 0, 0, 2, 0, 0, 0, + -12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, -2, 1, 0, -2, 0, 0, 5, + 0, 2, 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, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, -10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -1, + 1, 0, -1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 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, 0, 0, 0, 0, 0, 0, 0, + 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, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, + 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 = 40, + .right_class_cnt = 35, +}; + +/*-------------------- + * 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 lv_font_roboto_12_subpx = { + .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 = 14, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ + .subpx = LV_FONT_SUBPX_HOR, + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_ROBOTO_12_SUBPX*/ + diff --git a/src/lv_font/lv_font_roboto_16.c b/src/lv_font/lv_font_roboto_16.c index a0906bf49..a52b2c0dc 100644 --- a/src/lv_font/lv_font_roboto_16.c +++ b/src/lv_font/lv_font_roboto_16.c @@ -3,7 +3,7 @@ /******************************************************************************* * Size: 16 px * Bpp: 4 - * Opts: + * Opts: --no-compress --no-prefilter --bpp 4 --size 16 --font Roboto-Regular.woff -r 0x20-0x7F --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 lv_font_roboto_16.c --force-fast-kern-format ******************************************************************************/ #ifndef LV_FONT_ROBOTO_16 @@ -21,411 +21,417 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { /* U+20 " " */ /* U+21 "!" */ - 0x33, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, - 0x34, 0x0, 0x67, 0xcf, + 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0x9b, 0x9b, + 0x56, 0x0, 0x57, 0x8c, /* U+22 "\"" */ - 0x42, 0x23, 0xf8, 0x8f, 0xf8, 0x8f, 0xf3, 0x8a, - 0xa0, 0x64, + 0xe2, 0xd4, 0xe2, 0xd3, 0xe0, 0xd2, 0xe0, 0xd1, + 0x0, 0x0, /* U+23 "#" */ - 0x0, 0x0, 0x41, 0x4, 0x10, 0x0, 0x3, 0xf0, - 0xf, 0x30, 0x0, 0x6, 0xd0, 0x4f, 0x0, 0x0, - 0x9, 0xa0, 0x6c, 0x0, 0xc, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0xf, 0x40, 0xc6, 0x0, 0x0, 0x3f, - 0x0, 0xf4, 0x0, 0x23, 0x7d, 0x35, 0xf3, 0x30, - 0x6c, 0xee, 0xce, 0xfc, 0x90, 0x0, 0xc7, 0x9, - 0xa0, 0x0, 0x0, 0xf4, 0xc, 0x70, 0x0, 0x2, - 0xf0, 0xf, 0x40, 0x0, + 0x0, 0x1, 0xf0, 0xe, 0x30, 0x0, 0x4, 0xc0, + 0x2f, 0x0, 0x0, 0x8, 0x90, 0x5c, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xf4, 0x1, 0x2e, 0x42, 0xc7, + 0x20, 0x0, 0x1f, 0x0, 0xe3, 0x0, 0x0, 0x4d, + 0x1, 0xf0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xa0, + 0x12, 0xb8, 0x28, 0xb2, 0x10, 0x0, 0xc4, 0xa, + 0x70, 0x0, 0x0, 0xf2, 0xc, 0x50, 0x0, 0x1, + 0xf0, 0xf, 0x20, 0x0, /* U+24 "$" */ - 0x0, 0x3, 0x20, 0x0, 0x0, 0xc, 0x80, 0x0, - 0x0, 0x5d, 0xa3, 0x0, 0xc, 0xfc, 0xef, 0x60, - 0x6f, 0x40, 0x1c, 0xe0, 0x8f, 0x0, 0x7, 0xf2, - 0x7f, 0x40, 0x0, 0x0, 0x1d, 0xf9, 0x30, 0x0, - 0x1, 0x8e, 0xfb, 0x20, 0x0, 0x0, 0x6f, 0xd0, - 0x42, 0x0, 0x6, 0xf4, 0xeb, 0x0, 0x5, 0xf4, - 0x8f, 0x63, 0x4c, 0xe0, 0x19, 0xff, 0xfc, 0x30, - 0x0, 0xf, 0x40, 0x0, 0x0, 0xc, 0x30, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0xe, 0x40, + 0x0, 0x0, 0x2, 0xe6, 0x0, 0x0, 0xa, 0xff, + 0xfc, 0x10, 0x6, 0xf5, 0x4, 0xfa, 0x0, 0xac, + 0x0, 0x8, 0xe0, 0x9, 0xe0, 0x0, 0x26, 0x0, + 0x3f, 0xb3, 0x0, 0x0, 0x0, 0x3c, 0xfd, 0x50, + 0x0, 0x0, 0x3, 0xaf, 0x70, 0x1, 0x0, 0x0, + 0x9f, 0x0, 0xf6, 0x0, 0x5, 0xf1, 0xc, 0xd1, + 0x1, 0xce, 0x0, 0x3e, 0xfe, 0xfe, 0x40, 0x0, + 0x5, 0xf6, 0x10, 0x0, 0x0, 0xf, 0x20, 0x0, /* U+25 "%" */ - 0x1, 0x67, 0x30, 0x0, 0x0, 0x0, 0xcb, 0x9f, - 0x20, 0x1, 0x0, 0x2f, 0x0, 0xb8, 0x4, 0xf0, - 0x3, 0xf0, 0xa, 0x80, 0xd5, 0x0, 0xe, 0x74, - 0xe4, 0x8c, 0x0, 0x0, 0x2a, 0xc5, 0x2e, 0x20, - 0x0, 0x0, 0x0, 0xb, 0x80, 0x10, 0x0, 0x0, - 0x5, 0xd1, 0xcd, 0xf5, 0x0, 0x1, 0xd4, 0x8b, - 0x5, 0xe0, 0x0, 0x99, 0xc, 0x80, 0xf, 0x0, - 0x1e, 0x10, 0x8a, 0x5, 0xf0, 0x0, 0x0, 0x1, - 0xdc, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x5, 0xde, 0x80, 0x0, 0x0, 0x0, 0xf, 0x31, + 0xd4, 0x0, 0x70, 0x0, 0x2e, 0x0, 0x97, 0x8, + 0x90, 0x0, 0xf, 0x31, 0xd5, 0x2e, 0x10, 0x0, + 0x5, 0xde, 0x80, 0xb5, 0x0, 0x0, 0x0, 0x0, + 0x5, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0x29, + 0xec, 0x20, 0x0, 0x0, 0x98, 0x6c, 0x17, 0xc0, + 0x0, 0x3, 0xe0, 0x97, 0x1, 0xf0, 0x0, 0xd, + 0x50, 0x97, 0x1, 0xf0, 0x0, 0x19, 0x0, 0x6c, + 0x7, 0xc0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x20, /* U+26 "&" */ - 0x0, 0x16, 0x75, 0x0, 0x0, 0x1, 0xef, 0xcf, - 0x90, 0x0, 0x6, 0xf2, 0x6, 0xf1, 0x0, 0x8, - 0xf1, 0x6, 0xf0, 0x0, 0x2, 0xf8, 0x7e, 0x60, - 0x0, 0x0, 0x9f, 0xf6, 0x0, 0x0, 0x3, 0xef, - 0xe3, 0x0, 0x41, 0x2e, 0xb2, 0xdc, 0x11, 0xf4, - 0x8f, 0x20, 0x3f, 0xb6, 0xf2, 0x6f, 0x20, 0x4, - 0xff, 0xa0, 0x2f, 0xb3, 0x5, 0xef, 0x70, 0x3, - 0xdf, 0xff, 0xaa, 0xf4, 0x0, 0x0, 0x20, 0x0, - 0x0, + 0x0, 0x3c, 0xfc, 0x30, 0x0, 0x0, 0xeb, 0x4a, + 0xe0, 0x0, 0x3, 0xf3, 0x1, 0xf3, 0x0, 0x2, + 0xf5, 0x6, 0xf1, 0x0, 0x0, 0xbd, 0x8f, 0x50, + 0x0, 0x0, 0x3f, 0xf4, 0x0, 0x0, 0x3, 0xec, + 0xf8, 0x0, 0x71, 0xd, 0xc0, 0x7f, 0x42, 0xf1, + 0x2f, 0x40, 0xa, 0xf9, 0xe0, 0x1f, 0x60, 0x0, + 0xcf, 0x70, 0xa, 0xe4, 0x15, 0xef, 0xb0, 0x0, + 0x8d, 0xfe, 0x95, 0xf8, /* U+27 "'" */ - 0x42, 0xf8, 0xf7, 0xf2, 0x70, + 0x3f, 0x3f, 0x3e, 0x2c, /* U+28 "(" */ - 0x0, 0x7, 0x10, 0x9, 0xd1, 0x5, 0xf2, 0x0, - 0xe8, 0x0, 0x4f, 0x30, 0xa, 0xe0, 0x0, 0xcc, - 0x0, 0xe, 0xb0, 0x0, 0xf8, 0x0, 0xd, 0xc0, - 0x0, 0xcc, 0x0, 0xa, 0xe0, 0x0, 0x3f, 0x30, - 0x0, 0xca, 0x0, 0x3, 0xf3, 0x0, 0x6, 0xf1, - 0x0, 0x5, 0x0, + 0x0, 0x2, 0x0, 0x3, 0xe1, 0x1, 0xe5, 0x0, + 0x9b, 0x0, 0x1f, 0x40, 0x6, 0xe0, 0x0, 0xab, + 0x0, 0xd, 0x90, 0x0, 0xe8, 0x0, 0xe, 0x70, + 0x0, 0xd8, 0x0, 0xc, 0xa0, 0x0, 0x8d, 0x0, + 0x3, 0xf1, 0x0, 0xd, 0x70, 0x0, 0x4e, 0x10, + 0x0, 0x9b, 0x0, 0x0, 0x80, /* U+29 ")" */ - 0x81, 0x0, 0xa, 0xc1, 0x0, 0xd, 0x90, 0x0, - 0x4f, 0x20, 0x0, 0xf9, 0x0, 0xa, 0xe0, 0x0, - 0x8f, 0x0, 0x6, 0xf3, 0x0, 0x4f, 0x40, 0x6, - 0xf2, 0x0, 0x8f, 0x0, 0xa, 0xe0, 0x0, 0xf7, - 0x0, 0x5f, 0x20, 0x1d, 0x70, 0xa, 0xa0, 0x0, - 0x50, 0x0, 0x0, + 0x20, 0x0, 0x8, 0xa0, 0x0, 0xd, 0x70, 0x0, + 0x4f, 0x10, 0x0, 0xd8, 0x0, 0x8, 0xe0, 0x0, + 0x4f, 0x20, 0x1, 0xf4, 0x0, 0xf, 0x60, 0x0, + 0xf6, 0x0, 0x1f, 0x50, 0x3, 0xf3, 0x0, 0x5f, + 0x0, 0xa, 0xb0, 0x0, 0xf4, 0x0, 0x8b, 0x0, + 0x4e, 0x20, 0x6, 0x20, 0x0, /* U+2A "*" */ - 0x0, 0x27, 0x0, 0x0, 0x12, 0xf0, 0x0, 0x2e, - 0x9f, 0x9e, 0x10, 0x4d, 0xfc, 0x51, 0x3, 0xfa, - 0xe1, 0x0, 0x58, 0xb, 0x30, + 0x0, 0x1f, 0x0, 0x0, 0x1, 0xf0, 0x0, 0x9b, + 0x6f, 0x5b, 0x73, 0x8d, 0xfd, 0x83, 0x0, 0xde, + 0xa0, 0x0, 0x9c, 0x1f, 0x50, 0x7, 0x30, 0x66, + 0x0, /* U+2B "+" */ - 0x0, 0x2, 0x72, 0x0, 0x0, 0x0, 0x4f, 0x40, - 0x0, 0x0, 0x4, 0xf4, 0x0, 0x0, 0x0, 0x4f, - 0x40, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x82, 0x44, - 0x7f, 0x74, 0x42, 0x0, 0x4, 0xf4, 0x0, 0x0, - 0x0, 0x4f, 0x40, 0x0, 0x0, 0x3, 0xc3, 0x0, + 0x0, 0x2, 0xa2, 0x0, 0x0, 0x0, 0x3f, 0x30, + 0x0, 0x0, 0x3, 0xf3, 0x0, 0x0, 0x11, 0x4f, + 0x51, 0x10, 0x6f, 0xff, 0xff, 0xff, 0x61, 0x44, + 0x7f, 0x74, 0x41, 0x0, 0x3, 0xf3, 0x0, 0x0, + 0x0, 0x3f, 0x30, 0x0, 0x0, 0x3, 0xf3, 0x0, 0x0, /* U+2C "," */ - 0xc6, 0xf8, 0xf5, 0xe0, + 0xf, 0x60, 0xf5, 0x4f, 0x28, 0x90, 0x0, 0x0, /* U+2D "-" */ - 0x46, 0x66, 0x58, 0xcc, 0xcb, + 0x0, 0x0, 0xb, 0xff, 0xf1, 0x23, 0x33, 0x0, /* U+2E "." */ - 0x56, 0xbc, + 0x88, 0xab, /* U+2F "/" */ - 0x0, 0x0, 0x13, 0x0, 0x0, 0x7e, 0x0, 0x0, - 0xe7, 0x0, 0x4, 0xf2, 0x0, 0xa, 0xb0, 0x0, - 0x1e, 0x50, 0x0, 0x6f, 0x0, 0x0, 0xd9, 0x0, - 0x2, 0xf2, 0x0, 0x9, 0xd0, 0x0, 0xf, 0x60, - 0x0, 0x5f, 0x10, 0x0, 0xba, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0x0, 0x0, 0xa, 0x90, 0x0, + 0x0, 0xf3, 0x0, 0x0, 0x6d, 0x0, 0x0, 0xc, + 0x70, 0x0, 0x2, 0xf1, 0x0, 0x0, 0x7c, 0x0, + 0x0, 0xd, 0x60, 0x0, 0x3, 0xf0, 0x0, 0x0, + 0x9a, 0x0, 0x0, 0xe, 0x40, 0x0, 0x5, 0xe0, + 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, /* U+30 "0" */ - 0x1, 0x57, 0x51, 0x0, 0x2c, 0xec, 0xec, 0x20, - 0xae, 0x10, 0x1e, 0xa0, 0xf8, 0x0, 0x8, 0xf0, - 0xf8, 0x0, 0x8, 0xf1, 0xf8, 0x0, 0x8, 0xf4, - 0xf8, 0x0, 0x8, 0xf4, 0xf8, 0x0, 0x8, 0xf4, - 0xf8, 0x0, 0x8, 0xf0, 0xfa, 0x0, 0xa, 0xf0, - 0x7f, 0x61, 0x6f, 0x70, 0x8, 0xff, 0xf8, 0x0, - 0x0, 0x2, 0x0, 0x0, + 0x0, 0x7d, 0xfd, 0x60, 0x0, 0x5f, 0x84, 0x9f, + 0x50, 0xc, 0xb0, 0x0, 0xbc, 0x0, 0xf7, 0x0, + 0x7, 0xf0, 0x1f, 0x50, 0x0, 0x5f, 0x1, 0xf5, + 0x0, 0x5, 0xf1, 0x1f, 0x50, 0x0, 0x5f, 0x11, + 0xf5, 0x0, 0x6, 0xf0, 0xf, 0x70, 0x0, 0x7f, + 0x0, 0xcc, 0x0, 0xc, 0xb0, 0x5, 0xf9, 0x49, + 0xf5, 0x0, 0x6, 0xdf, 0xd6, 0x0, /* U+31 "1" */ - 0x23, 0x37, 0x48, 0xff, 0xf8, 0x0, 0xf, 0x80, - 0x0, 0xf8, 0x0, 0xf, 0x80, 0x0, 0xf8, 0x0, - 0xf, 0x80, 0x0, 0xf8, 0x0, 0xf, 0x80, 0x0, - 0xf8, 0x0, 0xf, 0x80, 0x0, 0xf8, + 0x0, 0x39, 0xa5, 0xdf, 0xfb, 0x99, 0x2c, 0xb0, + 0x0, 0xcb, 0x0, 0xc, 0xb0, 0x0, 0xcb, 0x0, + 0xc, 0xb0, 0x0, 0xcb, 0x0, 0xc, 0xb0, 0x0, + 0xcb, 0x0, 0xc, 0xb0, 0x0, 0xcb, /* U+32 "2" */ - 0x1, 0x57, 0x61, 0x0, 0x1d, 0xfc, 0xee, 0x30, - 0xaf, 0x10, 0x1e, 0xb0, 0xa8, 0x0, 0xc, 0xe0, - 0x0, 0x0, 0xe, 0xb0, 0x0, 0x0, 0x7f, 0x40, - 0x0, 0x3, 0xe9, 0x0, 0x0, 0x1c, 0xd0, 0x0, - 0x0, 0xde, 0x10, 0x0, 0xa, 0xf3, 0x0, 0x0, - 0x7f, 0x73, 0x33, 0x31, 0xcf, 0xff, 0xff, 0xf4, + 0x0, 0x7e, 0xfd, 0x60, 0x0, 0x9f, 0x74, 0x9f, + 0x60, 0x1f, 0x60, 0x0, 0xcc, 0x2, 0xa2, 0x0, + 0x9, 0xd0, 0x0, 0x0, 0x0, 0xd9, 0x0, 0x0, + 0x0, 0x7f, 0x10, 0x0, 0x0, 0x4f, 0x60, 0x0, + 0x0, 0x2f, 0x90, 0x0, 0x0, 0x1e, 0xa0, 0x0, + 0x0, 0xc, 0xc0, 0x0, 0x0, 0xa, 0xf4, 0x33, + 0x33, 0x10, 0xff, 0xff, 0xff, 0xf6, /* U+33 "3" */ - 0x1, 0x57, 0x62, 0x3, 0xdf, 0xce, 0xe4, 0xbe, - 0x10, 0x1e, 0xc8, 0x40, 0x0, 0xbe, 0x0, 0x0, - 0xd, 0xc0, 0x6, 0x7a, 0xf3, 0x0, 0x9c, 0xec, - 0x30, 0x0, 0x0, 0xcd, 0x0, 0x0, 0x8, 0xff, - 0x90, 0x0, 0x9f, 0x9e, 0x50, 0x5e, 0xb1, 0x9f, - 0xff, 0xa1, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x8d, 0xfd, 0x50, 0xa, 0xe6, 0x48, 0xf5, + 0xf, 0x60, 0x0, 0xca, 0x1, 0x0, 0x0, 0xbb, + 0x0, 0x0, 0x16, 0xf4, 0x0, 0xf, 0xff, 0x60, + 0x0, 0x3, 0x49, 0xf4, 0x0, 0x0, 0x0, 0xbc, + 0x16, 0x10, 0x0, 0x8e, 0x2f, 0x60, 0x0, 0xbc, + 0xa, 0xe6, 0x48, 0xf4, 0x0, 0x8d, 0xfc, 0x50, /* U+34 "4" */ - 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, 0x3, 0xff, - 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x6f, - 0xaf, 0x0, 0x0, 0x1e, 0x88, 0xf0, 0x0, 0xa, - 0xd0, 0x8f, 0x0, 0x4, 0xf4, 0x8, 0xf0, 0x0, - 0xda, 0x0, 0x8f, 0x0, 0x6f, 0xcb, 0xbd, 0xfb, - 0x64, 0x88, 0x88, 0xcf, 0x84, 0x0, 0x0, 0x8, - 0xf0, 0x0, 0x0, 0x0, 0x8f, 0x0, + 0x0, 0x0, 0xc, 0xf0, 0x0, 0x0, 0x6, 0xff, + 0x0, 0x0, 0x1, 0xec, 0xf0, 0x0, 0x0, 0xac, + 0x6f, 0x0, 0x0, 0x3f, 0x26, 0xf0, 0x0, 0xd, + 0x80, 0x6f, 0x0, 0x7, 0xe0, 0x6, 0xf0, 0x1, + 0xf5, 0x0, 0x6f, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xa1, 0x33, 0x33, 0x8f, 0x32, 0x0, 0x0, 0x6, + 0xf0, 0x0, 0x0, 0x0, 0x6f, 0x0, /* U+35 "5" */ - 0x4, 0x33, 0x33, 0x30, 0xf, 0xff, 0xff, 0xc0, - 0x4f, 0x40, 0x0, 0x0, 0x4f, 0x30, 0x0, 0x0, - 0x6f, 0x13, 0x31, 0x0, 0x8f, 0xef, 0xfd, 0x30, - 0x8e, 0x20, 0x3f, 0xb0, 0x0, 0x0, 0x9, 0xf0, - 0x0, 0x0, 0x8, 0xf1, 0xcc, 0x0, 0x9, 0xf0, - 0x7f, 0x50, 0x6e, 0x90, 0x9, 0xff, 0xfa, 0x10, - 0x0, 0x2, 0x0, 0x0, + 0xd, 0xff, 0xff, 0xf0, 0xf, 0xa6, 0x66, 0x60, + 0x1f, 0x40, 0x0, 0x0, 0x2f, 0x20, 0x0, 0x0, + 0x4f, 0xcf, 0xfa, 0x10, 0x4f, 0x84, 0x8f, 0xb0, + 0x0, 0x0, 0x7, 0xf2, 0x0, 0x0, 0x2, 0xf4, + 0x43, 0x0, 0x2, 0xf4, 0x9d, 0x0, 0x6, 0xf1, + 0x2f, 0xa4, 0x6f, 0xa0, 0x4, 0xcf, 0xe8, 0x0, /* U+36 "6" */ - 0x0, 0x36, 0x75, 0x10, 0x6, 0xfd, 0xce, 0x40, - 0x4f, 0x70, 0x0, 0x0, 0xbe, 0x0, 0x0, 0x0, - 0xdb, 0x3, 0x30, 0x0, 0xfa, 0xdf, 0xfe, 0x30, - 0xff, 0x30, 0x2d, 0xd0, 0xf8, 0x0, 0x5, 0xf4, - 0xcc, 0x0, 0x4, 0xf4, 0xae, 0x0, 0x6, 0xf2, - 0x2f, 0x92, 0x4e, 0xc0, 0x4, 0xef, 0xfc, 0x10, - 0x0, 0x1, 0x0, 0x0, + 0x0, 0x2a, 0xe9, 0x0, 0x5, 0xfc, 0x63, 0x0, + 0x1f, 0x80, 0x0, 0x0, 0x7e, 0x0, 0x0, 0x0, + 0xbb, 0xbf, 0xf9, 0x0, 0xef, 0xa4, 0x7f, 0x80, + 0xfb, 0x0, 0x8, 0xf0, 0xf8, 0x0, 0x4, 0xf2, + 0xd9, 0x0, 0x4, 0xf2, 0x9e, 0x0, 0x8, 0xe0, + 0x1e, 0xc5, 0x7f, 0x70, 0x2, 0xcf, 0xe7, 0x0, /* U+37 "7" */ - 0x13, 0x33, 0x33, 0x33, 0x13, 0xcc, 0xcc, 0xcd, - 0xf4, 0x0, 0x0, 0x0, 0xbd, 0x0, 0x0, 0x0, - 0x7f, 0x20, 0x0, 0x0, 0x2e, 0x60, 0x0, 0x0, - 0xa, 0xe0, 0x0, 0x0, 0x1, 0xf6, 0x0, 0x0, - 0x0, 0x6f, 0x10, 0x0, 0x0, 0xb, 0xd0, 0x0, - 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0xe, 0xc0, - 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x41, 0x33, 0x33, 0x38, + 0xf1, 0x0, 0x0, 0x0, 0xc9, 0x0, 0x0, 0x0, + 0x3f, 0x20, 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, + 0x1, 0xf5, 0x0, 0x0, 0x0, 0x8e, 0x0, 0x0, + 0x0, 0xe, 0x70, 0x0, 0x0, 0x6, 0xf1, 0x0, + 0x0, 0x0, 0xda, 0x0, 0x0, 0x0, 0x4f, 0x30, + 0x0, 0x0, 0xb, 0xc0, 0x0, 0x0, /* U+38 "8" */ - 0x0, 0x16, 0x76, 0x10, 0x0, 0x3e, 0xfc, 0xfe, - 0x30, 0xb, 0xf1, 0x1, 0xfb, 0x0, 0xcc, 0x0, - 0xc, 0xd0, 0xa, 0xd1, 0x0, 0xeb, 0x0, 0x1d, - 0xd7, 0xcd, 0x10, 0x1, 0x9f, 0xce, 0x91, 0x0, - 0xcd, 0x10, 0x1d, 0xb0, 0x2f, 0x70, 0x0, 0x6f, - 0x21, 0xf8, 0x0, 0x8, 0xf1, 0xc, 0xe5, 0x5, - 0xec, 0x0, 0x1a, 0xff, 0xfb, 0x10, 0x0, 0x0, - 0x20, 0x0, 0x0, + 0x0, 0x6d, 0xfd, 0x60, 0x0, 0x6f, 0x84, 0x8f, + 0x60, 0xc, 0xb0, 0x0, 0xbb, 0x0, 0xca, 0x0, + 0xa, 0xc0, 0x6, 0xf4, 0x4, 0xf6, 0x0, 0x9, + 0xff, 0xf9, 0x0, 0x5, 0xf7, 0x48, 0xf5, 0x0, + 0xe8, 0x0, 0x9, 0xe0, 0x1f, 0x50, 0x0, 0x5f, + 0x10, 0xf8, 0x0, 0x8, 0xf0, 0x8, 0xf7, 0x47, + 0xf7, 0x0, 0x7, 0xdf, 0xd7, 0x0, /* U+39 "9" */ - 0x0, 0x16, 0x74, 0x0, 0x3, 0xee, 0xcf, 0xb0, - 0xd, 0xc1, 0x3, 0xf8, 0x2f, 0x60, 0x0, 0xcc, - 0x4f, 0x40, 0x0, 0x9e, 0x1f, 0x70, 0x0, 0x9f, - 0xc, 0xe4, 0x7, 0xff, 0x1, 0xcf, 0xfd, 0x9f, - 0x0, 0x0, 0x30, 0xbd, 0x0, 0x0, 0x0, 0xeb, - 0x2, 0x30, 0x3a, 0xf3, 0x6, 0xff, 0xfe, 0x40, - 0x0, 0x3, 0x0, 0x0, + 0x0, 0x6e, 0xfc, 0x30, 0x7, 0xf8, 0x5c, 0xf1, + 0xe, 0x90, 0x1, 0xf8, 0x2f, 0x40, 0x0, 0xac, + 0x2f, 0x30, 0x0, 0x8e, 0xf, 0x70, 0x0, 0xae, + 0xa, 0xe4, 0x17, 0xfe, 0x1, 0xcf, 0xfc, 0xab, + 0x0, 0x2, 0x20, 0xc8, 0x0, 0x0, 0x5, 0xf2, + 0x0, 0x25, 0xaf, 0x60, 0x0, 0x9e, 0xb4, 0x0, /* U+3A ":" */ - 0x66, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x66, - 0xcc, + 0xba, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x97, + 0xba, /* U+3B ";" */ - 0x66, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc6, - 0xf8, 0xf5, 0xe0, + 0xe, 0x70, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa5, 0xe, 0x71, 0xf5, 0x7d, + 0x1, 0x20, /* U+3C "<" */ - 0x0, 0x0, 0x4, 0xb0, 0x0, 0x6b, 0xfe, 0x6, - 0xdf, 0xa4, 0x8, 0xfa, 0x20, 0x0, 0x2a, 0xfc, - 0x51, 0x0, 0x2, 0x9f, 0xe9, 0x0, 0x0, 0x18, - 0xf0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x4, 0xb0, 0x0, 0x4c, 0xfc, 0x5, + 0xcf, 0xb4, 0x6, 0xfa, 0x20, 0x0, 0x2c, 0xfa, + 0x30, 0x0, 0x4, 0xbf, 0xc5, 0x0, 0x0, 0x3b, + 0xf0, 0x0, 0x0, 0x2, /* U+3D "=" */ - 0x9b, 0xbb, 0xbb, 0x96, 0x88, 0x88, 0x86, 0x0, - 0x0, 0x0, 0x6, 0x77, 0x77, 0x76, 0x9c, 0xcc, - 0xcc, 0x90, + 0x1, 0x11, 0x11, 0xd, 0xff, 0xff, 0xfb, 0x34, + 0x44, 0x44, 0x20, 0x11, 0x11, 0x10, 0xdf, 0xff, + 0xff, 0xb3, 0x33, 0x33, 0x32, /* U+3E ">" */ - 0xa2, 0x0, 0x0, 0xf, 0xfa, 0x40, 0x0, 0x6, - 0xbf, 0xc5, 0x0, 0x0, 0x28, 0xfb, 0x0, 0x39, - 0xee, 0x76, 0xcf, 0xd6, 0x0, 0xfa, 0x40, 0x0, + 0xb4, 0x0, 0x0, 0xb, 0xfd, 0x50, 0x0, 0x2, + 0x9f, 0xe7, 0x0, 0x0, 0x7, 0xfb, 0x0, 0x39, + 0xfd, 0x55, 0xcf, 0xc5, 0x0, 0xfb, 0x40, 0x0, 0x2, 0x0, 0x0, 0x0, /* U+3F "?" */ - 0x0, 0x67, 0x72, 0x1, 0xcf, 0xce, 0xe4, 0x6f, - 0x30, 0x1e, 0xc2, 0x40, 0x0, 0xce, 0x0, 0x0, - 0xe, 0xb0, 0x0, 0xa, 0xf3, 0x0, 0x6, 0xf6, - 0x0, 0x2, 0xf9, 0x0, 0x0, 0x3c, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x27, 0x40, 0x0, 0x4, - 0xf8, 0x0, + 0x3, 0xbf, 0xe8, 0x1, 0xec, 0x57, 0xf8, 0x4e, + 0x10, 0xa, 0xd0, 0x0, 0x0, 0x9d, 0x0, 0x0, + 0x1e, 0x80, 0x0, 0xc, 0xd0, 0x0, 0xa, 0xe2, + 0x0, 0x1, 0xf6, 0x0, 0x0, 0x19, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x19, 0x20, 0x0, 0x2, + 0xe4, 0x0, /* U+40 "@" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x6b, 0xfc, 0xfc, 0x60, 0x0, 0x1, 0x9d, 0x30, - 0x0, 0x2b, 0xa1, 0x0, 0x8b, 0x10, 0x0, 0x0, - 0xb, 0x80, 0x2f, 0x20, 0x7, 0xa9, 0x20, 0x2f, - 0x19, 0xa0, 0x9, 0xd6, 0x9f, 0x0, 0xc4, 0xc6, - 0x4, 0xf2, 0x7, 0xc0, 0xa, 0x6f, 0x40, 0x8d, - 0x0, 0x8c, 0x0, 0x88, 0xf0, 0xc, 0xc0, 0x8, - 0xa0, 0x8, 0x8f, 0x40, 0xcc, 0x0, 0xc8, 0x0, - 0xd4, 0xf4, 0xa, 0xd1, 0x4e, 0x90, 0x6e, 0xb, - 0xa0, 0x3f, 0xfd, 0x5f, 0xcd, 0x20, 0x3f, 0x10, - 0x2, 0x0, 0x11, 0x0, 0x0, 0x9c, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa7, 0x79, 0xa0, - 0x0, 0x0, 0x0, 0x14, 0x78, 0x61, 0x0, 0x0, + 0x0, 0x0, 0x3a, 0xef, 0xeb, 0x40, 0x0, 0x0, + 0x7, 0xe7, 0x31, 0x26, 0xe8, 0x0, 0x0, 0x6e, + 0x20, 0x0, 0x0, 0xc, 0x50, 0x1, 0xf3, 0x0, + 0x8e, 0xc5, 0x2, 0xe0, 0x7, 0xb0, 0x8, 0xc3, + 0x7e, 0x0, 0xc3, 0xc, 0x50, 0x1f, 0x30, 0x5c, + 0x0, 0x96, 0xf, 0x20, 0x6d, 0x0, 0x6b, 0x0, + 0x78, 0x1f, 0x0, 0x9a, 0x0, 0x8a, 0x0, 0x78, + 0x1f, 0x0, 0xb8, 0x0, 0x99, 0x0, 0x87, 0xf, + 0x20, 0xa9, 0x0, 0xc8, 0x0, 0xc3, 0xd, 0x50, + 0x6d, 0x15, 0xec, 0x6, 0xc0, 0x7, 0xc0, 0xb, + 0xf9, 0x1c, 0xfb, 0x10, 0x0, 0xe7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xa3, 0x10, 0x34, + 0x0, 0x0, 0x0, 0x1, 0x8d, 0xff, 0xc6, 0x0, + 0x0, /* U+41 "A" */ - 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, 0x0, 0xef, - 0x10, 0x0, 0x0, 0x4, 0xff, 0x70, 0x0, 0x0, - 0xa, 0xeb, 0xc0, 0x0, 0x0, 0xf, 0x96, 0xf2, - 0x0, 0x0, 0x5f, 0x21, 0xf7, 0x0, 0x0, 0xbd, - 0x0, 0xbd, 0x0, 0x1, 0xf9, 0x33, 0x7f, 0x30, - 0x6, 0xff, 0xff, 0xff, 0x90, 0xd, 0xd0, 0x0, - 0xa, 0xd0, 0x2f, 0x70, 0x0, 0x5, 0xf4, 0x7f, - 0x10, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x9f, 0x10, 0x0, 0x0, 0x0, 0xf, + 0xf6, 0x0, 0x0, 0x0, 0x5, 0xfb, 0xc0, 0x0, + 0x0, 0x0, 0xbb, 0x4f, 0x20, 0x0, 0x0, 0x1f, + 0x60, 0xf8, 0x0, 0x0, 0x6, 0xf1, 0xa, 0xd0, + 0x0, 0x0, 0xcc, 0x0, 0x5f, 0x30, 0x0, 0x2f, + 0x70, 0x1, 0xf9, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0xdc, 0x33, 0x33, 0x6f, 0x50, 0x3f, + 0x50, 0x0, 0x0, 0xeb, 0x9, 0xe0, 0x0, 0x0, + 0x8, 0xf1, /* U+42 "B" */ - 0x33, 0x33, 0x33, 0x0, 0xc, 0xfc, 0xce, 0xfb, - 0x10, 0xcc, 0x0, 0x4, 0xf8, 0xc, 0xc0, 0x0, - 0xc, 0xc0, 0xcc, 0x0, 0x1, 0xea, 0xc, 0xd7, - 0x78, 0xdc, 0x10, 0xcf, 0xcc, 0xcd, 0xe6, 0xc, - 0xc0, 0x0, 0x7, 0xf4, 0xcc, 0x0, 0x0, 0xf, - 0x8c, 0xc0, 0x0, 0x2, 0xf7, 0xcc, 0x33, 0x34, - 0xcf, 0x2c, 0xff, 0xff, 0xfb, 0x30, + 0xaf, 0xff, 0xfc, 0x50, 0xa, 0xe4, 0x45, 0xaf, + 0x50, 0xad, 0x0, 0x0, 0xdb, 0xa, 0xd0, 0x0, + 0xd, 0xb0, 0xad, 0x0, 0x17, 0xf4, 0xa, 0xff, + 0xff, 0xf8, 0x0, 0xad, 0x33, 0x48, 0xf6, 0xa, + 0xd0, 0x0, 0xa, 0xe0, 0xad, 0x0, 0x0, 0x7f, + 0xa, 0xd0, 0x0, 0xa, 0xe0, 0xae, 0x44, 0x59, + 0xf7, 0xa, 0xff, 0xff, 0xd6, 0x0, /* U+43 "C" */ - 0x0, 0x25, 0x75, 0x10, 0x0, 0x7f, 0xdc, 0xee, - 0x60, 0x4f, 0x80, 0x1, 0xbe, 0x2c, 0xe0, 0x0, - 0x3, 0xf5, 0xf8, 0x0, 0x0, 0x4, 0x2f, 0x80, - 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0xf, - 0x80, 0x0, 0x0, 0x0, 0xea, 0x0, 0x0, 0xc, - 0x6a, 0xe1, 0x0, 0x5, 0xf4, 0x1f, 0xc3, 0x14, - 0xec, 0x0, 0x2c, 0xff, 0xf9, 0x10, 0x0, 0x0, - 0x20, 0x0, 0x0, + 0x0, 0x8, 0xdf, 0xe8, 0x0, 0x0, 0xcf, 0x75, + 0x7f, 0xb0, 0x7, 0xf3, 0x0, 0x4, 0xf4, 0xd, + 0xb0, 0x0, 0x0, 0xd8, 0xf, 0x80, 0x0, 0x0, + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x0, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, + 0xd, 0xb0, 0x0, 0x0, 0xc7, 0x7, 0xf3, 0x0, + 0x4, 0xf5, 0x0, 0xcf, 0x75, 0x7e, 0xb0, 0x0, + 0x9, 0xef, 0xe8, 0x0, /* U+44 "D" */ - 0x33, 0x33, 0x32, 0x0, 0xc, 0xfc, 0xcf, 0xfa, - 0x10, 0xcc, 0x0, 0x4, 0xec, 0xc, 0xc0, 0x0, - 0x4, 0xf7, 0xcc, 0x0, 0x0, 0xe, 0xbc, 0xc0, - 0x0, 0x0, 0xcc, 0xcc, 0x0, 0x0, 0xc, 0xcc, - 0xc0, 0x0, 0x0, 0xcc, 0xcc, 0x0, 0x0, 0xf, - 0x9c, 0xc0, 0x0, 0x8, 0xf4, 0xcc, 0x33, 0x49, - 0xf8, 0xc, 0xff, 0xff, 0xc4, 0x0, + 0xaf, 0xff, 0xe9, 0x10, 0xa, 0xe4, 0x46, 0xde, + 0x20, 0xad, 0x0, 0x0, 0xdc, 0xa, 0xd0, 0x0, + 0x5, 0xf3, 0xad, 0x0, 0x0, 0x1f, 0x7a, 0xd0, + 0x0, 0x0, 0xf8, 0xad, 0x0, 0x0, 0xf, 0x8a, + 0xd0, 0x0, 0x1, 0xf7, 0xad, 0x0, 0x0, 0x5f, + 0x3a, 0xd0, 0x0, 0x1d, 0xd0, 0xae, 0x44, 0x6e, + 0xe2, 0xa, 0xff, 0xfe, 0x91, 0x0, /* U+45 "E" */ - 0x33, 0x33, 0x33, 0x31, 0xcf, 0xcc, 0xcc, 0xc3, - 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0x0, 0x0, 0xcd, 0x77, 0x77, 0x40, - 0xcf, 0xcc, 0xcc, 0x60, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x33, 0x33, 0x31, 0xcf, 0xff, 0xff, 0xf4, + 0xaf, 0xff, 0xff, 0xf7, 0xae, 0x44, 0x44, 0x42, + 0xad, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, + 0xad, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xc0, + 0xad, 0x33, 0x33, 0x20, 0xad, 0x0, 0x0, 0x0, + 0xad, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, + 0xae, 0x44, 0x44, 0x42, 0xaf, 0xff, 0xff, 0xf8, /* U+46 "F" */ - 0x33, 0x33, 0x33, 0x32, 0xcf, 0xcc, 0xcc, 0xc6, - 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x33, 0x33, 0x20, - 0xcf, 0xff, 0xff, 0x80, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xf6, 0xae, 0x44, 0x44, 0x41, + 0xad, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, + 0xad, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0x90, 0xad, 0x33, 0x33, 0x20, + 0xad, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, + 0xad, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, /* U+47 "G" */ - 0x0, 0x25, 0x75, 0x20, 0x0, 0x7f, 0xec, 0xee, - 0x60, 0x4f, 0x90, 0x0, 0xae, 0x2c, 0xe0, 0x0, - 0x2, 0xf6, 0xf9, 0x0, 0x0, 0x0, 0xf, 0x80, - 0x0, 0x0, 0x0, 0xf8, 0x0, 0x6b, 0xbb, 0x6f, - 0x80, 0x4, 0x88, 0xf8, 0xeb, 0x0, 0x0, 0xf, - 0x8a, 0xe2, 0x0, 0x0, 0xf8, 0x1f, 0xc4, 0x2, - 0x7f, 0x60, 0x1a, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0x20, 0x0, 0x0, + 0x0, 0x8, 0xef, 0xe9, 0x0, 0x0, 0xce, 0x75, + 0x7e, 0xc0, 0x7, 0xf3, 0x0, 0x3, 0xf6, 0xc, + 0xc0, 0x0, 0x0, 0x75, 0xf, 0x90, 0x0, 0x0, + 0x0, 0xf, 0x70, 0x0, 0x0, 0x0, 0xf, 0x70, + 0x6, 0xff, 0xfb, 0xf, 0x90, 0x1, 0x33, 0xdb, + 0xc, 0xd0, 0x0, 0x0, 0xcb, 0x6, 0xf5, 0x0, + 0x0, 0xcb, 0x0, 0xbf, 0x84, 0x5a, 0xf7, 0x0, + 0x7, 0xdf, 0xfc, 0x50, /* U+48 "H" */ - 0x33, 0x0, 0x0, 0x2, 0x3c, 0xc0, 0x0, 0x0, - 0x8f, 0xcc, 0x0, 0x0, 0x8, 0xfc, 0xc0, 0x0, - 0x0, 0x8f, 0xcc, 0x0, 0x0, 0x8, 0xfc, 0xc3, - 0x33, 0x33, 0x9f, 0xcf, 0xff, 0xff, 0xff, 0xfc, - 0xc0, 0x0, 0x0, 0x8f, 0xcc, 0x0, 0x0, 0x8, - 0xfc, 0xc0, 0x0, 0x0, 0x8f, 0xcc, 0x0, 0x0, - 0x8, 0xfc, 0xc0, 0x0, 0x0, 0x8f, + 0xad, 0x0, 0x0, 0x7, 0xf1, 0xad, 0x0, 0x0, + 0x7, 0xf1, 0xad, 0x0, 0x0, 0x7, 0xf1, 0xad, + 0x0, 0x0, 0x7, 0xf1, 0xad, 0x0, 0x0, 0x7, + 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xf1, 0xad, 0x33, + 0x33, 0x39, 0xf1, 0xad, 0x0, 0x0, 0x7, 0xf1, + 0xad, 0x0, 0x0, 0x7, 0xf1, 0xad, 0x0, 0x0, + 0x7, 0xf1, 0xad, 0x0, 0x0, 0x7, 0xf1, 0xad, + 0x0, 0x0, 0x7, 0xf1, /* U+49 "I" */ - 0x35, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, - 0x8f, 0x8f, 0x8f, 0x8f, + 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, + 0x9f, 0x9f, 0x9f, 0x9f, /* U+4A "J" */ - 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0xf8, - 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0xf8, - 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0xf8, - 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0xf8, - 0x13, 0x0, 0x0, 0xf8, 0x4f, 0x40, 0x4, 0xf5, - 0x2f, 0xb2, 0x2c, 0xf1, 0x5, 0xef, 0xfd, 0x30, - 0x0, 0x1, 0x10, 0x0, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xe9, + 0x0, 0x0, 0x0, 0xe9, 0x0, 0x0, 0x0, 0xe9, + 0x36, 0x0, 0x0, 0xe9, 0x7f, 0x10, 0x2, 0xf7, + 0x1e, 0xc5, 0x5d, 0xe1, 0x3, 0xbe, 0xea, 0x20, /* U+4B "K" */ - 0x33, 0x0, 0x0, 0x13, 0x2c, 0xc0, 0x0, 0x1c, - 0xd1, 0xcc, 0x0, 0xa, 0xf3, 0xc, 0xc0, 0x7, - 0xf4, 0x0, 0xcc, 0x4, 0xf6, 0x0, 0xc, 0xc4, - 0xea, 0x0, 0x0, 0xcf, 0xcf, 0x90, 0x0, 0xc, - 0xc0, 0x8f, 0x60, 0x0, 0xcc, 0x0, 0xbe, 0x30, - 0xc, 0xc0, 0x1, 0xdd, 0x10, 0xcc, 0x0, 0x3, - 0xfc, 0xc, 0xc0, 0x0, 0x5, 0xf9, + 0xad, 0x0, 0x0, 0x8f, 0x40, 0xad, 0x0, 0x6, + 0xf6, 0x0, 0xad, 0x0, 0x4f, 0x90, 0x0, 0xad, + 0x2, 0xfb, 0x0, 0x0, 0xad, 0x1d, 0xd0, 0x0, + 0x0, 0xad, 0xcf, 0x60, 0x0, 0x0, 0xaf, 0xfc, + 0xf2, 0x0, 0x0, 0xaf, 0x41, 0xec, 0x0, 0x0, + 0xad, 0x0, 0x4f, 0x80, 0x0, 0xad, 0x0, 0x8, + 0xf4, 0x0, 0xad, 0x0, 0x0, 0xce, 0x10, 0xad, + 0x0, 0x0, 0x2f, 0xa0, /* U+4C "L" */ - 0x33, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x33, 0x33, 0x32, 0xcf, 0xff, 0xff, 0xf8, + 0xad, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, + 0xad, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, + 0xad, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, + 0xad, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, + 0xad, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, 0x0, + 0xae, 0x44, 0x44, 0x40, 0xaf, 0xff, 0xff, 0xf3, /* U+4D "M" */ - 0x33, 0x20, 0x0, 0x0, 0x2, 0x32, 0xcf, 0xa0, - 0x0, 0x0, 0xc, 0xf8, 0xcf, 0xf1, 0x0, 0x0, - 0x2f, 0xf8, 0xcd, 0xf7, 0x0, 0x0, 0x9e, 0xf8, - 0xcc, 0xac, 0x0, 0x0, 0xf8, 0xf8, 0xcc, 0x3f, - 0x30, 0x5, 0xf2, 0xf8, 0xcc, 0xd, 0xa0, 0xb, - 0xb0, 0xf8, 0xcc, 0x6, 0xe1, 0x2f, 0x50, 0xf8, - 0xcc, 0x1, 0xf6, 0x8e, 0x0, 0xf8, 0xcc, 0x0, - 0xac, 0xd8, 0x0, 0xf8, 0xcc, 0x0, 0x3f, 0xf2, - 0x0, 0xf8, 0xcc, 0x0, 0xd, 0xb0, 0x0, 0xf8, + 0xaf, 0x70, 0x0, 0x0, 0x7, 0xfa, 0xaf, 0xd0, + 0x0, 0x0, 0xd, 0xfa, 0xae, 0xf3, 0x0, 0x0, + 0x3f, 0xea, 0xab, 0xd9, 0x0, 0x0, 0xac, 0xca, + 0xab, 0x7e, 0x0, 0x0, 0xf6, 0xca, 0xac, 0x1f, + 0x50, 0x6, 0xf1, 0xca, 0xac, 0xb, 0xb0, 0xc, + 0xa0, 0xda, 0xad, 0x5, 0xf1, 0x2f, 0x40, 0xda, + 0xad, 0x0, 0xe7, 0x8e, 0x0, 0xda, 0xad, 0x0, + 0x8d, 0xe8, 0x0, 0xda, 0xad, 0x0, 0x2f, 0xf2, + 0x0, 0xda, 0xad, 0x0, 0xc, 0xb0, 0x0, 0xda, /* U+4E "N" */ - 0x33, 0x0, 0x0, 0x2, 0x3c, 0xf7, 0x0, 0x0, - 0x8f, 0xcf, 0xe1, 0x0, 0x8, 0xfc, 0xdf, 0xa0, - 0x0, 0x8f, 0xcc, 0x5f, 0x50, 0x8, 0xfc, 0xc0, - 0xcd, 0x10, 0x8f, 0xcc, 0x2, 0xf9, 0x8, 0xfc, - 0xc0, 0x7, 0xf4, 0x8f, 0xcc, 0x0, 0xd, 0xc8, - 0xfc, 0xc0, 0x0, 0x3f, 0xef, 0xcc, 0x0, 0x0, - 0x9f, 0xfc, 0xc0, 0x0, 0x1, 0xef, + 0xaf, 0x20, 0x0, 0x6, 0xf1, 0xaf, 0xc0, 0x0, + 0x6, 0xf1, 0xaf, 0xf6, 0x0, 0x6, 0xf1, 0xad, + 0xbe, 0x10, 0x6, 0xf1, 0xad, 0x2f, 0x90, 0x6, + 0xf1, 0xad, 0x7, 0xf3, 0x6, 0xf1, 0xad, 0x0, + 0xdd, 0x6, 0xf1, 0xad, 0x0, 0x3f, 0x76, 0xf1, + 0xad, 0x0, 0x9, 0xf8, 0xf1, 0xad, 0x0, 0x1, + 0xef, 0xf1, 0xad, 0x0, 0x0, 0x5f, 0xf1, 0xad, + 0x0, 0x0, 0xb, 0xf1, /* U+4F "O" */ - 0x0, 0x25, 0x74, 0x10, 0x0, 0x7f, 0xec, 0xfe, - 0x50, 0x4f, 0x90, 0x1, 0xaf, 0x2d, 0xd0, 0x0, - 0x1, 0xeb, 0xf8, 0x0, 0x0, 0xa, 0xdf, 0x80, - 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x8, 0xff, - 0x80, 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0xc, - 0xda, 0xe1, 0x0, 0x2, 0xf8, 0x1f, 0xc4, 0x34, - 0xed, 0x10, 0x2b, 0xff, 0xf9, 0x10, 0x0, 0x0, - 0x10, 0x0, 0x0, + 0x0, 0x8, 0xdf, 0xd8, 0x0, 0x0, 0xc, 0xf8, + 0x58, 0xfc, 0x0, 0x6, 0xf4, 0x0, 0x4, 0xf6, + 0x0, 0xcc, 0x0, 0x0, 0xc, 0xc0, 0xf, 0x80, + 0x0, 0x0, 0x8f, 0x1, 0xf7, 0x0, 0x0, 0x7, + 0xf1, 0x1f, 0x60, 0x0, 0x0, 0x6f, 0x10, 0xf8, + 0x0, 0x0, 0x8, 0xf0, 0xc, 0xc0, 0x0, 0x0, + 0xcc, 0x0, 0x6f, 0x40, 0x0, 0x3f, 0x60, 0x0, + 0xbf, 0x85, 0x8f, 0xc0, 0x0, 0x0, 0x8d, 0xfe, + 0x80, 0x0, /* U+50 "P" */ - 0x33, 0x33, 0x33, 0x10, 0xc, 0xfc, 0xcc, 0xfe, - 0x60, 0xcc, 0x0, 0x1, 0xbe, 0x2c, 0xc0, 0x0, - 0x3, 0xf6, 0xcc, 0x0, 0x0, 0x3f, 0x6c, 0xc0, - 0x0, 0xa, 0xf2, 0xce, 0xbb, 0xbe, 0xf6, 0xc, - 0xe8, 0x88, 0x42, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0xc, 0xc0, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, - 0x0, 0xc, 0xc0, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xfe, 0x80, 0xa, 0xe4, 0x45, 0x8f, + 0xd0, 0xad, 0x0, 0x0, 0x4f, 0x5a, 0xd0, 0x0, + 0x0, 0xf7, 0xad, 0x0, 0x0, 0x2f, 0x6a, 0xd0, + 0x1, 0x3c, 0xf1, 0xaf, 0xff, 0xff, 0xd3, 0xa, + 0xd3, 0x33, 0x10, 0x0, 0xad, 0x0, 0x0, 0x0, + 0xa, 0xd0, 0x0, 0x0, 0x0, 0xad, 0x0, 0x0, + 0x0, 0xa, 0xd0, 0x0, 0x0, 0x0, /* U+51 "Q" */ - 0x0, 0x25, 0x74, 0x10, 0x0, 0x7, 0xfe, 0xcf, - 0xe5, 0x0, 0x4f, 0x90, 0x1, 0xaf, 0x20, 0xdd, - 0x0, 0x0, 0x1e, 0xb0, 0xf8, 0x0, 0x0, 0xa, - 0xd0, 0xf8, 0x0, 0x0, 0x8, 0xf0, 0xf8, 0x0, - 0x0, 0x8, 0xf0, 0xf8, 0x0, 0x0, 0x8, 0xf0, - 0xf9, 0x0, 0x0, 0xc, 0xe0, 0xae, 0x10, 0x0, - 0x2f, 0x90, 0x1f, 0xc4, 0x34, 0xef, 0x40, 0x2, - 0xbf, 0xff, 0xaf, 0xe3, 0x0, 0x0, 0x20, 0x1, - 0xd6, + 0x0, 0x8, 0xef, 0xd7, 0x0, 0x0, 0xc, 0xf8, + 0x58, 0xfb, 0x0, 0x7, 0xf3, 0x0, 0x5, 0xf5, + 0x0, 0xdb, 0x0, 0x0, 0xd, 0xb0, 0xf, 0x70, + 0x0, 0x0, 0x9e, 0x2, 0xf6, 0x0, 0x0, 0x8, + 0xf0, 0x2f, 0x50, 0x0, 0x0, 0x7f, 0x0, 0xf7, + 0x0, 0x0, 0x9, 0xe0, 0xd, 0xb0, 0x0, 0x0, + 0xdb, 0x0, 0x7f, 0x30, 0x0, 0x4f, 0x50, 0x0, + 0xce, 0x75, 0x8f, 0xb0, 0x0, 0x0, 0x8e, 0xfe, + 0xf6, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x6, 0x60, /* U+52 "R" */ - 0x33, 0x33, 0x33, 0x0, 0xc, 0xfc, 0xcd, 0xfd, - 0x30, 0xcc, 0x0, 0x1, 0xdd, 0xc, 0xc0, 0x0, - 0x7, 0xf2, 0xcc, 0x0, 0x0, 0x8f, 0x1c, 0xc3, - 0x33, 0x5e, 0x90, 0xcf, 0xff, 0xff, 0xc1, 0xc, - 0xc0, 0x0, 0x5f, 0xb0, 0xcc, 0x0, 0x0, 0x8f, - 0xc, 0xc0, 0x0, 0x8, 0xf4, 0xcc, 0x0, 0x0, - 0x6f, 0x4c, 0xc0, 0x0, 0x3, 0xf7, + 0xbf, 0xff, 0xfc, 0x50, 0xb, 0xe4, 0x45, 0xaf, + 0x70, 0xbd, 0x0, 0x0, 0xbe, 0xb, 0xd0, 0x0, + 0x7, 0xf0, 0xbd, 0x0, 0x0, 0xaf, 0xb, 0xd0, + 0x1, 0x6f, 0x80, 0xbf, 0xff, 0xff, 0x80, 0xb, + 0xd3, 0x37, 0xf3, 0x0, 0xbd, 0x0, 0xd, 0xb0, + 0xb, 0xd0, 0x0, 0x5f, 0x40, 0xbd, 0x0, 0x0, + 0xcc, 0xb, 0xd0, 0x0, 0x4, 0xf5, /* U+53 "S" */ - 0x0, 0x47, 0x73, 0x0, 0xc, 0xfc, 0xcf, 0xb1, - 0x7f, 0x30, 0x3, 0xf9, 0xbd, 0x0, 0x0, 0xbc, - 0x7f, 0x30, 0x0, 0x0, 0x1d, 0xf9, 0x40, 0x0, - 0x0, 0x7d, 0xfe, 0x70, 0x0, 0x0, 0x28, 0xf9, - 0x42, 0x0, 0x0, 0xae, 0xea, 0x0, 0x0, 0xaf, - 0x6f, 0x72, 0x16, 0xf9, 0x6, 0xef, 0xff, 0x80, - 0x0, 0x0, 0x10, 0x0, + 0x0, 0x5c, 0xff, 0xa2, 0x0, 0x6f, 0x95, 0x6c, + 0xf2, 0xe, 0xa0, 0x0, 0xe, 0xa0, 0xf9, 0x0, + 0x0, 0x67, 0xa, 0xf5, 0x0, 0x0, 0x0, 0xa, + 0xfe, 0x93, 0x0, 0x0, 0x3, 0x8e, 0xf9, 0x0, + 0x0, 0x0, 0x6, 0xf8, 0x29, 0x10, 0x0, 0xa, + 0xd2, 0xf7, 0x0, 0x0, 0xcc, 0x9, 0xf9, 0x55, + 0xaf, 0x50, 0x6, 0xcf, 0xec, 0x50, /* U+54 "T" */ - 0x33, 0x33, 0x33, 0x33, 0x31, 0x9c, 0xcc, 0xfe, - 0xcc, 0xc3, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xf3, 0x24, 0x44, 0xfa, + 0x44, 0x40, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, @@ -434,1050 +440,1209 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0x0, 0xf8, 0x0, 0x0, /* U+55 "U" */ - 0x33, 0x0, 0x0, 0x3, 0x3c, 0xc0, 0x0, 0x0, - 0xcc, 0xcc, 0x0, 0x0, 0xc, 0xcc, 0xc0, 0x0, - 0x0, 0xcc, 0xcc, 0x0, 0x0, 0xc, 0xcc, 0xc0, - 0x0, 0x0, 0xcc, 0xcc, 0x0, 0x0, 0xc, 0xcc, - 0xc0, 0x0, 0x0, 0xcc, 0xcc, 0x0, 0x0, 0xe, - 0xba, 0xe1, 0x0, 0x2, 0xf8, 0x2f, 0xb3, 0x14, - 0xce, 0x10, 0x3c, 0xff, 0xfb, 0x20, 0x0, 0x0, - 0x10, 0x0, 0x0, + 0xe9, 0x0, 0x0, 0x2f, 0x5e, 0x90, 0x0, 0x2, + 0xf5, 0xe9, 0x0, 0x0, 0x2f, 0x5e, 0x90, 0x0, + 0x2, 0xf5, 0xe9, 0x0, 0x0, 0x2f, 0x5e, 0x90, + 0x0, 0x2, 0xf5, 0xe9, 0x0, 0x0, 0x2f, 0x5e, + 0x90, 0x0, 0x2, 0xf5, 0xda, 0x0, 0x0, 0x3f, + 0x4a, 0xe0, 0x0, 0x8, 0xf1, 0x2f, 0xc6, 0x59, + 0xf7, 0x0, 0x2a, 0xef, 0xc5, 0x0, /* U+56 "V" */ - 0x33, 0x0, 0x0, 0x0, 0x33, 0x8f, 0x20, 0x0, - 0x1, 0xfa, 0x2f, 0x80, 0x0, 0x6, 0xf4, 0xc, - 0xd0, 0x0, 0xb, 0xe0, 0x6, 0xf3, 0x0, 0x1f, - 0x80, 0x1, 0xf9, 0x0, 0x7f, 0x20, 0x0, 0xad, - 0x0, 0xdd, 0x0, 0x0, 0x5f, 0x42, 0xf6, 0x0, - 0x0, 0xe, 0xa7, 0xf1, 0x0, 0x0, 0x9, 0xed, - 0xa0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, - 0x0, 0xde, 0x0, 0x0, + 0x9f, 0x0, 0x0, 0x0, 0xdc, 0x4f, 0x50, 0x0, + 0x2, 0xf7, 0xe, 0xa0, 0x0, 0x7, 0xf1, 0x8, + 0xf0, 0x0, 0xd, 0xc0, 0x3, 0xf5, 0x0, 0x2f, + 0x60, 0x0, 0xda, 0x0, 0x7f, 0x10, 0x0, 0x7f, + 0x0, 0xcb, 0x0, 0x0, 0x2f, 0x52, 0xf5, 0x0, + 0x0, 0xc, 0xa7, 0xf0, 0x0, 0x0, 0x7, 0xfd, + 0xa0, 0x0, 0x0, 0x1, 0xff, 0x40, 0x0, 0x0, + 0x0, 0xbe, 0x0, 0x0, /* U+57 "W" */ - 0x33, 0x0, 0x0, 0x43, 0x0, 0x1, 0x32, 0x8f, - 0x20, 0x2, 0xfd, 0x0, 0x6, 0xf5, 0x4f, 0x60, - 0x6, 0xff, 0x20, 0x9, 0xf1, 0xf, 0x90, 0xa, - 0xcf, 0x70, 0xd, 0xd0, 0xc, 0xc0, 0xf, 0xad, - 0xb0, 0xf, 0x90, 0x8, 0xf0, 0x3f, 0x58, 0xe0, - 0x4f, 0x50, 0x5, 0xf4, 0x7f, 0x3, 0xf4, 0x8f, - 0x10, 0x1, 0xf8, 0xcb, 0x0, 0xf8, 0xbd, 0x0, - 0x0, 0xdb, 0xf7, 0x0, 0xac, 0xe9, 0x0, 0x0, - 0x9d, 0xf2, 0x0, 0x6e, 0xf6, 0x0, 0x0, 0x5f, - 0xe0, 0x0, 0x1f, 0xf2, 0x0, 0x0, 0x1f, 0x90, - 0x0, 0xd, 0xe0, 0x0, + 0x6f, 0x10, 0x0, 0x9f, 0x0, 0x0, 0xcb, 0x2f, + 0x40, 0x0, 0xdf, 0x30, 0x0, 0xf8, 0xe, 0x80, + 0x1, 0xfe, 0x70, 0x3, 0xf4, 0xb, 0xb0, 0x6, + 0xf8, 0xb0, 0x6, 0xf0, 0x7, 0xf0, 0xa, 0xa4, + 0xf0, 0x9, 0xd0, 0x4, 0xf2, 0xe, 0x60, 0xf4, + 0xd, 0x90, 0x0, 0xf6, 0x2f, 0x10, 0xb8, 0xf, + 0x50, 0x0, 0xc9, 0x7d, 0x0, 0x7c, 0x4f, 0x20, + 0x0, 0x9d, 0xb9, 0x0, 0x3f, 0x8e, 0x0, 0x0, + 0x5f, 0xe4, 0x0, 0xe, 0xea, 0x0, 0x0, 0x1f, + 0xf0, 0x0, 0xa, 0xf7, 0x0, 0x0, 0xe, 0xb0, + 0x0, 0x6, 0xf3, 0x0, /* U+58 "X" */ - 0x13, 0x20, 0x0, 0x2, 0x32, 0xd, 0xe1, 0x0, - 0xc, 0xf1, 0x4, 0xf9, 0x0, 0x6f, 0x70, 0x0, - 0x9f, 0x21, 0xec, 0x0, 0x0, 0x1e, 0xb9, 0xf2, - 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x1, - 0xef, 0x30, 0x0, 0x0, 0x9, 0xfe, 0xb0, 0x0, - 0x0, 0x4f, 0x84, 0xf7, 0x0, 0x0, 0xee, 0x0, - 0xbe, 0x20, 0x8, 0xf4, 0x0, 0x2f, 0xb0, 0x3f, - 0xb0, 0x0, 0x8, 0xf5, + 0x2f, 0x90, 0x0, 0x8, 0xf3, 0x8, 0xf3, 0x0, + 0x2f, 0x90, 0x0, 0xec, 0x0, 0xbe, 0x10, 0x0, + 0x5f, 0x65, 0xf6, 0x0, 0x0, 0xb, 0xee, 0xc0, + 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x3, + 0xff, 0x40, 0x0, 0x0, 0xc, 0xed, 0xd0, 0x0, + 0x0, 0x6f, 0x54, 0xf7, 0x0, 0x1, 0xeb, 0x0, + 0xaf, 0x20, 0xa, 0xf2, 0x0, 0x1f, 0xb0, 0x3f, + 0x80, 0x0, 0x7, 0xf4, /* U+59 "Y" */ - 0x23, 0x10, 0x0, 0x0, 0x43, 0x4f, 0x80, 0x0, - 0x7, 0xf4, 0xb, 0xe1, 0x0, 0x1e, 0xc0, 0x2, - 0xf8, 0x0, 0x8f, 0x40, 0x0, 0xae, 0x21, 0xea, - 0x0, 0x0, 0x1f, 0xa8, 0xf2, 0x0, 0x0, 0x8, - 0xfe, 0xa0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, - 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, 0xcc, - 0x0, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0x0, 0xcc, 0x0, 0x0, + 0x9f, 0x10, 0x0, 0x7, 0xf3, 0x1f, 0x90, 0x0, + 0xe, 0xa0, 0x9, 0xf1, 0x0, 0x7f, 0x20, 0x1, + 0xf9, 0x0, 0xea, 0x0, 0x0, 0x8f, 0x17, 0xf2, + 0x0, 0x0, 0x1f, 0x9e, 0x90, 0x0, 0x0, 0x7, + 0xff, 0x10, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0xf8, 0x0, 0x0, /* U+5A "Z" */ - 0x13, 0x33, 0x33, 0x33, 0x23, 0xcc, 0xcc, 0xcd, - 0xf8, 0x0, 0x0, 0x0, 0x9f, 0x20, 0x0, 0x0, - 0x4f, 0x70, 0x0, 0x0, 0x1d, 0xc0, 0x0, 0x0, - 0xb, 0xf2, 0x0, 0x0, 0x5, 0xf7, 0x0, 0x0, - 0x1, 0xec, 0x0, 0x0, 0x0, 0xbf, 0x20, 0x0, - 0x0, 0x5f, 0x50, 0x0, 0x0, 0x1e, 0xc3, 0x33, - 0x33, 0x34, 0xff, 0xff, 0xff, 0xfc, + 0x3f, 0xff, 0xff, 0xff, 0xb1, 0x44, 0x44, 0x48, + 0xf7, 0x0, 0x0, 0x0, 0xdc, 0x0, 0x0, 0x0, + 0x8f, 0x30, 0x0, 0x0, 0x3f, 0x80, 0x0, 0x0, + 0xd, 0xd0, 0x0, 0x0, 0x7, 0xf3, 0x0, 0x0, + 0x2, 0xf8, 0x0, 0x0, 0x0, 0xcd, 0x0, 0x0, + 0x0, 0x7f, 0x40, 0x0, 0x0, 0x2f, 0xc4, 0x44, + 0x44, 0x45, 0xff, 0xff, 0xff, 0xff, /* U+5B "[" */ - 0xcf, 0xf4, 0xcd, 0x41, 0xcc, 0x0, 0xcc, 0x0, - 0xcc, 0x0, 0xcc, 0x0, 0xcc, 0x0, 0xcc, 0x0, - 0xcc, 0x0, 0xcc, 0x0, 0xcc, 0x0, 0xcc, 0x0, - 0xcc, 0x0, 0xcc, 0x0, 0xce, 0xb3, 0x68, 0x82, + 0x0, 0x0, 0xdf, 0xf1, 0xda, 0x30, 0xd9, 0x0, + 0xd9, 0x0, 0xd9, 0x0, 0xd9, 0x0, 0xd9, 0x0, + 0xd9, 0x0, 0xd9, 0x0, 0xd9, 0x0, 0xd9, 0x0, + 0xd9, 0x0, 0xd9, 0x0, 0xd9, 0x0, 0xd9, 0x0, + 0xdf, 0xf1, 0x23, 0x30, /* U+5C "\\" */ - 0x23, 0x0, 0x0, 0x6, 0xf2, 0x0, 0x0, 0xf, - 0x80, 0x0, 0x0, 0xad, 0x0, 0x0, 0x3, 0xf4, - 0x0, 0x0, 0xd, 0xa0, 0x0, 0x0, 0x7f, 0x10, - 0x0, 0x1, 0xf6, 0x0, 0x0, 0xa, 0xc0, 0x0, - 0x0, 0x5f, 0x30, 0x0, 0x0, 0xe9, 0x0, 0x0, - 0x8, 0xe0, 0x0, 0x0, 0x2f, 0x60, + 0x8d, 0x0, 0x0, 0x2, 0xf3, 0x0, 0x0, 0xc, + 0x90, 0x0, 0x0, 0x6e, 0x0, 0x0, 0x1, 0xf5, + 0x0, 0x0, 0xa, 0xb0, 0x0, 0x0, 0x5f, 0x10, + 0x0, 0x0, 0xe6, 0x0, 0x0, 0x9, 0xc0, 0x0, + 0x0, 0x3f, 0x20, 0x0, 0x0, 0xd8, 0x0, 0x0, + 0x7, 0xe0, 0x0, 0x0, 0x2f, 0x40, /* U+5D "]" */ - 0xff, 0xf4, 0xaf, 0x8, 0xf0, 0x8f, 0x8, 0xf0, - 0x8f, 0x8, 0xf0, 0x8f, 0x8, 0xf0, 0x8f, 0x8, - 0xf0, 0x8f, 0x8, 0xf0, 0x8f, 0xcd, 0xf8, 0x88, + 0x0, 0x0, 0xef, 0xf0, 0x38, 0xf0, 0x6, 0xf0, + 0x6, 0xf0, 0x6, 0xf0, 0x6, 0xf0, 0x6, 0xf0, + 0x6, 0xf0, 0x6, 0xf0, 0x6, 0xf0, 0x6, 0xf0, + 0x6, 0xf0, 0x6, 0xf0, 0x6, 0xf0, 0x7, 0xf0, + 0xef, 0xf0, 0x23, 0x30, /* U+5E "^" */ - 0x0, 0x13, 0x0, 0x0, 0x9f, 0x30, 0x0, 0xfe, - 0xa0, 0x6, 0xf7, 0xf1, 0xd, 0xa0, 0xf7, 0x3f, - 0x30, 0x9d, 0x24, 0x0, 0x14, + 0x0, 0x5f, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x2, + 0xfa, 0xc0, 0x0, 0x8c, 0x2f, 0x20, 0xe, 0x60, + 0xb9, 0x4, 0xf1, 0x5, 0xe0, /* U+5F "_" */ - 0xff, 0xff, 0xff, 0xf3, 0x33, 0x33, 0x33, 0x30, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf3, + 0x33, 0x33, 0x33, 0x30, /* U+60 "`" */ - 0x1b, 0x80, 0x3, 0xf5, 0x0, 0x23, + 0x28, 0x20, 0xb, 0xc0, 0x1, 0xd6, /* U+61 "a" */ - 0x0, 0x17, 0x77, 0x10, 0x3, 0xed, 0xbe, 0xe2, - 0xb, 0xd0, 0x1, 0xf8, 0x0, 0x0, 0x0, 0xdc, - 0x1, 0x9c, 0xff, 0xfc, 0xd, 0xe5, 0x0, 0xcc, - 0x2f, 0x80, 0x0, 0xec, 0xf, 0xa4, 0x4b, 0xfc, - 0x6, 0xff, 0xf6, 0xcc, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x8d, 0xfc, 0x40, 0xa, 0xe5, 0x48, 0xf2, + 0x4, 0x20, 0x0, 0xe7, 0x0, 0x7c, 0xef, 0xf8, + 0x9, 0xe5, 0x22, 0xe8, 0xf, 0x60, 0x0, 0xe8, + 0x1f, 0x60, 0x2, 0xf8, 0xc, 0xe6, 0x6e, 0xf9, + 0x2, 0xbf, 0xe6, 0xa9, /* U+62 "b" */ - 0x33, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x47, 0x72, 0x0, 0xce, 0xfc, 0xef, 0x50, - 0xce, 0x10, 0x1d, 0xd0, 0xcc, 0x0, 0x6, 0xf4, - 0xcc, 0x0, 0x4, 0xf4, 0xcc, 0x0, 0x4, 0xf4, - 0xcc, 0x0, 0x7, 0xf3, 0xcf, 0x63, 0x4e, 0xc0, - 0xc8, 0xcf, 0xfd, 0x10, 0x0, 0x1, 0x10, 0x0, + 0xe8, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x0, 0xe9, 0x9f, 0xe8, 0x0, + 0xef, 0x95, 0x8f, 0x80, 0xea, 0x0, 0x9, 0xe0, + 0xe8, 0x0, 0x4, 0xf2, 0xe8, 0x0, 0x3, 0xf3, + 0xe8, 0x0, 0x4, 0xf2, 0xea, 0x0, 0x9, 0xe0, + 0xef, 0x95, 0x8f, 0x80, 0xe7, 0x9f, 0xe9, 0x0, /* U+63 "c" */ - 0x0, 0x16, 0x76, 0x10, 0x3, 0xee, 0xae, 0xc1, - 0xc, 0xe1, 0x1, 0xf8, 0x1f, 0x80, 0x0, 0x65, - 0x4f, 0x40, 0x0, 0x0, 0x3f, 0x60, 0x0, 0x0, - 0xf, 0xa0, 0x0, 0x97, 0x8, 0xe5, 0x17, 0xf5, - 0x0, 0x9f, 0xff, 0x80, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x6d, 0xfc, 0x50, 0x6, 0xf7, 0x49, 0xf4, + 0xe, 0x90, 0x0, 0xbb, 0x2f, 0x40, 0x0, 0x12, + 0x4f, 0x20, 0x0, 0x0, 0x2f, 0x40, 0x0, 0x0, + 0xe, 0x80, 0x0, 0x9a, 0x6, 0xf7, 0x48, 0xf4, + 0x0, 0x6d, 0xfc, 0x50, /* U+64 "d" */ - 0x0, 0x0, 0x0, 0x23, 0x0, 0x0, 0x0, 0x8f, - 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8f, - 0x0, 0x27, 0x74, 0x8f, 0x3, 0xee, 0xce, 0xcf, - 0xc, 0xe1, 0x1, 0xdf, 0xf, 0x80, 0x0, 0x8f, - 0x4f, 0x50, 0x0, 0x8f, 0x4f, 0x50, 0x0, 0x8f, - 0xf, 0x90, 0x0, 0x9f, 0xa, 0xe5, 0x26, 0xff, - 0x1, 0xcf, 0xfd, 0x7f, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x9e, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x8e, 0xfa, 0x9e, + 0x7, 0xf9, 0x59, 0xfe, 0xe, 0xa0, 0x0, 0xae, + 0x2f, 0x40, 0x0, 0x9e, 0x3f, 0x30, 0x0, 0x9e, + 0x2f, 0x40, 0x0, 0x9e, 0xe, 0x80, 0x0, 0x9e, + 0x7, 0xf6, 0x26, 0xfe, 0x0, 0x8e, 0xea, 0x9e, /* U+65 "e" */ - 0x0, 0x16, 0x76, 0x10, 0x2, 0xde, 0xbf, 0xc1, - 0xc, 0xe1, 0x2, 0xf7, 0x1f, 0x93, 0x33, 0xcb, - 0x4f, 0xff, 0xff, 0xfc, 0x3f, 0x70, 0x0, 0x0, - 0xf, 0xa0, 0x0, 0x0, 0x8, 0xf6, 0x11, 0x52, - 0x0, 0x7f, 0xff, 0xe3, 0x0, 0x0, 0x21, 0x0, + 0x0, 0x5d, 0xfd, 0x40, 0x5, 0xf8, 0x4a, 0xf2, + 0xe, 0xa0, 0x0, 0xd9, 0x2f, 0x50, 0x0, 0x9c, + 0x4f, 0xff, 0xff, 0xfe, 0x3f, 0x63, 0x33, 0x33, + 0xe, 0x80, 0x0, 0x10, 0x6, 0xf8, 0x45, 0xd8, + 0x0, 0x5d, 0xfe, 0x80, /* U+66 "f" */ - 0x0, 0x4, 0x31, 0x0, 0xcf, 0xf4, 0x4, 0xf7, - 0x0, 0x8, 0xf1, 0x0, 0x6b, 0xf7, 0x60, 0x9e, - 0xfc, 0x90, 0x8, 0xf0, 0x0, 0x8, 0xf0, 0x0, - 0x8, 0xf0, 0x0, 0x8, 0xf0, 0x0, 0x8, 0xf0, - 0x0, 0x8, 0xf0, 0x0, 0x8, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3c, 0xf8, 0x0, 0xdd, + 0x42, 0x1, 0xf5, 0x0, 0x2, 0xf4, 0x0, 0x8f, + 0xff, 0xf1, 0x15, 0xf6, 0x20, 0x3, 0xf4, 0x0, + 0x3, 0xf4, 0x0, 0x3, 0xf4, 0x0, 0x3, 0xf4, + 0x0, 0x3, 0xf4, 0x0, 0x3, 0xf4, 0x0, 0x3, + 0xf4, 0x0, /* U+67 "g" */ - 0x0, 0x27, 0x74, 0x27, 0x3, 0xee, 0xce, 0xbf, - 0xa, 0xf1, 0x0, 0xcf, 0xf, 0x90, 0x0, 0x8f, - 0x1f, 0x80, 0x0, 0x8f, 0x1f, 0x80, 0x0, 0x8f, - 0xf, 0xa0, 0x0, 0x9f, 0x8, 0xf6, 0x35, 0xef, - 0x1, 0xaf, 0xfe, 0xbf, 0x0, 0x0, 0x20, 0x9f, - 0x0, 0x30, 0x2, 0xeb, 0x2, 0xff, 0xff, 0xe2, - 0x0, 0x25, 0x64, 0x0, + 0x0, 0x8e, 0xfa, 0x8e, 0x7, 0xf9, 0x59, 0xfe, + 0xe, 0xa0, 0x0, 0xae, 0x2f, 0x40, 0x0, 0x9e, + 0x3f, 0x30, 0x0, 0x9e, 0x2f, 0x40, 0x0, 0x9e, + 0xe, 0x90, 0x0, 0xae, 0x7, 0xf9, 0x59, 0xfe, + 0x0, 0x8e, 0xfa, 0xae, 0x0, 0x0, 0x0, 0xcb, + 0x9, 0xc5, 0x49, 0xf4, 0x0, 0x8e, 0xfc, 0x40, /* U+68 "h" */ - 0x33, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0xcc, - 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0xcc, 0x27, - 0x75, 0xc, 0xdd, 0xce, 0xf6, 0xce, 0x10, 0xd, - 0xcc, 0xc0, 0x0, 0x8f, 0xcc, 0x0, 0x8, 0xfc, - 0xc0, 0x0, 0x8f, 0xcc, 0x0, 0x8, 0xfc, 0xc0, - 0x0, 0x8f, 0xcc, 0x0, 0x8, 0xf0, + 0xe8, 0x0, 0x0, 0xe, 0x80, 0x0, 0x0, 0xe8, + 0x0, 0x0, 0xe, 0x88, 0xee, 0x90, 0xef, 0xa5, + 0x8f, 0x6e, 0xb0, 0x0, 0xca, 0xe8, 0x0, 0xb, + 0xbe, 0x80, 0x0, 0xbc, 0xe8, 0x0, 0xb, 0xce, + 0x80, 0x0, 0xbc, 0xe8, 0x0, 0xb, 0xce, 0x80, + 0x0, 0xbc, /* U+69 "i" */ - 0x33, 0xcc, 0x66, 0x0, 0x66, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xb9, 0x76, 0x0, 0xca, 0xca, 0xca, 0xca, 0xca, + 0xca, 0xca, 0xca, 0xca, /* U+6A "j" */ - 0x0, 0x33, 0x0, 0xcc, 0x0, 0x33, 0x0, 0x0, - 0x0, 0x67, 0x0, 0xcf, 0x0, 0xcf, 0x0, 0xcf, - 0x0, 0xcf, 0x0, 0xcf, 0x0, 0xcf, 0x0, 0xcf, - 0x0, 0xcf, 0x0, 0xcf, 0x0, 0xdc, 0x8d, 0xf5, - 0x26, 0x20, + 0x0, 0xc8, 0x0, 0x85, 0x0, 0x0, 0x0, 0xd9, + 0x0, 0xd9, 0x0, 0xd9, 0x0, 0xd9, 0x0, 0xd9, + 0x0, 0xd9, 0x0, 0xd9, 0x0, 0xd9, 0x0, 0xd9, + 0x0, 0xd9, 0x26, 0xf7, 0x7f, 0xb0, /* U+6B "k" */ - 0x33, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0xcc, - 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0xcc, 0x0, - 0x17, 0x5c, 0xc0, 0xb, 0xf3, 0xcc, 0x7, 0xf6, - 0xc, 0xc3, 0xea, 0x0, 0xcf, 0xff, 0x10, 0xc, - 0xc2, 0xf9, 0x0, 0xcc, 0x7, 0xf5, 0xc, 0xc0, - 0xc, 0xe2, 0xcc, 0x0, 0x2f, 0xb0, + 0xe8, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x7f, 0x40, + 0xe8, 0x6, 0xf6, 0x0, 0xe8, 0x4f, 0x80, 0x0, + 0xeb, 0xfb, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0xed, 0x3f, 0xa0, 0x0, 0xe8, 0x6, 0xf5, 0x0, + 0xe8, 0x0, 0xae, 0x10, 0xe8, 0x0, 0x1e, 0xb0, /* U+6C "l" */ - 0x33, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, - 0xbc, 0xbc, 0xbc, 0xbc, 0xbc, + 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, + 0xca, 0xca, 0xca, 0xca, /* U+6D "m" */ - 0x64, 0x27, 0x74, 0x2, 0x77, 0x30, 0xcb, 0xec, - 0xff, 0x7e, 0xce, 0xf4, 0xce, 0x10, 0x2f, 0xf3, - 0x1, 0xfb, 0xcc, 0x0, 0xc, 0xc0, 0x0, 0xcc, - 0xcc, 0x0, 0xc, 0xc0, 0x0, 0xcf, 0xcc, 0x0, - 0xc, 0xc0, 0x0, 0xcf, 0xcc, 0x0, 0xc, 0xc0, - 0x0, 0xcf, 0xcc, 0x0, 0xc, 0xc0, 0x0, 0xcf, - 0xcc, 0x0, 0xc, 0xc0, 0x0, 0xcf, + 0xe8, 0x9f, 0xf9, 0x8, 0xee, 0xa1, 0xef, 0x85, + 0x9f, 0xdb, 0x57, 0xf9, 0xea, 0x0, 0xd, 0xe0, + 0x0, 0x9d, 0xe8, 0x0, 0xb, 0xb0, 0x0, 0x8e, + 0xe8, 0x0, 0xb, 0xb0, 0x0, 0x8f, 0xe8, 0x0, + 0xb, 0xb0, 0x0, 0x8f, 0xe8, 0x0, 0xb, 0xb0, + 0x0, 0x8f, 0xe8, 0x0, 0xb, 0xb0, 0x0, 0x8f, + 0xe8, 0x0, 0xb, 0xb0, 0x0, 0x8f, /* U+6E "n" */ - 0x64, 0x27, 0x75, 0xc, 0xad, 0xcd, 0xf6, 0xce, - 0x10, 0xd, 0xcc, 0xc0, 0x0, 0x9f, 0xcc, 0x0, - 0x8, 0xfc, 0xc0, 0x0, 0x8f, 0xcc, 0x0, 0x8, - 0xfc, 0xc0, 0x0, 0x8f, 0xcc, 0x0, 0x8, 0xf0, + 0xe8, 0x9e, 0xe9, 0xe, 0xfa, 0x58, 0xf6, 0xeb, + 0x0, 0xc, 0xae, 0x80, 0x0, 0xbb, 0xe8, 0x0, + 0xb, 0xce, 0x80, 0x0, 0xbc, 0xe8, 0x0, 0xb, + 0xce, 0x80, 0x0, 0xbc, 0xe8, 0x0, 0xb, 0xc0, /* U+6F "o" */ - 0x0, 0x16, 0x76, 0x10, 0x0, 0x2d, 0xeb, 0xee, - 0x30, 0xc, 0xe1, 0x1, 0xdc, 0x0, 0xf8, 0x0, - 0x6, 0xf3, 0x4f, 0x40, 0x0, 0x4f, 0x42, 0xf6, - 0x0, 0x4, 0xf4, 0xf, 0xa0, 0x0, 0x8f, 0x10, - 0x8f, 0x61, 0x5e, 0x90, 0x0, 0x8f, 0xff, 0x90, - 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x5d, 0xfd, 0x70, 0x0, 0x5f, 0x94, 0x7f, + 0x70, 0xe, 0xa0, 0x0, 0x8f, 0x13, 0xf4, 0x0, + 0x2, 0xf5, 0x4f, 0x30, 0x0, 0xf, 0x63, 0xf4, + 0x0, 0x2, 0xf5, 0xe, 0x90, 0x0, 0x8f, 0x10, + 0x5f, 0x94, 0x7f, 0x70, 0x0, 0x6d, 0xfd, 0x70, + 0x0, /* U+70 "p" */ - 0x62, 0x47, 0x72, 0x0, 0xcc, 0xec, 0xef, 0x50, - 0xce, 0x10, 0x1e, 0xd0, 0xcc, 0x0, 0x6, 0xf3, - 0xcc, 0x0, 0x4, 0xf4, 0xcc, 0x0, 0x4, 0xf4, - 0xcc, 0x0, 0x8, 0xf2, 0xce, 0x40, 0x5e, 0xc0, - 0xcd, 0xdf, 0xfd, 0x10, 0xcc, 0x1, 0x10, 0x0, - 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, - 0x33, 0x0, 0x0, 0x0, + 0xe8, 0xaf, 0xe8, 0x0, 0xef, 0x62, 0x6f, 0x70, + 0xe9, 0x0, 0x9, 0xe0, 0xe8, 0x0, 0x4, 0xf1, + 0xe8, 0x0, 0x3, 0xf3, 0xe8, 0x0, 0x5, 0xf1, + 0xe9, 0x0, 0xa, 0xe0, 0xef, 0x74, 0x8f, 0x70, + 0xe9, 0xae, 0xe9, 0x0, 0xe8, 0x0, 0x0, 0x0, + 0xe8, 0x0, 0x0, 0x0, 0xe8, 0x0, 0x0, 0x0, /* U+71 "q" */ - 0x0, 0x27, 0x74, 0x36, 0x3, 0xee, 0xae, 0xcc, - 0xc, 0xe1, 0x1, 0xec, 0xf, 0x80, 0x0, 0xcc, - 0x4f, 0x50, 0x0, 0xcc, 0x4f, 0x50, 0x0, 0xcc, - 0xf, 0x90, 0x0, 0xcc, 0xa, 0xe4, 0x6, 0xfc, - 0x1, 0xcf, 0xfd, 0xdc, 0x0, 0x0, 0x20, 0xcc, - 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0xcc, - 0x0, 0x0, 0x0, 0x33, + 0x0, 0x8e, 0xfa, 0x8e, 0x7, 0xf8, 0x48, 0xfe, + 0xe, 0x90, 0x0, 0xae, 0x2f, 0x40, 0x0, 0x9e, + 0x3f, 0x30, 0x0, 0x9e, 0x2f, 0x40, 0x0, 0x9e, + 0xe, 0x90, 0x0, 0xae, 0x7, 0xf8, 0x48, 0xfe, + 0x0, 0x8e, 0xea, 0xae, 0x0, 0x0, 0x0, 0x9e, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x9e, /* U+72 "r" */ - 0x64, 0x37, 0x2c, 0xae, 0xf4, 0xce, 0x10, 0xc, - 0xc0, 0x0, 0xcc, 0x0, 0xc, 0xc0, 0x0, 0xcc, - 0x0, 0xc, 0xc0, 0x0, 0xcc, 0x0, 0x0, + 0xe9, 0xbf, 0x2e, 0xf8, 0x51, 0xea, 0x0, 0xe, + 0x80, 0x0, 0xe8, 0x0, 0xe, 0x80, 0x0, 0xe8, + 0x0, 0xe, 0x80, 0x0, 0xe8, 0x0, 0x0, /* U+73 "s" */ - 0x2, 0x77, 0x50, 0x6, 0xfd, 0xaf, 0xc0, 0xdd, - 0x0, 0x4f, 0x5b, 0xd2, 0x0, 0x0, 0x3c, 0xfd, - 0x82, 0x0, 0x2, 0x7d, 0xe3, 0x84, 0x0, 0x1f, - 0x8d, 0xc3, 0x7, 0xf6, 0x3c, 0xff, 0xf8, 0x0, - 0x0, 0x20, 0x0, + 0x0, 0x9e, 0xfb, 0x30, 0xa, 0xe5, 0x4c, 0xe1, + 0xe, 0x80, 0x1, 0xb3, 0xa, 0xe6, 0x10, 0x0, + 0x0, 0x8d, 0xfc, 0x40, 0x0, 0x0, 0x29, 0xf3, + 0x2d, 0x40, 0x0, 0xf6, 0xc, 0xd5, 0x49, 0xf2, + 0x1, 0x9e, 0xfc, 0x40, /* U+74 "t" */ - 0x4, 0x70, 0x0, 0x8f, 0x0, 0x6b, 0xf7, 0x69, - 0xef, 0xc9, 0x8, 0xf0, 0x0, 0x8f, 0x0, 0x8, - 0xf0, 0x0, 0x8f, 0x0, 0x8, 0xf0, 0x0, 0x6f, - 0x51, 0x1, 0xdf, 0xc0, 0x0, 0x20, + 0x6, 0xf1, 0x0, 0x6f, 0x10, 0xef, 0xff, 0xa2, + 0x7f, 0x31, 0x6, 0xf1, 0x0, 0x6f, 0x10, 0x6, + 0xf1, 0x0, 0x6f, 0x10, 0x6, 0xf1, 0x0, 0x4f, + 0x73, 0x0, 0xaf, 0x90, /* U+75 "u" */ - 0x86, 0x0, 0x4, 0x7f, 0xc0, 0x0, 0x8f, 0xfc, - 0x0, 0x8, 0xff, 0xc0, 0x0, 0x8f, 0xfc, 0x0, - 0x8, 0xff, 0xc0, 0x0, 0x8f, 0xcc, 0x0, 0x9, - 0xf8, 0xf4, 0x26, 0xff, 0x1c, 0xff, 0xc9, 0xf0, - 0x1, 0x10, 0x0, + 0xf8, 0x0, 0xb, 0xbf, 0x80, 0x0, 0xbb, 0xf8, + 0x0, 0xb, 0xbf, 0x80, 0x0, 0xbb, 0xf8, 0x0, + 0xb, 0xbe, 0x80, 0x0, 0xbb, 0xda, 0x0, 0xd, + 0xb9, 0xf6, 0x5b, 0xfb, 0x1a, 0xfe, 0x9b, 0xb0, /* U+76 "v" */ - 0x47, 0x0, 0x0, 0x76, 0x5f, 0x50, 0x2, 0xf7, - 0xe, 0xa0, 0x7, 0xf1, 0x9, 0xe0, 0xc, 0xb0, - 0x2, 0xf5, 0x1f, 0x50, 0x0, 0xda, 0x6f, 0x0, - 0x0, 0x6e, 0xba, 0x0, 0x0, 0x1f, 0xf3, 0x0, - 0x0, 0xb, 0xe0, 0x0, + 0x9e, 0x0, 0x2, 0xf4, 0x3f, 0x30, 0x7, 0xe0, + 0xe, 0x80, 0xc, 0x90, 0x8, 0xd0, 0x1f, 0x40, + 0x3, 0xf2, 0x6e, 0x0, 0x0, 0xd7, 0xb9, 0x0, + 0x0, 0x8d, 0xf4, 0x0, 0x0, 0x2f, 0xe0, 0x0, + 0x0, 0xd, 0x90, 0x0, /* U+77 "w" */ - 0x47, 0x0, 0x5, 0x60, 0x0, 0x85, 0x6f, 0x30, - 0xe, 0xe0, 0x2, 0xf7, 0x1f, 0x70, 0x3f, 0xf5, - 0x6, 0xf2, 0xd, 0xb0, 0x9c, 0xc9, 0x9, 0xe0, - 0x8, 0xe0, 0xd7, 0x7d, 0xd, 0x90, 0x3, 0xf5, - 0xf2, 0x2f, 0x4f, 0x50, 0x0, 0xfc, 0xe0, 0xd, - 0xcf, 0x0, 0x0, 0xaf, 0x90, 0x7, 0xfb, 0x0, - 0x0, 0x5f, 0x30, 0x2, 0xf6, 0x0, + 0x8e, 0x0, 0xb, 0xb0, 0x0, 0xe8, 0x4f, 0x20, + 0xf, 0xf0, 0x2, 0xf3, 0xf, 0x60, 0x5d, 0xe5, + 0x6, 0xf0, 0xb, 0xa0, 0x99, 0xa9, 0xa, 0xb0, + 0x6, 0xe0, 0xe4, 0x5e, 0xe, 0x60, 0x2, 0xf5, + 0xf0, 0xf, 0x5f, 0x20, 0x0, 0xed, 0xb0, 0xb, + 0xdd, 0x0, 0x0, 0x9f, 0x60, 0x6, 0xf9, 0x0, + 0x0, 0x5f, 0x10, 0x2, 0xf5, 0x0, /* U+78 "x" */ - 0x37, 0x30, 0x3, 0x73, 0x1e, 0xb0, 0xc, 0xe1, - 0x4, 0xf5, 0x6f, 0x50, 0x0, 0x9d, 0xdb, 0x0, - 0x0, 0x1f, 0xf1, 0x0, 0x0, 0x5f, 0xf5, 0x0, - 0x1, 0xea, 0x9e, 0x10, 0xb, 0xf1, 0x1f, 0xa0, - 0x5f, 0x70, 0x6, 0xf5, + 0x4f, 0x50, 0x7, 0xf3, 0xa, 0xe0, 0x1f, 0x90, + 0x1, 0xf8, 0xae, 0x0, 0x0, 0x6f, 0xf5, 0x0, + 0x0, 0xf, 0xe0, 0x0, 0x0, 0x7f, 0xf6, 0x0, + 0x2, 0xf7, 0x8e, 0x10, 0xb, 0xd0, 0xe, 0xa0, + 0x5f, 0x40, 0x6, 0xf4, /* U+79 "y" */ - 0x67, 0x0, 0x0, 0x86, 0x7f, 0x30, 0x3, 0xf7, - 0x1f, 0x90, 0x9, 0xf2, 0xb, 0xd0, 0xe, 0xb0, - 0x5, 0xf3, 0x3f, 0x60, 0x0, 0xe9, 0x9f, 0x10, - 0x0, 0x9d, 0xda, 0x0, 0x0, 0x2f, 0xf5, 0x0, - 0x0, 0xd, 0xe0, 0x0, 0x0, 0xf, 0x90, 0x0, - 0x0, 0x7f, 0x20, 0x0, 0x1f, 0xf9, 0x0, 0x0, - 0x17, 0x30, 0x0, 0x0, + 0xae, 0x0, 0x5, 0xf3, 0x4f, 0x30, 0x9, 0xd0, + 0xe, 0x80, 0xe, 0x80, 0x9, 0xd0, 0x3f, 0x20, + 0x3, 0xf2, 0x8d, 0x0, 0x0, 0xd8, 0xc7, 0x0, + 0x0, 0x8e, 0xf2, 0x0, 0x0, 0x2f, 0xc0, 0x0, + 0x0, 0xe, 0x70, 0x0, 0x0, 0x3f, 0x10, 0x0, + 0x15, 0xda, 0x0, 0x0, 0x5f, 0xb1, 0x0, 0x0, /* U+7A "z" */ - 0x27, 0x77, 0x77, 0x72, 0x3c, 0xcc, 0xcf, 0xf3, - 0x0, 0x0, 0x4f, 0x80, 0x0, 0x1, 0xec, 0x0, - 0x0, 0xc, 0xf1, 0x0, 0x0, 0x7f, 0x50, 0x0, - 0x3, 0xf9, 0x0, 0x0, 0x1d, 0xe3, 0x33, 0x32, - 0x4f, 0xff, 0xff, 0xf8, + 0x3f, 0xff, 0xff, 0xf2, 0x4, 0x44, 0x4e, 0xd0, + 0x0, 0x0, 0x8f, 0x20, 0x0, 0x3, 0xf7, 0x0, + 0x0, 0xd, 0xb0, 0x0, 0x0, 0xae, 0x10, 0x0, + 0x5, 0xf5, 0x0, 0x0, 0x1e, 0xc3, 0x33, 0x31, + 0x5f, 0xff, 0xff, 0xf6, /* U+7B "{" */ - 0x0, 0x0, 0x50, 0x0, 0x1c, 0xe2, 0x0, 0x8f, - 0x10, 0x0, 0xcc, 0x0, 0x0, 0xcc, 0x0, 0x0, - 0xdc, 0x0, 0x1, 0xf9, 0x0, 0x4a, 0xf2, 0x0, - 0x6f, 0xb0, 0x0, 0x3, 0xf7, 0x0, 0x0, 0xeb, - 0x0, 0x0, 0xcc, 0x0, 0x0, 0xcc, 0x0, 0x0, - 0xbd, 0x0, 0x0, 0x3f, 0x91, 0x0, 0x3, 0xa1, + 0x0, 0x0, 0x30, 0x0, 0xa, 0xe1, 0x0, 0x6f, + 0x10, 0x0, 0xbb, 0x0, 0x0, 0xd9, 0x0, 0x0, + 0xd9, 0x0, 0x0, 0xe8, 0x0, 0x5, 0xf4, 0x0, + 0x8f, 0xa0, 0x0, 0x18, 0xf2, 0x0, 0x0, 0xe8, + 0x0, 0x0, 0xd9, 0x0, 0x0, 0xd9, 0x0, 0x0, + 0xca, 0x0, 0x0, 0x8e, 0x0, 0x0, 0x1c, 0xc1, + 0x0, 0x0, 0x60, /* U+7C "|" */ - 0x32, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, - 0xda, 0xda, 0xda, 0xda, 0xda, 0xda, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, + 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, /* U+7D "}" */ - 0x41, 0x0, 0x8, 0xf4, 0x0, 0xa, 0xe0, 0x0, - 0x4f, 0x40, 0x4, 0xf4, 0x0, 0x4f, 0x40, 0x3, - 0xf6, 0x0, 0xa, 0xe7, 0x0, 0x5f, 0xd0, 0x1f, - 0x90, 0x4, 0xf4, 0x0, 0x4f, 0x40, 0x4, 0xf4, - 0x0, 0x7f, 0x20, 0x4e, 0x90, 0x8, 0x60, 0x0, + 0x30, 0x0, 0x9, 0xe2, 0x0, 0xa, 0xd0, 0x0, + 0x4f, 0x20, 0x3, 0xf3, 0x0, 0x3f, 0x30, 0x2, + 0xf4, 0x0, 0xd, 0xb1, 0x0, 0x3f, 0xe0, 0xc, + 0xd3, 0x2, 0xf5, 0x0, 0x3f, 0x30, 0x3, 0xf3, + 0x0, 0x4f, 0x20, 0x9, 0xe0, 0x7, 0xf4, 0x0, + 0x52, 0x0, 0x0, /* U+7E "~" */ - 0x2, 0x31, 0x0, 0x0, 0x5, 0xef, 0xf7, 0x0, - 0x5a, 0xe7, 0x7, 0xfb, 0x7d, 0x86, 0x10, 0x3, - 0xbc, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xd3, 0x0, + 0x6c, 0xac, 0x5a, 0xf6, 0x2c, 0x8d, 0x50, 0x7, + 0xff, 0xc1, 0x0, 0x0, 0x1, 0x30, 0x0, /* U+F001 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x74, 0x0, - 0x0, 0x0, 0x0, 0x58, 0xdf, 0xfc, 0x0, 0x0, - 0x6, 0x9e, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x7f, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xd7, 0xac, 0x0, 0x0, 0x8f, 0xfb, 0x61, 0x0, - 0x8c, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x8c, - 0x0, 0x0, 0x8c, 0x0, 0x0, 0x0, 0x8c, 0x0, - 0x0, 0x8c, 0x0, 0x3, 0x64, 0xac, 0x0, 0x0, - 0x8c, 0x0, 0xaf, 0xff, 0xfc, 0x0, 0x20, 0x8c, - 0x0, 0xff, 0xff, 0xfb, 0x6d, 0xff, 0xec, 0x0, - 0x4d, 0xff, 0xa1, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x1, 0x44, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, + 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F008 "" */ - 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x50, 0xfb, 0x8f, 0xf8, 0x88, 0x88, 0x88, 0xdf, - 0x89, 0xf1, 0xf4, 0x8, 0x80, 0x0, 0x0, 0x0, - 0x8c, 0x0, 0xf4, 0xf6, 0x3a, 0x80, 0x0, 0x0, - 0x0, 0x8c, 0x34, 0xf4, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x8f, 0xff, 0xf4, 0xf5, 0x9, 0x80, - 0x0, 0x0, 0x0, 0x8d, 0x1, 0xf4, 0xf4, 0x8, - 0x80, 0x0, 0x0, 0x0, 0x8c, 0x0, 0xf4, 0xfc, - 0xbe, 0xeb, 0xbb, 0xbb, 0xbb, 0xdf, 0xbc, 0xf4, - 0xfa, 0x8d, 0xd8, 0x88, 0x88, 0x88, 0xce, 0x89, - 0xf4, 0xf4, 0x8, 0x80, 0x0, 0x0, 0x0, 0x8c, - 0x0, 0xf4, 0xf7, 0x3b, 0x80, 0x0, 0x0, 0x0, - 0x8d, 0x34, 0xf4, 0xff, 0xcf, 0x80, 0x0, 0x0, - 0x0, 0x8f, 0xde, 0xf4, 0xf4, 0x9, 0x80, 0x0, - 0x0, 0x0, 0x8c, 0x0, 0xf4, 0xf4, 0x9, 0x90, - 0x0, 0x0, 0x0, 0x8c, 0x0, 0xf4, 0xde, 0xbf, - 0xfb, 0xbb, 0xbb, 0xbb, 0xff, 0xcd, 0xf0, 0x14, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, /* U+F00B "" */ - 0x77, 0x77, 0x31, 0x77, 0x77, 0x77, 0x77, 0x76, - 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xbc, 0xcc, 0x52, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0x72, 0xef, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x58, 0x88, 0x10, 0x78, 0x88, 0x88, 0x88, 0x85, - 0x57, 0x77, 0x10, 0x77, 0x77, 0x77, 0x77, 0x75, - 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xdf, 0xff, 0x72, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xfe, 0x3, 0x50, 0x0, - 0x0, 0xaf, 0xff, 0xf3, 0x3e, 0xf9, 0x0, 0xa, - 0xff, 0xff, 0x30, 0xef, 0xff, 0x90, 0xaf, 0xff, - 0xf3, 0x0, 0x6f, 0xff, 0xfb, 0xff, 0xff, 0x30, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6c, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, /* U+F00D "" */ - 0x3, 0x50, 0x0, 0x1, 0x51, 0x3, 0xef, 0x60, - 0x1, 0xcf, 0xc1, 0xff, 0xff, 0x61, 0xcf, 0xff, - 0x86, 0xff, 0xff, 0xdf, 0xff, 0xf3, 0x6, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x7, 0xff, 0xff, 0xf3, - 0x0, 0x1, 0xcf, 0xff, 0xff, 0x60, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0x60, 0xcf, 0xff, 0xf8, 0xff, - 0xff, 0x5d, 0xff, 0xf3, 0x6, 0xff, 0xf7, 0x1d, - 0xf3, 0x0, 0x6, 0xfa, 0x0, 0x1, 0x0, 0x0, - 0x2, 0x0, + 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, + 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, + 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, + 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, + 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, + 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, + 0x4, 0xa1, /* U+F011 "" */ - 0x0, 0x0, 0x0, 0xa7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x0, 0x0, 0x0, 0x0, 0x15, - 0x14, 0xff, 0x2, 0x50, 0x0, 0x3, 0xcf, 0x84, - 0xff, 0xc, 0xf9, 0x0, 0xd, 0xff, 0x34, 0xff, - 0x9, 0xff, 0x80, 0x6f, 0xf4, 0x4, 0xff, 0x0, - 0xaf, 0xf2, 0xbf, 0xa0, 0x4, 0xff, 0x0, 0x1f, - 0xf7, 0xff, 0x60, 0x3, 0xff, 0x0, 0xc, 0xfa, - 0xff, 0x40, 0x0, 0x32, 0x0, 0x9, 0xfc, 0xef, - 0x70, 0x0, 0x0, 0x0, 0xd, 0xf9, 0xaf, 0xd0, - 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x2f, 0xf9, 0x0, - 0x0, 0x1, 0xcf, 0xe0, 0x8, 0xff, 0xc5, 0x33, - 0x7e, 0xff, 0x30, 0x0, 0x9f, 0xff, 0xff, 0xff, - 0xf5, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xea, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, + 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, + 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, + 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, + 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, + 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, + 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, + 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, /* U+F013 "" */ - 0x0, 0x0, 0x4, 0x77, 0x20, 0x0, 0x0, 0x0, - 0x22, 0x9, 0xff, 0x40, 0x30, 0x0, 0x3, 0xee, - 0x7d, 0xff, 0xb8, 0xf9, 0x0, 0xb, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x2, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x13, 0xef, 0xf8, 0x12, 0xcf, - 0xfb, 0x30, 0xff, 0xff, 0xd0, 0x0, 0x1f, 0xff, - 0xfc, 0xff, 0xff, 0xa0, 0x0, 0xf, 0xff, 0xfc, - 0xac, 0xff, 0xe1, 0x0, 0x4f, 0xff, 0xc7, 0x0, - 0xef, 0xfd, 0x78, 0xef, 0xf9, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x9, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x50, 0x0, 0xaa, 0x1c, 0xff, - 0x73, 0xc6, 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x44, 0x0, 0x0, - 0x0, - - /* U+F014 "" */ - 0x0, 0x0, 0x77, 0x77, 0x40, 0x0, 0x0, 0x0, - 0x7e, 0x88, 0x9f, 0x10, 0x0, 0x43, 0x3d, 0x83, - 0x33, 0xd8, 0x33, 0x2c, 0xfd, 0xcc, 0xcc, 0xcc, - 0xcf, 0xe6, 0xc, 0x40, 0x0, 0x0, 0x0, 0xc8, - 0x0, 0xc4, 0x44, 0x26, 0x7, 0x1c, 0x80, 0xc, - 0x48, 0x84, 0xc0, 0xf4, 0xc8, 0x0, 0xc4, 0x88, - 0x4c, 0xf, 0x4c, 0x80, 0xc, 0x48, 0x84, 0xc0, - 0xf4, 0xc8, 0x0, 0xc4, 0x88, 0x4c, 0xf, 0x4c, - 0x80, 0xc, 0x48, 0x84, 0xc0, 0xf4, 0xc8, 0x0, - 0xc4, 0x22, 0x13, 0x4, 0xc, 0x80, 0xc, 0x50, - 0x0, 0x0, 0x0, 0xd7, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x0, 0x24, 0x44, 0x44, 0x44, - 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x16, 0x10, 0x57, 0x40, 0x0, - 0x0, 0x0, 0x3e, 0xfc, 0x2c, 0xf8, 0x0, 0x0, - 0x0, 0x6e, 0xd4, 0xee, 0xdf, 0x80, 0x0, 0x0, - 0x8f, 0xa7, 0xe5, 0xdf, 0xf8, 0x0, 0x1, 0x9f, - 0x89, 0xff, 0xf6, 0xaf, 0xa0, 0x1, 0xcf, 0x7a, - 0xff, 0xff, 0xf9, 0x7f, 0xb1, 0xbf, 0x6c, 0xff, - 0xff, 0xff, 0xfc, 0x6f, 0x71, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x20, 0x0, 0xcf, 0xff, 0xa8, - 0xcf, 0xff, 0x80, 0x0, 0xc, 0xff, 0xf4, 0x8, - 0xff, 0xf8, 0x0, 0x0, 0xcf, 0xff, 0x40, 0x8f, - 0xff, 0x80, 0x0, 0xb, 0xff, 0xf4, 0x8, 0xff, - 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, + 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, + 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, + 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, + 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, + 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, + 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, /* U+F019 "" */ - 0x0, 0x0, 0x2, 0xbb, 0xa1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3, - 0x36, 0xff, 0xf6, 0x32, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xf3, 0x0, 0x0, 0x7, 0x77, 0x77, 0x36, 0xf3, - 0x37, 0x77, 0x75, 0xff, 0xff, 0xfe, 0x30, 0x4e, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xef, 0xfe, - 0xff, 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, - 0xa7, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, /* U+F01C "" */ - 0x0, 0x27, 0x77, 0x77, 0x77, 0x61, 0x0, 0x0, - 0xef, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x4, 0xfb, - 0x44, 0x44, 0x44, 0xee, 0x0, 0xb, 0xf2, 0x0, - 0x0, 0x0, 0x8f, 0x60, 0x2f, 0xc0, 0x0, 0x0, - 0x0, 0x1f, 0xd0, 0x9f, 0x50, 0x0, 0x0, 0x0, - 0xa, 0xf4, 0xfe, 0x33, 0x20, 0x0, 0x3, 0x36, - 0xfa, 0xff, 0xff, 0xd0, 0x0, 0x2f, 0xff, 0xfc, - 0xff, 0xff, 0xf9, 0x77, 0xbf, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, /* U+F021 "" */ - 0x0, 0x0, 0x25, 0x77, 0x51, 0x0, 0x0, 0x0, - 0x19, 0xff, 0xff, 0xfe, 0x70, 0xab, 0x1, 0xcf, - 0xff, 0xcd, 0xff, 0xfd, 0xfc, 0xd, 0xff, 0x70, - 0x0, 0x1b, 0xff, 0xfc, 0x5f, 0xf5, 0x0, 0x0, - 0xa, 0xff, 0xfc, 0xbf, 0xa0, 0x0, 0x0, 0x6f, - 0xff, 0xfb, 0x24, 0x10, 0x0, 0x0, 0x4, 0x44, - 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x77, 0x77, 0x70, 0x0, 0x0, 0x7, 0x74, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x3f, 0xf3, 0xff, 0xfe, - 0x10, 0x0, 0x1, 0xcf, 0xc0, 0xff, 0xff, 0xc5, - 0x33, 0x7e, 0xff, 0x30, 0xfd, 0x9f, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x71, 0x4, 0xbf, 0xff, 0xe8, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x0, + 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, + 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, + 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, + 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, + 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, + 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, + 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, /* U+F026 "" */ - 0x0, 0x0, 0xa, 0xc0, 0x0, 0xa, 0xfc, 0x0, - 0xa, 0xff, 0xcf, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xc7, 0x88, 0xff, 0xfc, 0x0, 0x3, 0xff, 0xc0, - 0x0, 0x3, 0xfc, 0x0, 0x0, 0x3, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, /* U+F027 "" */ - 0x0, 0x0, 0xa, 0xc0, 0x0, 0x0, 0x0, 0xa, - 0xfc, 0x0, 0x0, 0x0, 0xa, 0xff, 0xc0, 0x0, - 0xf, 0xff, 0xff, 0xfc, 0x9, 0x60, 0xff, 0xff, - 0xff, 0xc0, 0x4f, 0x2f, 0xff, 0xff, 0xfc, 0x0, - 0xf4, 0xff, 0xff, 0xff, 0xc0, 0xae, 0x7, 0x88, - 0xff, 0xfc, 0x5, 0x10, 0x0, 0x3, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x3, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x3, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, + 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf7, 0x10, 0x0, - 0x0, 0x0, 0xac, 0x0, 0x2, 0xdc, 0x10, 0x0, - 0x0, 0xaf, 0xc0, 0xe, 0x71, 0xba, 0x0, 0x0, - 0xaf, 0xfc, 0x0, 0x4d, 0x91, 0xf3, 0xff, 0xff, - 0xff, 0xc0, 0x96, 0x2f, 0x2a, 0x9f, 0xff, 0xff, - 0xfc, 0x4, 0xf2, 0xc8, 0x6c, 0xff, 0xff, 0xff, - 0xc0, 0xf, 0x49, 0x84, 0xcf, 0xff, 0xff, 0xfc, - 0xa, 0xe0, 0xd7, 0x8c, 0x78, 0x8f, 0xff, 0xc0, - 0x51, 0x7f, 0x1d, 0x70, 0x0, 0x3f, 0xfc, 0x0, - 0xaf, 0x35, 0xf1, 0x0, 0x0, 0x3f, 0xc0, 0x7, - 0x23, 0xe6, 0x0, 0x0, 0x0, 0x38, 0x0, 0x9, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x82, - 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, + 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, + 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, + 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, + 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, /* U+F03E "" */ - 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x50, 0xfa, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x89, 0xf1, 0xf4, 0x3, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf4, 0xf4, 0x5f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf4, 0xf4, 0xcf, 0xfc, 0x0, - 0x0, 0x38, 0x0, 0x0, 0xf4, 0xf4, 0x5f, 0xf5, - 0x0, 0x3, 0xef, 0x90, 0x0, 0xf4, 0xf4, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xf9, 0x0, 0xf4, 0xf4, - 0x0, 0x36, 0x3, 0xef, 0xff, 0xff, 0x90, 0xf4, - 0xf4, 0x3, 0xef, 0x7e, 0xff, 0xff, 0xff, 0xc0, - 0xf4, 0xf4, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0xf4, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xc0, 0xf4, 0xf4, 0x9c, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0x90, 0xf4, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf3, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x3, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, - - /* U+F040 "" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x3b, 0x2d, 0xff, 0xf7, 0x0, 0x0, 0x3, 0xec, - 0xc2, 0xdf, 0xf5, 0x0, 0x0, 0x3e, 0xbc, 0xfc, - 0x2d, 0x60, 0x0, 0x3, 0xeb, 0xcf, 0xff, 0xc0, - 0x0, 0x0, 0x3e, 0xbc, 0xff, 0xff, 0x60, 0x0, - 0x3, 0xeb, 0xcf, 0xff, 0xf6, 0x0, 0x0, 0x3e, - 0xdc, 0xff, 0xff, 0x60, 0x0, 0x0, 0xfa, 0xaf, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0xf6, 0x1a, 0xff, - 0x60, 0x0, 0x0, 0x0, 0xff, 0x46, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x44, 0x43, 0x0, 0x0, 0x0, 0x0, - 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, + 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, /* U+F048 "" */ - 0x77, 0x20, 0x0, 0x0, 0x32, 0xff, 0x40, 0x0, - 0x3, 0xe4, 0xff, 0x40, 0x0, 0x3e, 0xf4, 0xff, - 0x40, 0x3, 0xef, 0xf4, 0xff, 0x40, 0x3e, 0xff, - 0xf4, 0xff, 0x43, 0xef, 0xff, 0xf4, 0xff, 0x7e, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0x5d, 0xff, 0xff, 0xf4, 0xff, 0x41, 0xdf, - 0xff, 0xf4, 0xff, 0x40, 0x1d, 0xff, 0xf4, 0xff, - 0x40, 0x1, 0xdf, 0xf4, 0xff, 0x40, 0x0, 0x1d, - 0xf4, 0xff, 0x40, 0x0, 0x1, 0xd4, 0x23, 0x0, - 0x0, 0x0, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, + 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, + 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, + 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F04B "" */ - 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xe7, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xfd, 0x50, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xb4, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x20, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xff, 0x81, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe7, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xa1, 0xf, 0xff, 0xff, 0xff, 0xfc, 0x20, - 0x0, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0xf, - 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0xff, 0xf8, - 0x10, 0x0, 0x0, 0x0, 0xf, 0xa1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F04C "" */ - 0x77, 0x77, 0x75, 0x0, 0x77, 0x77, 0x75, 0xff, - 0xff, 0xfc, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xfc, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, - 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xfc, 0x0, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xfc, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xfc, 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, - 0x0, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfc, 0x0, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xfb, 0x0, 0xff, - 0xff, 0xfb, 0x24, 0x44, 0x41, 0x0, 0x24, 0x44, - 0x41, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, + 0xf7, /* U+F04D "" */ - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x41, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, /* U+F051 "" */ - 0x50, 0x0, 0x0, 0x8, 0x70, 0xf6, 0x0, 0x0, - 0x4f, 0xf4, 0xff, 0x60, 0x0, 0x4f, 0xf4, 0xff, - 0xf6, 0x0, 0x4f, 0xf4, 0xff, 0xff, 0x60, 0x4f, - 0xf4, 0xff, 0xff, 0xf6, 0x4f, 0xf4, 0xff, 0xff, - 0xff, 0xaf, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xff, 0xff, 0xfd, 0x5f, 0xf4, 0xff, 0xff, 0xd1, - 0x4f, 0xf4, 0xff, 0xfd, 0x10, 0x4f, 0xf4, 0xff, - 0xd1, 0x0, 0x4f, 0xf4, 0xfd, 0x10, 0x0, 0x4f, - 0xf4, 0xd1, 0x0, 0x0, 0x3f, 0xf3, 0x10, 0x0, - 0x0, 0x3, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, + 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, + 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x86, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x7, 0x10, 0x0, 0x0, 0x0, - 0xaf, 0xc1, 0x0, 0x0, 0xa, 0xff, 0xf8, 0x0, - 0x0, 0xaf, 0xff, 0xd1, 0x0, 0xa, 0xff, 0xfd, - 0x10, 0x0, 0xaf, 0xff, 0xd1, 0x0, 0xa, 0xff, - 0xfd, 0x10, 0x0, 0x7f, 0xff, 0xe1, 0x0, 0x0, - 0x3f, 0xff, 0xf9, 0x0, 0x0, 0x3, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x3f, 0xff, 0xf9, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x90, 0x0, 0x0, 0x3f, 0xff, - 0xf7, 0x0, 0x0, 0x3, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x3d, 0x30, + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, + 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, + 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, + 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, /* U+F054 "" */ - 0x0, 0x53, 0x0, 0x0, 0x0, 0x6, 0xfe, 0x30, - 0x0, 0x0, 0x2f, 0xff, 0xe3, 0x0, 0x0, 0x6, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x6f, 0xff, 0xe3, - 0x0, 0x0, 0x6, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x6f, 0xff, 0xe3, 0x0, 0x0, 0x8, 0xff, 0xfe, - 0x0, 0x0, 0x3e, 0xff, 0xfa, 0x0, 0x3, 0xef, - 0xff, 0xa0, 0x0, 0x3e, 0xff, 0xfa, 0x0, 0x3, - 0xef, 0xff, 0xa0, 0x0, 0x2e, 0xff, 0xfa, 0x0, - 0x0, 0x1d, 0xff, 0xa0, 0x0, 0x0, 0x1, 0xc9, - 0x0, 0x0, 0x0, + 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, + 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, /* U+F067 "" */ - 0x0, 0x0, 0x17, 0x76, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x58, 0x88, 0xcf, 0xff, - 0x88, 0x88, 0x10, 0x0, 0x8, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x5f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, + 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, /* U+F068 "" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x85, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x81, + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F06E "" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, + 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, + 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, + 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, + 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, + 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, + 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, + 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, + 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, + 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, + 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xda, 0x50, 0x0, 0x0, + + /* U+F070 "" */ + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, + 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, + 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, + 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, + 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, + 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, + 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, + 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x9, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x1e, 0xfc, 0xcf, 0xe1, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xc0, 0xc, 0xf8, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xc0, 0xc, 0xfe, 0x20, 0x0, - 0x0, 0xa, 0xff, 0xc0, 0xc, 0xff, 0xa0, 0x0, - 0x0, 0x2f, 0xff, 0xc0, 0xc, 0xff, 0xf2, 0x0, - 0x0, 0xcf, 0xff, 0xe7, 0x7e, 0xff, 0xfb, 0x0, - 0x4, 0xff, 0xff, 0xf8, 0x8f, 0xff, 0xff, 0x40, - 0xc, 0xff, 0xff, 0xc0, 0xc, 0xff, 0xff, 0xb0, - 0x6f, 0xff, 0xff, 0xc3, 0x3c, 0xff, 0xff, 0xf6, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, /* U+F074 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c, 0x10, - 0x77, 0x52, 0x0, 0x0, 0x14, 0x77, 0xbf, 0xc1, - 0xff, 0xff, 0xb1, 0x6, 0xef, 0xff, 0xff, 0xfc, - 0xcc, 0xef, 0xfc, 0x5f, 0xff, 0xcc, 0xef, 0xf6, - 0x0, 0x4, 0xf8, 0xdf, 0xd1, 0x0, 0x8f, 0x60, - 0x0, 0x0, 0x77, 0xff, 0x20, 0x0, 0x66, 0x0, - 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x31, 0x0, - 0x0, 0x1, 0xdf, 0xca, 0x70, 0x0, 0x8c, 0x10, - 0x77, 0x7c, 0xff, 0x5f, 0xf9, 0x77, 0xbf, 0xc1, - 0xff, 0xff, 0xf6, 0x1d, 0xff, 0xff, 0xff, 0xfc, - 0xcc, 0xcb, 0x40, 0x1, 0x8c, 0xcc, 0xef, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, + 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, + 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, + 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xe3, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x3e, 0xff, 0xf6, 0x6f, 0xff, 0xe3, 0x0, - 0x3, 0xef, 0xff, 0x60, 0x6, 0xff, 0xfe, 0x30, - 0x2e, 0xff, 0xf6, 0x0, 0x0, 0x6f, 0xff, 0xe2, - 0xa, 0xff, 0x60, 0x0, 0x0, 0x6, 0xff, 0xa0, - 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0x69, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, + 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, + 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, + 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F078 "" */ - 0x1, 0xc9, 0x0, 0x0, 0x0, 0x0, 0xac, 0x10, - 0x1c, 0xff, 0x90, 0x0, 0x0, 0xa, 0xff, 0xc1, - 0x1f, 0xff, 0xf9, 0x0, 0x0, 0xaf, 0xff, 0xf1, - 0x3, 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0x30, - 0x0, 0x3f, 0xff, 0xf9, 0xaf, 0xff, 0xf3, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, + 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, + 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F079 "" */ - 0x0, 0x3, 0x1, 0x33, 0x33, 0x33, 0x33, 0x30, - 0x0, 0x8, 0xf6, 0x1e, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x6, 0xff, 0xe3, 0x3f, 0xff, 0xff, 0xff, - 0xc0, 0x3, 0xef, 0xff, 0xe1, 0x0, 0x0, 0x8, - 0xfc, 0x0, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x8f, 0xc0, 0x3, 0x4d, 0xfa, 0x43, 0x0, 0x0, - 0x8, 0xfc, 0x0, 0x0, 0xcf, 0x80, 0x0, 0x0, - 0x57, 0xbf, 0xd7, 0x70, 0xc, 0xf8, 0x0, 0x0, - 0x7, 0xff, 0xff, 0xfd, 0x0, 0xcf, 0x93, 0x33, - 0x33, 0xa, 0xff, 0xff, 0x30, 0xc, 0xff, 0xff, - 0xff, 0xf8, 0xd, 0xff, 0x40, 0x0, 0xcf, 0xff, - 0xff, 0xff, 0xf4, 0x1d, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, + 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, + 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, /* U+F07B "" */ - 0x16, 0x77, 0x76, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xc3, 0x33, 0x33, 0x33, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x30, + 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x1, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0x40, 0x0, 0x0, 0x57, 0x77, 0x62, 0x88, 0x80, - 0x77, 0x77, 0x4f, 0xff, 0xff, 0x73, 0x33, 0xaf, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaa, - 0x6c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, /* U+F095 "" */ - 0x5, 0x71, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x20, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xe6, 0x0, - 0x7, 0x20, 0x0, 0x1, 0xdf, 0xf8, 0x1a, 0xfe, - 0x71, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x28, 0xdf, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, + 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, + 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, /* U+F0C4 "" */ - 0x2, 0x53, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x1, 0x30, - 0xfb, 0x2, 0xbf, 0x50, 0x0, 0x0, 0x6a, 0x6a, - 0xea, 0x0, 0xc, 0xc0, 0x0, 0x4b, 0x40, 0x78, - 0x6f, 0xa3, 0x3c, 0xc1, 0x2a, 0x60, 0x19, 0x50, - 0x6, 0xef, 0xff, 0x6e, 0x81, 0x2, 0xa3, 0x0, - 0x0, 0x4, 0x43, 0xb8, 0xa1, 0x59, 0x10, 0x0, - 0x0, 0x47, 0x76, 0xa3, 0x88, 0x7b, 0x30, 0x0, - 0x1a, 0xff, 0xff, 0xaa, 0xe7, 0x0, 0x86, 0x0, - 0x9f, 0x70, 0xb, 0xc0, 0x6, 0xa2, 0x6, 0x90, - 0xf9, 0x0, 0x1d, 0xb0, 0x0, 0x18, 0x81, 0x3b, - 0xec, 0x36, 0xdf, 0x30, 0x0, 0x0, 0x29, 0xb8, - 0x3e, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, + 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, + 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, + 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, + 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, + 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, + 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, + 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, + 0x10, /* U+F0C5 "" */ - 0x0, 0x0, 0x5a, 0xbb, 0xba, 0x10, 0x0, 0x0, - 0x0, 0x6, 0xfe, 0x88, 0x8e, 0x40, 0x0, 0x0, - 0x0, 0x6f, 0xdc, 0x0, 0xc, 0x40, 0x0, 0x0, - 0x6, 0xf6, 0x8c, 0x0, 0xc, 0x53, 0x33, 0x32, - 0x6f, 0x93, 0x9c, 0x0, 0xc, 0xfe, 0xcc, 0xde, - 0xef, 0xff, 0xf9, 0x0, 0x3e, 0xf8, 0x0, 0x4f, - 0xf4, 0x0, 0x0, 0x3, 0xe6, 0xc8, 0x0, 0x4f, - 0xf4, 0x0, 0x0, 0x3e, 0x60, 0xc8, 0x0, 0x4f, - 0xf4, 0x0, 0x1, 0xee, 0xbb, 0xe7, 0x0, 0x4f, - 0xf4, 0x0, 0x4, 0xe8, 0x88, 0x71, 0x0, 0x4f, - 0xf4, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x4f, - 0xf6, 0x33, 0x36, 0xc0, 0x0, 0x0, 0x0, 0x4f, - 0xbc, 0xcc, 0xcd, 0xc0, 0x0, 0x0, 0x0, 0x4f, - 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x4f, - 0x0, 0x0, 0x4, 0xc0, 0x0, 0x0, 0x0, 0x4f, - 0x0, 0x0, 0x4, 0xeb, 0xbb, 0xbb, 0xbb, 0xcf, - 0x0, 0x0, 0x0, 0x44, 0x44, 0x44, 0x44, 0x42, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, /* U+F0C7 "" */ - 0x77, 0x77, 0x77, 0x77, 0x77, 0x20, 0x0, 0xfa, - 0xef, 0xfe, 0x89, 0xfd, 0xe3, 0x0, 0xf4, 0xcf, - 0xfc, 0x0, 0xf4, 0xae, 0x30, 0xf4, 0xcf, 0xfc, - 0x0, 0xf4, 0xa, 0xe2, 0xf4, 0xcf, 0xfc, 0x0, - 0xf4, 0x0, 0xba, 0xf4, 0xbf, 0xff, 0xff, 0xf1, - 0x0, 0x8c, 0xf4, 0x4, 0x44, 0x44, 0x10, 0x0, - 0x8c, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c, - 0xf4, 0x47, 0x77, 0x77, 0x77, 0x71, 0x8c, 0xf4, - 0xcc, 0x88, 0x88, 0x88, 0xe8, 0x8c, 0xf4, 0xc8, - 0x0, 0x0, 0x0, 0xc8, 0x8c, 0xf4, 0xc8, 0x0, - 0x0, 0x0, 0xc8, 0x8c, 0xf4, 0xc8, 0x0, 0x0, - 0x0, 0xc8, 0x8c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x40, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, /* U+F0E7 "" */ - 0x2, 0x77, 0x74, 0x0, 0x6, 0xff, 0xf5, 0x0, - 0xa, 0xff, 0xe0, 0x0, 0xe, 0xff, 0x90, 0x0, - 0x2f, 0xff, 0x44, 0x8b, 0x6f, 0xff, 0xff, 0xfa, - 0xaf, 0xff, 0xff, 0xf2, 0xef, 0xfc, 0xff, 0xa0, - 0x84, 0x1, 0xff, 0x40, 0x0, 0x5, 0xfc, 0x0, - 0x0, 0x9, 0xf4, 0x0, 0x0, 0xd, 0xd0, 0x0, - 0x0, 0x1f, 0x60, 0x0, 0x0, 0x5e, 0x0, 0x0, - 0x0, 0x96, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, + 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, + 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5d, 0xd4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3c, 0xff, 0xff, 0xc3, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xff, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x3, 0xbf, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaa, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, /* U+F11C "" */ - 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x20, 0xfd, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xf1, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf4, 0xf4, 0xc8, 0x8c, 0x4f, 0xc, - 0x48, 0x84, 0xc0, 0xf4, 0xf4, 0x21, 0x13, 0x4, - 0x3, 0x12, 0x24, 0xc0, 0xf4, 0xf4, 0x9b, 0x63, - 0x90, 0xc2, 0x96, 0x6c, 0xc0, 0xf4, 0xf4, 0x68, - 0x42, 0x60, 0x81, 0x64, 0x48, 0x60, 0xf4, 0xf4, - 0x64, 0x47, 0x77, 0x77, 0x77, 0x42, 0x60, 0xf4, - 0xf4, 0x96, 0x6c, 0xcc, 0xcc, 0xcc, 0x63, 0x90, - 0xf4, 0xf6, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0xf4, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, + 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x4b, 0xf7, 0x0, 0x0, 0x0, - 0x4, 0xbf, 0xff, 0x10, 0x0, 0x0, 0x4b, 0xff, - 0xff, 0x80, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xf1, - 0x0, 0x4b, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x7, 0x88, 0x88, - 0xaf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf1, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, + 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, /* U+F15B "" */ - 0x9b, 0xbb, 0xbb, 0xbb, 0x1, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xb, 0x30, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xc, 0xe3, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xc, 0xfe, 0x30, 0xff, 0xff, 0xff, 0xff, - 0x9, 0xcc, 0xb1, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - 0x24, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, + 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x47, 0x77, 0x74, 0x10, 0x0, - 0x0, 0x0, 0x3, 0xae, 0xff, 0xff, 0xff, 0xfc, - 0x50, 0x0, 0x1, 0x9f, 0xff, 0xfe, 0xcc, 0xcf, - 0xff, 0xfd, 0x30, 0x3c, 0xff, 0xe6, 0x20, 0x1, - 0x1, 0x5c, 0xff, 0xe6, 0x5f, 0xf7, 0x6, 0xaf, - 0xff, 0xfc, 0x61, 0x4f, 0xfa, 0x5, 0x33, 0xdf, - 0xff, 0xff, 0xff, 0xfe, 0x61, 0x70, 0x0, 0x2f, - 0xff, 0xc6, 0x44, 0x5a, 0xff, 0xf5, 0x0, 0x0, - 0x6, 0xd4, 0x16, 0xab, 0x83, 0x2c, 0xa0, 0x0, - 0x0, 0x0, 0x6, 0xef, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xb9, 0xef, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x51, 0x33, 0x5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6a, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, + 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, + 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, + 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, + 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, /* U+F240 "" */ - 0x26, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x40, 0xe, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcf, 0x40, 0xf4, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x31, 0xc8, 0xf, - 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x4c, 0xb1, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x6c, 0x8f, 0x4c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x88, 0xf4, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x8, 0x8f, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x40, 0x88, 0xf4, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, 0x6f, 0x49, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x3c, - 0x80, 0xf6, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0xc7, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, /* U+F241 "" */ - 0x26, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x40, 0xe, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcf, 0x40, 0xf4, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x33, 0x0, 0x0, 0xc8, 0xf, - 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0xc, 0xb1, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x6c, 0x8f, 0x4c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x88, 0xf4, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x8, 0x8f, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x88, 0xf4, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0x0, 0xcf, 0x6f, 0x49, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x90, 0x0, 0xc, - 0x80, 0xf6, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0xc7, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, /* U+F242 "" */ - 0x26, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x40, 0xe, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcf, 0x40, 0xf4, 0x33, 0x33, - 0x33, 0x33, 0x10, 0x0, 0x0, 0x0, 0xc8, 0xf, - 0x4c, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0xc, 0xb1, 0xf4, 0xcf, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x6c, 0x8f, 0x4c, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x88, 0xf4, - 0xcf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x8, 0x8f, 0x4c, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x88, 0xf4, 0xcf, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0xcf, 0x6f, 0x49, - 0xcc, 0xcc, 0xcc, 0xc3, 0x0, 0x0, 0x0, 0xc, - 0x80, 0xf6, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0xc7, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, /* U+F243 "" */ - 0x26, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x40, 0xe, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcf, 0x40, 0xf4, 0x33, 0x33, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc8, 0xf, - 0x4c, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xb1, 0xf4, 0xcf, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6c, 0x8f, 0x4c, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x88, 0xf4, - 0xcf, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x8f, 0x4c, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x88, 0xf4, 0xcf, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x6f, 0x49, - 0xcc, 0xc9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x80, 0xf6, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0xc7, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, /* U+F244 "" */ - 0x26, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x40, 0xe, 0xdc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcf, 0x40, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc8, 0xf, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xb1, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6c, 0x8f, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x88, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0x8f, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x88, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x6f, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x80, 0xf6, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0xc7, 0xa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, + 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, + 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, + 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, + 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, + 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x0, 0x0, 0x0, /* U+F293 "" */ - 0x0, 0x6, 0x9b, 0xb7, 0x40, 0x0, 0x2, 0xcf, - 0xfd, 0xff, 0xf9, 0x0, 0xd, 0xff, 0xf4, 0xaf, - 0xff, 0x80, 0x5f, 0xff, 0xf4, 0xa, 0xff, 0xe1, - 0xaf, 0xff, 0xf4, 0x51, 0xaf, 0xf5, 0xdf, 0x83, - 0xf4, 0x8a, 0xc, 0xf8, 0xff, 0xf6, 0x33, 0x51, - 0x6f, 0xfc, 0xff, 0xff, 0x60, 0x6, 0xff, 0xfc, - 0xff, 0xff, 0xd0, 0x1f, 0xff, 0xfc, 0xff, 0xfd, - 0x10, 0x13, 0xff, 0xfc, 0xff, 0xd1, 0x64, 0x86, - 0x3f, 0xfa, 0xcf, 0x96, 0xf4, 0x86, 0x1c, 0xf8, - 0x8f, 0xff, 0xf4, 0x11, 0xcf, 0xf3, 0x2f, 0xff, - 0xf4, 0x1c, 0xff, 0xe0, 0x8, 0xff, 0xf5, 0xcf, - 0xff, 0x40, 0x0, 0x7e, 0xfe, 0xff, 0xc3, 0x0, - 0x0, 0x0, 0x34, 0x42, 0x0, 0x0 + 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, + 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, + 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, + 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, + 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, + 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, + 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, + 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, + 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, + 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, + 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, + 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, + 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, + 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, + 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, + 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, + 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, + 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, + 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, + 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F7C2 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, + 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, + 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, + 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; @@ -1486,152 +1651,159 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { *--------------------*/ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_h = 0, .box_w = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 64, .box_h = 0, .box_w = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 67, .box_h = 12, .box_w = 2, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12, .adv_w = 92, .box_h = 5, .box_w = 4, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 22, .adv_w = 160, .box_h = 12, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 82, .adv_w = 149, .box_h = 16, .box_w = 8, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 146, .adv_w = 187, .box_h = 13, .box_w = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 218, .adv_w = 160, .box_h = 13, .box_w = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 283, .adv_w = 56, .box_h = 5, .box_w = 2, .ofs_x = 1, .ofs_y = 7}, - {.bitmap_index = 288, .adv_w = 85, .box_h = 17, .box_w = 5, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 331, .adv_w = 86, .box_h = 17, .box_w = 5, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 374, .adv_w = 111, .box_h = 6, .box_w = 7, .ofs_x = 0, .ofs_y = 3}, - {.bitmap_index = 395, .adv_w = 145, .box_h = 9, .box_w = 9, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 436, .adv_w = 57, .box_h = 4, .box_w = 2, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 440, .adv_w = 115, .box_h = 2, .box_w = 5, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 445, .adv_w = 69, .box_h = 2, .box_w = 2, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 447, .adv_w = 106, .box_h = 13, .box_w = 6, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 486, .adv_w = 144, .box_h = 13, .box_w = 8, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 538, .adv_w = 144, .box_h = 12, .box_w = 5, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 568, .adv_w = 144, .box_h = 12, .box_w = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 616, .adv_w = 144, .box_h = 13, .box_w = 7, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 662, .adv_w = 144, .box_h = 12, .box_w = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 716, .adv_w = 144, .box_h = 13, .box_w = 8, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 768, .adv_w = 144, .box_h = 13, .box_w = 8, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 820, .adv_w = 144, .box_h = 12, .box_w = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 874, .adv_w = 144, .box_h = 13, .box_w = 9, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 933, .adv_w = 144, .box_h = 13, .box_w = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 985, .adv_w = 65, .box_h = 9, .box_w = 2, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 994, .adv_w = 66, .box_h = 11, .box_w = 2, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1005, .adv_w = 130, .box_h = 8, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1033, .adv_w = 144, .box_h = 5, .box_w = 7, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 1051, .adv_w = 134, .box_h = 8, .box_w = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1079, .adv_w = 122, .box_h = 12, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1121, .adv_w = 229, .box_h = 16, .box_w = 13, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1225, .adv_w = 162, .box_h = 12, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1285, .adv_w = 162, .box_h = 12, .box_w = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1339, .adv_w = 162, .box_h = 13, .box_w = 9, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1398, .adv_w = 173, .box_h = 12, .box_w = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1452, .adv_w = 140, .box_h = 12, .box_w = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1500, .adv_w = 140, .box_h = 12, .box_w = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1548, .adv_w = 173, .box_h = 13, .box_w = 9, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1607, .adv_w = 180, .box_h = 12, .box_w = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1661, .adv_w = 72, .box_h = 12, .box_w = 2, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1673, .adv_w = 140, .box_h = 13, .box_w = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 1725, .adv_w = 162, .box_h = 12, .box_w = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1779, .adv_w = 140, .box_h = 12, .box_w = 8, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1827, .adv_w = 221, .box_h = 12, .box_w = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1899, .adv_w = 180, .box_h = 12, .box_w = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1953, .adv_w = 175, .box_h = 13, .box_w = 9, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2012, .adv_w = 162, .box_h = 12, .box_w = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2066, .adv_w = 178, .box_h = 13, .box_w = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2131, .adv_w = 162, .box_h = 12, .box_w = 9, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2185, .adv_w = 157, .box_h = 13, .box_w = 8, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2237, .adv_w = 153, .box_h = 12, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2297, .adv_w = 173, .box_h = 13, .box_w = 9, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2356, .adv_w = 162, .box_h = 12, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2416, .adv_w = 220, .box_h = 12, .box_w = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2500, .adv_w = 162, .box_h = 12, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2560, .adv_w = 162, .box_h = 12, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2620, .adv_w = 153, .box_h = 12, .box_w = 9, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2674, .adv_w = 69, .box_h = 16, .box_w = 4, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 2706, .adv_w = 106, .box_h = 13, .box_w = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2752, .adv_w = 69, .box_h = 16, .box_w = 3, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2776, .adv_w = 107, .box_h = 7, .box_w = 6, .ofs_x = 0, .ofs_y = 5}, - {.bitmap_index = 2797, .adv_w = 116, .box_h = 2, .box_w = 8, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2805, .adv_w = 80, .box_h = 3, .box_w = 4, .ofs_x = 0, .ofs_y = 9}, - {.bitmap_index = 2811, .adv_w = 141, .box_h = 10, .box_w = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2851, .adv_w = 146, .box_h = 14, .box_w = 8, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2907, .adv_w = 134, .box_h = 10, .box_w = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2947, .adv_w = 146, .box_h = 14, .box_w = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3003, .adv_w = 134, .box_h = 10, .box_w = 8, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3043, .adv_w = 78, .box_h = 13, .box_w = 6, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3082, .adv_w = 146, .box_h = 13, .box_w = 8, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 3134, .adv_w = 146, .box_h = 13, .box_w = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3180, .adv_w = 65, .box_h = 13, .box_w = 2, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3193, .adv_w = 66, .box_h = 17, .box_w = 4, .ofs_x = -1, .ofs_y = -4}, - {.bitmap_index = 3227, .adv_w = 131, .box_h = 13, .box_w = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3273, .adv_w = 65, .box_h = 13, .box_w = 2, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3286, .adv_w = 224, .box_h = 9, .box_w = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3340, .adv_w = 146, .box_h = 9, .box_w = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3372, .adv_w = 146, .box_h = 10, .box_w = 9, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3417, .adv_w = 146, .box_h = 13, .box_w = 8, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 3469, .adv_w = 146, .box_h = 13, .box_w = 8, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 3521, .adv_w = 90, .box_h = 9, .box_w = 5, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3544, .adv_w = 134, .box_h = 10, .box_w = 7, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3579, .adv_w = 82, .box_h = 12, .box_w = 5, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3609, .adv_w = 146, .box_h = 10, .box_w = 7, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3644, .adv_w = 129, .box_h = 9, .box_w = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3680, .adv_w = 194, .box_h = 9, .box_w = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3734, .adv_w = 129, .box_h = 9, .box_w = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3770, .adv_w = 129, .box_h = 13, .box_w = 8, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 3822, .adv_w = 129, .box_h = 9, .box_w = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3858, .adv_w = 87, .box_h = 16, .box_w = 6, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3906, .adv_w = 63, .box_h = 14, .box_w = 2, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 3920, .adv_w = 87, .box_h = 16, .box_w = 5, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3960, .adv_w = 174, .box_h = 4, .box_w = 9, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 3978, .adv_w = 219, .box_h = 16, .box_w = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4090, .adv_w = 274, .box_h = 16, .box_w = 18, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 4234, .adv_w = 256, .box_h = 13, .box_w = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4338, .adv_w = 256, .box_h = 11, .box_w = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4415, .adv_w = 201, .box_h = 12, .box_w = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4481, .adv_w = 219, .box_h = 16, .box_w = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4593, .adv_w = 219, .box_h = 15, .box_w = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4698, .adv_w = 201, .box_h = 15, .box_w = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 4796, .adv_w = 238, .box_h = 12, .box_w = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4886, .adv_w = 238, .box_h = 14, .box_w = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4991, .adv_w = 219, .box_h = 12, .box_w = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5075, .adv_w = 219, .box_h = 15, .box_w = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5180, .adv_w = 110, .box_h = 11, .box_w = 7, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5219, .adv_w = 165, .box_h = 11, .box_w = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5280, .adv_w = 238, .box_h = 13, .box_w = 15, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 5378, .adv_w = 274, .box_h = 15, .box_w = 18, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5513, .adv_w = 219, .box_h = 15, .box_w = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5618, .adv_w = 146, .box_h = 15, .box_w = 10, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5693, .adv_w = 201, .box_h = 15, .box_w = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5791, .adv_w = 219, .box_h = 15, .box_w = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5896, .adv_w = 219, .box_h = 15, .box_w = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6001, .adv_w = 146, .box_h = 15, .box_w = 10, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6076, .adv_w = 220, .box_h = 12, .box_w = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6160, .adv_w = 183, .box_h = 15, .box_w = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6235, .adv_w = 183, .box_h = 15, .box_w = 10, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6310, .adv_w = 201, .box_h = 13, .box_w = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6395, .adv_w = 201, .box_h = 4, .box_w = 13, .ofs_x = 0, .ofs_y = 4}, - {.bitmap_index = 6421, .adv_w = 256, .box_h = 16, .box_w = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 6549, .adv_w = 256, .box_h = 15, .box_w = 16, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6669, .adv_w = 256, .box_h = 10, .box_w = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6749, .adv_w = 256, .box_h = 10, .box_w = 16, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6829, .adv_w = 274, .box_h = 11, .box_w = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6923, .adv_w = 238, .box_h = 13, .box_w = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7021, .adv_w = 238, .box_h = 16, .box_w = 15, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7141, .adv_w = 201, .box_h = 13, .box_w = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7226, .adv_w = 256, .box_h = 14, .box_w = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7338, .adv_w = 256, .box_h = 17, .box_w = 16, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7474, .adv_w = 219, .box_h = 15, .box_w = 14, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7579, .adv_w = 128, .box_h = 16, .box_w = 8, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7643, .adv_w = 256, .box_h = 17, .box_w = 16, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 7779, .adv_w = 274, .box_h = 11, .box_w = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7878, .adv_w = 201, .box_h = 13, .box_w = 13, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 7963, .adv_w = 219, .box_h = 17, .box_w = 14, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8082, .adv_w = 293, .box_h = 13, .box_w = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8199, .adv_w = 329, .box_h = 12, .box_w = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8325, .adv_w = 329, .box_h = 12, .box_w = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8451, .adv_w = 329, .box_h = 12, .box_w = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8577, .adv_w = 329, .box_h = 12, .box_w = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8703, .adv_w = 329, .box_h = 12, .box_w = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8829, .adv_w = 219, .box_h = 17, .box_w = 12, .ofs_x = 1, .ofs_y = -3} + {.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 = 63, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 66, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 12, .adv_w = 82, .box_w = 4, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 22, .adv_w = 159, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 82, .adv_w = 144, .box_w = 9, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 154, .adv_w = 188, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 226, .adv_w = 159, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 286, .adv_w = 45, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 290, .adv_w = 88, .box_w = 5, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 335, .adv_w = 89, .box_w = 5, .box_h = 18, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 380, .adv_w = 110, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 405, .adv_w = 145, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 446, .adv_w = 50, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 454, .adv_w = 71, .box_w = 5, .box_h = 3, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 462, .adv_w = 67, .box_w = 2, .box_h = 2, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 464, .adv_w = 106, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 510, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 564, .adv_w = 144, .box_w = 5, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 594, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 648, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 696, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 750, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 798, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 846, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 900, .adv_w = 144, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 954, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1002, .adv_w = 62, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1011, .adv_w = 54, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1029, .adv_w = 130, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 1057, .adv_w = 141, .box_w = 7, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1078, .adv_w = 134, .box_w = 7, .box_h = 8, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 1106, .adv_w = 121, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1148, .adv_w = 230, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1253, .adv_w = 167, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1319, .adv_w = 159, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1373, .adv_w = 167, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1433, .adv_w = 168, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1487, .adv_w = 146, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1535, .adv_w = 142, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1583, .adv_w = 174, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1643, .adv_w = 183, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1703, .adv_w = 70, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1715, .adv_w = 141, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1763, .adv_w = 161, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1823, .adv_w = 138, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1871, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1943, .adv_w = 183, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2003, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2069, .adv_w = 162, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2123, .adv_w = 176, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2200, .adv_w = 158, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2254, .adv_w = 152, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2308, .adv_w = 153, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2368, .adv_w = 166, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2422, .adv_w = 163, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2482, .adv_w = 227, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2566, .adv_w = 161, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2626, .adv_w = 154, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2686, .adv_w = 153, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2740, .adv_w = 68, .box_w = 4, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2776, .adv_w = 105, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2822, .adv_w = 68, .box_w = 4, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2858, .adv_w = 107, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 2879, .adv_w = 116, .box_w = 8, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2891, .adv_w = 79, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 2897, .adv_w = 139, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2933, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2981, .adv_w = 134, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3017, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3065, .adv_w = 136, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3101, .adv_w = 89, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3143, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3191, .adv_w = 141, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3233, .adv_w = 62, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3245, .adv_w = 61, .box_w = 4, .box_h = 15, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 3275, .adv_w = 130, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3323, .adv_w = 62, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3335, .adv_w = 224, .box_w = 12, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3389, .adv_w = 141, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3421, .adv_w = 146, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3462, .adv_w = 144, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3510, .adv_w = 146, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3558, .adv_w = 87, .box_w = 5, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3581, .adv_w = 132, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3617, .adv_w = 84, .box_w = 5, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3645, .adv_w = 141, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3677, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3713, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3767, .adv_w = 127, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3803, .adv_w = 121, .box_w = 8, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3851, .adv_w = 127, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3887, .adv_w = 87, .box_w = 6, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3938, .adv_w = 62, .box_w = 2, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3952, .adv_w = 87, .box_w = 5, .box_h = 17, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3995, .adv_w = 174, .box_w = 9, .box_h = 5, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 4018, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4154, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4250, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4362, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4458, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4524, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4652, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4780, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4906, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5034, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5142, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5270, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5326, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5410, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5554, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5650, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 5730, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 5856, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5961, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6059, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6139, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 6251, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6321, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6391, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6489, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 6517, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6625, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6785, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6945, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7073, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7143, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7213, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7353, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7449, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7577, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7722, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7827, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7939, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8037, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8133, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8245, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8357, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8465, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 8627, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8723, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8873, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 8973, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9073, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9173, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9273, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9373, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9520, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 9616, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9728, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 9873, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9993, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10089, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1} }; /*--------------------- @@ -1639,25 +1811,26 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { *--------------------*/ static const uint16_t unicode_list_1[] = { - 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x13, - 0x14, 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, - 0x3f, 0x47, 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, - 0x53, 0x66, 0x67, 0x70, 0x73, 0x76, 0x77, 0x78, - 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xe6, 0xf2, - 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, 0x240, 0x241, 0x242, - 0x243, 0x292 + 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x14, + 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, 0x47, + 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, 0x53, 0x66, + 0x67, 0x6d, 0x6f, 0x70, 0x73, 0x76, 0x77, 0x78, + 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xe6, 0xe9, + 0xf2, 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, 0x240, 0x241, + 0x242, 0x243, 0x286, 0x292, 0x2ec, 0x303, 0x559, 0x7c1, + 0x8a1 }; /*Collect the unicode lists and glyph_id offsets*/ static const lv_font_fmt_txt_cmap_t cmaps[] = { { - .range_start = 32, .range_length = 95, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY, - .glyph_id_start = 1, .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0 + .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 = 61441, .range_length = 659, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY, - .glyph_id_start = 96, .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 50 + .range_start = 61441, .range_length = 2210, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 57, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; @@ -1666,569 +1839,245 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = *----------------*/ -/*Pair left and right glyphs for kerning*/ -static const uint8_t kern_pair_glyph_ids[] = +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { - 9, 43, - 9, 55, - 9, 56, - 9, 58, - 17, 17, - 17, 18, - 17, 20, - 17, 21, - 17, 22, - 17, 23, - 17, 24, - 17, 26, - 18, 19, - 18, 20, - 18, 22, - 18, 24, - 19, 17, - 19, 18, - 19, 19, - 19, 22, - 19, 23, - 19, 24, - 19, 25, - 19, 26, - 20, 18, - 20, 19, - 20, 20, - 20, 21, - 20, 22, - 20, 23, - 20, 24, - 20, 25, - 20, 26, - 21, 17, - 21, 19, - 21, 21, - 21, 22, - 21, 23, - 21, 24, - 21, 25, - 22, 18, - 22, 19, - 22, 20, - 22, 21, - 22, 22, - 22, 23, - 22, 24, - 22, 25, - 22, 26, - 23, 17, - 23, 18, - 23, 19, - 23, 21, - 23, 22, - 23, 23, - 23, 24, - 23, 25, - 24, 18, - 24, 21, - 24, 22, - 24, 23, - 24, 24, - 24, 25, - 24, 26, - 25, 17, - 25, 18, - 25, 20, - 25, 21, - 25, 22, - 25, 23, - 26, 17, - 26, 18, - 26, 19, - 26, 21, - 26, 22, - 26, 23, - 26, 24, - 26, 26, - 34, 36, - 34, 40, - 34, 48, - 34, 50, - 34, 53, - 34, 54, - 34, 55, - 34, 56, - 34, 58, - 34, 66, - 34, 68, - 34, 69, - 34, 70, - 34, 72, - 34, 80, - 34, 82, - 34, 84, - 34, 85, - 34, 86, - 34, 87, - 34, 88, - 34, 91, - 35, 58, - 35, 66, - 35, 74, - 35, 77, - 35, 80, - 35, 83, - 35, 86, - 35, 90, - 36, 36, - 36, 40, - 36, 48, - 36, 50, - 36, 74, - 36, 83, - 36, 86, - 36, 90, - 36, 91, - 37, 55, - 37, 56, - 37, 66, - 37, 70, - 37, 80, - 37, 86, - 38, 55, - 38, 56, - 38, 58, - 38, 67, - 38, 68, - 38, 69, - 38, 70, - 38, 71, - 38, 72, - 38, 74, - 38, 75, - 38, 76, - 38, 77, - 38, 78, - 38, 79, - 38, 80, - 38, 81, - 38, 82, - 38, 83, - 38, 85, - 38, 86, - 38, 87, - 38, 88, - 38, 89, - 38, 90, - 38, 91, - 39, 13, - 39, 15, - 39, 34, - 39, 66, - 39, 70, - 39, 74, - 39, 77, - 39, 80, - 39, 83, - 39, 86, - 39, 90, - 40, 66, - 40, 70, - 40, 79, - 40, 80, - 40, 83, - 40, 86, - 40, 90, - 41, 66, - 41, 70, - 41, 80, - 41, 86, - 41, 90, - 42, 66, - 42, 68, - 42, 69, - 42, 71, - 42, 72, - 42, 78, - 42, 79, - 42, 80, - 42, 81, - 42, 83, - 42, 84, - 42, 85, - 42, 86, - 42, 87, - 42, 88, - 42, 90, - 43, 66, - 43, 80, - 44, 36, - 44, 40, - 44, 48, - 44, 50, - 44, 66, - 44, 70, - 44, 74, - 44, 80, - 44, 83, - 44, 86, - 44, 88, - 44, 90, - 45, 34, - 45, 36, - 45, 40, - 45, 48, - 45, 50, - 45, 53, - 45, 54, - 45, 55, - 45, 56, - 45, 58, - 45, 75, - 45, 86, - 45, 88, - 45, 90, - 46, 66, - 46, 70, - 46, 75, - 46, 79, - 46, 80, - 46, 86, - 46, 90, - 47, 70, - 47, 80, - 47, 90, - 48, 34, - 48, 53, - 48, 55, - 48, 56, - 48, 57, - 48, 58, - 48, 68, - 48, 69, - 48, 70, - 48, 71, - 48, 72, - 48, 75, - 48, 80, - 48, 81, - 48, 82, - 48, 84, - 48, 85, - 48, 86, - 48, 89, - 48, 90, - 48, 91, - 49, 13, - 49, 15, - 49, 34, - 49, 38, - 49, 41, - 49, 42, - 49, 66, - 49, 70, - 49, 73, - 49, 74, - 49, 77, - 49, 79, - 49, 80, - 49, 83, - 49, 84, - 49, 85, - 49, 90, - 50, 34, - 50, 53, - 50, 54, - 50, 55, - 50, 56, - 50, 57, - 50, 58, - 50, 66, - 50, 86, - 51, 36, - 51, 40, - 51, 48, - 51, 50, - 51, 53, - 51, 54, - 51, 55, - 51, 56, - 51, 58, - 51, 66, - 51, 70, - 51, 80, - 51, 86, - 51, 90, - 52, 66, - 52, 70, - 52, 75, - 52, 78, - 52, 79, - 52, 80, - 52, 81, - 52, 82, - 52, 86, - 52, 88, - 52, 90, - 53, 13, - 53, 14, - 53, 15, - 53, 27, - 53, 28, - 53, 34, - 53, 36, - 53, 40, - 53, 48, - 53, 50, - 53, 52, - 53, 53, - 53, 55, - 53, 56, - 53, 57, - 53, 58, - 53, 66, - 53, 70, - 53, 74, - 53, 78, - 53, 80, - 53, 83, - 53, 84, - 53, 86, - 53, 88, - 53, 90, - 53, 91, - 54, 34, - 54, 69, - 54, 71, - 54, 72, - 54, 78, - 54, 79, - 54, 81, - 54, 83, - 54, 84, - 54, 85, - 54, 89, - 54, 91, - 55, 10, - 55, 13, - 55, 14, - 55, 15, - 55, 27, - 55, 28, - 55, 34, - 55, 36, - 55, 40, - 55, 48, - 55, 50, - 55, 62, - 55, 66, - 55, 70, - 55, 80, - 55, 83, - 55, 86, - 55, 90, - 55, 94, - 56, 10, - 56, 13, - 56, 14, - 56, 15, - 56, 27, - 56, 28, - 56, 34, - 56, 36, - 56, 40, - 56, 48, - 56, 50, - 56, 53, - 56, 62, - 56, 66, - 56, 70, - 56, 80, - 56, 83, - 56, 86, - 56, 90, - 56, 94, - 57, 36, - 57, 40, - 57, 48, - 57, 50, - 57, 70, - 57, 86, - 57, 90, - 58, 10, - 58, 13, - 58, 14, - 58, 15, - 58, 27, - 58, 28, - 58, 34, - 58, 36, - 58, 40, - 58, 48, - 58, 50, - 58, 53, - 58, 55, - 58, 56, - 58, 57, - 58, 58, - 58, 62, - 58, 66, - 58, 70, - 58, 80, - 58, 82, - 58, 85, - 58, 86, - 58, 87, - 58, 94, - 59, 34, - 59, 36, - 59, 40, - 59, 48, - 59, 50, - 59, 66, - 59, 70, - 59, 74, - 59, 80, - 59, 86, - 59, 88, - 59, 90, - 60, 43, - 67, 87, - 67, 88, - 67, 90, - 70, 90, - 71, 3, - 71, 8, - 71, 10, - 71, 62, - 71, 72, - 71, 94, - 76, 70, - 80, 87, - 80, 88, - 80, 89, - 80, 90, - 81, 88, - 83, 13, - 83, 15, - 83, 68, - 83, 69, - 83, 70, - 83, 71, - 83, 76, - 83, 80, - 83, 82, - 83, 85, - 83, 86, - 83, 87, - 83, 88, - 83, 89, - 83, 90, - 83, 91, - 87, 13, - 87, 15, - 87, 66, - 87, 68, - 87, 69, - 87, 70, - 87, 80, - 87, 82, - 88, 13, - 88, 15, - 88, 68, - 88, 69, - 88, 70, - 88, 82, - 89, 68, - 89, 69, - 89, 70, - 89, 80, - 89, 82, - 90, 13, - 90, 15, - 90, 68, - 90, 69, - 90, 70, - 90, 80, - 90, 82, - 91, 68, - 91, 69, - 91, 70, - 91, 80, - 92, 43 + 0, 1, 0, 2, 0, 0, 0, 0, + 2, 3, 0, 0, 0, 4, 0, 4, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 7, 8, 9, 10, 11, + 0, 12, 12, 13, 14, 15, 12, 12, + 9, 16, 17, 18, 0, 19, 13, 20, + 21, 22, 23, 24, 25, 0, 0, 0, + 0, 0, 26, 27, 28, 0, 29, 30, + 0, 31, 0, 0, 32, 0, 31, 31, + 33, 27, 0, 34, 0, 35, 0, 36, + 37, 38, 36, 39, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; -/* Kerning between the respective left and right glyphs - * 4.4 format which needs to scaled with `kern_scale`*/ -static const int8_t kern_pair_values[] = +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { - -12, 5, 5, 6, 1, -4, 0, 1, - 0, 1, -5, 1, -1, -1, -1, 0, - -2, -2, 1, -2, -2, -3, -2, 0, - -2, 0, 1, 2, 1, 0, -3, 1, - 0, 0, -4, 4, 2, 0, -10, 2, - 0, -3, 1, 2, 1, 0, 0, 1, - -3, 0, -5, -3, 3, 1, 0, -5, - 1, 5, -20, -4, -5, 5, -3, -1, - 0, -3, 1, 3, 1, 0, 0, -5, - -1, 1, 0, 0, -6, 1, -5, -5, - -5, -5, -19, -6, -18, -12, -20, 1, - -2, -3, -3, -2, -3, -2, 0, -8, - -3, -10, -8, 3, -20, 1, 0, 0, - 1, 0, 1, 1, -1, -1, -1, -1, - -1, -1, -1, 1, -1, -5, -3, 0, - 1, 1, 1, 2, 2, 2, -1, -5, - -5, -5, -5, -4, -1, -1, -1, -1, - -2, -2, -5, -2, -4, -2, -5, -4, - -7, -6, 1, -6, 1, -38, -38, -15, - -9, -5, -1, -1, -5, -7, -6, -6, - 0, 1, 0, 0, 0, 0, 0, -1, - -1, -1, -1, 0, -1, -1, -2, -1, - -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, 0, -1, -1, -1, -7, -7, - -8, -7, -1, -7, -1, -7, -1, -6, - -10, -10, 5, -5, -6, -6, -6, -19, - -6, -23, -14, -22, 0, -4, -11, -14, - -1, -1, -1, -1, -1, -1, 0, -1, - -1, 0, -5, -7, -6, -3, -6, -7, - 0, 0, 0, 0, 0, -1, 0, 0, - 1, 0, 1, 0, -1, 1, -2, -42, - -42, -14, -1, -1, -1, -3, -3, 0, - -1, -1, -1, -3, 0, -1, 4, 4, - 4, -8, -2, -7, -5, 3, -9, 0, - 0, -1, -1, -2, -1, -5, -2, -5, - -4, -12, 0, -2, -2, -1, 0, 0, - 0, -1, -1, -1, 0, 0, 0, 0, - 1, 1, -20, -20, -20, -19, -19, -20, - -6, -7, -7, -7, -4, 4, 4, 4, - 3, 4, -20, -20, -1, -17, -20, -17, - -19, -17, -12, -12, -15, -6, -2, 0, - -1, -1, -1, -1, -1, -1, 0, -2, - -2, 5, -22, -9, -22, -8, -8, -19, - -5, -5, -6, -5, 4, -12, -11, -12, - -8, -7, -3, 5, 4, -15, -5, -15, - -5, -6, -14, -3, -3, -4, -3, 4, - 3, -8, -8, -8, -5, -5, -1, 4, - -6, -6, -6, -6, -7, -5, -8, 5, - -23, -13, -23, -11, -11, -21, -7, -7, - -7, -7, 4, 5, 4, 3, 5, 5, - -16, -17, -17, -16, -6, -10, -5, 5, - 3, -6, -6, -7, -6, 0, -5, -1, - -5, -5, -7, -7, -5, -3, -2, -3, - -3, 4, 4, 5, 5, -6, 5, -5, - -4, -2, -5, -4, -2, -16, -16, -5, - -4, -5, 4, 0, -5, -4, 4, 0, - 5, 4, 2, 5, 1, -15, -15, -4, - -3, -3, -3, -4, -3, -12, -11, -2, - -2, -3, -2, -5, -5, -5, -5, -5, - -17, -16, -4, -4, -4, -4, -5, -4, - -4, -4, -4, -5 + 0, 1, 0, 2, 0, 0, 0, 3, + 2, 0, 4, 5, 0, 6, 7, 6, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 10, 0, 11, 0, 0, 0, + 11, 0, 0, 12, 0, 0, 0, 0, + 11, 0, 11, 0, 13, 14, 15, 16, + 17, 18, 19, 20, 0, 0, 21, 0, + 0, 0, 22, 0, 23, 23, 23, 24, + 23, 0, 0, 0, 0, 0, 25, 25, + 26, 25, 23, 27, 28, 29, 30, 31, + 32, 33, 31, 34, 0, 0, 35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; -/*Collect the kern pair's data in one place*/ -static const lv_font_fmt_txt_kern_pair_t kern_pairs = +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { - .glyph_ids = kern_pair_glyph_ids, - .values = kern_pair_values, - .pair_cnt = 484, - .glyph_ids_size = 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, -13, 0, 0, 0, + 0, 0, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, -7, 0, -2, -8, 0, -10, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 2, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -28, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -15, 0, 0, 0, 0, 0, 0, -8, + 0, -1, 0, 0, -16, -2, -11, -9, + 0, -12, 0, 0, 0, 0, 0, 0, + -1, 0, 0, -2, -1, -6, -4, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, -3, 0, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -2, + 0, 0, 0, 0, 0, -13, 0, 0, + 0, -3, 0, 0, 0, -3, 0, -3, + 0, -3, -5, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, -2, -2, 0, -2, 0, 0, 0, + -2, -3, -3, 0, 0, 0, 0, 0, + 0, 0, 0, -29, 0, 0, 0, -21, + 0, -33, 0, 3, 0, 0, 0, 0, + 0, 0, 0, -4, -3, 0, 0, -3, + -3, 0, 0, -3, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, -4, 0, + 0, 0, 2, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, -3, + -3, 0, 0, 0, -3, -5, -8, 0, + 0, 0, 0, -42, 0, 0, 0, 0, + 0, 0, 0, 2, -8, 0, 0, -34, + -7, -22, -18, 0, -30, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + -17, -11, 0, 0, 0, 0, 0, 0, + 0, 0, -40, 0, 0, 0, -17, 0, + -25, 0, 0, 0, 0, 0, -4, 0, + -3, 0, -1, -2, 0, 0, -2, 0, + 0, 2, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -5, 0, -3, + -2, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -10, 0, -2, 0, 0, -6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -5, 0, + 0, 0, 0, -27, -29, 0, 0, -10, + -3, -30, -2, 2, 0, 2, 2, 0, + 2, 0, 0, -14, -12, 0, -14, -12, + -9, -14, 0, -12, -9, -7, -10, -7, + 0, 0, 0, 0, 3, 0, -28, -5, + 0, 0, -9, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, -6, -5, + 0, 0, -6, -4, 0, 0, -3, -1, + 0, 0, 0, 2, 0, 0, 0, 2, + 0, -15, -7, 0, 0, -5, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 2, -4, -4, 0, 0, -4, -3, 0, + 0, -2, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, -6, 0, 0, + 0, -3, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + -3, 0, 0, 0, -3, -4, 0, 0, + 0, 0, 0, 0, -4, 3, -6, -26, + -6, 0, 0, -12, -4, -12, -2, 2, + -12, 2, 2, 2, 2, 0, 2, -9, + -8, -3, -5, -8, -5, -7, -3, -5, + -2, 0, -3, -4, 2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, 0, 0, -3, 0, + 0, 0, -2, -3, -3, 0, 0, 0, + 0, 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, 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, 0, + 0, -2, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 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, -2, -2, + 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, 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, -2, 0, 0, 0, 0, 0, + 2, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, -13, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 0, 0, 0, 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, + -3, -2, 0, 0, 2, 0, 0, 0, + -15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, -2, 2, 0, -2, 0, 0, 6, + 0, 2, 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, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 0, 0, 0, -13, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -2, -2, + 2, 0, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, + 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 = 40, + .right_class_cnt = 35, }; /*-------------------- @@ -2240,12 +2089,12 @@ 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_scale = 16, - .kern_dsc = &kern_pairs, - .kern_classes = 0 + .kern_classes = 1, + .bitmap_format = 0 }; @@ -2255,11 +2104,13 @@ static lv_font_fmt_txt_dsc_t font_dsc = { /*Initialize a public general font descriptor*/ lv_font_t lv_font_roboto_16 = { - .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .line_height = 18, /*The maximum line height required by the font*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 19, /*The maximum line height required by the font*/ .base_line = 4, /*Baseline measured from the bottom of the line*/ + .subpx = LV_FONT_SUBPX_NONE, + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; #endif /*#if LV_FONT_ROBOTO_16*/ + diff --git a/src/lv_font/lv_font_roboto_22.c b/src/lv_font/lv_font_roboto_22.c index 5b5f2f866..f7bdac057 100644 --- a/src/lv_font/lv_font_roboto_22.c +++ b/src/lv_font/lv_font_roboto_22.c @@ -3,7 +3,7 @@ /******************************************************************************* * Size: 22 px * Bpp: 4 - * Opts: + * Opts: --no-compress --no-prefilter --bpp 4 --size 22 --font Roboto-Regular.woff -r 0x20-0x7F --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 lv_font_roboto_22.c --force-fast-kern-format ******************************************************************************/ #ifndef LV_FONT_ROBOTO_22 @@ -21,2379 +21,2736 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { /* U+20 " " */ /* U+21 "!" */ - 0x3b, 0xb4, 0xff, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, - 0xff, 0x4f, 0xf4, 0xff, 0x4f, 0xf4, 0xff, 0x3c, - 0xc0, 0x0, 0x0, 0x1, 0x33, 0x4f, 0xf4, 0xff, + 0x3f, 0xd0, 0x2f, 0xd0, 0x2f, 0xd0, 0x2f, 0xd0, + 0x2f, 0xd0, 0x2f, 0xc0, 0x2f, 0xc0, 0x1f, 0xc0, + 0x1f, 0xc0, 0x1f, 0xc0, 0x1f, 0xb0, 0x6, 0x40, + 0x0, 0x0, 0x3, 0x20, 0x2f, 0xf0, 0x1e, 0xc0, /* U+22 "\"" */ - 0x9b, 0x63, 0xb9, 0xcf, 0x84, 0xfc, 0xcf, 0x84, - 0xfc, 0xcf, 0x64, 0xfb, 0xcf, 0x14, 0xf5, 0xc9, - 0x4, 0xe0, + 0x8f, 0xa, 0xe8, 0xf0, 0xad, 0x8e, 0xa, 0xc8, + 0xc0, 0xab, 0x8b, 0xa, 0x93, 0x40, 0x33, /* U+23 "#" */ - 0x0, 0x0, 0x6, 0xb0, 0x3, 0xb6, 0x0, 0x0, - 0x0, 0xce, 0x0, 0x6f, 0x40, 0x0, 0x0, 0xf, - 0xb0, 0x9, 0xf1, 0x0, 0x0, 0x2, 0xf8, 0x0, - 0xce, 0x0, 0x2, 0x33, 0x6f, 0x63, 0x3f, 0xc3, - 0x30, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x2, - 0x44, 0xdf, 0x44, 0x8f, 0x74, 0x30, 0x0, 0xf, - 0xc0, 0x8, 0xf1, 0x0, 0x0, 0x1, 0xf8, 0x0, - 0xce, 0x0, 0x0, 0x0, 0x4f, 0x50, 0xf, 0xb0, - 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2, - 0x88, 0xef, 0x88, 0xbf, 0xa8, 0x80, 0x0, 0xe, - 0xc0, 0x8, 0xf2, 0x0, 0x0, 0x1, 0xf8, 0x0, - 0xcf, 0x0, 0x0, 0x0, 0x4f, 0x50, 0xf, 0xc0, - 0x0, 0x0, 0x8, 0xf2, 0x2, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xe0, 0x3, 0xf5, 0x0, 0x0, + 0x0, 0xdb, 0x0, 0x7f, 0x10, 0x0, 0x0, 0xf, + 0x80, 0xa, 0xe0, 0x0, 0x0, 0x4, 0xf4, 0x0, + 0xea, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x38, 0x8d, 0xe8, 0x8a, 0xf9, 0x85, 0x0, + 0x0, 0xdb, 0x0, 0x7f, 0x10, 0x0, 0x0, 0xf, + 0x80, 0xa, 0xe0, 0x0, 0x0, 0x2, 0xf5, 0x0, + 0xcb, 0x0, 0x0, 0x22, 0x6f, 0x52, 0x2f, 0xa2, + 0x20, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1, + 0x55, 0xdd, 0x55, 0x9f, 0x75, 0x40, 0x0, 0xe, + 0xa0, 0x8, 0xf0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0xbd, 0x0, 0x0, 0x0, 0x4f, 0x40, 0xe, 0xa0, + 0x0, 0x0, 0x7, 0xf1, 0x1, 0xf7, 0x0, 0x0, /* U+24 "$" */ - 0x0, 0x0, 0x13, 0x20, 0x0, 0x0, 0x0, 0x4, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4f, 0x80, 0x0, - 0x0, 0x1, 0x6c, 0xfd, 0x61, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xd3, 0x0, 0xaf, 0xd2, 0x1, 0xdf, - 0xb0, 0xe, 0xf4, 0x0, 0x2, 0xff, 0x0, 0xff, - 0x10, 0x0, 0xf, 0xf4, 0xe, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xe6, 0x0, 0x0, 0x0, 0x0, - 0xbf, 0xfe, 0x82, 0x0, 0x0, 0x0, 0x5c, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x2, 0xaf, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xf3, 0x47, 0x40, 0x0, - 0x0, 0xcf, 0x58, 0xfa, 0x0, 0x0, 0xd, 0xf4, - 0x3f, 0xf3, 0x0, 0x5, 0xff, 0x20, 0xbf, 0xfa, - 0x7b, 0xff, 0x80, 0x0, 0x8e, 0xff, 0xfe, 0x70, - 0x0, 0x0, 0x9, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0x40, 0x0, 0x0, 0x0, 0x2, 0x41, 0x0, - 0x0, + 0x0, 0x0, 0x6f, 0x30, 0x0, 0x0, 0x0, 0x6, + 0xf3, 0x0, 0x0, 0x0, 0x4, 0xbf, 0xa3, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xf9, 0x0, 0x9, 0xfc, + 0x42, 0x6f, 0xf5, 0x1, 0xff, 0x10, 0x0, 0x6f, + 0xc0, 0x3f, 0xc0, 0x0, 0x1, 0xff, 0x2, 0xfe, + 0x0, 0x0, 0x8, 0x80, 0xe, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xfd, 0x60, 0x0, 0x0, 0x0, + 0x4e, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x5, 0xbf, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x3d, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xf1, 0xcf, 0x30, 0x0, + 0x0, 0xdf, 0x2a, 0xf7, 0x0, 0x0, 0xf, 0xf1, + 0x4f, 0xf4, 0x0, 0x1a, 0xfc, 0x0, 0x9f, 0xfe, + 0xdf, 0xfe, 0x20, 0x0, 0x5b, 0xff, 0xc8, 0x10, + 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0x0, 0x0, 0x0, /* U+25 "%" */ - 0x4, 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xfb, 0x8e, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xce, - 0x0, 0x2f, 0x70, 0x1, 0xd5, 0x0, 0xc, 0xc0, - 0x0, 0xf8, 0x0, 0xaf, 0x10, 0x0, 0xcc, 0x0, - 0xf, 0x80, 0x4f, 0x60, 0x0, 0xa, 0xf3, 0x7, - 0xf4, 0xe, 0xc0, 0x0, 0x0, 0x1d, 0xff, 0xf9, - 0x8, 0xf2, 0x0, 0x0, 0x0, 0x4, 0x53, 0x2, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xce, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x42, - 0xbf, 0xf9, 0x10, 0x0, 0x0, 0x1e, 0xa0, 0xdf, - 0x56, 0xfa, 0x0, 0x0, 0xa, 0xf1, 0x4f, 0x60, - 0x9, 0xf0, 0x0, 0x4, 0xf6, 0x4, 0xf4, 0x0, - 0x8f, 0x40, 0x0, 0xec, 0x0, 0x4f, 0x50, 0x8, - 0xf1, 0x0, 0x19, 0x20, 0x0, 0xec, 0x34, 0xdc, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfd, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, + 0x6, 0xef, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xf9, 0x5c, 0xe1, 0x0, 0x0, 0x0, 0x0, 0xcc, + 0x0, 0x1f, 0x60, 0x2, 0xf3, 0x0, 0xd, 0x90, + 0x0, 0xf8, 0x0, 0xcc, 0x0, 0x0, 0xcb, 0x0, + 0xf, 0x70, 0x6f, 0x20, 0x0, 0x8, 0xf5, 0x19, + 0xf2, 0x1f, 0x80, 0x0, 0x0, 0xa, 0xff, 0xf6, + 0xa, 0xd0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x4, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xea, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0x11, + 0xbf, 0xfa, 0x10, 0x0, 0x0, 0x3f, 0x60, 0xce, + 0x56, 0xeb, 0x0, 0x0, 0xc, 0xc0, 0x2f, 0x50, + 0x7, 0xf0, 0x0, 0x7, 0xf2, 0x3, 0xf3, 0x0, + 0x5f, 0x20, 0x1, 0xf8, 0x0, 0x2f, 0x50, 0x7, + 0xf0, 0x0, 0x6, 0x0, 0x0, 0xce, 0x67, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xae, 0xe9, 0x0, /* U+26 "&" */ - 0x0, 0x2, 0x9b, 0xb9, 0x10, 0x0, 0x0, 0x0, - 0x3f, 0xfe, 0xef, 0xe1, 0x0, 0x0, 0x0, 0xbf, - 0xb0, 0x9, 0xfa, 0x0, 0x0, 0x0, 0xef, 0x40, - 0x4, 0xfc, 0x0, 0x0, 0x0, 0xef, 0x50, 0x6, - 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xa0, 0x6e, 0xf2, - 0x0, 0x0, 0x0, 0x1f, 0xfb, 0xfd, 0x30, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xb1, 0x0, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xe2, 0x0, 0x4, 0x30, 0x8, - 0xff, 0x3a, 0xfc, 0x10, 0xf, 0xc0, 0x2f, 0xf3, - 0x0, 0xdf, 0xa0, 0x4f, 0xb0, 0x4f, 0xd0, 0x0, - 0x1f, 0xf9, 0xaf, 0x60, 0x3f, 0xe0, 0x0, 0x3, - 0xff, 0xff, 0x10, 0xf, 0xf7, 0x0, 0x0, 0xaf, - 0xf6, 0x0, 0x5, 0xff, 0x97, 0x7c, 0xff, 0xfe, - 0x20, 0x0, 0x4d, 0xff, 0xff, 0xa2, 0xaf, 0xc1, - 0x0, 0x0, 0x3, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x19, 0xef, 0xc4, 0x0, 0x0, 0x0, 0xd, + 0xfd, 0xbf, 0xf5, 0x0, 0x0, 0x7, 0xfb, 0x0, + 0x2f, 0xd0, 0x0, 0x0, 0x9f, 0x60, 0x0, 0xef, + 0x0, 0x0, 0x8, 0xf7, 0x0, 0x3f, 0xb0, 0x0, + 0x0, 0x3f, 0xe1, 0x4e, 0xf3, 0x0, 0x0, 0x0, + 0x9f, 0xdf, 0xe3, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0x4, 0xff, 0xef, 0x60, + 0x0, 0x53, 0x3, 0xff, 0x53, 0xff, 0x40, 0x3f, + 0xa0, 0xbf, 0x70, 0x5, 0xfe, 0x25, 0xf8, 0xe, + 0xf1, 0x0, 0x8, 0xfd, 0xbf, 0x40, 0xdf, 0x30, + 0x0, 0xa, 0xff, 0xd0, 0x8, 0xfa, 0x0, 0x0, + 0x5f, 0xf9, 0x0, 0xc, 0xfd, 0x87, 0xbf, 0xff, + 0xf5, 0x0, 0x6, 0xcf, 0xfd, 0x92, 0x3f, 0xf3, /* U+27 "'" */ - 0x9b, 0x6c, 0xf8, 0xcf, 0x8c, 0xf3, 0xce, 0x9, - 0x70, + 0xeb, 0xeb, 0xea, 0xe9, 0xe8, 0x31, /* U+28 "(" */ - 0x0, 0x0, 0x4, 0x0, 0x0, 0xa, 0xf1, 0x0, - 0x8, 0xf6, 0x0, 0x4, 0xfa, 0x0, 0x0, 0xef, - 0x20, 0x0, 0x5f, 0x90, 0x0, 0xb, 0xf5, 0x0, - 0x1, 0xff, 0x0, 0x0, 0x4f, 0xc0, 0x0, 0x5, - 0xfc, 0x0, 0x0, 0x8f, 0xa0, 0x0, 0x8, 0xf8, - 0x0, 0x0, 0x8f, 0x80, 0x0, 0x7, 0xfc, 0x0, - 0x0, 0x4f, 0xc0, 0x0, 0x3, 0xfd, 0x0, 0x0, - 0xe, 0xf3, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x1, - 0xfd, 0x0, 0x0, 0x8, 0xf6, 0x0, 0x0, 0xd, - 0xe2, 0x0, 0x0, 0x2f, 0xc1, 0x0, 0x0, 0x1c, - 0x0, + 0x0, 0x0, 0x18, 0x0, 0x0, 0x1d, 0xe0, 0x0, + 0xc, 0xe2, 0x0, 0x7, 0xf5, 0x0, 0x0, 0xfd, + 0x0, 0x0, 0x6f, 0x60, 0x0, 0xc, 0xf1, 0x0, + 0x0, 0xfd, 0x0, 0x0, 0x4f, 0xa0, 0x0, 0x6, + 0xf8, 0x0, 0x0, 0x7f, 0x70, 0x0, 0x8, 0xf6, + 0x0, 0x0, 0x8f, 0x70, 0x0, 0x6, 0xf8, 0x0, + 0x0, 0x5f, 0x90, 0x0, 0x1, 0xfc, 0x0, 0x0, + 0xd, 0xf0, 0x0, 0x0, 0x8f, 0x50, 0x0, 0x1, + 0xfb, 0x0, 0x0, 0x9, 0xf3, 0x0, 0x0, 0x1e, + 0xd0, 0x0, 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x3c, + 0x0, 0x0, 0x0, 0x0, /* U+29 ")" */ - 0x40, 0x0, 0x0, 0xdc, 0x10, 0x0, 0x3f, 0xb0, - 0x0, 0x6, 0xf8, 0x0, 0x0, 0xef, 0x20, 0x0, - 0x6f, 0x90, 0x0, 0x1f, 0xd0, 0x0, 0xd, 0xf5, - 0x0, 0x8, 0xf8, 0x0, 0x8, 0xf9, 0x0, 0x6, - 0xfc, 0x0, 0x4, 0xfc, 0x0, 0x4, 0xfc, 0x0, - 0x8, 0xfa, 0x0, 0x8, 0xf8, 0x0, 0xa, 0xf7, - 0x0, 0xf, 0xf1, 0x0, 0x3f, 0xb0, 0x0, 0xaf, - 0x50, 0x2, 0xfc, 0x0, 0xb, 0xf2, 0x0, 0xaf, - 0x50, 0x0, 0xa3, 0x0, 0x0, + 0x45, 0x0, 0x0, 0x5, 0xf7, 0x0, 0x0, 0x8, + 0xf4, 0x0, 0x0, 0xd, 0xe0, 0x0, 0x0, 0x5f, + 0x70, 0x0, 0x0, 0xee, 0x0, 0x0, 0x9, 0xf4, + 0x0, 0x0, 0x5f, 0x80, 0x0, 0x2, 0xfc, 0x0, + 0x0, 0xf, 0xe0, 0x0, 0x0, 0xff, 0x0, 0x0, + 0xe, 0xf1, 0x0, 0x0, 0xff, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x1, 0xfd, 0x0, 0x0, 0x4f, 0x90, + 0x0, 0x8, 0xf5, 0x0, 0x0, 0xcf, 0x10, 0x0, + 0x2f, 0x90, 0x0, 0xa, 0xf2, 0x0, 0x4, 0xf7, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x69, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, /* U+2A "*" */ - 0x0, 0x8, 0x40, 0x0, 0x0, 0xf, 0x80, 0x0, - 0x86, 0x1f, 0x83, 0x82, 0xef, 0xff, 0xef, 0xf7, - 0x4, 0xdf, 0xf8, 0x30, 0x4, 0xfd, 0xf9, 0x0, - 0x1f, 0xf1, 0xbf, 0x50, 0x4, 0x50, 0x19, 0x0, + 0x0, 0x0, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xf8, + 0x0, 0x0, 0x23, 0x0, 0xf8, 0x0, 0x30, 0x8f, + 0xd7, 0xfa, 0x9e, 0xe0, 0x38, 0xdf, 0xff, 0xfc, + 0x70, 0x0, 0xb, 0xff, 0x20, 0x0, 0x0, 0x6f, + 0x8f, 0xc0, 0x0, 0x2, 0xfc, 0x7, 0xf7, 0x0, + 0x3, 0xd2, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, /* U+2B "+" */ - 0x0, 0x0, 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xf4, 0x0, 0x0, - 0x27, 0x77, 0x7d, 0xf9, 0x77, 0x74, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x28, 0x88, 0x8e, 0xfa, - 0x88, 0x84, 0x0, 0x0, 0xc, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x6, 0x82, 0x0, 0x0, + 0x0, 0x0, 0x6, 0x81, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf3, 0x0, 0x0, 0x2e, 0xee, + 0xef, 0xfe, 0xee, 0xe8, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0xc, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xc, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf3, 0x0, 0x0, /* U+2C "," */ - 0x33, 0x2c, 0xf8, 0xcf, 0x8c, 0xf3, 0xcd, 0x9, - 0x50, + 0xa, 0xf5, 0xa, 0xf4, 0xb, 0xf3, 0x1f, 0xd0, + 0x7f, 0x50, 0x5, 0x0, /* U+2D "-" */ - 0x16, 0x66, 0x66, 0x60, 0x3f, 0xff, 0xff, 0xf1, - 0x3, 0x33, 0x33, 0x30, + 0x6a, 0xaa, 0xa6, 0x9f, 0xff, 0xfa, /* U+2E "." */ - 0x2, 0x24, 0xfd, 0x4f, 0xd0, + 0x5, 0x20, 0x5f, 0xe0, 0x3e, 0xb0, /* U+2F "/" */ - 0x0, 0x0, 0x0, 0x5b, 0x50, 0x0, 0x0, 0xc, - 0xf1, 0x0, 0x0, 0x2, 0xfb, 0x0, 0x0, 0x0, - 0x8f, 0x50, 0x0, 0x0, 0xe, 0xe0, 0x0, 0x0, - 0x5, 0xf9, 0x0, 0x0, 0x0, 0xaf, 0x20, 0x0, - 0x0, 0x1f, 0xc0, 0x0, 0x0, 0x7, 0xf6, 0x0, - 0x0, 0x0, 0xdf, 0x10, 0x0, 0x0, 0x3f, 0xa0, - 0x0, 0x0, 0xa, 0xf3, 0x0, 0x0, 0x0, 0xfe, - 0x0, 0x0, 0x0, 0x6f, 0x70, 0x0, 0x0, 0xc, - 0xf1, 0x0, 0x0, 0x2, 0xfb, 0x0, 0x0, 0x0, - 0x8f, 0x50, 0x0, 0x0, 0x3, 0x40, 0x0, 0x0, - 0x0, + 0x0, 0x0, 0x0, 0x7f, 0x30, 0x0, 0x0, 0xd, + 0xd0, 0x0, 0x0, 0x3, 0xf7, 0x0, 0x0, 0x0, + 0xaf, 0x10, 0x0, 0x0, 0xf, 0xb0, 0x0, 0x0, + 0x6, 0xf5, 0x0, 0x0, 0x0, 0xce, 0x0, 0x0, + 0x0, 0x2f, 0x80, 0x0, 0x0, 0x8, 0xf2, 0x0, + 0x0, 0x0, 0xec, 0x0, 0x0, 0x0, 0x5f, 0x60, + 0x0, 0x0, 0xb, 0xf0, 0x0, 0x0, 0x1, 0xfa, + 0x0, 0x0, 0x0, 0x7f, 0x30, 0x0, 0x0, 0xd, + 0xd0, 0x0, 0x0, 0x3, 0xf7, 0x0, 0x0, 0x0, + 0x9f, 0x10, 0x0, 0x0, 0x0, /* U+30 "0" */ - 0x0, 0x17, 0xbb, 0x94, 0x0, 0x0, 0x3e, 0xff, - 0xef, 0xf8, 0x0, 0xe, 0xf6, 0x0, 0x3f, 0xf4, - 0x6, 0xfc, 0x0, 0x0, 0x6f, 0xb0, 0x9f, 0x80, - 0x0, 0x0, 0xff, 0xc, 0xf4, 0x0, 0x0, 0xf, - 0xf2, 0xcf, 0x40, 0x0, 0x0, 0xff, 0x4c, 0xf4, - 0x0, 0x0, 0xf, 0xf4, 0xcf, 0x40, 0x0, 0x0, - 0xff, 0x4c, 0xf4, 0x0, 0x0, 0xf, 0xf4, 0xcf, - 0x40, 0x0, 0x0, 0xff, 0x3a, 0xf7, 0x0, 0x0, - 0xf, 0xf0, 0x8f, 0x90, 0x0, 0x2, 0xfe, 0x2, - 0xfe, 0x30, 0x0, 0xbf, 0x80, 0x8, 0xfe, 0x87, - 0xbf, 0xd0, 0x0, 0x5, 0xef, 0xff, 0x91, 0x0, - 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, + 0x0, 0x4c, 0xff, 0xd7, 0x0, 0x0, 0x6f, 0xfc, + 0xbe, 0xfb, 0x0, 0x1f, 0xf3, 0x0, 0xc, 0xf5, + 0x6, 0xfa, 0x0, 0x0, 0x4f, 0xb0, 0x9f, 0x50, + 0x0, 0x0, 0xfe, 0xb, 0xf4, 0x0, 0x0, 0xe, + 0xf0, 0xcf, 0x30, 0x0, 0x0, 0xef, 0x1c, 0xf3, + 0x0, 0x0, 0xe, 0xf1, 0xcf, 0x30, 0x0, 0x0, + 0xef, 0x1b, 0xf3, 0x0, 0x0, 0xe, 0xf1, 0xbf, + 0x40, 0x0, 0x0, 0xef, 0x9, 0xf6, 0x0, 0x0, + 0xf, 0xe0, 0x5f, 0xa0, 0x0, 0x4, 0xfb, 0x0, + 0xff, 0x40, 0x0, 0xdf, 0x50, 0x5, 0xff, 0xba, + 0xef, 0xb0, 0x0, 0x4, 0xbf, 0xfd, 0x80, 0x0, /* U+31 "1" */ - 0x47, 0x79, 0xb9, 0xff, 0xff, 0xfc, 0x44, 0x4a, - 0xfc, 0x0, 0x8, 0xfc, 0x0, 0x8, 0xfc, 0x0, - 0x8, 0xfc, 0x0, 0x8, 0xfc, 0x0, 0x8, 0xfc, - 0x0, 0x8, 0xfc, 0x0, 0x8, 0xfc, 0x0, 0x8, - 0xfc, 0x0, 0x8, 0xfc, 0x0, 0x8, 0xfc, 0x0, - 0x8, 0xfc, 0x0, 0x8, 0xfc, 0x0, 0x8, 0xfc, + 0x0, 0x0, 0x39, 0xc0, 0x17, 0xdf, 0xfd, 0x2f, + 0xff, 0xbf, 0xd2, 0xc6, 0x2, 0xfd, 0x0, 0x0, + 0x2f, 0xd0, 0x0, 0x2, 0xfd, 0x0, 0x0, 0x2f, + 0xd0, 0x0, 0x2, 0xfd, 0x0, 0x0, 0x2f, 0xd0, + 0x0, 0x2, 0xfd, 0x0, 0x0, 0x2f, 0xd0, 0x0, + 0x2, 0xfd, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x2, + 0xfd, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x2, 0xfd, /* U+32 "2" */ - 0x0, 0x17, 0xbb, 0xb5, 0x0, 0x0, 0x3e, 0xff, - 0xdf, 0xfc, 0x0, 0x1d, 0xf9, 0x0, 0x2e, 0xf7, - 0x5, 0xfd, 0x0, 0x0, 0x6f, 0xc0, 0x6c, 0x70, - 0x0, 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x7f, - 0xb0, 0x0, 0x0, 0x0, 0x1d, 0xf4, 0x0, 0x0, - 0x0, 0x9, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, - 0x10, 0x0, 0x0, 0x3, 0xef, 0x40, 0x0, 0x0, - 0x1, 0xef, 0x60, 0x0, 0x0, 0x1, 0xcf, 0xa0, - 0x0, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, - 0x8f, 0xd1, 0x0, 0x0, 0x0, 0x5f, 0xfc, 0xbb, - 0xbb, 0xbb, 0x38, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x0, 0x6c, 0xff, 0xd8, 0x0, 0x0, 0xbf, 0xfc, + 0xbf, 0xfc, 0x0, 0x6f, 0xd1, 0x0, 0x1d, 0xf7, + 0xc, 0xf4, 0x0, 0x0, 0x5f, 0xb0, 0xdd, 0x0, + 0x0, 0x3, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x0, 0x0, 0xc, 0xf3, 0x0, 0x0, + 0x0, 0x7, 0xfa, 0x0, 0x0, 0x0, 0x5, 0xfd, + 0x10, 0x0, 0x0, 0x3, 0xfe, 0x20, 0x0, 0x0, + 0x2, 0xef, 0x30, 0x0, 0x0, 0x1, 0xef, 0x50, + 0x0, 0x0, 0x0, 0xcf, 0x60, 0x0, 0x0, 0x0, + 0xbf, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xfa, 0xaa, + 0xaa, 0xaa, 0x5b, 0xff, 0xff, 0xff, 0xff, 0xf8, /* U+33 "3" */ - 0x0, 0x28, 0xbb, 0xb5, 0x0, 0x0, 0x6e, 0xff, - 0xdf, 0xfc, 0x0, 0x2e, 0xf7, 0x0, 0x2e, 0xf8, - 0x7, 0xfa, 0x0, 0x0, 0x5f, 0xc0, 0x48, 0x40, - 0x0, 0x4, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x5f, - 0xb0, 0x0, 0x0, 0x0, 0x2d, 0xf5, 0x0, 0x0, - 0x8f, 0xff, 0xf6, 0x0, 0x0, 0x6, 0xcc, 0xff, - 0xa1, 0x0, 0x0, 0x0, 0x1, 0xbf, 0x90, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xf1, 0x9f, 0x80, 0x0, 0x1, 0xff, 0x7, - 0xfd, 0x10, 0x0, 0x8f, 0xc0, 0xb, 0xfe, 0x77, - 0xaf, 0xf3, 0x0, 0x8, 0xff, 0xff, 0xc3, 0x0, - 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, + 0x0, 0x6c, 0xff, 0xc7, 0x0, 0xb, 0xff, 0xbb, + 0xff, 0xb0, 0x6f, 0xc1, 0x0, 0x1d, 0xf5, 0xbf, + 0x40, 0x0, 0x6, 0xf9, 0x34, 0x0, 0x0, 0x5, + 0xfa, 0x0, 0x0, 0x0, 0x9, 0xf7, 0x0, 0x0, + 0x1, 0x8f, 0xd0, 0x0, 0xd, 0xff, 0xfb, 0x10, + 0x0, 0x8, 0xac, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x1d, 0xf6, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x55, + 0x0, 0x0, 0x1, 0xfe, 0xef, 0x20, 0x0, 0x3, + 0xfc, 0x9f, 0xb0, 0x0, 0x1c, 0xf7, 0x1d, 0xfe, + 0xbb, 0xef, 0xb0, 0x0, 0x7d, 0xff, 0xc7, 0x0, /* U+34 "4" */ - 0x0, 0x0, 0x0, 0xa, 0xb6, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xf8, 0x0, 0x0, 0x0, 0x8, 0xfe, 0xf8, 0x0, - 0x0, 0x0, 0x3f, 0xe8, 0xf8, 0x0, 0x0, 0x0, - 0xcf, 0x48, 0xf8, 0x0, 0x0, 0x6, 0xfa, 0x8, - 0xf8, 0x0, 0x0, 0x1e, 0xf1, 0x8, 0xf8, 0x0, - 0x0, 0x9f, 0x70, 0x8, 0xf8, 0x0, 0x3, 0xfd, - 0x0, 0x8, 0xf8, 0x0, 0xc, 0xf6, 0x33, 0x39, - 0xf9, 0x33, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x28, 0x88, 0x88, 0x8c, 0xfc, 0x86, 0x0, 0x0, - 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xfb, 0x0, 0x0, 0x0, 0x9, 0xfa, 0xfb, 0x0, + 0x0, 0x0, 0x3f, 0xb5, 0xfb, 0x0, 0x0, 0x0, + 0xcf, 0x25, 0xfb, 0x0, 0x0, 0x6, 0xf8, 0x5, + 0xfb, 0x0, 0x0, 0x1e, 0xe0, 0x5, 0xfb, 0x0, + 0x0, 0xaf, 0x50, 0x5, 0xfb, 0x0, 0x3, 0xfb, + 0x0, 0x5, 0xfb, 0x0, 0xd, 0xf2, 0x0, 0x5, + 0xfb, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4a, 0xaa, 0xaa, 0xac, 0xfe, 0xa9, 0x0, 0x0, + 0x0, 0x5, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5, 0xfb, 0x0, /* U+35 "5" */ - 0x3, 0xbb, 0xbb, 0xbb, 0xb6, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0x80, 0x8, 0xfa, 0x44, 0x44, 0x42, - 0x0, 0x8f, 0x80, 0x0, 0x0, 0x0, 0xb, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0x40, 0x10, 0x0, - 0x0, 0xd, 0xf9, 0xef, 0xfa, 0x30, 0x0, 0xff, - 0xfc, 0xcf, 0xfe, 0x20, 0xf, 0xf3, 0x0, 0x1d, - 0xfa, 0x0, 0x23, 0x0, 0x0, 0x4f, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x20, 0x0, 0x0, 0x0, - 0xf, 0xf2, 0x4f, 0xc0, 0x0, 0x2, 0xff, 0x1, - 0xff, 0x20, 0x0, 0xbf, 0xb0, 0x8, 0xfe, 0x87, - 0xbf, 0xf2, 0x0, 0x7, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x2f, 0xfd, + 0xdd, 0xdd, 0xd0, 0x3, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0x70, 0x0, 0x0, 0x0, 0x7, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x79, 0xbb, 0x71, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x9f, + 0x81, 0x3, 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x20, 0x0, 0x0, 0x0, 0xa, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0x72, 0x74, 0x0, 0x0, + 0x9, 0xf6, 0x2f, 0xc0, 0x0, 0x0, 0xdf, 0x30, + 0xcf, 0x70, 0x0, 0x8f, 0xd0, 0x2, 0xef, 0xda, + 0xdf, 0xf3, 0x0, 0x2, 0x9e, 0xfe, 0xa2, 0x0, /* U+36 "6" */ - 0x0, 0x3, 0x8b, 0xbb, 0x61, 0x0, 0x7, 0xff, - 0xec, 0xff, 0x0, 0x4, 0xff, 0x30, 0x0, 0x30, - 0x0, 0xef, 0x40, 0x0, 0x0, 0x0, 0x4f, 0xd0, - 0x0, 0x0, 0x0, 0x6, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0x84, 0xae, 0xda, 0x30, 0x8, 0xfc, - 0xfc, 0xcd, 0xff, 0x50, 0x8f, 0xf3, 0x0, 0xa, - 0xfd, 0x8, 0xf8, 0x0, 0x0, 0x1e, 0xf4, 0x8f, - 0x90, 0x0, 0x0, 0xcf, 0x65, 0xfc, 0x0, 0x0, - 0xc, 0xf5, 0x3f, 0xe1, 0x0, 0x0, 0xef, 0x40, - 0xbf, 0x90, 0x0, 0x7f, 0xe0, 0x2, 0xff, 0xb7, - 0x9f, 0xf4, 0x0, 0x1, 0xbf, 0xff, 0xe4, 0x0, - 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5b, 0xef, 0x10, 0x0, 0x1, 0xcf, + 0xfd, 0xb1, 0x0, 0x0, 0xcf, 0xb2, 0x0, 0x0, + 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xf1, + 0x0, 0x0, 0x0, 0x2, 0xfb, 0x17, 0xa9, 0x50, + 0x0, 0x6f, 0xcf, 0xff, 0xff, 0xb0, 0x8, 0xff, + 0xb3, 0x3, 0xef, 0x80, 0x9f, 0xc0, 0x0, 0x3, + 0xfe, 0x9, 0xf6, 0x0, 0x0, 0xd, 0xf3, 0x8f, + 0x70, 0x0, 0x0, 0xbf, 0x46, 0xf9, 0x0, 0x0, + 0xc, 0xf3, 0x2f, 0xe0, 0x0, 0x1, 0xff, 0x0, + 0xaf, 0x90, 0x0, 0xaf, 0xa0, 0x1, 0xdf, 0xeb, + 0xef, 0xd1, 0x0, 0x1, 0x9e, 0xfe, 0x81, 0x0, /* U+37 "7" */ - 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x1, 0xef, - 0x20, 0x0, 0x0, 0x0, 0xcf, 0x50, 0x0, 0x0, - 0x0, 0x8f, 0x90, 0x0, 0x0, 0x0, 0x2f, 0xe0, - 0x0, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, 0x0, - 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x60, - 0x0, 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, 0x0, - 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x90, - 0x0, 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0xc, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0x80, 0x0, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x1a, 0xaa, + 0xaa, 0xaa, 0xae, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x50, + 0x0, 0x0, 0x0, 0x0, 0xee, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x20, 0x0, 0x0, 0x0, + 0x3, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0x70, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xe, 0xf2, 0x0, 0x0, 0x0, /* U+38 "8" */ - 0x0, 0x29, 0xbb, 0xa5, 0x0, 0x0, 0x6f, 0xff, - 0xdf, 0xfb, 0x0, 0x2e, 0xf8, 0x0, 0x3f, 0xf7, - 0x5, 0xfd, 0x0, 0x0, 0x7f, 0xb0, 0x8f, 0xc0, - 0x0, 0x4, 0xfc, 0x3, 0xfd, 0x0, 0x0, 0x9f, - 0xa0, 0xc, 0xf9, 0x10, 0x5e, 0xf2, 0x0, 0x18, - 0xff, 0xff, 0xd3, 0x0, 0x3, 0xcf, 0xec, 0xfe, - 0x70, 0x3, 0xef, 0x40, 0x1, 0xcf, 0x80, 0xbf, - 0x80, 0x0, 0x1, 0xff, 0x1d, 0xf4, 0x0, 0x0, - 0xe, 0xf4, 0xcf, 0x60, 0x0, 0x0, 0xff, 0x28, - 0xfc, 0x10, 0x0, 0x8f, 0xf0, 0x1d, 0xfe, 0x77, - 0xaf, 0xf4, 0x0, 0x18, 0xff, 0xff, 0xc4, 0x0, - 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, + 0x0, 0x4b, 0xff, 0xd7, 0x0, 0x0, 0x7f, 0xfc, + 0xbf, 0xfc, 0x0, 0x1f, 0xf4, 0x0, 0x1d, 0xf6, + 0x5, 0xfb, 0x0, 0x0, 0x5f, 0xb0, 0x6f, 0x90, + 0x0, 0x4, 0xfb, 0x3, 0xfd, 0x0, 0x0, 0x7f, + 0x80, 0xb, 0xf9, 0x10, 0x5f, 0xe1, 0x0, 0xa, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xef, 0xcb, 0xef, + 0x80, 0x2, 0xfe, 0x20, 0x0, 0xbf, 0x70, 0x9f, + 0x60, 0x0, 0x1, 0xff, 0xc, 0xf3, 0x0, 0x0, + 0xe, 0xf1, 0xbf, 0x50, 0x0, 0x0, 0xff, 0x6, + 0xfd, 0x10, 0x0, 0x9f, 0xb0, 0xb, 0xff, 0xbb, + 0xef, 0xe2, 0x0, 0x6, 0xcf, 0xfd, 0x81, 0x0, /* U+39 "9" */ - 0x0, 0x39, 0xbb, 0x72, 0x0, 0x6, 0xff, 0xef, - 0xfe, 0x60, 0x3f, 0xf5, 0x0, 0x6f, 0xe1, 0xbf, - 0x80, 0x0, 0xa, 0xf9, 0xdf, 0x40, 0x0, 0x5, - 0xfc, 0xff, 0x20, 0x0, 0x4, 0xfd, 0xef, 0x40, - 0x0, 0x4, 0xff, 0xbf, 0x80, 0x0, 0x6, 0xff, - 0x4f, 0xe6, 0x0, 0x6e, 0xff, 0x7, 0xff, 0xff, - 0xfd, 0xff, 0x0, 0x38, 0xcb, 0x54, 0xff, 0x0, - 0x0, 0x0, 0x5, 0xfc, 0x0, 0x0, 0x0, 0xa, - 0xf9, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0xb, 0x97, - 0x79, 0xff, 0x70, 0xa, 0xff, 0xff, 0xe4, 0x0, - 0x0, 0x3, 0x40, 0x0, 0x0, + 0x0, 0x5c, 0xfe, 0xb3, 0x0, 0x9, 0xff, 0xbc, + 0xff, 0x50, 0x4f, 0xe2, 0x0, 0x5f, 0xf1, 0xaf, + 0x60, 0x0, 0x9, 0xf7, 0xdf, 0x20, 0x0, 0x4, + 0xfb, 0xef, 0x10, 0x0, 0x1, 0xfd, 0xcf, 0x30, + 0x0, 0x1, 0xfe, 0x9f, 0x80, 0x0, 0x7, 0xfe, + 0x2f, 0xf7, 0x1, 0x8f, 0xfd, 0x6, 0xff, 0xff, + 0xf9, 0xfb, 0x0, 0x28, 0xa8, 0x24, 0xf8, 0x0, + 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, 0x2f, + 0xd0, 0x0, 0x0, 0x5, 0xef, 0x50, 0x0, 0x8c, + 0xff, 0xf6, 0x0, 0x0, 0xbe, 0xc8, 0x20, 0x0, /* U+3A ":" */ - 0x13, 0x34, 0xfc, 0x4f, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x4f, - 0xc4, 0xfc, + 0x4f, 0x97, 0xfd, 0x5, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x7f, + 0xd4, 0xf9, /* U+3B ";" */ - 0x13, 0x30, 0x4f, 0xc0, 0x4f, 0xc0, 0x0, 0x0, + 0x8, 0xf5, 0xb, 0xf9, 0x1, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0x32, 0xc, 0xf8, 0xc, 0xf8, - 0xc, 0xf3, 0xc, 0xd0, 0x9, 0x50, + 0x0, 0x0, 0x4, 0x94, 0x8, 0xf7, 0x8, 0xf6, + 0xb, 0xf2, 0x3f, 0xb0, 0x3b, 0x10, /* U+3C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x66, 0x0, 0x0, 0x1, - 0x7e, 0xf8, 0x0, 0x2, 0x8e, 0xff, 0xb3, 0x2, - 0x9f, 0xff, 0x92, 0x0, 0x4f, 0xfc, 0x60, 0x0, - 0x0, 0x3f, 0xfb, 0x50, 0x0, 0x0, 0x2, 0xaf, - 0xfe, 0x82, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xb4, - 0x0, 0x0, 0x1, 0x7e, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x77, 0x0, 0x0, 0x1, + 0x8e, 0xf9, 0x0, 0x2, 0x9f, 0xff, 0xa2, 0x2, + 0xaf, 0xfd, 0x71, 0x0, 0x3f, 0xfb, 0x40, 0x0, + 0x0, 0x2f, 0xfb, 0x50, 0x0, 0x0, 0x1, 0x8f, + 0xfe, 0x81, 0x0, 0x0, 0x1, 0x8e, 0xff, 0xa3, + 0x0, 0x0, 0x0, 0x7e, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x66, /* U+3D "=" */ - 0x27, 0x77, 0x77, 0x77, 0x74, 0x4f, 0xff, 0xff, - 0xff, 0xf8, 0x14, 0x44, 0x44, 0x44, 0x42, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x13, 0x33, 0x33, 0x33, - 0x32, 0x4f, 0xff, 0xff, 0xff, 0xf8, 0x3c, 0xcc, - 0xcc, 0xcc, 0xc6, + 0x5f, 0xff, 0xff, 0xff, 0xf9, 0x4c, 0xcc, 0xcc, + 0xcc, 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4b, 0xbb, 0xbb, 0xbb, + 0xb6, 0x5f, 0xff, 0xff, 0xff, 0xf9, /* U+3E ">" */ - 0x44, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xb5, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xd6, 0x10, 0x0, 0x0, - 0x3a, 0xff, 0xe8, 0x20, 0x0, 0x0, 0x16, 0xdf, - 0xf8, 0x0, 0x0, 0x1, 0x6c, 0xfc, 0x0, 0x4, - 0x9f, 0xff, 0x81, 0x16, 0xdf, 0xfe, 0x60, 0x0, - 0x8f, 0xfc, 0x40, 0x0, 0x0, 0x8a, 0x20, 0x0, + 0x77, 0x10, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x20, + 0x0, 0x0, 0x18, 0xef, 0xfb, 0x30, 0x0, 0x0, + 0x5, 0xbf, 0xfc, 0x50, 0x0, 0x0, 0x1, 0x8e, + 0xf9, 0x0, 0x0, 0x4, 0xaf, 0xf8, 0x0, 0x17, + 0xdf, 0xfa, 0x30, 0x2a, 0xff, 0xf9, 0x20, 0x0, + 0x9f, 0xe7, 0x10, 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, 0x0, /* U+3F "?" */ - 0x0, 0x29, 0xbb, 0xa4, 0x0, 0x6, 0xff, 0xff, - 0xff, 0x80, 0x1e, 0xf7, 0x0, 0x6f, 0xf3, 0x4f, - 0xc0, 0x0, 0xc, 0xf6, 0x0, 0x0, 0x0, 0xa, - 0xf8, 0x0, 0x0, 0x0, 0xe, 0xf5, 0x0, 0x0, - 0x0, 0x8f, 0xe0, 0x0, 0x0, 0x5, 0xff, 0x30, - 0x0, 0x0, 0x3e, 0xf6, 0x0, 0x0, 0x0, 0xff, - 0x70, 0x0, 0x0, 0x2, 0xff, 0x0, 0x0, 0x0, - 0x2, 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0x33, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, + 0x0, 0x3b, 0xef, 0xd8, 0x0, 0x4, 0xff, 0xed, + 0xff, 0xb0, 0xe, 0xf6, 0x0, 0x2e, 0xf3, 0x2e, + 0xc0, 0x0, 0x9, 0xf7, 0x0, 0x0, 0x0, 0x8, + 0xf7, 0x0, 0x0, 0x0, 0xd, 0xf3, 0x0, 0x0, + 0x0, 0x8f, 0xb0, 0x0, 0x0, 0x7, 0xfe, 0x10, + 0x0, 0x0, 0x5f, 0xe2, 0x0, 0x0, 0x0, 0xdf, + 0x40, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, + 0x1, 0x76, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x2, + 0xff, 0x0, 0x0, 0x0, 0x1, 0xed, 0x0, 0x0, /* U+40 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x43, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xcf, 0xff, 0xff, 0xb5, - 0x0, 0x0, 0x0, 0x1, 0xbf, 0x95, 0x10, 0x25, - 0x9f, 0x80, 0x0, 0x0, 0x2e, 0xf3, 0x0, 0x0, - 0x0, 0x5, 0xfa, 0x0, 0x0, 0xcf, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0x40, 0x4, 0xf6, 0x0, - 0x2, 0x57, 0x72, 0x0, 0xc, 0xb0, 0xe, 0xe0, - 0x0, 0x3e, 0xfe, 0xef, 0x70, 0x5, 0xf3, 0x3f, - 0x70, 0x0, 0xef, 0x30, 0x1f, 0x80, 0x0, 0xf4, - 0x5f, 0x40, 0x6, 0xf7, 0x0, 0x4f, 0x80, 0x0, - 0xf7, 0x8f, 0x0, 0xc, 0xf1, 0x0, 0x4f, 0x60, - 0x0, 0xf8, 0xce, 0x0, 0xf, 0xf0, 0x0, 0x5f, - 0x40, 0x0, 0xc8, 0xcd, 0x0, 0x3f, 0xc0, 0x0, - 0x8f, 0x40, 0x0, 0xf8, 0xaf, 0x0, 0x4f, 0xc0, - 0x0, 0x8f, 0x20, 0x2, 0xf4, 0x8f, 0x0, 0x2f, - 0xd0, 0x0, 0xbf, 0x0, 0xa, 0xe0, 0x8f, 0x20, - 0xd, 0xf9, 0x6a, 0xdf, 0x72, 0x7f, 0x50, 0x2f, - 0xa0, 0x3, 0xff, 0xf9, 0x1d, 0xff, 0xe4, 0x0, - 0xa, 0xf2, 0x0, 0x4, 0x10, 0x0, 0x31, 0x0, - 0x0, 0x2, 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xc3, 0x0, 0x0, 0x0, - 0x10, 0x0, 0x0, 0x0, 0x3, 0xdf, 0xc9, 0x77, - 0x9e, 0x70, 0x0, 0x0, 0x0, 0x0, 0x14, 0x8b, - 0xcc, 0xb6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7c, 0xef, 0xec, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x87, 0x8b, 0xfe, + 0x50, 0x0, 0x0, 0x8, 0xf9, 0x10, 0x0, 0x0, + 0x19, 0xf6, 0x0, 0x0, 0x6f, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0x20, 0x2, 0xfa, 0x0, 0x0, + 0x1, 0x0, 0x0, 0xc, 0xa0, 0x9, 0xf1, 0x0, + 0x5, 0xdf, 0xfa, 0x10, 0x5, 0xf1, 0xf, 0x90, + 0x0, 0x5f, 0xb5, 0x6f, 0x90, 0x0, 0xf4, 0x4f, + 0x40, 0x1, 0xfb, 0x0, 0x1f, 0x80, 0x0, 0xe7, + 0x8f, 0x0, 0x7, 0xf3, 0x0, 0x2f, 0x60, 0x0, + 0xc9, 0xae, 0x0, 0xc, 0xe0, 0x0, 0x3f, 0x50, + 0x0, 0xc9, 0xbd, 0x0, 0xf, 0xb0, 0x0, 0x5f, + 0x30, 0x0, 0xc9, 0xbc, 0x0, 0x1f, 0x90, 0x0, + 0x6f, 0x20, 0x0, 0xe7, 0xbd, 0x0, 0x1f, 0xa0, + 0x0, 0xaf, 0x10, 0x2, 0xf4, 0x9f, 0x0, 0xf, + 0xe0, 0x3, 0xff, 0x20, 0xa, 0xd0, 0x6f, 0x20, + 0x9, 0xfd, 0xaf, 0x9f, 0xb5, 0x9f, 0x40, 0x2f, + 0x70, 0x0, 0xaf, 0xd6, 0x6, 0xef, 0xc4, 0x0, + 0xb, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xb1, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x6, 0xef, 0xb7, 0x67, + 0xae, 0x60, 0x0, 0x0, 0x0, 0x0, 0x17, 0xce, + 0xff, 0xc7, 0x10, 0x0, 0x0, /* U+41 "A" */ - 0x0, 0x0, 0x0, 0xcb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x1f, - 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xaa, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x55, 0xfb, - 0x0, 0x0, 0x0, 0x2, 0xfe, 0x0, 0xff, 0x20, - 0x0, 0x0, 0x7, 0xf9, 0x0, 0xaf, 0x70, 0x0, - 0x0, 0xd, 0xf3, 0x0, 0x5f, 0xc0, 0x0, 0x0, - 0x3f, 0xe0, 0x0, 0xf, 0xf2, 0x0, 0x0, 0x9f, - 0xeb, 0xbb, 0xbe, 0xf8, 0x0, 0x0, 0xef, 0xff, - 0xff, 0xff, 0xfd, 0x0, 0x5, 0xfd, 0x0, 0x0, - 0x0, 0xef, 0x30, 0xa, 0xf7, 0x0, 0x0, 0x0, - 0x9f, 0x90, 0x1e, 0xf2, 0x0, 0x0, 0x0, 0x3f, - 0xd0, 0x6f, 0xd0, 0x0, 0x0, 0x0, 0xe, 0xf5, + 0x0, 0x0, 0x0, 0xef, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xfe, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xfd, 0x7f, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0x72, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xf2, 0xc, 0xf2, 0x0, 0x0, 0x0, 0x2, 0xfc, + 0x0, 0x6f, 0x80, 0x0, 0x0, 0x0, 0x8f, 0x60, + 0x1, 0xfe, 0x0, 0x0, 0x0, 0xe, 0xf1, 0x0, + 0xb, 0xf4, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, + 0x5f, 0xa0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xf, 0xfb, 0xbb, 0xbb, 0xbd, + 0xf6, 0x0, 0x6, 0xfa, 0x0, 0x0, 0x0, 0x4f, + 0xc0, 0x0, 0xcf, 0x40, 0x0, 0x0, 0x0, 0xef, + 0x20, 0x2f, 0xe0, 0x0, 0x0, 0x0, 0x9, 0xf8, + 0x8, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xd0, /* U+42 "B" */ - 0x3b, 0xbb, 0xbb, 0x77, 0x20, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x4f, 0xf0, 0x0, 0x16, - 0xff, 0x90, 0x4f, 0xf0, 0x0, 0x0, 0x5f, 0xd0, - 0x4f, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x4f, 0xf0, - 0x0, 0x0, 0x5f, 0xf0, 0x4f, 0xf0, 0x0, 0x4, - 0xcf, 0x50, 0x4f, 0xff, 0xff, 0xff, 0xe6, 0x0, - 0x4f, 0xfc, 0xcc, 0xcc, 0xff, 0x91, 0x4f, 0xf0, - 0x0, 0x0, 0x2d, 0xf8, 0x4f, 0xf0, 0x0, 0x0, - 0x5, 0xff, 0x4f, 0xf0, 0x0, 0x0, 0x0, 0xff, - 0x4f, 0xf0, 0x0, 0x0, 0x3, 0xff, 0x4f, 0xf0, - 0x0, 0x0, 0x1a, 0xfb, 0x4f, 0xfb, 0xbb, 0xbb, - 0xef, 0xf1, 0x4f, 0xff, 0xff, 0xff, 0xc8, 0x10, + 0x3f, 0xff, 0xff, 0xfd, 0x91, 0x0, 0x3f, 0xfb, + 0xbb, 0xcf, 0xfe, 0x20, 0x3f, 0xe0, 0x0, 0x0, + 0xbf, 0xb0, 0x3f, 0xe0, 0x0, 0x0, 0x2f, 0xf0, + 0x3f, 0xe0, 0x0, 0x0, 0x1f, 0xf0, 0x3f, 0xe0, + 0x0, 0x0, 0x5f, 0xd0, 0x3f, 0xe0, 0x0, 0x15, + 0xef, 0x40, 0x3f, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x3f, 0xfb, 0xbb, 0xbd, 0xfd, 0x20, 0x3f, 0xe0, + 0x0, 0x0, 0x6f, 0xe0, 0x3f, 0xe0, 0x0, 0x0, + 0xc, 0xf4, 0x3f, 0xe0, 0x0, 0x0, 0xa, 0xf7, + 0x3f, 0xe0, 0x0, 0x0, 0xd, 0xf5, 0x3f, 0xe0, + 0x0, 0x0, 0x8f, 0xf1, 0x3f, 0xfb, 0xbb, 0xbe, + 0xff, 0x50, 0x3f, 0xff, 0xff, 0xfe, 0xa3, 0x0, /* U+43 "C" */ - 0x0, 0x3, 0x7b, 0xba, 0x71, 0x0, 0x0, 0x6e, - 0xff, 0xdf, 0xfe, 0x60, 0x5, 0xff, 0x50, 0x0, - 0x7f, 0xf3, 0x1d, 0xf4, 0x0, 0x0, 0x8, 0xfb, - 0x6f, 0xd0, 0x0, 0x0, 0x4, 0xfd, 0x8f, 0x80, - 0x0, 0x0, 0x0, 0x44, 0xcf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0x80, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x7f, 0xb0, 0x0, 0x0, 0x2, 0xff, - 0x2f, 0xf2, 0x0, 0x0, 0x5, 0xfc, 0x9, 0xfc, - 0x10, 0x0, 0x2d, 0xf5, 0x1, 0xcf, 0xd8, 0x79, - 0xef, 0xa0, 0x0, 0x8, 0xef, 0xff, 0xe5, 0x0, - 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xae, 0xfe, 0xb5, 0x0, 0x0, 0x8, + 0xff, 0xdc, 0xdf, 0xf9, 0x0, 0x6, 0xfe, 0x40, + 0x0, 0x3e, 0xf6, 0x0, 0xef, 0x40, 0x0, 0x0, + 0x4f, 0xe0, 0x5f, 0xc0, 0x0, 0x0, 0x0, 0xef, + 0x38, 0xf8, 0x0, 0x0, 0x0, 0x2, 0x31, 0xaf, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0x50, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0x80, 0x0, 0x0, 0x0, 0x22, 0x5, + 0xfc, 0x0, 0x0, 0x0, 0xe, 0xf3, 0xe, 0xf4, + 0x0, 0x0, 0x4, 0xfe, 0x0, 0x6f, 0xe3, 0x0, + 0x3, 0xdf, 0x60, 0x0, 0x8f, 0xfd, 0xbd, 0xff, + 0x90, 0x0, 0x0, 0x4b, 0xef, 0xeb, 0x40, 0x0, /* U+44 "D" */ - 0x3b, 0xbb, 0xba, 0x74, 0x20, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x4f, 0xf0, 0x0, - 0x36, 0xff, 0xc0, 0x4, 0xff, 0x0, 0x0, 0x1, - 0xdf, 0x80, 0x4f, 0xf0, 0x0, 0x0, 0x4, 0xff, - 0x14, 0xff, 0x0, 0x0, 0x0, 0xd, 0xf4, 0x4f, - 0xf0, 0x0, 0x0, 0x0, 0xcf, 0x74, 0xff, 0x0, - 0x0, 0x0, 0x8, 0xf8, 0x4f, 0xf0, 0x0, 0x0, - 0x0, 0x8f, 0x84, 0xff, 0x0, 0x0, 0x0, 0xa, - 0xf8, 0x4f, 0xf0, 0x0, 0x0, 0x0, 0xcf, 0x54, - 0xff, 0x0, 0x0, 0x0, 0x1f, 0xf2, 0x4f, 0xf0, - 0x0, 0x0, 0xa, 0xfc, 0x4, 0xff, 0x0, 0x0, - 0x19, 0xff, 0x20, 0x4f, 0xfb, 0xbb, 0xbf, 0xfe, - 0x40, 0x4, 0xff, 0xff, 0xfe, 0xc7, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xea, 0x30, 0x0, 0x3, 0xff, + 0xbb, 0xbe, 0xff, 0x90, 0x0, 0x3f, 0xe0, 0x0, + 0x3, 0xdf, 0x80, 0x3, 0xfe, 0x0, 0x0, 0x1, + 0xef, 0x30, 0x3f, 0xe0, 0x0, 0x0, 0x7, 0xf9, + 0x3, 0xfe, 0x0, 0x0, 0x0, 0x2f, 0xe0, 0x3f, + 0xe0, 0x0, 0x0, 0x0, 0xff, 0x3, 0xfe, 0x0, + 0x0, 0x0, 0xe, 0xf1, 0x3f, 0xe0, 0x0, 0x0, + 0x0, 0xef, 0x13, 0xfe, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x3f, 0xe0, 0x0, 0x0, 0x2, 0xfe, 0x3, + 0xfe, 0x0, 0x0, 0x0, 0x7f, 0xa0, 0x3f, 0xe0, + 0x0, 0x0, 0x2f, 0xf3, 0x3, 0xfe, 0x0, 0x0, + 0x4e, 0xf9, 0x0, 0x3f, 0xfb, 0xbb, 0xef, 0xf9, + 0x0, 0x3, 0xff, 0xff, 0xfd, 0x93, 0x0, 0x0, /* U+45 "E" */ - 0x3b, 0xbb, 0xbb, 0xbb, 0xbb, 0x34, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x4f, 0xf0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x4f, 0xfc, 0xcc, 0xcc, - 0xc3, 0x4, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xf0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, 0xbb, - 0xbb, 0xbb, 0x64, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xa3, 0xff, 0xbb, + 0xbb, 0xbb, 0xb7, 0x3f, 0xe0, 0x0, 0x0, 0x0, + 0x3, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xe0, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x3f, 0xfb, 0xbb, 0xbb, + 0xb7, 0x3, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xe0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x3, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xbb, + 0xbb, 0xbb, 0x83, 0xff, 0xff, 0xff, 0xff, 0xfc, /* U+46 "F" */ - 0x3b, 0xbb, 0xbb, 0xbb, 0xbb, 0x64, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x4f, 0xf0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x77, 0x77, 0x77, 0x40, 0x4f, 0xff, 0xff, 0xff, - 0xf8, 0x4, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xf0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xbb, + 0xbb, 0xbb, 0xb5, 0x3f, 0xe0, 0x0, 0x0, 0x0, + 0x3, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xe0, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xbb, 0xbb, 0xbb, 0x40, 0x3f, 0xff, 0xff, 0xff, + 0xf7, 0x3, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xe0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x3, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xe0, 0x0, + 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, 0x0, /* U+47 "G" */ - 0x0, 0x2, 0x7b, 0xbb, 0x72, 0x0, 0x0, 0x7e, - 0xff, 0xcf, 0xfe, 0x60, 0x5, 0xff, 0x60, 0x0, - 0x7f, 0xf4, 0x1e, 0xf5, 0x0, 0x0, 0x8, 0xfc, - 0x6f, 0xd0, 0x0, 0x0, 0x3, 0xfe, 0x8f, 0x90, - 0x0, 0x0, 0x0, 0x44, 0xcf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0x80, 0x0, 0x6b, 0xbb, 0xbb, 0xcf, 0x80, - 0x0, 0x6c, 0xcc, 0xff, 0x9f, 0x80, 0x0, 0x0, - 0x0, 0xff, 0x7f, 0xb0, 0x0, 0x0, 0x0, 0xff, - 0x2f, 0xf3, 0x0, 0x0, 0x0, 0xff, 0x8, 0xfc, - 0x20, 0x0, 0x4, 0xff, 0x1, 0xcf, 0xe9, 0x77, - 0xaf, 0xf8, 0x0, 0x7, 0xdf, 0xff, 0xfb, 0x40, - 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, + 0x0, 0x4, 0xae, 0xfe, 0xb6, 0x0, 0x0, 0x9, + 0xff, 0xdb, 0xdf, 0xfb, 0x0, 0x6, 0xfe, 0x40, + 0x0, 0x3d, 0xf9, 0x0, 0xef, 0x40, 0x0, 0x0, + 0x2f, 0xf1, 0x5f, 0xd0, 0x0, 0x0, 0x0, 0xac, + 0x38, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x60, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x60, 0x0, 0x5f, + 0xff, 0xff, 0x59, 0xf7, 0x0, 0x3, 0xbb, 0xbe, + 0xf5, 0x8f, 0x90, 0x0, 0x0, 0x0, 0xbf, 0x54, + 0xfe, 0x0, 0x0, 0x0, 0xb, 0xf5, 0xd, 0xf7, + 0x0, 0x0, 0x0, 0xbf, 0x50, 0x4f, 0xf6, 0x0, + 0x0, 0x3e, 0xf5, 0x0, 0x5f, 0xfe, 0xbb, 0xef, + 0xfa, 0x0, 0x0, 0x29, 0xdf, 0xfd, 0xa4, 0x0, /* U+48 "H" */ - 0x3b, 0xb0, 0x0, 0x0, 0x0, 0x6b, 0x94, 0xff, - 0x0, 0x0, 0x0, 0x8, 0xfc, 0x4f, 0xf0, 0x0, - 0x0, 0x0, 0x8f, 0xc4, 0xff, 0x0, 0x0, 0x0, - 0x8, 0xfc, 0x4f, 0xf0, 0x0, 0x0, 0x0, 0x8f, - 0xc4, 0xff, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x4f, - 0xf0, 0x0, 0x0, 0x0, 0x8f, 0xc4, 0xff, 0x77, - 0x77, 0x77, 0x7b, 0xfc, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc4, 0xff, 0x0, 0x0, 0x0, 0x8, - 0xfc, 0x4f, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0xc4, - 0xff, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x4f, 0xf0, - 0x0, 0x0, 0x0, 0x8f, 0xc4, 0xff, 0x0, 0x0, - 0x0, 0x8, 0xfc, 0x4f, 0xf0, 0x0, 0x0, 0x0, - 0x8f, 0xc4, 0xff, 0x0, 0x0, 0x0, 0x8, 0xfc, + 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x3f, 0xd3, 0xfe, + 0x0, 0x0, 0x0, 0x3, 0xfd, 0x3f, 0xe0, 0x0, + 0x0, 0x0, 0x3f, 0xd3, 0xfe, 0x0, 0x0, 0x0, + 0x3, 0xfd, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x3f, + 0xd3, 0xfe, 0x0, 0x0, 0x0, 0x3, 0xfd, 0x3f, + 0xe0, 0x0, 0x0, 0x0, 0x3f, 0xd3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x3f, 0xfb, 0xbb, 0xbb, + 0xbb, 0xcf, 0xd3, 0xfe, 0x0, 0x0, 0x0, 0x3, + 0xfd, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x3f, 0xd3, + 0xfe, 0x0, 0x0, 0x0, 0x3, 0xfd, 0x3f, 0xe0, + 0x0, 0x0, 0x0, 0x3f, 0xd3, 0xfe, 0x0, 0x0, + 0x0, 0x3, 0xfd, 0x3f, 0xe0, 0x0, 0x0, 0x0, + 0x3f, 0xd3, 0xfe, 0x0, 0x0, 0x0, 0x3, 0xfd, /* U+49 "I" */ - 0x9a, 0x1f, 0xf2, 0xff, 0x2f, 0xf2, 0xff, 0x2f, - 0xf2, 0xff, 0x2f, 0xf2, 0xff, 0x2f, 0xf2, 0xff, - 0x2f, 0xf2, 0xff, 0x2f, 0xf2, 0xff, 0x2f, 0xf2, + 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, + 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, + 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, + 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, 0xf, 0xf0, /* U+4A "J" */ - 0x0, 0x0, 0x0, 0x0, 0x9b, 0x30, 0x0, 0x0, - 0x0, 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0x40, 0x0, 0x0, 0x0, 0xc, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0x40, 0x0, 0x0, 0x0, 0xc, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x40, 0x0, - 0x0, 0x0, 0xc, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0x40, 0x0, 0x0, 0x0, 0xc, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0x41, 0x33, 0x0, 0x0, - 0xd, 0xf4, 0xf, 0xf0, 0x0, 0x0, 0xff, 0x10, - 0xff, 0x60, 0x0, 0x8f, 0xe0, 0x5, 0xff, 0x87, - 0x9f, 0xf4, 0x0, 0x5, 0xef, 0xff, 0xd4, 0x0, - 0x0, 0x0, 0x14, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, + 0x0, 0xa, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0x70, 0x0, 0x0, 0x0, 0xa, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x70, 0x0, 0x0, 0x0, 0xa, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0xaf, 0x70, 0x0, + 0x0, 0x0, 0xa, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0xa, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x73, 0x96, 0x0, 0x0, + 0xa, 0xf6, 0x5f, 0xd0, 0x0, 0x0, 0xef, 0x41, + 0xff, 0x70, 0x0, 0x8f, 0xe0, 0x6, 0xff, 0xdb, + 0xef, 0xf4, 0x0, 0x3, 0xbe, 0xfe, 0xa2, 0x0, /* U+4B "K" */ - 0x3b, 0xb0, 0x0, 0x0, 0x5, 0xbb, 0x14, 0xff, - 0x0, 0x0, 0x3, 0xef, 0x60, 0x4f, 0xf0, 0x0, - 0x1, 0xcf, 0x80, 0x4, 0xff, 0x0, 0x0, 0xbf, - 0xa0, 0x0, 0x4f, 0xf0, 0x0, 0x8f, 0xd1, 0x0, - 0x4, 0xff, 0x0, 0x5f, 0xf1, 0x0, 0x0, 0x4f, - 0xf0, 0x3e, 0xf3, 0x0, 0x0, 0x4, 0xff, 0xbe, - 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x4, 0xff, 0x3, 0xff, 0x70, 0x0, - 0x0, 0x4f, 0xf0, 0x5, 0xff, 0x50, 0x0, 0x4, - 0xff, 0x0, 0x8, 0xfe, 0x30, 0x0, 0x4f, 0xf0, - 0x0, 0xb, 0xfc, 0x10, 0x4, 0xff, 0x0, 0x0, - 0x1d, 0xfa, 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x3f, - 0xf9, 0x4, 0xff, 0x0, 0x0, 0x0, 0x5f, 0xf6, + 0x3f, 0xe0, 0x0, 0x0, 0x9, 0xfd, 0x3, 0xfe, + 0x0, 0x0, 0x7, 0xfe, 0x10, 0x3f, 0xe0, 0x0, + 0x5, 0xff, 0x30, 0x3, 0xfe, 0x0, 0x4, 0xff, + 0x40, 0x0, 0x3f, 0xe0, 0x2, 0xff, 0x60, 0x0, + 0x3, 0xfe, 0x1, 0xef, 0x80, 0x0, 0x0, 0x3f, + 0xe0, 0xdf, 0xa0, 0x0, 0x0, 0x3, 0xfe, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xdf, 0xf3, + 0x0, 0x0, 0x3, 0xff, 0xd1, 0x8f, 0xe1, 0x0, + 0x0, 0x3f, 0xf1, 0x0, 0xcf, 0xb0, 0x0, 0x3, + 0xfe, 0x0, 0x1, 0xef, 0x70, 0x0, 0x3f, 0xe0, + 0x0, 0x4, 0xff, 0x30, 0x3, 0xfe, 0x0, 0x0, + 0x8, 0xfd, 0x10, 0x3f, 0xe0, 0x0, 0x0, 0xc, + 0xfa, 0x3, 0xfe, 0x0, 0x0, 0x0, 0x1e, 0xf6, /* U+4C "L" */ - 0x3b, 0xb0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xf0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, 0xbb, - 0xbb, 0xbb, 0x64, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, + 0x3, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xe0, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x3, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, + 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xe0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x3, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xfb, 0xbb, + 0xbb, 0xbb, 0x33, 0xff, 0xff, 0xff, 0xff, 0xf4, /* U+4D "M" */ - 0x3b, 0xb8, 0x0, 0x0, 0x0, 0x0, 0x7, 0xbb, - 0x34, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xf4, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0x44, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf4, 0x4f, 0xfd, 0xf2, 0x0, 0x0, 0x1, - 0xfe, 0xff, 0x44, 0xff, 0x6f, 0x90, 0x0, 0x0, - 0x7f, 0x8f, 0xf4, 0x4f, 0xf1, 0xfe, 0x0, 0x0, - 0xe, 0xf2, 0xff, 0x44, 0xff, 0xa, 0xf5, 0x0, - 0x4, 0xfb, 0xf, 0xf4, 0x4f, 0xf0, 0x3f, 0xb0, - 0x0, 0xaf, 0x50, 0xff, 0x44, 0xff, 0x0, 0xdf, - 0x20, 0x1f, 0xe0, 0xf, 0xf4, 0x4f, 0xf0, 0x6, - 0xf8, 0x6, 0xf8, 0x0, 0xff, 0x44, 0xff, 0x0, - 0x1f, 0xd0, 0xdf, 0x20, 0xf, 0xf4, 0x4f, 0xf0, - 0x0, 0xaf, 0x8f, 0xb0, 0x0, 0xff, 0x44, 0xff, - 0x0, 0x3, 0xff, 0xf5, 0x0, 0xf, 0xf4, 0x4f, - 0xf0, 0x0, 0xd, 0xfe, 0x0, 0x0, 0xff, 0x44, - 0xff, 0x0, 0x0, 0x6f, 0x80, 0x0, 0xf, 0xf4, + 0x3f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0x63, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf6, 0x3f, 0xff, 0x70, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0x63, 0xfd, 0xfd, 0x0, 0x0, 0x0, 0xa, + 0xfd, 0xf6, 0x3f, 0xbc, 0xf3, 0x0, 0x0, 0x1, + 0xfe, 0x8f, 0x63, 0xfb, 0x5f, 0xa0, 0x0, 0x0, + 0x7f, 0x88, 0xf6, 0x3f, 0xc0, 0xef, 0x0, 0x0, + 0xd, 0xf2, 0x9f, 0x63, 0xfc, 0x9, 0xf6, 0x0, + 0x3, 0xfb, 0x9, 0xf6, 0x3f, 0xd0, 0x2f, 0xc0, + 0x0, 0xaf, 0x50, 0xaf, 0x63, 0xfd, 0x0, 0xcf, + 0x30, 0xf, 0xe0, 0xa, 0xf6, 0x3f, 0xe0, 0x6, + 0xf9, 0x6, 0xf8, 0x0, 0xbf, 0x63, 0xfe, 0x0, + 0xf, 0xf0, 0xcf, 0x20, 0xb, 0xf6, 0x3f, 0xe0, + 0x0, 0x9f, 0x8f, 0xc0, 0x0, 0xbf, 0x63, 0xfe, + 0x0, 0x3, 0xff, 0xf5, 0x0, 0xb, 0xf6, 0x3f, + 0xe0, 0x0, 0xc, 0xfe, 0x0, 0x0, 0xbf, 0x63, + 0xfe, 0x0, 0x0, 0x6f, 0x90, 0x0, 0xb, 0xf6, /* U+4E "N" */ - 0x3b, 0xb1, 0x0, 0x0, 0x0, 0x6b, 0x94, 0xff, - 0xa0, 0x0, 0x0, 0x8, 0xfc, 0x4f, 0xff, 0x40, - 0x0, 0x0, 0x8f, 0xc4, 0xff, 0xfd, 0x10, 0x0, - 0x8, 0xfc, 0x4f, 0xfc, 0xf9, 0x0, 0x0, 0x8f, - 0xc4, 0xff, 0x2f, 0xf3, 0x0, 0x8, 0xfc, 0x4f, - 0xf0, 0x8f, 0xc0, 0x0, 0x8f, 0xc4, 0xff, 0x0, - 0xdf, 0x70, 0x8, 0xfc, 0x4f, 0xf0, 0x3, 0xfe, - 0x20, 0x8f, 0xc4, 0xff, 0x0, 0x9, 0xfa, 0x8, - 0xfc, 0x4f, 0xf0, 0x0, 0x1e, 0xf5, 0x8f, 0xc4, - 0xff, 0x0, 0x0, 0x5f, 0xe9, 0xfc, 0x4f, 0xf0, - 0x0, 0x0, 0xbf, 0xef, 0xc4, 0xff, 0x0, 0x0, - 0x2, 0xff, 0xfc, 0x4f, 0xf0, 0x0, 0x0, 0x7, - 0xff, 0xc4, 0xff, 0x0, 0x0, 0x0, 0xc, 0xfc, + 0x3f, 0xf3, 0x0, 0x0, 0x0, 0x3f, 0xd3, 0xff, + 0xd0, 0x0, 0x0, 0x3, 0xfd, 0x3f, 0xff, 0x70, + 0x0, 0x0, 0x3f, 0xd3, 0xff, 0xff, 0x20, 0x0, + 0x3, 0xfd, 0x3f, 0xe9, 0xfc, 0x0, 0x0, 0x3f, + 0xd3, 0xfe, 0xe, 0xf6, 0x0, 0x3, 0xfd, 0x3f, + 0xe0, 0x4f, 0xe1, 0x0, 0x3f, 0xd3, 0xfe, 0x0, + 0xaf, 0xa0, 0x3, 0xfd, 0x3f, 0xe0, 0x1, 0xef, + 0x40, 0x3f, 0xd3, 0xfe, 0x0, 0x6, 0xfe, 0x3, + 0xfd, 0x3f, 0xe0, 0x0, 0xb, 0xf9, 0x3f, 0xd3, + 0xfe, 0x0, 0x0, 0x2f, 0xf7, 0xfd, 0x3f, 0xe0, + 0x0, 0x0, 0x7f, 0xff, 0xd3, 0xfe, 0x0, 0x0, + 0x0, 0xdf, 0xfd, 0x3f, 0xe0, 0x0, 0x0, 0x3, + 0xff, 0xd3, 0xfe, 0x0, 0x0, 0x0, 0x8, 0xfd, /* U+4F "O" */ - 0x0, 0x2, 0x7a, 0xba, 0x71, 0x0, 0x0, 0x6, - 0xef, 0xff, 0xff, 0xe5, 0x0, 0x5, 0xff, 0x71, - 0x1, 0x8f, 0xf4, 0x1, 0xef, 0x40, 0x0, 0x0, - 0x7f, 0xd1, 0x7f, 0xc0, 0x0, 0x0, 0x0, 0xef, - 0x69, 0xf8, 0x0, 0x0, 0x0, 0x8, 0xf8, 0xcf, - 0x60, 0x0, 0x0, 0x0, 0x6f, 0xcc, 0xf4, 0x0, - 0x0, 0x0, 0x4, 0xfc, 0xcf, 0x40, 0x0, 0x0, - 0x0, 0x4f, 0xcc, 0xf4, 0x0, 0x0, 0x0, 0x5, - 0xfc, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xa8, - 0xfa, 0x0, 0x0, 0x0, 0xa, 0xf7, 0x2f, 0xf2, - 0x0, 0x0, 0x2, 0xff, 0x20, 0x9f, 0xc1, 0x0, - 0x3, 0xcf, 0x80, 0x1, 0xcf, 0xea, 0x7b, 0xef, - 0xb0, 0x0, 0x0, 0x7e, 0xff, 0xfd, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xae, 0xfe, 0xa4, 0x0, 0x0, 0x7, + 0xff, 0xed, 0xef, 0xf9, 0x0, 0x5, 0xff, 0x60, + 0x0, 0x4e, 0xf7, 0x0, 0xef, 0x50, 0x0, 0x0, + 0x3f, 0xf0, 0x4f, 0xd0, 0x0, 0x0, 0x0, 0xbf, + 0x68, 0xf8, 0x0, 0x0, 0x0, 0x6, 0xfa, 0xaf, + 0x50, 0x0, 0x0, 0x0, 0x4f, 0xcb, 0xf5, 0x0, + 0x0, 0x0, 0x3, 0xfd, 0xbf, 0x50, 0x0, 0x0, + 0x0, 0x3f, 0xda, 0xf5, 0x0, 0x0, 0x0, 0x4, + 0xfc, 0x8f, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xa4, + 0xfd, 0x0, 0x0, 0x0, 0xa, 0xf6, 0xe, 0xf5, + 0x0, 0x0, 0x3, 0xff, 0x10, 0x5f, 0xf5, 0x0, + 0x3, 0xef, 0x70, 0x0, 0x6f, 0xfe, 0xce, 0xff, + 0x90, 0x0, 0x0, 0x3a, 0xef, 0xeb, 0x40, 0x0, /* U+50 "P" */ - 0x3b, 0xbb, 0xbb, 0xa7, 0x51, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xfe, 0x60, 0x4f, 0xf0, 0x0, 0x3, - 0x8f, 0xf4, 0x4f, 0xf0, 0x0, 0x0, 0x8, 0xfc, - 0x4f, 0xf0, 0x0, 0x0, 0x4, 0xfe, 0x4f, 0xf0, - 0x0, 0x0, 0x3, 0xff, 0x4f, 0xf0, 0x0, 0x0, - 0x8, 0xfc, 0x4f, 0xf0, 0x0, 0x0, 0x7e, 0xf4, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0x70, 0x4f, 0xfc, - 0xcc, 0xca, 0x82, 0x0, 0x4f, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xfe, 0xb6, 0x0, 0x3, 0xff, + 0xbb, 0xbb, 0xdf, 0xfb, 0x0, 0x3f, 0xe0, 0x0, + 0x0, 0x3e, 0xf7, 0x3, 0xfe, 0x0, 0x0, 0x0, + 0x5f, 0xd0, 0x3f, 0xe0, 0x0, 0x0, 0x1, 0xff, + 0x3, 0xfe, 0x0, 0x0, 0x0, 0x1f, 0xf0, 0x3f, + 0xe0, 0x0, 0x0, 0x6, 0xfd, 0x3, 0xfe, 0x0, + 0x0, 0x17, 0xff, 0x60, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x3, 0xff, 0xbb, 0xbb, 0xa7, 0x20, + 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+51 "Q" */ - 0x0, 0x2, 0x7a, 0xba, 0x71, 0x0, 0x0, 0x0, - 0x6e, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x5, 0xff, - 0x71, 0x1, 0x8f, 0xf4, 0x0, 0x1e, 0xf4, 0x0, - 0x0, 0x7, 0xfd, 0x10, 0x7f, 0xc0, 0x0, 0x0, - 0x0, 0xef, 0x60, 0x9f, 0x80, 0x0, 0x0, 0x0, - 0x8f, 0x80, 0xcf, 0x60, 0x0, 0x0, 0x0, 0x6f, - 0xc0, 0xcf, 0x40, 0x0, 0x0, 0x0, 0x4f, 0xc0, - 0xcf, 0x40, 0x0, 0x0, 0x0, 0x4f, 0xc0, 0xcf, - 0x40, 0x0, 0x0, 0x0, 0x5f, 0xc0, 0xaf, 0x80, - 0x0, 0x0, 0x0, 0x8f, 0xc0, 0x8f, 0xa0, 0x0, - 0x0, 0x0, 0xaf, 0x80, 0x2f, 0xf2, 0x0, 0x0, - 0x2, 0xff, 0x20, 0x9, 0xfc, 0x10, 0x0, 0x3c, - 0xfa, 0x0, 0x1, 0xcf, 0xea, 0x7b, 0xef, 0xfe, - 0x30, 0x0, 0x7, 0xef, 0xff, 0xe8, 0xdf, 0xe3, - 0x0, 0x0, 0x0, 0x42, 0x0, 0x1d, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x50, + 0x0, 0x3, 0xae, 0xfe, 0xa3, 0x0, 0x0, 0x8, + 0xff, 0xed, 0xef, 0xf8, 0x0, 0x6, 0xfe, 0x50, + 0x0, 0x5f, 0xf6, 0x0, 0xff, 0x40, 0x0, 0x0, + 0x4f, 0xe0, 0x6f, 0xb0, 0x0, 0x0, 0x0, 0xcf, + 0x5a, 0xf7, 0x0, 0x0, 0x0, 0x8, 0xf9, 0xcf, + 0x40, 0x0, 0x0, 0x0, 0x5f, 0xbd, 0xf3, 0x0, + 0x0, 0x0, 0x4, 0xfc, 0xdf, 0x30, 0x0, 0x0, + 0x0, 0x4f, 0xcc, 0xf4, 0x0, 0x0, 0x0, 0x5, + 0xfa, 0xaf, 0x70, 0x0, 0x0, 0x0, 0x7f, 0x96, + 0xfb, 0x0, 0x0, 0x0, 0xc, 0xf4, 0xf, 0xf4, + 0x0, 0x0, 0x4, 0xfe, 0x0, 0x6f, 0xe4, 0x0, + 0x4, 0xef, 0x50, 0x0, 0x8f, 0xfe, 0xce, 0xff, + 0x70, 0x0, 0x0, 0x3a, 0xef, 0xef, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfd, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x1b, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0x0, /* U+52 "R" */ - 0x27, 0x77, 0x77, 0x77, 0x40, 0x0, 0x4, 0xff, - 0xff, 0xff, 0xff, 0xd3, 0x0, 0x4f, 0xf0, 0x0, - 0x4, 0xbf, 0xe1, 0x4, 0xff, 0x0, 0x0, 0x0, - 0xdf, 0x60, 0x4f, 0xf0, 0x0, 0x0, 0x8, 0xf8, - 0x4, 0xff, 0x0, 0x0, 0x0, 0xaf, 0x80, 0x4f, - 0xf0, 0x0, 0x0, 0x1e, 0xf2, 0x4, 0xff, 0x77, - 0x77, 0x8e, 0xf6, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xf9, 0x10, 0x4, 0xff, 0x44, 0x44, 0x5d, 0xfc, - 0x0, 0x4f, 0xf0, 0x0, 0x0, 0x1f, 0xf6, 0x4, - 0xff, 0x0, 0x0, 0x0, 0xaf, 0x80, 0x4f, 0xf0, - 0x0, 0x0, 0x8, 0xf8, 0x4, 0xff, 0x0, 0x0, - 0x0, 0x8f, 0x80, 0x4f, 0xf0, 0x0, 0x0, 0x8, - 0xfb, 0x4, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xe2, + 0x3f, 0xff, 0xff, 0xfd, 0x92, 0x0, 0x3, 0xff, + 0xbb, 0xbc, 0xff, 0xf4, 0x0, 0x3f, 0xe0, 0x0, + 0x0, 0x9f, 0xe0, 0x3, 0xfe, 0x0, 0x0, 0x0, + 0xef, 0x40, 0x3f, 0xe0, 0x0, 0x0, 0xa, 0xf6, + 0x3, 0xfe, 0x0, 0x0, 0x0, 0xbf, 0x60, 0x3f, + 0xe0, 0x0, 0x0, 0x1f, 0xf2, 0x3, 0xfe, 0x0, + 0x1, 0x4d, 0xfa, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0x3, 0xff, 0xbb, 0xbd, 0xfb, 0x0, + 0x0, 0x3f, 0xe0, 0x0, 0x1f, 0xf2, 0x0, 0x3, + 0xfe, 0x0, 0x0, 0x7f, 0xb0, 0x0, 0x3f, 0xe0, + 0x0, 0x0, 0xef, 0x30, 0x3, 0xfe, 0x0, 0x0, + 0x6, 0xfc, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0xd, + 0xf5, 0x3, 0xfe, 0x0, 0x0, 0x0, 0x5f, 0xd0, /* U+53 "S" */ - 0x0, 0x6, 0xab, 0xb8, 0x40, 0x0, 0x1, 0xcf, - 0xfd, 0xff, 0xf8, 0x0, 0xb, 0xfc, 0x10, 0x4, - 0xdf, 0x80, 0xf, 0xf1, 0x0, 0x0, 0x3f, 0xf0, - 0x4f, 0xf0, 0x0, 0x0, 0xf, 0xf3, 0xf, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xfe, 0x71, 0x0, - 0x0, 0x0, 0x0, 0x9f, 0xff, 0xa5, 0x10, 0x0, - 0x0, 0x4, 0xaf, 0xff, 0xe6, 0x0, 0x0, 0x0, - 0x0, 0x5a, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf2, 0x57, 0x40, 0x0, 0x0, 0xc, 0xf5, - 0x8f, 0xa0, 0x0, 0x0, 0xd, 0xf4, 0x2f, 0xf6, - 0x0, 0x0, 0x6f, 0xf1, 0x6, 0xff, 0xb7, 0x7a, - 0xff, 0x50, 0x0, 0x4c, 0xff, 0xff, 0xc4, 0x0, - 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xae, 0xfe, 0xb6, 0x0, 0x0, 0x7, + 0xff, 0xec, 0xdf, 0xfb, 0x0, 0x3, 0xff, 0x50, + 0x0, 0x2c, 0xf9, 0x0, 0x8f, 0x90, 0x0, 0x0, + 0x2f, 0xf0, 0x9, 0xf8, 0x0, 0x0, 0x0, 0xbb, + 0x10, 0x6f, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x1, 0x9f, + 0xff, 0xc7, 0x10, 0x0, 0x0, 0x0, 0x27, 0xdf, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x0, + 0xcb, 0x0, 0x0, 0x0, 0xe, 0xf2, 0xe, 0xf3, + 0x0, 0x0, 0x0, 0xff, 0x20, 0x7f, 0xe4, 0x0, + 0x0, 0xaf, 0xd0, 0x0, 0x9f, 0xfd, 0xbc, 0xff, + 0xe3, 0x0, 0x0, 0x3a, 0xef, 0xfd, 0x81, 0x0, /* U+54 "T" */ - 0x6b, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0x98, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x8, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0xbb, + 0xbb, 0xdf, 0xeb, 0xbb, 0xb7, 0x0, 0x0, 0x7, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x90, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x90, 0x0, 0x0, /* U+55 "U" */ - 0x6b, 0x90, 0x0, 0x0, 0x0, 0x9b, 0x38, 0xfc, - 0x0, 0x0, 0x0, 0xc, 0xf4, 0x8f, 0xc0, 0x0, - 0x0, 0x0, 0xcf, 0x48, 0xfc, 0x0, 0x0, 0x0, - 0xc, 0xf4, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0xcf, - 0x48, 0xfc, 0x0, 0x0, 0x0, 0xc, 0xf4, 0x8f, - 0xc0, 0x0, 0x0, 0x0, 0xcf, 0x48, 0xfc, 0x0, - 0x0, 0x0, 0xc, 0xf4, 0x8f, 0xc0, 0x0, 0x0, - 0x0, 0xcf, 0x48, 0xfc, 0x0, 0x0, 0x0, 0xc, - 0xf4, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0xcf, 0x44, - 0xfc, 0x0, 0x0, 0x0, 0xe, 0xf4, 0x2f, 0xf2, - 0x0, 0x0, 0x2, 0xff, 0x0, 0xbf, 0xa1, 0x0, - 0x1, 0xcf, 0xa0, 0x1, 0xef, 0xd8, 0x79, 0xef, - 0xd1, 0x0, 0x1, 0x8f, 0xff, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, + 0x8f, 0x80, 0x0, 0x0, 0x4, 0xfd, 0x8f, 0x80, + 0x0, 0x0, 0x4, 0xfd, 0x8f, 0x80, 0x0, 0x0, + 0x4, 0xfd, 0x8f, 0x80, 0x0, 0x0, 0x4, 0xfd, + 0x8f, 0x80, 0x0, 0x0, 0x4, 0xfd, 0x8f, 0x80, + 0x0, 0x0, 0x4, 0xfd, 0x8f, 0x80, 0x0, 0x0, + 0x4, 0xfd, 0x8f, 0x80, 0x0, 0x0, 0x4, 0xfd, + 0x8f, 0x80, 0x0, 0x0, 0x4, 0xfd, 0x8f, 0x80, + 0x0, 0x0, 0x4, 0xfd, 0x7f, 0x80, 0x0, 0x0, + 0x4, 0xfd, 0x6f, 0xa0, 0x0, 0x0, 0x5, 0xfc, + 0x3f, 0xe0, 0x0, 0x0, 0xa, 0xf8, 0xc, 0xfb, + 0x10, 0x0, 0x7f, 0xf1, 0x2, 0xdf, 0xfc, 0xce, + 0xff, 0x40, 0x0, 0x7, 0xcf, 0xfd, 0x92, 0x0, /* U+56 "V" */ - 0x8b, 0x70, 0x0, 0x0, 0x0, 0x8, 0xb7, 0x6f, - 0xe0, 0x0, 0x0, 0x0, 0x1f, 0xf4, 0xf, 0xf5, - 0x0, 0x0, 0x0, 0x6f, 0xe0, 0xa, 0xfa, 0x0, - 0x0, 0x0, 0xbf, 0x80, 0x3, 0xfe, 0x0, 0x0, - 0x1, 0xff, 0x20, 0x0, 0xef, 0x60, 0x0, 0x6, - 0xfc, 0x0, 0x0, 0x7f, 0xb0, 0x0, 0xd, 0xf6, - 0x0, 0x0, 0x2f, 0xf1, 0x0, 0x2f, 0xf1, 0x0, - 0x0, 0xc, 0xf6, 0x0, 0x7f, 0xa0, 0x0, 0x0, - 0x6, 0xfb, 0x0, 0xdf, 0x50, 0x0, 0x0, 0x1, - 0xff, 0x23, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0x79, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xcd, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x10, 0x0, 0x0, + 0x8f, 0xb0, 0x0, 0x0, 0x0, 0xb, 0xf8, 0x2f, + 0xf1, 0x0, 0x0, 0x0, 0x1f, 0xf2, 0xc, 0xf6, + 0x0, 0x0, 0x0, 0x6f, 0xc0, 0x6, 0xfb, 0x0, + 0x0, 0x0, 0xbf, 0x70, 0x1, 0xff, 0x10, 0x0, + 0x1, 0xff, 0x10, 0x0, 0xbf, 0x60, 0x0, 0x6, + 0xfb, 0x0, 0x0, 0x5f, 0xc0, 0x0, 0xc, 0xf5, + 0x0, 0x0, 0xf, 0xf1, 0x0, 0x1f, 0xf0, 0x0, + 0x0, 0xa, 0xf7, 0x0, 0x7f, 0xa0, 0x0, 0x0, + 0x4, 0xfc, 0x0, 0xcf, 0x40, 0x0, 0x0, 0x0, + 0xef, 0x22, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x77, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xcc, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, /* U+57 "W" */ - 0x6b, 0x90, 0x0, 0x0, 0x8b, 0x70, 0x0, 0x0, - 0x9b, 0x65, 0xfe, 0x0, 0x0, 0xe, 0xfc, 0x0, - 0x0, 0xf, 0xf4, 0x2f, 0xf3, 0x0, 0x2, 0xff, - 0xf1, 0x0, 0x4, 0xff, 0x0, 0xef, 0x60, 0x0, - 0x7f, 0xff, 0x60, 0x0, 0x7f, 0xd0, 0xa, 0xfa, - 0x0, 0xb, 0xfb, 0xfa, 0x0, 0xb, 0xf9, 0x0, - 0x6f, 0xc0, 0x0, 0xff, 0x4f, 0xd0, 0x0, 0xef, - 0x50, 0x2, 0xff, 0x10, 0x4f, 0xe0, 0xef, 0x30, - 0x1f, 0xf1, 0x0, 0xe, 0xf4, 0x8, 0xf9, 0x9, - 0xf7, 0x5, 0xfd, 0x0, 0x0, 0xaf, 0x80, 0xdf, - 0x40, 0x5f, 0xc0, 0x8f, 0x90, 0x0, 0x6, 0xfc, - 0x1f, 0xf0, 0x0, 0xff, 0xc, 0xf5, 0x0, 0x0, - 0x3f, 0xe5, 0xfb, 0x0, 0xb, 0xf4, 0xff, 0x20, - 0x0, 0x0, 0xff, 0x9f, 0x60, 0x0, 0x7f, 0xaf, - 0xe0, 0x0, 0x0, 0xb, 0xfe, 0xf1, 0x0, 0x2, - 0xfd, 0xfa, 0x0, 0x0, 0x0, 0x7f, 0xfd, 0x0, - 0x0, 0xe, 0xff, 0x60, 0x0, 0x0, 0x3, 0xff, - 0x80, 0x0, 0x0, 0x9f, 0xf2, 0x0, 0x0, 0x0, - 0xf, 0xf3, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, + 0x3f, 0xd0, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, + 0x2f, 0xe0, 0xf, 0xf0, 0x0, 0x0, 0x6f, 0xf2, + 0x0, 0x0, 0x5f, 0xb0, 0xc, 0xf4, 0x0, 0x0, + 0xaf, 0xf7, 0x0, 0x0, 0x9f, 0x70, 0x8, 0xf8, + 0x0, 0x0, 0xed, 0xfb, 0x0, 0x0, 0xcf, 0x30, + 0x4, 0xfb, 0x0, 0x3, 0xf9, 0xcf, 0x0, 0x0, + 0xff, 0x0, 0x0, 0xff, 0x0, 0x7, 0xf5, 0x8f, + 0x30, 0x4, 0xfb, 0x0, 0x0, 0xcf, 0x20, 0xc, + 0xf0, 0x4f, 0x80, 0x7, 0xf8, 0x0, 0x0, 0x9f, + 0x60, 0x1f, 0xb0, 0xf, 0xc0, 0xb, 0xf4, 0x0, + 0x0, 0x5f, 0xa0, 0x5f, 0x70, 0xb, 0xf1, 0xe, + 0xf0, 0x0, 0x0, 0x1f, 0xd0, 0x9f, 0x20, 0x6, + 0xf5, 0x2f, 0xc0, 0x0, 0x0, 0xd, 0xf1, 0xee, + 0x0, 0x2, 0xf9, 0x5f, 0x80, 0x0, 0x0, 0xa, + 0xf6, 0xf9, 0x0, 0x0, 0xdd, 0x8f, 0x50, 0x0, + 0x0, 0x6, 0xfc, 0xf5, 0x0, 0x0, 0x9f, 0xcf, + 0x10, 0x0, 0x0, 0x2, 0xff, 0xf0, 0x0, 0x0, + 0x5f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, + 0x0, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0x70, 0x0, 0x0, 0xc, 0xf5, 0x0, 0x0, /* U+58 "X" */ - 0x1b, 0xb6, 0x0, 0x0, 0x0, 0x6b, 0xb1, 0x8, - 0xfe, 0x10, 0x0, 0x1, 0xef, 0x80, 0x0, 0xdf, - 0xa0, 0x0, 0xa, 0xfd, 0x0, 0x0, 0x3f, 0xf4, - 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x8, 0xfc, 0x0, - 0xdf, 0x80, 0x0, 0x0, 0x1, 0xef, 0x77, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x4f, 0xee, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0x98, 0xfb, 0x0, 0x0, 0x0, 0x7, 0xff, - 0x11, 0xef, 0x70, 0x0, 0x0, 0x2e, 0xf6, 0x0, - 0x5f, 0xe2, 0x0, 0x0, 0xbf, 0xc0, 0x0, 0xc, - 0xfa, 0x0, 0x5, 0xff, 0x30, 0x0, 0x2, 0xff, - 0x50, 0x1e, 0xf9, 0x0, 0x0, 0x0, 0x8f, 0xe1, + 0xe, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x5, + 0xff, 0x10, 0x0, 0x4, 0xff, 0x20, 0x0, 0xbf, + 0xb0, 0x0, 0xd, 0xf8, 0x0, 0x0, 0x2f, 0xf5, + 0x0, 0x7f, 0xe0, 0x0, 0x0, 0x7, 0xfe, 0x2, + 0xff, 0x40, 0x0, 0x0, 0x0, 0xdf, 0x9b, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xef, 0x7a, 0xfc, 0x0, 0x0, 0x0, 0x8, 0xfd, + 0x1, 0xef, 0x60, 0x0, 0x0, 0x3f, 0xf3, 0x0, + 0x6f, 0xe1, 0x0, 0x0, 0xcf, 0x90, 0x0, 0xc, + 0xfa, 0x0, 0x7, 0xfe, 0x10, 0x0, 0x2, 0xff, + 0x40, 0x1f, 0xf5, 0x0, 0x0, 0x0, 0x8f, 0xd0, /* U+59 "Y" */ - 0x5b, 0xa0, 0x0, 0x0, 0x0, 0x1b, 0xb4, 0x1f, - 0xf6, 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x6, 0xfe, - 0x10, 0x0, 0x2, 0xff, 0x40, 0x0, 0xef, 0x80, - 0x0, 0xa, 0xfc, 0x0, 0x0, 0x6f, 0xe1, 0x0, - 0x2f, 0xf3, 0x0, 0x0, 0xc, 0xf8, 0x0, 0xaf, - 0xa0, 0x0, 0x0, 0x4, 0xfe, 0x12, 0xff, 0x20, - 0x0, 0x0, 0x0, 0xcf, 0x8a, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xef, 0xf1, 0x0, 0x0, 0x0, - 0x0, 0xa, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, 0x0, + 0x9f, 0xc0, 0x0, 0x0, 0x0, 0x9f, 0xb0, 0x1f, + 0xf4, 0x0, 0x0, 0x1, 0xff, 0x30, 0x8, 0xfc, + 0x0, 0x0, 0x9, 0xfa, 0x0, 0x0, 0xef, 0x40, + 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x6f, 0xd0, 0x0, + 0xaf, 0x90, 0x0, 0x0, 0xd, 0xf5, 0x2, 0xff, + 0x10, 0x0, 0x0, 0x5, 0xfd, 0xa, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x8f, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xf9, 0x0, 0x0, 0x0, /* U+5A "Z" */ - 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0x90, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0x70, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf2, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0x50, 0x0, 0x0, 0x0, 0x9, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf1, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0x50, 0x0, 0x0, 0x0, 0xb, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf1, 0x0, - 0x0, 0x0, 0x1, 0xef, 0x50, 0x0, 0x0, 0x0, - 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xdb, 0xbb, 0xbb, - 0xbb, 0xb3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xab, + 0xbb, 0xbb, 0xbb, 0xef, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfe, 0x10, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfd, 0xbb, 0xbb, 0xbb, + 0xbb, 0x31, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, /* U+5B "[" */ - 0x6b, 0xbb, 0x98, 0xff, 0xc9, 0x8f, 0xc0, 0x8, - 0xfc, 0x0, 0x8f, 0xc0, 0x8, 0xfc, 0x0, 0x8f, - 0xc0, 0x8, 0xfc, 0x0, 0x8f, 0xc0, 0x8, 0xfc, - 0x0, 0x8f, 0xc0, 0x8, 0xfc, 0x0, 0x8f, 0xc0, - 0x8, 0xfc, 0x0, 0x8f, 0xc0, 0x8, 0xfc, 0x0, - 0x8f, 0xc0, 0x8, 0xfc, 0x0, 0x8f, 0xc0, 0x8, - 0xfc, 0x33, 0x8f, 0xff, 0xc2, 0x44, 0x43, + 0x4a, 0xaa, 0x67, 0xff, 0xfa, 0x7f, 0x90, 0x7, + 0xf9, 0x0, 0x7f, 0x90, 0x7, 0xf9, 0x0, 0x7f, + 0x90, 0x7, 0xf9, 0x0, 0x7f, 0x90, 0x7, 0xf9, + 0x0, 0x7f, 0x90, 0x7, 0xf9, 0x0, 0x7f, 0x90, + 0x7, 0xf9, 0x0, 0x7f, 0x90, 0x7, 0xf9, 0x0, + 0x7f, 0x90, 0x7, 0xf9, 0x0, 0x7f, 0x90, 0x7, + 0xf9, 0x0, 0x7f, 0xda, 0x67, 0xff, 0xfa, /* U+5C "\\" */ - 0x6b, 0x60, 0x0, 0x0, 0x2, 0xfd, 0x0, 0x0, - 0x0, 0xc, 0xf4, 0x0, 0x0, 0x0, 0x6f, 0xa0, - 0x0, 0x0, 0x1, 0xfe, 0x10, 0x0, 0x0, 0xa, - 0xf6, 0x0, 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, - 0x0, 0xef, 0x20, 0x0, 0x0, 0x7, 0xf9, 0x0, - 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, 0x0, 0xbf, - 0x50, 0x0, 0x0, 0x5, 0xfb, 0x0, 0x0, 0x0, - 0xe, 0xf2, 0x0, 0x0, 0x0, 0x9f, 0x70, 0x0, - 0x0, 0x2, 0xfd, 0x0, 0x0, 0x0, 0xc, 0xf4, - 0x0, 0x0, 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x1, - 0x43, + 0x5f, 0x80, 0x0, 0x0, 0x0, 0xfe, 0x0, 0x0, + 0x0, 0x9, 0xf4, 0x0, 0x0, 0x0, 0x3f, 0xa0, + 0x0, 0x0, 0x0, 0xdf, 0x10, 0x0, 0x0, 0x7, + 0xf7, 0x0, 0x0, 0x0, 0x1f, 0xd0, 0x0, 0x0, + 0x0, 0xaf, 0x30, 0x0, 0x0, 0x4, 0xf9, 0x0, + 0x0, 0x0, 0xe, 0xf0, 0x0, 0x0, 0x0, 0x8f, + 0x50, 0x0, 0x0, 0x2, 0xfb, 0x0, 0x0, 0x0, + 0xc, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0x80, 0x0, + 0x0, 0x0, 0xfe, 0x0, 0x0, 0x0, 0x9, 0xf4, + 0x0, 0x0, 0x0, 0x3f, 0xa0, /* U+5D "]" */ - 0x9b, 0xbb, 0x39, 0xcf, 0xf4, 0x0, 0xcf, 0x40, - 0xc, 0xf4, 0x0, 0xcf, 0x40, 0xc, 0xf4, 0x0, - 0xcf, 0x40, 0xc, 0xf4, 0x0, 0xcf, 0x40, 0xc, - 0xf4, 0x0, 0xcf, 0x40, 0xc, 0xf4, 0x0, 0xcf, - 0x40, 0xc, 0xf4, 0x0, 0xcf, 0x40, 0xc, 0xf4, - 0x0, 0xcf, 0x40, 0xc, 0xf4, 0x0, 0xcf, 0x43, - 0x3c, 0xf4, 0xcf, 0xff, 0x43, 0x44, 0x41, + 0x9a, 0xaa, 0x1e, 0xff, 0xf2, 0x0, 0xdf, 0x20, + 0xd, 0xf2, 0x0, 0xdf, 0x20, 0xd, 0xf2, 0x0, + 0xdf, 0x20, 0xd, 0xf2, 0x0, 0xdf, 0x20, 0xd, + 0xf2, 0x0, 0xdf, 0x20, 0xd, 0xf2, 0x0, 0xdf, + 0x20, 0xd, 0xf2, 0x0, 0xdf, 0x20, 0xd, 0xf2, + 0x0, 0xdf, 0x20, 0xd, 0xf2, 0x0, 0xdf, 0x20, + 0xd, 0xf2, 0x9a, 0xff, 0x2e, 0xff, 0xf2, /* U+5E "^" */ - 0x0, 0x3, 0xb5, 0x0, 0x0, 0x0, 0xaf, 0xb0, - 0x0, 0x0, 0x1e, 0xff, 0x30, 0x0, 0x6, 0xfb, - 0xfa, 0x0, 0x0, 0xef, 0x1e, 0xe1, 0x0, 0x4f, - 0xa0, 0x8f, 0x60, 0xa, 0xf5, 0x2, 0xfd, 0x1, - 0xfe, 0x0, 0xb, 0xf4, 0x14, 0x30, 0x0, 0x24, - 0x20, + 0x0, 0x4, 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xd0, + 0x0, 0x0, 0x1f, 0xff, 0x40, 0x0, 0x8, 0xf6, + 0xfa, 0x0, 0x0, 0xee, 0xb, 0xf1, 0x0, 0x4f, + 0x80, 0x5f, 0x70, 0xb, 0xf1, 0x0, 0xed, 0x1, + 0xfb, 0x0, 0x9, 0xf4, /* U+5F "_" */ - 0xff, 0xff, 0xff, 0xff, 0xff, 0x9a, 0xaa, 0xaa, - 0xaa, 0xa9, + 0x9a, 0xaa, 0xaa, 0xaa, 0xa9, 0xff, 0xff, 0xff, + 0xff, 0xfe, /* U+60 "`" */ - 0x43, 0x20, 0x6, 0xfd, 0x10, 0x6, 0xf9, 0x0, - 0x5, 0x81, + 0x1d, 0xf5, 0x0, 0x1, 0xef, 0x10, 0x0, 0x2e, + 0xb0, /* U+61 "a" */ - 0x0, 0x28, 0xbb, 0xa4, 0x0, 0x6, 0xff, 0xfe, - 0xff, 0x90, 0x1e, 0xf5, 0x0, 0x4f, 0xf3, 0x28, - 0x60, 0x0, 0xb, 0xf8, 0x0, 0x0, 0x0, 0x8, - 0xf8, 0x0, 0x69, 0xbb, 0xbd, 0xf8, 0x1c, 0xff, - 0xcc, 0xce, 0xf8, 0x9f, 0xd1, 0x0, 0x8, 0xf8, - 0xcf, 0x50, 0x0, 0xa, 0xf8, 0xcf, 0x70, 0x0, - 0x6f, 0xf8, 0x7f, 0xf9, 0x8c, 0xfb, 0xf9, 0x8, - 0xff, 0xfe, 0x47, 0xfc, 0x0, 0x3, 0x20, 0x0, - 0x0, + 0x0, 0x5c, 0xfe, 0xc5, 0x0, 0xa, 0xfe, 0xbb, + 0xff, 0x90, 0x5f, 0xc0, 0x0, 0x2f, 0xf2, 0x48, + 0x30, 0x0, 0xb, 0xf5, 0x0, 0x0, 0x1, 0x1a, + 0xf5, 0x1, 0x9e, 0xff, 0xff, 0xf5, 0x2e, 0xfa, + 0x65, 0x4b, 0xf5, 0xaf, 0x70, 0x0, 0xa, 0xf5, + 0xcf, 0x30, 0x0, 0xb, 0xf5, 0xaf, 0x90, 0x0, + 0x7f, 0xf6, 0x2f, 0xfe, 0xce, 0xfd, 0xf7, 0x2, + 0xbf, 0xfc, 0x45, 0xc8, /* U+62 "b" */ - 0x6b, 0x90, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x0, - 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xc0, - 0x0, 0x0, 0x0, 0x8, 0xfc, 0x29, 0xbb, 0x61, - 0x0, 0x8f, 0xde, 0xff, 0xff, 0xc1, 0x8, 0xff, - 0xa1, 0x3, 0xff, 0x90, 0x8f, 0xd0, 0x0, 0x4, - 0xfe, 0x18, 0xfc, 0x0, 0x0, 0xe, 0xf4, 0x8f, - 0xc0, 0x0, 0x0, 0xcf, 0x68, 0xfc, 0x0, 0x0, - 0xc, 0xf8, 0x8f, 0xc0, 0x0, 0x0, 0xcf, 0x58, - 0xfc, 0x0, 0x0, 0x1e, 0xf4, 0x8f, 0xf3, 0x0, - 0x8, 0xfe, 0x8, 0xfe, 0xf9, 0x7c, 0xff, 0x50, - 0x8f, 0x48, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x0, - 0x42, 0x0, 0x0, + 0x8f, 0x70, 0x0, 0x0, 0x0, 0x8, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0x70, 0x0, 0x0, 0x0, + 0x8, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x75, + 0xcf, 0xea, 0x10, 0x8, 0xfd, 0xfd, 0xce, 0xfe, + 0x10, 0x8f, 0xf5, 0x0, 0xc, 0xfa, 0x8, 0xf9, + 0x0, 0x0, 0x2f, 0xf0, 0x8f, 0x70, 0x0, 0x0, + 0xcf, 0x38, 0xf7, 0x0, 0x0, 0xa, 0xf5, 0x8f, + 0x70, 0x0, 0x0, 0xaf, 0x58, 0xf7, 0x0, 0x0, + 0xc, 0xf3, 0x8f, 0x90, 0x0, 0x2, 0xff, 0x8, + 0xff, 0x50, 0x0, 0xcf, 0xa0, 0x8f, 0xdf, 0xdb, + 0xef, 0xe1, 0x8, 0xf5, 0x5c, 0xfe, 0xa1, 0x0, /* U+63 "c" */ - 0x0, 0x27, 0xbb, 0x93, 0x0, 0x4, 0xef, 0xfe, - 0xff, 0x60, 0x1e, 0xf6, 0x0, 0x5f, 0xe2, 0x8f, - 0xb0, 0x0, 0x9, 0xf6, 0xcf, 0x50, 0x0, 0x4, - 0x84, 0xef, 0x40, 0x0, 0x0, 0x0, 0xff, 0x40, - 0x0, 0x0, 0x0, 0xcf, 0x40, 0x0, 0x0, 0x0, - 0xbf, 0x90, 0x0, 0x6, 0xb6, 0x3f, 0xd3, 0x0, - 0xd, 0xf5, 0x9, 0xfe, 0x87, 0xcf, 0xb0, 0x0, - 0x7f, 0xff, 0xf8, 0x10, 0x0, 0x0, 0x13, 0x0, - 0x0, + 0x0, 0x4, 0xbe, 0xfc, 0x50, 0x0, 0x7, 0xff, + 0xbb, 0xff, 0xa0, 0x3, 0xfe, 0x30, 0x1, 0xdf, + 0x50, 0xaf, 0x70, 0x0, 0x4, 0xfa, 0xe, 0xf1, + 0x0, 0x0, 0x3, 0x20, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xa, 0xf6, 0x0, 0x0, + 0x3e, 0x90, 0x3f, 0xe2, 0x0, 0x1c, 0xf5, 0x0, + 0x7f, 0xfb, 0xbe, 0xf9, 0x0, 0x0, 0x4b, 0xff, + 0xc5, 0x0, /* U+64 "d" */ - 0x0, 0x0, 0x0, 0x3, 0xbb, 0x0, 0x0, 0x0, - 0x4, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x0, 0x48, 0xbb, 0x54, 0xff, 0x6, 0xff, - 0xff, 0xfc, 0xff, 0x1e, 0xfa, 0x0, 0x4f, 0xff, - 0x8f, 0xc0, 0x0, 0x5, 0xff, 0xcf, 0x60, 0x0, - 0x4, 0xff, 0xdf, 0x40, 0x0, 0x4, 0xff, 0xff, - 0x40, 0x0, 0x4, 0xff, 0xdf, 0x40, 0x0, 0x4, - 0xff, 0xcf, 0x80, 0x0, 0x4, 0xff, 0x6f, 0xd2, - 0x0, 0xb, 0xff, 0xd, 0xfe, 0x97, 0xde, 0xff, - 0x1, 0xaf, 0xff, 0xc3, 0xef, 0x0, 0x0, 0x32, - 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xfd, 0x0, 0x0, 0x0, + 0x2, 0xfd, 0x0, 0x0, 0x0, 0x2, 0xfd, 0x0, + 0x0, 0x0, 0x2, 0xfd, 0x0, 0x6d, 0xfe, 0x93, + 0xfd, 0x9, 0xff, 0xcc, 0xfe, 0xfd, 0x3f, 0xf4, + 0x0, 0x1c, 0xfd, 0xaf, 0x80, 0x0, 0x3, 0xfd, + 0xdf, 0x30, 0x0, 0x2, 0xfd, 0xff, 0x10, 0x0, + 0x2, 0xfd, 0xff, 0x0, 0x0, 0x2, 0xfd, 0xdf, + 0x20, 0x0, 0x2, 0xfd, 0xaf, 0x60, 0x0, 0x2, + 0xfd, 0x3f, 0xe1, 0x0, 0xa, 0xfd, 0x9, 0xfe, + 0x98, 0xdf, 0xfd, 0x0, 0x6d, 0xfe, 0xa2, 0xfd, /* U+65 "e" */ - 0x0, 0x17, 0xbb, 0x83, 0x0, 0x3, 0xef, 0xff, - 0xfe, 0x60, 0x1d, 0xf7, 0x0, 0x5f, 0xe1, 0x8f, - 0xb0, 0x0, 0xa, 0xf7, 0xcf, 0x60, 0x0, 0x8, - 0xf8, 0xef, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xa8, - 0x88, 0x88, 0x86, 0xcf, 0x50, 0x0, 0x0, 0x0, - 0xaf, 0xa0, 0x0, 0x0, 0x0, 0x3f, 0xe3, 0x0, - 0x0, 0x20, 0x8, 0xfe, 0x97, 0x7b, 0xf1, 0x0, - 0x5e, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x4, 0x40, - 0x0, + 0x0, 0x3b, 0xef, 0xc5, 0x0, 0x5, 0xff, 0xcb, + 0xff, 0x80, 0x2f, 0xf3, 0x0, 0x2e, 0xf3, 0x9f, + 0x70, 0x0, 0x6, 0xf8, 0xdf, 0x20, 0x0, 0x2, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xaa, + 0xaa, 0xaa, 0xa9, 0xef, 0x20, 0x0, 0x0, 0x0, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0x3f, 0xf4, 0x0, + 0x4, 0xe5, 0x7, 0xff, 0xca, 0xcf, 0xe2, 0x0, + 0x4b, 0xef, 0xd9, 0x10, /* U+66 "f" */ - 0x0, 0x4, 0xbe, 0xe3, 0x0, 0x3f, 0xfd, 0xc3, - 0x0, 0xbf, 0xb0, 0x0, 0x0, 0xcf, 0x40, 0x0, - 0x0, 0xcf, 0x40, 0x0, 0x67, 0xdf, 0x97, 0x20, - 0xcf, 0xff, 0xff, 0x40, 0x0, 0xcf, 0x40, 0x0, - 0x0, 0xcf, 0x40, 0x0, 0x0, 0xcf, 0x40, 0x0, - 0x0, 0xcf, 0x40, 0x0, 0x0, 0xcf, 0x40, 0x0, - 0x0, 0xcf, 0x40, 0x0, 0x0, 0xcf, 0x40, 0x0, - 0x0, 0xcf, 0x40, 0x0, 0x0, 0xcf, 0x40, 0x0, - 0x0, 0xcf, 0x40, 0x0, + 0x0, 0x1, 0x9d, 0xf8, 0x0, 0xc, 0xfe, 0xc7, + 0x0, 0x5f, 0xd0, 0x0, 0x0, 0x7f, 0x80, 0x0, + 0x0, 0x8f, 0x70, 0x0, 0x5f, 0xff, 0xff, 0xf0, + 0x39, 0xcf, 0xc9, 0x80, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x8f, 0x70, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x8f, 0x70, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x8f, 0x70, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x8f, 0x70, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x8f, 0x70, 0x0, /* U+67 "g" */ - 0x0, 0x38, 0xbb, 0x60, 0x67, 0x4, 0xef, 0xff, - 0xfa, 0xef, 0xe, 0xfa, 0x10, 0x2d, 0xff, 0x6f, - 0xe0, 0x0, 0x2, 0xff, 0xaf, 0x90, 0x0, 0x0, - 0xff, 0xcf, 0x60, 0x0, 0x0, 0xff, 0xcf, 0x40, - 0x0, 0x0, 0xff, 0xcf, 0x60, 0x0, 0x0, 0xff, - 0x9f, 0xa0, 0x0, 0x1, 0xff, 0x4f, 0xe3, 0x0, - 0xa, 0xff, 0xc, 0xfe, 0x97, 0xbf, 0xff, 0x0, - 0x9f, 0xff, 0xd3, 0xff, 0x0, 0x0, 0x33, 0x3, - 0xff, 0x0, 0x0, 0x0, 0x6, 0xfc, 0x4, 0x83, - 0x23, 0x5e, 0xf5, 0x8, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x58, 0xca, 0x83, 0x0, + 0x0, 0x6d, 0xfe, 0x91, 0xfd, 0x9, 0xff, 0xcc, + 0xfd, 0xfd, 0x3f, 0xf4, 0x0, 0x1c, 0xfd, 0xaf, + 0x80, 0x0, 0x3, 0xfd, 0xdf, 0x30, 0x0, 0x2, + 0xfd, 0xff, 0x10, 0x0, 0x2, 0xfd, 0xff, 0x10, + 0x0, 0x2, 0xfd, 0xdf, 0x20, 0x0, 0x2, 0xfd, + 0xaf, 0x80, 0x0, 0x3, 0xfd, 0x3f, 0xf4, 0x0, + 0x1c, 0xfd, 0x9, 0xff, 0xcc, 0xfe, 0xfd, 0x0, + 0x6d, 0xfe, 0x93, 0xfd, 0x0, 0x0, 0x0, 0x3, + 0xfc, 0x3, 0x0, 0x0, 0x7, 0xfa, 0x2f, 0x90, + 0x0, 0x3f, 0xf4, 0xc, 0xfe, 0xac, 0xff, 0x90, + 0x0, 0x6c, 0xff, 0xc5, 0x0, /* U+68 "h" */ - 0x6b, 0x90, 0x0, 0x0, 0x0, 0x8f, 0xc0, 0x0, - 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x8f, - 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, - 0x0, 0x8f, 0xc1, 0x8b, 0xb8, 0x10, 0x8f, 0xdc, - 0xff, 0xff, 0xe2, 0x8f, 0xf7, 0x0, 0x2d, 0xfa, - 0x8f, 0xc0, 0x0, 0x5, 0xfc, 0x8f, 0xc0, 0x0, - 0x2, 0xff, 0x8f, 0xc0, 0x0, 0x0, 0xff, 0x8f, - 0xc0, 0x0, 0x0, 0xff, 0x8f, 0xc0, 0x0, 0x0, - 0xff, 0x8f, 0xc0, 0x0, 0x0, 0xff, 0x8f, 0xc0, - 0x0, 0x0, 0xff, 0x8f, 0xc0, 0x0, 0x0, 0xff, - 0x8f, 0xc0, 0x0, 0x0, 0xff, + 0x8f, 0x70, 0x0, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x0, 0x8f, 0x70, 0x0, 0x0, 0x0, 0x8f, + 0x70, 0x0, 0x0, 0x0, 0x8f, 0x74, 0xbf, 0xeb, + 0x20, 0x8f, 0xcf, 0xdc, 0xef, 0xe1, 0x8f, 0xf6, + 0x0, 0xd, 0xf6, 0x8f, 0x90, 0x0, 0x7, 0xf9, + 0x8f, 0x70, 0x0, 0x5, 0xfa, 0x8f, 0x70, 0x0, + 0x5, 0xfa, 0x8f, 0x70, 0x0, 0x5, 0xfa, 0x8f, + 0x70, 0x0, 0x5, 0xfa, 0x8f, 0x70, 0x0, 0x5, + 0xfa, 0x8f, 0x70, 0x0, 0x5, 0xfa, 0x8f, 0x70, + 0x0, 0x5, 0xfa, 0x8f, 0x70, 0x0, 0x5, 0xfa, /* U+69 "i" */ - 0x3b, 0x94, 0xfc, 0x28, 0x60, 0x0, 0x0, 0x2, - 0x76, 0x4f, 0xc4, 0xfc, 0x4f, 0xc4, 0xfc, 0x4f, - 0xc4, 0xfc, 0x4f, 0xc4, 0xfc, 0x4f, 0xc4, 0xfc, - 0x4f, 0xc0, + 0x3f, 0x96, 0xfc, 0x4, 0x10, 0x0, 0x5f, 0xa5, + 0xfa, 0x5f, 0xa5, 0xfa, 0x5f, 0xa5, 0xfa, 0x5f, + 0xa5, 0xfa, 0x5f, 0xa5, 0xfa, 0x5f, 0xa5, 0xfa, /* U+6A "j" */ - 0x0, 0x3b, 0xb0, 0x4, 0xff, 0x0, 0x14, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x77, 0x0, - 0x4f, 0xf0, 0x4, 0xff, 0x0, 0x4f, 0xf0, 0x4, - 0xff, 0x0, 0x4f, 0xf0, 0x4, 0xff, 0x0, 0x4f, - 0xf0, 0x4, 0xff, 0x0, 0x4f, 0xf0, 0x4, 0xff, - 0x0, 0x4f, 0xf0, 0x4, 0xff, 0x0, 0x4f, 0xe0, - 0x19, 0xfb, 0xaf, 0xff, 0x37, 0xb8, 0x20, + 0x0, 0x6f, 0x60, 0x8, 0xf9, 0x0, 0x4, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0x90, 0x7, 0xf9, 0x0, + 0x7f, 0x90, 0x7, 0xf9, 0x0, 0x7f, 0x90, 0x7, + 0xf9, 0x0, 0x7f, 0x90, 0x7, 0xf9, 0x0, 0x7f, + 0x90, 0x7, 0xf9, 0x0, 0x7f, 0x90, 0x7, 0xf9, + 0x0, 0x7f, 0x90, 0x7, 0xf8, 0x0, 0x9f, 0x78, + 0xcf, 0xf2, 0xaf, 0xd5, 0x0, /* U+6B "k" */ - 0x6b, 0x90, 0x0, 0x0, 0x0, 0x8f, 0xc0, 0x0, - 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x8f, - 0xc0, 0x0, 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, - 0x0, 0x8f, 0xc0, 0x0, 0x17, 0x73, 0x8f, 0xc0, - 0x0, 0x9f, 0xd1, 0x8f, 0xc0, 0x5, 0xff, 0x30, - 0x8f, 0xc0, 0x1e, 0xf6, 0x0, 0x8f, 0xc0, 0xcf, - 0xa0, 0x0, 0x8f, 0xff, 0xfe, 0x10, 0x0, 0x8f, - 0xfc, 0xff, 0x40, 0x0, 0x8f, 0xc0, 0x7f, 0xe1, - 0x0, 0x8f, 0xc0, 0xc, 0xfa, 0x0, 0x8f, 0xc0, - 0x2, 0xff, 0x60, 0x8f, 0xc0, 0x0, 0x7f, 0xe2, - 0x8f, 0xc0, 0x0, 0xc, 0xfb, + 0x7f, 0x80, 0x0, 0x0, 0x0, 0x7, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0x80, 0x0, 0x0, 0x0, + 0x7, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7f, 0x80, + 0x0, 0x4f, 0xf3, 0x7, 0xf8, 0x0, 0x3f, 0xf4, + 0x0, 0x7f, 0x80, 0x2e, 0xf5, 0x0, 0x7, 0xf8, + 0x2e, 0xf7, 0x0, 0x0, 0x7f, 0x8d, 0xf8, 0x0, + 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, 0x7f, + 0xfc, 0xff, 0x20, 0x0, 0x7, 0xfc, 0x7, 0xfd, + 0x0, 0x0, 0x7f, 0x80, 0xc, 0xf9, 0x0, 0x7, + 0xf8, 0x0, 0x1e, 0xf5, 0x0, 0x7f, 0x80, 0x0, + 0x4f, 0xe1, 0x7, 0xf8, 0x0, 0x0, 0x9f, 0xc0, /* U+6C "l" */ - 0x3c, 0xa4, 0xfd, 0x4f, 0xd4, 0xfd, 0x4f, 0xd4, - 0xfd, 0x4f, 0xd4, 0xfd, 0x4f, 0xd4, 0xfd, 0x4f, - 0xd4, 0xfd, 0x4f, 0xd4, 0xfd, 0x4f, 0xd4, 0xfd, - 0x4f, 0xd0, + 0x5f, 0xa5, 0xfa, 0x5f, 0xa5, 0xfa, 0x5f, 0xa5, + 0xfa, 0x5f, 0xa5, 0xfa, 0x5f, 0xa5, 0xfa, 0x5f, + 0xa5, 0xfa, 0x5f, 0xa5, 0xfa, 0x5f, 0xa5, 0xfa, /* U+6D "m" */ - 0x47, 0x41, 0x8b, 0xb8, 0x10, 0x29, 0xbb, 0x60, - 0x8, 0xfb, 0xef, 0xff, 0xfc, 0x3e, 0xff, 0xff, - 0xa0, 0x8f, 0xf7, 0x0, 0x5f, 0xfe, 0xa1, 0x4, - 0xff, 0x48, 0xfc, 0x0, 0x0, 0xaf, 0xf1, 0x0, - 0xa, 0xf8, 0x8f, 0xc0, 0x0, 0x8, 0xfc, 0x0, - 0x0, 0x8f, 0xa8, 0xfc, 0x0, 0x0, 0x8f, 0xc0, - 0x0, 0x8, 0xfc, 0x8f, 0xc0, 0x0, 0x8, 0xfc, - 0x0, 0x0, 0x8f, 0xc8, 0xfc, 0x0, 0x0, 0x8f, - 0xc0, 0x0, 0x8, 0xfc, 0x8f, 0xc0, 0x0, 0x8, - 0xfc, 0x0, 0x0, 0x8f, 0xc8, 0xfc, 0x0, 0x0, - 0x8f, 0xc0, 0x0, 0x8, 0xfc, 0x8f, 0xc0, 0x0, - 0x8, 0xfc, 0x0, 0x0, 0x8f, 0xc8, 0xfc, 0x0, - 0x0, 0x8f, 0xc0, 0x0, 0x8, 0xfc, + 0x8f, 0x65, 0xcf, 0xea, 0x10, 0x4c, 0xfe, 0xb3, + 0x8, 0xfd, 0xfc, 0xcf, 0xfe, 0x7f, 0xec, 0xef, + 0xf2, 0x8f, 0xf3, 0x0, 0x1e, 0xff, 0x70, 0x0, + 0xbf, 0x88, 0xf8, 0x0, 0x0, 0x7f, 0xd0, 0x0, + 0x4, 0xfb, 0x8f, 0x70, 0x0, 0x5, 0xfa, 0x0, + 0x0, 0x3f, 0xc8, 0xf7, 0x0, 0x0, 0x5f, 0xa0, + 0x0, 0x3, 0xfc, 0x8f, 0x70, 0x0, 0x5, 0xfa, + 0x0, 0x0, 0x3f, 0xc8, 0xf7, 0x0, 0x0, 0x5f, + 0xa0, 0x0, 0x3, 0xfc, 0x8f, 0x70, 0x0, 0x5, + 0xfa, 0x0, 0x0, 0x3f, 0xc8, 0xf7, 0x0, 0x0, + 0x5f, 0xa0, 0x0, 0x3, 0xfc, 0x8f, 0x70, 0x0, + 0x5, 0xfa, 0x0, 0x0, 0x3f, 0xc8, 0xf7, 0x0, + 0x0, 0x5f, 0xa0, 0x0, 0x3, 0xfc, /* U+6E "n" */ - 0x47, 0x41, 0x7b, 0xb8, 0x10, 0x8f, 0x9c, 0xff, - 0xff, 0xe2, 0x8f, 0xf7, 0x0, 0x2d, 0xfa, 0x8f, - 0xc0, 0x0, 0x5, 0xfc, 0x8f, 0xc0, 0x0, 0x4, - 0xff, 0x8f, 0xc0, 0x0, 0x4, 0xff, 0x8f, 0xc0, - 0x0, 0x4, 0xff, 0x8f, 0xc0, 0x0, 0x4, 0xff, - 0x8f, 0xc0, 0x0, 0x4, 0xff, 0x8f, 0xc0, 0x0, - 0x4, 0xff, 0x8f, 0xc0, 0x0, 0x4, 0xff, 0x8f, - 0xc0, 0x0, 0x4, 0xff, + 0x8f, 0x64, 0xbf, 0xeb, 0x20, 0x8f, 0xcf, 0xdc, + 0xef, 0xe1, 0x8f, 0xf6, 0x0, 0xd, 0xf6, 0x8f, + 0x90, 0x0, 0x7, 0xf9, 0x8f, 0x70, 0x0, 0x5, + 0xfa, 0x8f, 0x70, 0x0, 0x5, 0xfa, 0x8f, 0x70, + 0x0, 0x5, 0xfa, 0x8f, 0x70, 0x0, 0x5, 0xfa, + 0x8f, 0x70, 0x0, 0x5, 0xfa, 0x8f, 0x70, 0x0, + 0x5, 0xfa, 0x8f, 0x70, 0x0, 0x5, 0xfa, 0x8f, + 0x70, 0x0, 0x5, 0xfa, /* U+6F "o" */ - 0x0, 0x17, 0xbb, 0x85, 0x0, 0x0, 0x3e, 0xff, - 0xef, 0xf8, 0x0, 0x1d, 0xf9, 0x0, 0x3f, 0xf7, - 0x8, 0xfc, 0x0, 0x0, 0x4f, 0xe1, 0xcf, 0x50, - 0x0, 0x0, 0xef, 0x4e, 0xf4, 0x0, 0x0, 0xc, - 0xf6, 0xff, 0x40, 0x0, 0x0, 0xcf, 0x7c, 0xf4, - 0x0, 0x0, 0xc, 0xf4, 0xaf, 0x90, 0x0, 0x2, - 0xff, 0x22, 0xfe, 0x30, 0x0, 0xaf, 0xa0, 0x9, - 0xfe, 0x87, 0xbf, 0xf2, 0x0, 0x6, 0xef, 0xff, - 0xb1, 0x0, 0x0, 0x0, 0x13, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xbe, 0xfd, 0x70, 0x0, 0x0, 0x6f, + 0xfc, 0xbe, 0xfd, 0x10, 0x2, 0xff, 0x50, 0x0, + 0xbf, 0xa0, 0x9, 0xf8, 0x0, 0x0, 0xf, 0xf2, + 0xd, 0xf2, 0x0, 0x0, 0x9, 0xf6, 0xf, 0xf0, + 0x0, 0x0, 0x7, 0xf8, 0xf, 0xf0, 0x0, 0x0, + 0x7, 0xf8, 0xe, 0xf2, 0x0, 0x0, 0x9, 0xf6, + 0x9, 0xf8, 0x0, 0x0, 0xe, 0xf2, 0x2, 0xff, + 0x40, 0x0, 0xaf, 0xb0, 0x0, 0x6f, 0xfc, 0xae, + 0xfd, 0x10, 0x0, 0x3, 0xbe, 0xfd, 0x80, 0x0, /* U+70 "p" */ - 0x47, 0x22, 0x9b, 0xa6, 0x10, 0x8, 0xf9, 0xef, - 0xff, 0xfc, 0x10, 0x8f, 0xf7, 0x0, 0x4f, 0xf8, - 0x8, 0xfc, 0x0, 0x0, 0x5f, 0xe1, 0x8f, 0xc0, - 0x0, 0x0, 0xef, 0x48, 0xfc, 0x0, 0x0, 0xc, - 0xf4, 0x8f, 0xc0, 0x0, 0x0, 0xcf, 0x88, 0xfc, - 0x0, 0x0, 0xc, 0xf4, 0x8f, 0xc0, 0x0, 0x1, - 0xef, 0x48, 0xfe, 0x10, 0x0, 0x9f, 0xe0, 0x8f, - 0xfe, 0x87, 0xbf, 0xf5, 0x8, 0xfc, 0x8f, 0xff, - 0xe4, 0x0, 0x8f, 0xc0, 0x4, 0x20, 0x0, 0x8, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xc0, 0x0, - 0x0, 0x0, 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x48, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0x57, 0xdf, 0xea, 0x10, 0x8, 0xff, 0xe9, + 0x8d, 0xfe, 0x10, 0x8f, 0xd1, 0x0, 0xb, 0xfa, + 0x8, 0xf7, 0x0, 0x0, 0x2f, 0xf0, 0x8f, 0x70, + 0x0, 0x0, 0xdf, 0x38, 0xf7, 0x0, 0x0, 0xb, + 0xf4, 0x8f, 0x70, 0x0, 0x0, 0xbf, 0x48, 0xf7, + 0x0, 0x0, 0xd, 0xf3, 0x8f, 0x80, 0x0, 0x3, + 0xff, 0x8, 0xfe, 0x20, 0x1, 0xcf, 0x90, 0x8f, + 0xef, 0xba, 0xef, 0xe1, 0x8, 0xf7, 0x6d, 0xfe, + 0xa1, 0x0, 0x8f, 0x70, 0x0, 0x0, 0x0, 0x8, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x0, 0x0, 0x8, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0x70, 0x0, 0x0, 0x0, 0x0, /* U+71 "q" */ - 0x0, 0x48, 0xbb, 0x50, 0x86, 0x6, 0xff, 0xfe, - 0xfa, 0xfc, 0x1e, 0xf7, 0x0, 0x3e, 0xfc, 0x8f, - 0xc0, 0x0, 0x5, 0xfc, 0xcf, 0x60, 0x0, 0x4, - 0xfc, 0xdf, 0x40, 0x0, 0x4, 0xfc, 0xff, 0x40, - 0x0, 0x4, 0xfc, 0xdf, 0x40, 0x0, 0x4, 0xfc, - 0xcf, 0x80, 0x0, 0x4, 0xfc, 0x6f, 0xd1, 0x0, - 0xb, 0xfc, 0xd, 0xfd, 0x87, 0xbf, 0xfc, 0x1, - 0xaf, 0xff, 0xc7, 0xfc, 0x0, 0x0, 0x32, 0x4, - 0xfc, 0x0, 0x0, 0x0, 0x4, 0xfc, 0x0, 0x0, - 0x0, 0x4, 0xfc, 0x0, 0x0, 0x0, 0x4, 0xfc, - 0x0, 0x0, 0x0, 0x2, 0x86, + 0x0, 0x6d, 0xfe, 0x92, 0xfd, 0x9, 0xff, 0xcb, + 0xfe, 0xfd, 0x4f, 0xf4, 0x0, 0xb, 0xfd, 0xaf, + 0x80, 0x0, 0x2, 0xfd, 0xdf, 0x20, 0x0, 0x2, + 0xfd, 0xff, 0x0, 0x0, 0x2, 0xfd, 0xff, 0x0, + 0x0, 0x2, 0xfd, 0xdf, 0x20, 0x0, 0x2, 0xfd, + 0xaf, 0x70, 0x0, 0x3, 0xfd, 0x3f, 0xf3, 0x0, + 0xc, 0xfd, 0x9, 0xff, 0xba, 0xef, 0xfd, 0x0, + 0x6d, 0xfe, 0x94, 0xfd, 0x0, 0x0, 0x0, 0x2, + 0xfd, 0x0, 0x0, 0x0, 0x2, 0xfd, 0x0, 0x0, + 0x0, 0x2, 0xfd, 0x0, 0x0, 0x0, 0x2, 0xfd, + 0x0, 0x0, 0x0, 0x2, 0xfd, /* U+72 "r" */ - 0x47, 0x42, 0x9b, 0x38, 0xf9, 0xef, 0xf2, 0x8f, - 0xfb, 0x44, 0x8, 0xfd, 0x0, 0x0, 0x8f, 0xc0, - 0x0, 0x8, 0xfc, 0x0, 0x0, 0x8f, 0xc0, 0x0, - 0x8, 0xfc, 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x8, - 0xfc, 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x8, 0xfc, + 0x8f, 0x78, 0xef, 0x18, 0xff, 0xfd, 0xc1, 0x8f, + 0xf3, 0x0, 0x8, 0xf8, 0x0, 0x0, 0x8f, 0x70, + 0x0, 0x8, 0xf7, 0x0, 0x0, 0x8f, 0x70, 0x0, + 0x8, 0xf7, 0x0, 0x0, 0x8f, 0x70, 0x0, 0x8, + 0xf7, 0x0, 0x0, 0x8f, 0x70, 0x0, 0x8, 0xf7, 0x0, 0x0, /* U+73 "s" */ - 0x0, 0x4a, 0xbb, 0x82, 0x0, 0x9, 0xff, 0xef, - 0xfe, 0x40, 0x3f, 0xf3, 0x0, 0x8f, 0xe0, 0x8f, - 0xc0, 0x0, 0xb, 0xc2, 0x5f, 0xe4, 0x0, 0x0, - 0x0, 0x9, 0xff, 0xd9, 0x40, 0x0, 0x0, 0x4a, - 0xef, 0xfd, 0x30, 0x0, 0x0, 0x3, 0xaf, 0xe2, - 0x67, 0x20, 0x0, 0xd, 0xf5, 0xaf, 0xa0, 0x0, - 0x1d, 0xf4, 0x2f, 0xfb, 0x77, 0xdf, 0xd0, 0x2, - 0xcf, 0xff, 0xfa, 0x10, 0x0, 0x0, 0x32, 0x0, - 0x0, + 0x0, 0x7d, 0xfe, 0xb3, 0x0, 0xc, 0xfe, 0xbc, + 0xff, 0x50, 0x6f, 0xb0, 0x0, 0x6f, 0xe0, 0x8f, + 0x70, 0x0, 0x9, 0xa1, 0x5f, 0xe5, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfc, 0x71, 0x0, 0x0, 0x16, + 0xae, 0xff, 0x50, 0x0, 0x0, 0x0, 0x6f, 0xf1, + 0xbc, 0x10, 0x0, 0xc, 0xf3, 0xbf, 0x90, 0x0, + 0x2f, 0xf1, 0x2e, 0xfe, 0xab, 0xff, 0x80, 0x1, + 0x9d, 0xfe, 0xb5, 0x0, /* U+74 "t" */ - 0x0, 0x87, 0x20, 0x0, 0xf, 0xf4, 0x0, 0x0, - 0xff, 0x40, 0x6, 0x7f, 0xf9, 0x74, 0xcf, 0xff, - 0xff, 0x80, 0xf, 0xf4, 0x0, 0x0, 0xff, 0x40, - 0x0, 0xf, 0xf4, 0x0, 0x0, 0xff, 0x40, 0x0, - 0xf, 0xf4, 0x0, 0x0, 0xff, 0x40, 0x0, 0xf, - 0xf4, 0x0, 0x0, 0xcf, 0x50, 0x0, 0xa, 0xfd, - 0x72, 0x0, 0x2d, 0xff, 0x80, 0x0, 0x2, 0x30, + 0x0, 0xcf, 0x30, 0x0, 0xc, 0xf3, 0x0, 0x0, + 0xcf, 0x30, 0xe, 0xff, 0xff, 0xf6, 0x89, 0xef, + 0xa9, 0x30, 0xc, 0xf3, 0x0, 0x0, 0xcf, 0x30, + 0x0, 0xc, 0xf3, 0x0, 0x0, 0xcf, 0x30, 0x0, + 0xc, 0xf3, 0x0, 0x0, 0xcf, 0x30, 0x0, 0xc, + 0xf3, 0x0, 0x0, 0xbf, 0x50, 0x0, 0x7, 0xff, + 0xb5, 0x0, 0x9, 0xff, 0x50, /* U+75 "u" */ - 0x47, 0x40, 0x0, 0x2, 0x77, 0x8f, 0x80, 0x0, - 0x4, 0xff, 0x8f, 0x80, 0x0, 0x4, 0xff, 0x8f, - 0x80, 0x0, 0x4, 0xff, 0x8f, 0x80, 0x0, 0x4, - 0xff, 0x8f, 0x80, 0x0, 0x4, 0xff, 0x8f, 0x80, - 0x0, 0x4, 0xff, 0x8f, 0xa0, 0x0, 0x4, 0xff, - 0x5f, 0xc0, 0x0, 0x4, 0xff, 0x3f, 0xe1, 0x0, - 0xb, 0xff, 0xc, 0xfd, 0x87, 0xdc, 0xff, 0x1, - 0xbf, 0xff, 0xa1, 0xff, 0x0, 0x0, 0x41, 0x0, - 0x0, + 0x8f, 0x70, 0x0, 0x6, 0xf9, 0x8f, 0x70, 0x0, + 0x6, 0xf9, 0x8f, 0x70, 0x0, 0x6, 0xf9, 0x8f, + 0x70, 0x0, 0x6, 0xf9, 0x8f, 0x70, 0x0, 0x6, + 0xf9, 0x8f, 0x70, 0x0, 0x6, 0xf9, 0x8f, 0x70, + 0x0, 0x6, 0xf9, 0x8f, 0x70, 0x0, 0x6, 0xf9, + 0x7f, 0x90, 0x0, 0x6, 0xf9, 0x4f, 0xe1, 0x0, + 0x3e, 0xf9, 0xc, 0xfe, 0xbd, 0xfe, 0xf9, 0x1, + 0xae, 0xfd, 0x85, 0xf9, /* U+76 "v" */ - 0x37, 0x60, 0x0, 0x0, 0x47, 0x42, 0xff, 0x10, - 0x0, 0xd, 0xf5, 0xb, 0xf6, 0x0, 0x2, 0xfe, - 0x0, 0x6f, 0xb0, 0x0, 0x7f, 0x90, 0x0, 0xff, - 0x10, 0xd, 0xf3, 0x0, 0xa, 0xf6, 0x2, 0xfd, - 0x0, 0x0, 0x3f, 0xb0, 0x7f, 0x70, 0x0, 0x0, - 0xef, 0x1d, 0xf1, 0x0, 0x0, 0x7, 0xf8, 0xfb, - 0x0, 0x0, 0x0, 0x2f, 0xdf, 0x60, 0x0, 0x0, - 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x6, 0xfa, + 0x7f, 0x80, 0x0, 0x0, 0xef, 0x11, 0xfe, 0x0, + 0x0, 0x4f, 0xb0, 0xc, 0xf3, 0x0, 0x9, 0xf6, + 0x0, 0x6f, 0x80, 0x0, 0xef, 0x0, 0x1, 0xfd, + 0x0, 0x3f, 0xa0, 0x0, 0xb, 0xf2, 0x8, 0xf5, + 0x0, 0x0, 0x5f, 0x80, 0xdf, 0x0, 0x0, 0x0, + 0xfd, 0x2f, 0xa0, 0x0, 0x0, 0xa, 0xfa, 0xf4, + 0x0, 0x0, 0x0, 0x5f, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xef, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf4, 0x0, 0x0, /* U+77 "w" */ - 0x37, 0x60, 0x0, 0x6, 0x72, 0x0, 0x2, 0x77, - 0x3f, 0xe0, 0x0, 0xf, 0xf8, 0x0, 0x6, 0xfd, - 0xe, 0xf3, 0x0, 0x3f, 0xfc, 0x0, 0x9, 0xf8, - 0xa, 0xf7, 0x0, 0x9f, 0xcf, 0x20, 0xd, 0xf3, - 0x5, 0xfb, 0x0, 0xef, 0x6f, 0x70, 0x1f, 0xe0, - 0x1, 0xfe, 0x3, 0xfa, 0x1f, 0xc0, 0x4f, 0xa0, - 0x0, 0xcf, 0x37, 0xf5, 0xd, 0xf1, 0x8f, 0x50, - 0x0, 0x7f, 0x7d, 0xf0, 0x7, 0xf6, 0xcf, 0x10, - 0x0, 0x2f, 0xaf, 0xb0, 0x2, 0xfa, 0xfc, 0x0, - 0x0, 0xe, 0xff, 0x60, 0x0, 0xde, 0xf7, 0x0, - 0x0, 0x9, 0xff, 0x10, 0x0, 0x7f, 0xf3, 0x0, - 0x0, 0x5, 0xfb, 0x0, 0x0, 0x2f, 0xe0, 0x0, + 0x6f, 0x90, 0x0, 0xb, 0xf2, 0x0, 0x1, 0xfd, + 0x1, 0xfd, 0x0, 0x0, 0xff, 0x70, 0x0, 0x5f, + 0x90, 0xd, 0xf1, 0x0, 0x5f, 0xfc, 0x0, 0x9, + 0xf5, 0x0, 0x8f, 0x50, 0x9, 0xfa, 0xf1, 0x0, + 0xdf, 0x0, 0x4, 0xf9, 0x0, 0xeb, 0x4f, 0x60, + 0x1f, 0xc0, 0x0, 0xf, 0xd0, 0x3f, 0x60, 0xfb, + 0x5, 0xf7, 0x0, 0x0, 0xbf, 0x18, 0xf1, 0xb, + 0xf0, 0x9f, 0x30, 0x0, 0x6, 0xf5, 0xdd, 0x0, + 0x6f, 0x5d, 0xe0, 0x0, 0x0, 0x2f, 0xbf, 0x80, + 0x1, 0xfb, 0xfa, 0x0, 0x0, 0x0, 0xdf, 0xf3, + 0x0, 0xc, 0xff, 0x50, 0x0, 0x0, 0x9, 0xfe, + 0x0, 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x2, 0xfc, 0x0, 0x0, /* U+78 "x" */ - 0x18, 0x72, 0x0, 0x2, 0x77, 0x10, 0xbf, 0xa0, - 0x0, 0xbf, 0xb0, 0x1, 0xff, 0x40, 0x4f, 0xf1, - 0x0, 0x5, 0xfc, 0xe, 0xf6, 0x0, 0x0, 0xb, - 0xfb, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x20, - 0x0, 0x0, 0x0, 0xef, 0xd1, 0x0, 0x0, 0x0, - 0x8f, 0xef, 0x90, 0x0, 0x0, 0x3f, 0xf2, 0xff, - 0x40, 0x0, 0xd, 0xf6, 0x6, 0xfd, 0x10, 0x8, - 0xfd, 0x0, 0xc, 0xf8, 0x3, 0xff, 0x40, 0x0, - 0x4f, 0xf3, + 0x2f, 0xf2, 0x0, 0x5, 0xfe, 0x10, 0x7f, 0xb0, + 0x0, 0xef, 0x50, 0x0, 0xdf, 0x50, 0x8f, 0xb0, + 0x0, 0x3, 0xfe, 0x3f, 0xf1, 0x0, 0x0, 0x9, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0xe, 0xfc, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xd0, 0x0, 0x0, 0x0, + 0xaf, 0xdf, 0x80, 0x0, 0x0, 0x4f, 0xd1, 0xef, + 0x20, 0x0, 0xe, 0xf3, 0x6, 0xfc, 0x0, 0x9, + 0xfa, 0x0, 0xc, 0xf7, 0x3, 0xff, 0x10, 0x0, + 0x3f, 0xf2, /* U+79 "y" */ - 0x47, 0x60, 0x0, 0x0, 0x67, 0x55, 0xff, 0x10, - 0x0, 0xf, 0xf6, 0xe, 0xf6, 0x0, 0x5, 0xff, - 0x0, 0x9f, 0xb0, 0x0, 0xaf, 0xa0, 0x2, 0xff, - 0x10, 0xf, 0xf4, 0x0, 0xd, 0xf6, 0x5, 0xfe, - 0x0, 0x0, 0x6f, 0xb0, 0xaf, 0x90, 0x0, 0x1, - 0xff, 0x1f, 0xf2, 0x0, 0x0, 0xa, 0xfa, 0xfd, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0x60, 0x0, 0x0, - 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, 0x9, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0xbf, 0x50, 0x0, 0x0, - 0x0, 0x2f, 0xf0, 0x0, 0x0, 0x2, 0x2c, 0xf8, - 0x0, 0x0, 0x0, 0xcf, 0xfd, 0x10, 0x0, 0x0, - 0x7, 0xb7, 0x10, 0x0, 0x0, 0x0, + 0x9f, 0x90, 0x0, 0x2, 0xff, 0x3, 0xfe, 0x0, + 0x0, 0x7f, 0xa0, 0xe, 0xf3, 0x0, 0xc, 0xf4, + 0x0, 0x8f, 0x80, 0x1, 0xff, 0x0, 0x3, 0xfe, + 0x0, 0x5f, 0xa0, 0x0, 0xd, 0xf3, 0xa, 0xf4, + 0x0, 0x0, 0x8f, 0x80, 0xff, 0x0, 0x0, 0x2, + 0xfd, 0x4f, 0xa0, 0x0, 0x0, 0xd, 0xfc, 0xf4, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xc, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xa0, 0x0, 0x0, 0x0, 0xb, 0xf3, + 0x0, 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x0, + 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x0, /* U+7A "z" */ - 0x87, 0x77, 0x77, 0x77, 0x70, 0xff, 0xff, 0xff, - 0xff, 0xf0, 0x0, 0x0, 0x2, 0xef, 0x60, 0x0, - 0x0, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x8f, 0xd1, - 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, 0x1e, - 0xf6, 0x0, 0x0, 0x0, 0xcf, 0xa0, 0x0, 0x0, - 0x8, 0xfe, 0x10, 0x0, 0x0, 0x4f, 0xf3, 0x0, - 0x0, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xb3, 0xff, - 0xff, 0xff, 0xff, 0xf4, + 0xf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xaa, 0xaa, + 0xaa, 0xef, 0xb0, 0x0, 0x0, 0x0, 0x4f, 0xf2, + 0x0, 0x0, 0x0, 0x1e, 0xf5, 0x0, 0x0, 0x0, + 0xb, 0xf9, 0x0, 0x0, 0x0, 0x6, 0xfd, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x9f, 0xb0, 0x0, + 0x0, 0x0, 0x5f, 0xe1, 0x0, 0x0, 0x0, 0xe, + 0xfd, 0xaa, 0xaa, 0xaa, 0x10, 0xff, 0xff, 0xff, + 0xff, 0xf2, /* U+7B "{" */ - 0x0, 0x0, 0x19, 0xe1, 0x0, 0x1, 0xcf, 0x81, - 0x0, 0x9, 0xf9, 0x0, 0x0, 0xf, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x4e, 0xf1, + 0x0, 0x2, 0xfe, 0x20, 0x0, 0xa, 0xf5, 0x0, + 0x0, 0xe, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, - 0x0, 0xf, 0xf0, 0x0, 0x0, 0x2f, 0xf0, 0x0, - 0x0, 0x6f, 0xd0, 0x0, 0x28, 0xff, 0x40, 0x0, - 0x4f, 0xf8, 0x0, 0x0, 0x15, 0xef, 0x70, 0x0, - 0x0, 0x5f, 0xd0, 0x0, 0x0, 0x2f, 0xf0, 0x0, + 0x0, 0x1f, 0xe0, 0x0, 0x0, 0x7f, 0xa0, 0x0, + 0x3b, 0xfe, 0x10, 0x0, 0x5f, 0xf9, 0x0, 0x0, + 0x2, 0xcf, 0x60, 0x0, 0x0, 0x3f, 0xc0, 0x0, + 0x0, 0xf, 0xe0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, - 0x0, 0xf, 0xf0, 0x0, 0x0, 0xe, 0xf5, 0x0, - 0x0, 0x7, 0xfa, 0x0, 0x0, 0x0, 0xaf, 0xb2, - 0x0, 0x0, 0x6, 0xb0, + 0x0, 0xc, 0xf3, 0x0, 0x0, 0x6, 0xfa, 0x0, + 0x0, 0x0, 0xaf, 0xb1, 0x0, 0x0, 0x5, 0xb0, /* U+7C "|" */ - 0x4a, 0x66, 0xfa, 0x6f, 0xa6, 0xfa, 0x6f, 0xa6, - 0xfa, 0x6f, 0xa6, 0xfa, 0x6f, 0xa6, 0xfa, 0x6f, - 0xa6, 0xfa, 0x6f, 0xa6, 0xfa, 0x6f, 0xa6, 0xfa, - 0x6f, 0xa6, 0xfa, 0x6e, 0x90, + 0x2f, 0x72, 0xf7, 0x2f, 0x72, 0xf7, 0x2f, 0x72, + 0xf7, 0x2f, 0x72, 0xf7, 0x2f, 0x72, 0xf7, 0x2f, + 0x72, 0xf7, 0x2f, 0x72, 0xf7, 0x2f, 0x72, 0xf7, + 0x2f, 0x72, 0xf7, 0x2f, 0x70, /* U+7D "}" */ - 0x9c, 0x50, 0x0, 0x4, 0xdf, 0x60, 0x0, 0x2, - 0xfe, 0x10, 0x0, 0xc, 0xf5, 0x0, 0x0, 0xaf, - 0x80, 0x0, 0x8, 0xf8, 0x0, 0x0, 0x8f, 0x80, - 0x0, 0x8, 0xf8, 0x0, 0x0, 0x6f, 0xd0, 0x0, - 0x0, 0xcf, 0xb6, 0x0, 0x2, 0xdf, 0xc0, 0x1, - 0xdf, 0x83, 0x0, 0x6f, 0xc0, 0x0, 0x8, 0xf8, - 0x0, 0x0, 0x8f, 0x80, 0x0, 0x8, 0xf8, 0x0, - 0x0, 0xbf, 0x80, 0x0, 0xd, 0xf4, 0x0, 0x5, - 0xfe, 0x0, 0x7, 0xef, 0x30, 0x0, 0x69, 0x20, - 0x0, 0x0, + 0x22, 0x0, 0x0, 0xa, 0xf9, 0x0, 0x0, 0xa, + 0xf9, 0x0, 0x0, 0xe, 0xf1, 0x0, 0x0, 0xaf, + 0x50, 0x0, 0x8, 0xf6, 0x0, 0x0, 0x8f, 0x70, + 0x0, 0x8, 0xf7, 0x0, 0x0, 0x7f, 0x80, 0x0, + 0x3, 0xfd, 0x0, 0x0, 0x8, 0xfd, 0x70, 0x0, + 0x2e, 0xfb, 0x0, 0x1e, 0xf5, 0x0, 0x6, 0xfa, + 0x0, 0x0, 0x8f, 0x70, 0x0, 0x8, 0xf7, 0x0, + 0x0, 0x8f, 0x70, 0x0, 0x9, 0xf5, 0x0, 0x0, + 0xcf, 0x30, 0x0, 0x4f, 0xd0, 0x0, 0x6f, 0xe2, + 0x0, 0x7, 0x81, 0x0, 0x0, /* U+7E "~" */ - 0x0, 0x67, 0x72, 0x0, 0x0, 0x1, 0x0, 0xbf, - 0xff, 0xf8, 0x0, 0x1, 0xf8, 0x6f, 0xa4, 0x6e, - 0xfc, 0x42, 0x9f, 0x48, 0xf1, 0x0, 0x1b, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x4, 0x9a, 0x70, - 0x0, + 0x1, 0xaf, 0xea, 0x20, 0x0, 0x1b, 0x60, 0xdf, + 0xde, 0xff, 0x60, 0x8, 0xf5, 0x6f, 0x70, 0x7, + 0xff, 0xed, 0xfc, 0x5, 0xa1, 0x0, 0x2, 0xaf, + 0xfa, 0x10, /* U+F001 "" */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x15, 0xae, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x26, 0xbf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x38, 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xb6, 0xdc, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xa6, 0x10, 0xc, 0xc0, 0x0, 0x0, - 0xc, 0xfe, 0x95, 0x0, 0x0, 0x0, 0xcc, 0x0, - 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xc0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0xcc, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xc0, 0x0, 0x0, 0xc, 0xc0, - 0x0, 0x3, 0x7b, 0xb6, 0xcc, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0xc, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xfc, - 0x1, 0x57, 0x75, 0xdc, 0x0, 0xc, 0xff, 0xff, - 0xff, 0x96, 0xef, 0xff, 0xff, 0xc0, 0x0, 0x17, - 0xdf, 0xfc, 0x60, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, - 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xbf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x48, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x1, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x94, 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xfc, 0x72, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0x0, 0xa, 0xff, 0xea, 0x50, 0x0, 0x0, + 0x0, 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, + 0x0, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, + 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xfd, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0x0, 0x3, 0x54, 0xff, 0xd0, 0x0, 0x0, 0xa, + 0xff, 0x10, 0x0, 0x0, 0x5e, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xd0, 0x1, 0x69, 0x9d, 0xff, + 0x10, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfc, 0x6, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0x61, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x2a, 0xff, 0xfc, 0x50, 0x1f, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x10, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xcc, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F008 "" */ - 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x20, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0xfd, 0x44, 0xaf, 0xa4, 0x44, 0x44, 0x44, 0x44, - 0x5f, 0xf5, 0x47, 0xf8, 0xf8, 0x0, 0x4f, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0xf8, - 0xf8, 0x0, 0x4f, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xc0, 0x0, 0xf8, 0xfe, 0x77, 0xcf, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xf9, 0x7a, 0xf8, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xf8, 0xfb, 0x0, 0x7f, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xf1, 0x3, 0xf8, - 0xf8, 0x0, 0x4f, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xc0, 0x0, 0xf8, 0xf9, 0x0, 0x5f, 0x50, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xd0, 0x1, 0xf8, - 0xff, 0xcb, 0xff, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xdf, 0xfd, 0xbe, 0xf8, 0xff, 0xcc, 0xff, 0xfc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcf, 0xfd, 0xcd, 0xf8, - 0xf9, 0x0, 0x5f, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xe0, 0x0, 0xf8, 0xf8, 0x0, 0x4f, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xc0, 0x0, 0xf8, - 0xfb, 0x33, 0x7f, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xe3, 0x34, 0xf8, 0xff, 0xff, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf8, - 0xfe, 0x88, 0xbf, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xf9, 0x89, 0xf8, 0xf8, 0x0, 0x4f, 0x40, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xd0, 0x0, 0xf8, - 0xf8, 0x0, 0x4f, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xc0, 0x0, 0xf8, 0xfd, 0x77, 0xaf, 0xa7, - 0x77, 0x77, 0x77, 0x77, 0x7e, 0xf8, 0x78, 0xf8, - 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe2, 0x0, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, + 0x42, 0x0, 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x0, 0x24, 0xf8, 0x22, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x22, 0x8f, 0xff, 0xff, + 0xff, 0xb9, 0x99, 0x99, 0x99, 0x9b, 0xff, 0xff, + 0xff, 0xf9, 0x44, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x44, 0x9f, 0xf6, 0x0, 0xef, 0x30, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x6f, 0xf7, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x3, 0xfe, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xfa, 0x66, 0xff, + 0x74, 0x44, 0x44, 0x44, 0x47, 0xff, 0x66, 0xaf, + 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x6f, 0xf6, 0x0, 0xef, 0xdc, 0xcc, + 0xcc, 0xcc, 0xcd, 0xfe, 0x0, 0x6f, 0xff, 0xee, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x3, 0xff, 0xee, + 0xff, 0xfc, 0x88, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x88, 0xcf, 0xf6, 0x0, 0xef, 0x30, + 0x0, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x6f, 0xf6, + 0x0, 0xef, 0x30, 0x0, 0x0, 0x0, 0x3, 0xfe, + 0x0, 0x6f, 0xfe, 0xcc, 0xff, 0x41, 0x11, 0x11, + 0x11, 0x14, 0xff, 0xcc, 0xef, 0xfd, 0xaa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xdf, + 0xc6, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x6c, /* U+F00B "" */ - 0x23, 0x33, 0x33, 0x0, 0x23, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x32, 0xef, 0xff, 0xff, 0x31, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x31, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x28, - 0x88, 0x84, 0x0, 0x48, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x82, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfd, - 0x20, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, + 0xbf, 0xff, 0xfe, 0x31, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x42, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7c, 0xcc, 0xca, 0x0, 0x9c, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xc7, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, - 0xbb, 0xb9, 0x0, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb7, 0xff, 0xff, 0xff, 0x42, 0xff, 0xff, + 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x58, + 0x88, 0x87, 0x0, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x31, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfe, 0x20, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x53, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x47, 0x88, 0x87, 0x0, + 0x68, 0x88, 0x88, 0x88, 0x88, 0x88, 0x74, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0x31, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x52, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x37, 0x77, 0x76, 0x0, 0x57, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x74, /* U+F00C "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xa6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xef, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf6, - 0x0, 0x13, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, - 0xff, 0xa0, 0x1, 0xcf, 0x90, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xfa, 0x0, 0x1c, 0xff, 0xf9, 0x0, - 0x3, 0xef, 0xff, 0xff, 0xa0, 0x0, 0x8f, 0xff, - 0xff, 0x90, 0x3e, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xfa, 0xef, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x16, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xef, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0x30, 0x4, 0xe8, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xf3, 0x0, 0x4f, 0xff, 0x80, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0x30, 0x0, + 0xef, 0xff, 0xf8, 0x0, 0x0, 0x2e, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x80, 0x2, + 0xef, 0xff, 0xff, 0x30, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xf8, 0x2e, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xd3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, /* U+F00D "" */ - 0x0, 0x23, 0x0, 0x0, 0x0, 0x2, 0x30, 0x0, - 0x3e, 0xf9, 0x0, 0x0, 0x6, 0xff, 0x60, 0x3e, - 0xff, 0xf9, 0x0, 0x6, 0xff, 0xff, 0x6a, 0xff, - 0xff, 0xf9, 0x6, 0xff, 0xff, 0xfe, 0x3f, 0xff, - 0xff, 0xfb, 0xff, 0xff, 0xff, 0x60, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf9, 0x5, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xf9, 0x9f, 0xff, 0xff, 0x60, 0x3f, 0xff, - 0xff, 0xf2, 0xff, 0xff, 0x60, 0x0, 0x3f, 0xff, - 0xf6, 0x3, 0xff, 0x60, 0x0, 0x0, 0x3f, 0xf6, - 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x22, 0x0, + 0x8, 0xc4, 0x0, 0x0, 0x0, 0x2, 0xc9, 0x0, + 0x9f, 0xff, 0x40, 0x0, 0x0, 0x2e, 0xff, 0xb0, + 0xff, 0xff, 0xf4, 0x0, 0x2, 0xef, 0xff, 0xf1, + 0x7f, 0xff, 0xff, 0x40, 0x2e, 0xff, 0xff, 0x90, + 0x8, 0xff, 0xff, 0xf6, 0xef, 0xff, 0xfa, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x2, 0xef, 0xff, 0xfd, 0xff, 0xff, 0xf4, 0x0, + 0x2e, 0xff, 0xff, 0xa0, 0x8f, 0xff, 0xff, 0x40, + 0xdf, 0xff, 0xfa, 0x0, 0x8, 0xff, 0xff, 0xf0, + 0xdf, 0xff, 0xa0, 0x0, 0x0, 0x8f, 0xff, 0xe0, + 0x2e, 0xfa, 0x0, 0x0, 0x0, 0x8, 0xff, 0x30, + 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x21, 0x0, /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x7b, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0x70, - 0x4f, 0xff, 0x0, 0x8a, 0x10, 0x0, 0x0, 0x3e, - 0xff, 0x34, 0xff, 0xf0, 0x6f, 0xfe, 0x30, 0x0, - 0x2e, 0xff, 0xf2, 0x4f, 0xff, 0x4, 0xff, 0xfd, - 0x10, 0xc, 0xff, 0xf6, 0x4, 0xff, 0xf0, 0x6, - 0xff, 0xf9, 0x3, 0xff, 0xf5, 0x0, 0x4f, 0xff, - 0x0, 0x8, 0xff, 0xf1, 0xaf, 0xfc, 0x0, 0x4, - 0xff, 0xf0, 0x0, 0xe, 0xff, 0x7c, 0xff, 0x60, - 0x0, 0x3f, 0xff, 0x0, 0x0, 0x9f, 0xfc, 0xff, - 0xf4, 0x0, 0x0, 0xdf, 0xa0, 0x0, 0x5, 0xff, - 0xcf, 0xff, 0x40, 0x0, 0x0, 0x10, 0x0, 0x0, - 0x4f, 0xfc, 0xef, 0xf5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xca, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf9, 0x6f, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x30, 0xef, - 0xfc, 0x10, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xc0, - 0x5, 0xff, 0xfe, 0x50, 0x0, 0x0, 0x6e, 0xff, - 0xf3, 0x0, 0x8, 0xff, 0xff, 0xeb, 0x7b, 0xef, - 0xff, 0xf6, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x2, 0xaf, - 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x16, 0x88, 0x85, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x33, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0x50, 0xe, 0xff, 0x80, + 0xb, 0xf4, 0x0, 0x0, 0x0, 0xb, 0xff, 0xe0, + 0xe, 0xff, 0x80, 0x4f, 0xff, 0x50, 0x0, 0x0, + 0x9f, 0xff, 0xe0, 0xe, 0xff, 0x80, 0x5f, 0xff, + 0xf2, 0x0, 0x3, 0xff, 0xfe, 0x30, 0xe, 0xff, + 0x80, 0x8, 0xff, 0xfc, 0x0, 0xb, 0xff, 0xf3, + 0x0, 0xe, 0xff, 0x80, 0x0, 0xaf, 0xff, 0x50, + 0x1f, 0xff, 0x90, 0x0, 0xe, 0xff, 0x80, 0x0, + 0x1f, 0xff, 0xb0, 0x6f, 0xff, 0x30, 0x0, 0xe, + 0xff, 0x80, 0x0, 0x9, 0xff, 0xf0, 0x8f, 0xff, + 0x0, 0x0, 0xe, 0xff, 0x80, 0x0, 0x5, 0xff, + 0xf2, 0xaf, 0xfd, 0x0, 0x0, 0xe, 0xff, 0x80, + 0x0, 0x3, 0xff, 0xf3, 0x9f, 0xfd, 0x0, 0x0, + 0xc, 0xff, 0x50, 0x0, 0x4, 0xff, 0xf2, 0x8f, + 0xff, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x6, + 0xff, 0xf1, 0x4f, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe0, 0xf, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x90, + 0x8, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0x20, 0x1, 0xef, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x0, 0x0, 0x4f, + 0xff, 0xfd, 0x62, 0x1, 0x49, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0xff, 0xff, 0xff, 0xb4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0x65, + 0x30, 0x0, 0x0, 0x0, 0x0, /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x1, 0x33, 0x31, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x3, 0x50, 0xa, 0xff, - 0xf8, 0x0, 0x73, 0x0, 0x0, 0x6, 0xff, 0xa5, - 0xdf, 0xff, 0xc4, 0xcf, 0xe3, 0x0, 0x2, 0xef, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x10, 0x0, 0x3, 0xff, 0xff, 0xc3, 0x5, - 0xdf, 0xff, 0xf1, 0x0, 0xbd, 0xff, 0xff, 0xd0, - 0x0, 0x1, 0xef, 0xff, 0xfb, 0x8f, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xfc, 0x1, 0x7f, 0xff, 0xf6, 0x0, 0x9, - 0xff, 0xff, 0x62, 0x0, 0x1, 0xff, 0xff, 0xfd, - 0xbe, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x3f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x7f, 0xff, 0xaf, 0xff, 0xff, 0xaf, 0xff, - 0x60, 0x0, 0x0, 0x6c, 0x10, 0xaf, 0xff, 0x80, - 0x3c, 0x60, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x38, 0x88, 0x20, 0x0, 0x0, 0x0, - - /* U+F014 "" */ - 0x0, 0x0, 0x0, 0x43, 0x33, 0x31, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfe, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0x94, 0x44, 0x5f, - 0x80, 0x0, 0x0, 0x33, 0x33, 0xaf, 0x43, 0x33, - 0x3d, 0xe3, 0x33, 0x30, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x7c, 0xfa, 0x88, - 0x88, 0x88, 0x88, 0x88, 0xee, 0x81, 0x8, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x8, - 0xf4, 0x13, 0x10, 0x41, 0x3, 0x20, 0xcc, 0x0, - 0x8, 0xf4, 0x4f, 0x44, 0xf8, 0xf, 0x80, 0xcc, - 0x0, 0x8, 0xf4, 0x4f, 0x44, 0xf8, 0xf, 0x80, - 0xcc, 0x0, 0x8, 0xf4, 0x4f, 0x44, 0xf8, 0xf, - 0x80, 0xcc, 0x0, 0x8, 0xf4, 0x4f, 0x44, 0xf8, - 0xf, 0x80, 0xcc, 0x0, 0x8, 0xf4, 0x4f, 0x44, - 0xf8, 0xf, 0x80, 0xcc, 0x0, 0x8, 0xf4, 0x4f, - 0x44, 0xf8, 0xf, 0x80, 0xcc, 0x0, 0x8, 0xf4, - 0x4f, 0x44, 0xf8, 0xf, 0x80, 0xcc, 0x0, 0x8, - 0xf4, 0x2c, 0x21, 0xb4, 0xb, 0x50, 0xcc, 0x0, - 0x8, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, - 0x0, 0x6, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xfb, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x0, 0x0, 0x38, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6c, + 0xee, 0xc7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x30, 0x2a, + 0xff, 0xff, 0xff, 0xb2, 0x3, 0x80, 0x0, 0x0, + 0x8f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, + 0xf8, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x1f, 0xff, 0xff, 0xff, 0xfa, 0x55, 0xaf, 0xff, + 0xff, 0xff, 0xf2, 0x6, 0xef, 0xff, 0xff, 0x70, + 0x0, 0x7, 0xff, 0xff, 0xff, 0x60, 0x0, 0x2f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf3, + 0x0, 0x0, 0x3f, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf3, 0x0, 0x0, 0x2f, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xf3, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0x20, 0x0, 0x1, 0xff, 0xff, + 0xf9, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xd3, 0x0, + 0x3d, 0xff, 0xff, 0xff, 0xe1, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x2f, + 0xb2, 0x9f, 0xff, 0xff, 0xff, 0xfa, 0x2a, 0xf3, + 0x0, 0x0, 0x1, 0x0, 0x2, 0xdf, 0xff, 0xfe, + 0x30, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14, 0x66, + 0x41, 0x0, 0x0, 0x0, 0x0, /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x9, 0xa3, 0x0, 0x9b, - 0xb3, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xfe, - 0x50, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3d, - 0xfe, 0xbf, 0xf6, 0xcf, 0xf4, 0x0, 0x0, 0x0, - 0x5, 0xef, 0xd2, 0x56, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x7f, 0xfa, 0x3e, 0xf7, 0x4f, 0xff, - 0xf4, 0x0, 0x0, 0xa, 0xff, 0x76, 0xef, 0xff, - 0xa4, 0xdf, 0xf5, 0x0, 0x1, 0xcf, 0xf5, 0x8f, - 0xff, 0xff, 0xfc, 0x3c, 0xfe, 0x50, 0x3d, 0xfe, - 0x4a, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xaf, 0xf6, - 0x9f, 0xd3, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x66, 0xff, 0x6, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x43, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xc, - 0xff, 0xff, 0xd4, 0x47, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xc0, 0x4, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x4, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xc0, 0x4, 0xff, 0xff, 0xf4, 0x0, 0x0, 0xb, - 0xff, 0xff, 0xc0, 0x4, 0xff, 0xff, 0xf3, 0x0, - - /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x1, 0xbb, 0xbb, 0x50, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x77, 0x79, 0xff, 0xff, 0xb7, 0x77, 0x30, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3f, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x23, 0x33, - 0x33, 0x30, 0x3f, 0xfa, 0x2, 0x33, 0x33, 0x33, - 0xe, 0xff, 0xff, 0xff, 0x90, 0x36, 0x3, 0xef, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xa1, - 0x5, 0xef, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x45, - 0xf5, 0x4f, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfb, 0xcf, 0xcb, 0xf8, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, - - /* U+F01C "" */ - 0x0, 0x5, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xb3, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xd0, 0x0, 0x0, 0x6f, 0xfc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xff, 0x40, 0x0, 0xe, 0xfb, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xfb, 0x0, 0x4, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf2, 0x0, - 0xbf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, - 0x90, 0x2f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xfe, 0x19, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2f, 0xf6, 0xef, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xcf, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0xc, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x4, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xdb, 0xbb, 0xdf, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, - - /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x0, 0x23, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6b, 0xff, 0xff, 0xfa, - 0x40, 0x0, 0x45, 0x0, 0x3, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xb1, 0x6f, 0xc0, 0x3, 0xef, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xef, 0xfc, 0x2, 0xef, - 0xff, 0xa3, 0x0, 0x4, 0xcf, 0xff, 0xff, 0xc0, - 0xbf, 0xff, 0x50, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xfc, 0x2f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xc9, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x2e, 0xff, 0xff, 0xfc, 0x68, 0x83, 0x0, 0x0, - 0x0, 0x1, 0x88, 0x88, 0x88, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0x33, 0x33, 0x33, 0x0, 0x0, 0x0, 0x0, - 0x23, 0x32, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x6f, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x4, 0xff, 0xf1, 0xff, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x3, 0xef, 0xfa, 0xf, 0xff, - 0xff, 0xe5, 0x0, 0x0, 0x7, 0xef, 0xff, 0x20, - 0xff, 0xff, 0xff, 0xfd, 0xb8, 0xbe, 0xff, 0xff, - 0x30, 0xf, 0xf6, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0xb6, 0x0, 0x2b, 0xff, 0xff, - 0xff, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x1, - 0x68, 0x87, 0x41, 0x0, 0x0, 0x0, - - /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, - 0x6, 0xf7, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x0, - 0x0, 0x6, 0xff, 0xf8, 0x0, 0x0, 0x6f, 0xff, - 0xf8, 0xdf, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x34, - 0x44, 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x1d, 0xff, - 0xf8, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, - 0x0, 0x1d, 0xf8, 0x0, 0x0, 0x0, 0x1, 0x82, - - /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x31, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xf8, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x88, 0x10, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x8, 0xf9, 0xf, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x9, 0xf0, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x8f, 0x1f, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x5e, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xb, 0xe3, 0x3, 0x44, 0x4d, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1d, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x18, 0x20, 0x0, 0x0, - - /* U+F028 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x72, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, - 0x0, 0x4f, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xf7, 0x0, 0x0, 0x2b, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0x80, 0x5, 0x91, 0xa, - 0xf7, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf8, 0x0, - 0x5f, 0xe3, 0xc, 0xf2, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x80, 0x0, 0x3f, 0xe2, 0x2f, 0xa0, 0xdf, - 0xff, 0xff, 0xff, 0xf8, 0x8, 0x81, 0x3f, 0xa0, - 0xaf, 0xf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, - 0x90, 0xaf, 0x5, 0xf4, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x9f, 0x5, 0xf4, 0x4f, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x8, 0xf1, 0x4f, 0x44, - 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x5, 0xec, - 0x9, 0xf1, 0x4f, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0x80, 0xbe, 0x31, 0xdc, 0x9, 0xf1, 0x34, 0x44, - 0xdf, 0xff, 0xf8, 0x0, 0x1, 0xaf, 0x40, 0xfc, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0x80, 0x3, 0xdf, - 0x70, 0x8f, 0x40, 0x0, 0x0, 0x1, 0xdf, 0xf8, - 0x0, 0x7e, 0x50, 0x6f, 0xb0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0x80, 0x0, 0x0, 0x7f, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x82, 0x0, 0x2, 0xdf, - 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4c, 0x50, 0x0, 0x0, - - /* U+F03E "" */ - 0x3, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x20, 0x9f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, - 0xfb, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x44, 0x45, 0xf8, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, - 0xf8, 0x3, 0xdf, 0xd3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf8, 0xf8, 0xb, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xf8, - 0xf8, 0xc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x6e, - 0x30, 0x0, 0x0, 0xf8, 0xf8, 0x7, 0xff, 0xf7, - 0x0, 0x0, 0x6, 0xff, 0xe3, 0x0, 0x0, 0xf8, - 0xf8, 0x0, 0x58, 0x50, 0x0, 0x0, 0x6f, 0xff, - 0xfe, 0x30, 0x0, 0xf8, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xf8, - 0xf8, 0x0, 0x0, 0x66, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0xf8, 0xf8, 0x0, 0x6, 0xff, - 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf8, - 0xf8, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xf8, 0xf8, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf8, - 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0xf8, 0xf8, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xf8, - 0xf8, 0x6, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x40, 0xf8, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf5, 0x18, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x50, - - /* U+F040 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xe6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x36, 0x1d, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x3e, 0xf6, 0x1d, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x3e, 0xfa, 0xf6, 0x1d, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xf7, 0xcf, 0xf6, - 0x1d, 0xf3, 0x0, 0x0, 0x0, 0x3e, 0xf7, 0xcf, - 0xff, 0xf6, 0x13, 0x0, 0x0, 0x0, 0x3e, 0xf7, - 0xcf, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x3e, - 0xf7, 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x3e, 0xf7, 0xcf, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x3e, 0xf7, 0xcf, 0xff, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x3e, 0xfd, 0xcf, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0xf, 0xf4, 0xdf, 0xff, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x1, 0xdf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf, 0xb7, - 0x21, 0xdf, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xf4, 0x3e, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x88, 0x88, 0x83, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F048 "" */ - 0x33, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0x20, 0x0, 0x0, 0x0, 0xa8, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0xaf, 0x8f, 0xff, 0x40, 0x0, 0x0, - 0xaf, 0xf8, 0xff, 0xf4, 0x0, 0x0, 0xaf, 0xff, - 0x8f, 0xff, 0x40, 0x0, 0xaf, 0xff, 0xf8, 0xff, - 0xf4, 0x0, 0xaf, 0xff, 0xff, 0x8f, 0xff, 0x40, - 0xaf, 0xff, 0xff, 0xf8, 0xff, 0xf4, 0xaf, 0xff, - 0xff, 0xff, 0x8f, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0x5d, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xf4, - 0x1d, 0xff, 0xff, 0xff, 0x8f, 0xff, 0x40, 0x1d, - 0xff, 0xff, 0xf8, 0xff, 0xf4, 0x0, 0x1d, 0xff, - 0xff, 0x8f, 0xff, 0x40, 0x0, 0x1d, 0xff, 0xf8, - 0xff, 0xf4, 0x0, 0x0, 0x1d, 0xff, 0x8f, 0xff, - 0x40, 0x0, 0x0, 0x1d, 0xf8, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x1d, 0x87, 0x87, 0x0, 0x0, 0x0, - 0x0, 0x14, - - /* U+F04B "" */ - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xf9, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xe7, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x71, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc2, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe6, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x10, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x20, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x92, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0x33, 0x33, 0x33, 0x32, 0x0, 0x3, 0x33, 0x33, - 0x33, 0x2f, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x0, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xc0, - 0x0, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0xf, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0xf, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, - 0x50, 0x0, 0x78, 0x88, 0x88, 0x85, - - /* U+F04D "" */ - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc7, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x85, - - /* U+F051 "" */ - 0x20, 0x0, 0x0, 0x0, 0x1, 0x33, 0x1f, 0x30, - 0x0, 0x0, 0x0, 0x8f, 0xf8, 0xfe, 0x30, 0x0, - 0x0, 0x8, 0xff, 0x8f, 0xfe, 0x30, 0x0, 0x0, - 0x8f, 0xf8, 0xff, 0xfe, 0x30, 0x0, 0x8, 0xff, - 0x8f, 0xff, 0xfe, 0x30, 0x0, 0x8f, 0xf8, 0xff, - 0xff, 0xfe, 0x30, 0x8, 0xff, 0x8f, 0xff, 0xff, - 0xfe, 0x30, 0x8f, 0xf8, 0xff, 0xff, 0xff, 0xfe, - 0x38, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xfe, 0xaf, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xf6, 0x8f, 0xf8, 0xff, 0xff, - 0xff, 0xf6, 0x8, 0xff, 0x8f, 0xff, 0xff, 0xf6, - 0x0, 0x8f, 0xf8, 0xff, 0xff, 0xf6, 0x0, 0x8, - 0xff, 0x8f, 0xff, 0xf6, 0x0, 0x0, 0x8f, 0xf8, - 0xff, 0xf6, 0x0, 0x0, 0x8, 0xff, 0x8f, 0xf6, - 0x0, 0x0, 0x0, 0x8f, 0xf8, 0xf6, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x85, 0x0, 0x0, 0x0, 0x0, - 0x38, 0x83, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x3b, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x3e, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x30, 0x3e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x3b, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xc9, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x7, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xfe, 0x30, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xfe, 0x30, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xf7, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xfa, 0x0, 0x0, 0xa, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, - 0x30, 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x6, - 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x2, 0x10, - 0x0, - - /* U+F054 "" */ - 0x0, 0x55, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xd, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x4, 0x33, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xbf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x7c, 0xcc, 0xcc, 0xff, 0xff, - 0xfc, 0xcc, 0xcc, 0xa0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xe9, 0x0, + 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xfc, 0x10, 0x7f, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfe, 0x37, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xb4, 0xdf, 0xff, 0xbf, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0x80, + 0x1, 0xbf, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0x50, 0x8f, 0x50, 0x9f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfe, 0x30, + 0xbf, 0xff, 0x70, 0x6f, 0xff, 0xf1, 0x0, 0x0, + 0x7, 0xff, 0xfc, 0x12, 0xdf, 0xff, 0xff, 0xa0, + 0x3e, 0xff, 0xe3, 0x0, 0xa, 0xff, 0xfa, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xc1, 0x2d, 0xff, 0xf6, + 0xc, 0xff, 0xf7, 0x6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe3, 0xb, 0xff, 0xf8, 0x9f, 0xf5, 0x9, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x8, + 0xff, 0x50, 0x93, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x5, 0x70, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xcc, 0xcf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0x50, 0x0, 0x9f, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf5, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0x50, 0x0, 0x9f, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xf5, 0x0, 0x9, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0x40, 0x0, + 0x8f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2, + 0x44, 0x44, 0x40, 0x0, 0x1, 0x44, 0x44, 0x41, 0x0, 0x0, - /* U+F068 "" */ - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xee, 0xee, 0xff, + 0xff, 0xff, 0xee, 0xee, 0x20, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xfc, 0x4, 0xff, 0x40, 0xcf, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x23, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x44, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x6e, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, + 0x5d, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F01C "" */ + 0x0, 0x0, 0x4, 0xab, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x9f, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x50, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xfe, 0x10, 0x0, 0xd, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfa, 0x0, 0x9, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf5, 0x3, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xe1, 0xdf, 0xfa, 0x44, 0x44, + 0x20, 0x0, 0x0, 0x0, 0x34, 0x44, 0x4d, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x88, + 0x88, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, + + /* U+F021 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0x76, 0x0, 0x0, 0x0, 0x5, 0x9c, + 0xdd, 0xb8, 0x30, 0x0, 0xf, 0xff, 0x0, 0x0, + 0x6, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x40, 0xf, + 0xff, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xf, 0xff, 0x0, 0xc, 0xff, 0xff, + 0xa5, 0x34, 0x6b, 0xff, 0xff, 0xce, 0xff, 0x0, + 0xaf, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x2b, 0xff, + 0xff, 0xff, 0x5, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xd, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x7d, 0xdc, 0xbf, 0xff, 0xff, + 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x6f, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x2, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x22, + 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xde, + 0xee, 0xee, 0xee, 0xe7, 0x0, 0x0, 0x0, 0x0, + 0x9e, 0xe5, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x9, 0xff, 0xe0, + 0xff, 0xff, 0xf4, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0x70, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xfd, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x61, 0x0, 0x5, 0xcf, 0xff, 0xf2, + 0x0, 0xff, 0xe3, 0xef, 0xff, 0xff, 0xee, 0xff, + 0xff, 0xfe, 0x30, 0x0, 0xff, 0xf0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb1, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x28, 0xdf, 0xff, 0xfe, 0xa3, 0x0, + 0x0, 0x0, 0xab, 0xa0, 0x0, 0x0, 0x1, 0x33, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xf0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x24, 0x44, + 0x47, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x24, 0x44, 0x47, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x75, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x2f, 0xf7, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x7f, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0xdf, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xf, 0xf3, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xc, 0xfd, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x1, 0xfe, 0x20, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1, 0x0, 0x0, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x30, 0x0, + 0x0, 0x0, 0x9f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x0, 0x0, 0x1, 0x0, 0x7f, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xf0, + 0x0, 0x5, 0xf9, 0x0, 0x9f, 0xe1, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, 0x4f, 0xfb, + 0x0, 0xdf, 0x80, 0x24, 0x44, 0x47, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x3f, 0xf7, 0x4, 0xff, 0xe, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x86, 0x0, + 0x4f, 0xf1, 0xd, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x2f, 0xf7, 0x0, 0xcf, 0x60, 0x9f, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x6f, + 0xf1, 0x7, 0xf9, 0x6, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xdf, 0x40, 0x5f, 0xb0, + 0x5f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1f, 0xf2, 0x5, 0xfa, 0x5, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xd, 0xfc, 0x0, 0x9f, + 0x80, 0x7f, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x1, 0xfd, 0x20, 0x1e, 0xf3, 0xb, 0xf6, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0x0, 0xa, + 0xfc, 0x1, 0xff, 0x20, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x0, 0x0, 0xb, 0xff, 0x20, 0x8f, 0xc0, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf0, 0x0, 0x7, + 0xff, 0x40, 0x2f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0x0, 0x0, 0x19, 0x20, 0x1d, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xc0, 0x0, + 0x0, 0x0, 0x2d, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xfb, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0x5, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x50, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0xd, 0xff, 0xff, 0xff, 0xdb, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x2f, 0xff, 0xff, + 0xfd, 0x10, 0xaf, 0xff, 0xff, 0xff, 0xfb, 0x56, + 0xef, 0xff, 0xff, 0xd1, 0x0, 0xa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xf7, 0x2e, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, + 0x70, 0x2, 0xed, 0x10, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x21, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcf, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0xb, 0xd3, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x1d, 0xff, 0x82, 0xff, + 0xe0, 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x2f, 0xfe, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x92, 0xff, 0xe0, + 0x0, 0x3e, 0xff, 0xff, 0xf9, 0x2f, 0xfe, 0x0, + 0x4f, 0xff, 0xff, 0xff, 0x92, 0xff, 0xe0, 0x5f, + 0xff, 0xff, 0xff, 0xf9, 0x2f, 0xfe, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x92, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf9, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x2f, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0x92, 0xff, 0xe0, 0xbf, 0xff, 0xff, 0xff, + 0xf9, 0x2f, 0xfe, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0x92, 0xff, 0xe0, 0x0, 0x8f, 0xff, 0xff, 0xf9, + 0x2f, 0xfe, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x92, + 0xff, 0xe0, 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x2f, + 0xfe, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x92, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x4, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x13, 0x0, + + /* U+F04B "" */ + 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xfb, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x91, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x30, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2a, 0xa3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x3d, 0xff, 0xff, 0xe6, 0x0, 0x3, 0xdf, 0xff, + 0xfe, 0x60, 0xdf, 0xff, 0xff, 0xff, 0x10, 0xd, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0x30, 0xf, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0x40, 0xf, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0x30, 0xf, + 0xff, 0xff, 0xff, 0xf3, 0x8f, 0xff, 0xff, 0xfb, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xb0, 0x2, 0x44, + 0x44, 0x30, 0x0, 0x0, 0x24, 0x44, 0x43, 0x0, + + /* U+F04D "" */ + 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x7c, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xa0, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x2, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x43, 0x0, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdc, 0x10, 0x0, 0x0, 0x0, 0xbf, 0xf3, 0x7f, + 0xfd, 0x20, 0x0, 0x0, 0xd, 0xff, 0x47, 0xff, + 0xfe, 0x30, 0x0, 0x0, 0xdf, 0xf4, 0x7f, 0xff, + 0xff, 0x40, 0x0, 0xd, 0xff, 0x47, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xdf, 0xf4, 0x7f, 0xff, 0xff, + 0xff, 0x60, 0xd, 0xff, 0x47, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xdf, 0xf4, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0x8d, 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xcd, + 0xff, 0x47, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xdf, + 0xf4, 0x7f, 0xff, 0xff, 0xff, 0xa0, 0xd, 0xff, + 0x47, 0xff, 0xff, 0xff, 0x90, 0x0, 0xdf, 0xf4, + 0x7f, 0xff, 0xff, 0x80, 0x0, 0xd, 0xff, 0x47, + 0xff, 0xff, 0x70, 0x0, 0x0, 0xdf, 0xf4, 0x7f, + 0xff, 0x60, 0x0, 0x0, 0xd, 0xff, 0x44, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x2, 0x20, + 0x0, 0x0, 0x0, 0x2, 0x44, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xea, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x56, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x61, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x27, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x30, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x19, 0x20, 0x0, 0x0, + 0x0, 0x1, 0xdf, 0xe2, 0x0, 0x0, 0x0, 0x1d, + 0xff, 0xf8, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xd1, + 0x0, 0x0, 0x1d, 0xff, 0xfc, 0x10, 0x0, 0x1, + 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x1d, 0xff, 0xfc, + 0x10, 0x0, 0x1, 0xdf, 0xff, 0xc1, 0x0, 0x0, + 0x1d, 0xff, 0xfc, 0x10, 0x0, 0x0, 0xbf, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0xf6, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + + /* U+F054 "" */ + 0x5, 0x80, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xf3, 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, + 0x0, 0x0, 0x9f, 0xff, 0xf4, 0x0, 0x0, 0x9, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x9f, 0xff, 0xf4, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x8f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x1c, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x1, 0xbe, 0xd3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x14, 0x55, + 0x55, 0x59, 0xff, 0xfc, 0x55, 0x55, 0x54, 0x20, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x6c, 0xdd, + 0xdd, 0xde, 0xff, 0xff, 0xdd, 0xdd, 0xdc, 0x90, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x36, 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+F068 "" */ + 0x2, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x43, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5b, 0xff, 0xff, 0xff, 0xea, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xfd, 0xce, + 0xff, 0xff, 0xc3, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xff, 0x71, 0x0, 0x2, 0x9f, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x2d, 0xff, 0xfe, 0x20, 0x2, + 0x53, 0x0, 0x5f, 0xff, 0xfb, 0x0, 0x0, 0x1e, + 0xff, 0xff, 0x30, 0x0, 0x6f, 0xfc, 0x10, 0x7f, + 0xff, 0xfb, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x0, + 0x6, 0xff, 0xfc, 0x0, 0xef, 0xff, 0xf8, 0x6, + 0xff, 0xff, 0xf5, 0x1, 0x3, 0xef, 0xff, 0xf4, + 0x9, 0xff, 0xff, 0xf3, 0xef, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0x70, 0x7f, 0xff, 0xff, + 0xad, 0xff, 0xff, 0xf3, 0xa, 0xff, 0xff, 0xff, + 0xf6, 0x7, 0xff, 0xff, 0xf9, 0x3f, 0xff, 0xff, + 0x60, 0x5f, 0xff, 0xff, 0xff, 0x10, 0xaf, 0xff, + 0xfe, 0x10, 0x8f, 0xff, 0xfc, 0x0, 0xaf, 0xff, + 0xff, 0x60, 0x1f, 0xff, 0xff, 0x50, 0x0, 0xaf, + 0xff, 0xf6, 0x0, 0x6c, 0xdb, 0x40, 0xa, 0xff, + 0xff, 0x70, 0x0, 0x0, 0xaf, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfc, 0x52, 0x12, 0x6d, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x19, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x5a, 0xde, 0xfe, 0xd9, + 0x50, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xd2, 0x0, 0x0, 0x0, + 0x24, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x60, 0x28, 0xcf, 0xff, 0xff, + 0xfb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, + 0xff, 0xfc, 0xff, 0xff, 0xec, 0xdf, 0xff, 0xfe, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xa3, 0x0, 0x0, 0x6e, 0xff, 0xfc, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0x70, + 0x15, 0x40, 0x1, 0xdf, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x1c, 0xff, 0xfb, 0x1f, 0xfe, + 0x50, 0x2f, 0xff, 0xff, 0x20, 0x0, 0x0, 0x7e, + 0x30, 0x0, 0x9f, 0xff, 0xef, 0xff, 0xf3, 0x8, + 0xff, 0xff, 0xd0, 0x0, 0x2, 0xff, 0xf6, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xfa, 0x3, 0xff, 0xff, + 0xf8, 0x0, 0x8, 0xff, 0xff, 0xa0, 0x0, 0x2d, + 0xff, 0xff, 0xfd, 0x1, 0xff, 0xff, 0xff, 0x0, + 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0xaf, 0xff, + 0xfb, 0x2, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xdf, + 0xff, 0xfd, 0x0, 0x0, 0x6, 0xff, 0xff, 0x55, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0x40, 0x0, 0x0, 0x3d, 0xff, 0xfe, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x4, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfb, 0x10, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xe8, 0x31, 0x20, 0x0, 0x3e, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xfb, 0x0, 0x1, 0xbf, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, + 0xef, 0xfd, 0x80, 0x0, 0x8, 0xff, 0xfd, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4e, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0x60, /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0xaa, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, 0x88, - 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xf4, 0x0, 0x4f, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x4f, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf4, - 0x0, 0x4f, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xf5, 0x0, 0x6f, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x2, 0xff, 0xff, 0xf8, 0x0, 0x8f, - 0xff, 0xff, 0x20, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xf9, 0x33, 0x9f, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfa, 0x44, - 0xaf, 0xff, 0xff, 0xfb, 0x0, 0x4, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x40, - 0xe, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xd0, 0x6f, 0xff, 0xff, 0xff, 0xfc, - 0x77, 0xcf, 0xff, 0xff, 0xff, 0xf6, 0xef, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfd, 0x88, 0x8f, 0xff, 0xe0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0x80, + 0x0, 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x0, 0xd, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0xa0, 0x0, 0xef, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfb, + 0x0, 0xf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xfd, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, + 0xfd, 0xcd, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x6f, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x17, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x38, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, + 0xff, 0xff, 0xfb, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x2, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x90, 0x0, /* U+F074 "" */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, - 0x10, 0xbb, 0xb9, 0x52, 0x0, 0x0, 0x2, 0x6b, - 0xbb, 0xbe, 0xff, 0xc1, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, - 0xff, 0xff, 0xf9, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0x78, 0x88, 0xcf, 0xfe, 0x4f, 0xff, - 0xe8, 0x88, 0x8e, 0xff, 0xa0, 0x0, 0x0, 0xa, - 0xf6, 0xcf, 0xfe, 0x10, 0x0, 0xc, 0xfa, 0x0, - 0x0, 0x0, 0x1, 0xd4, 0xff, 0xf4, 0x0, 0x0, - 0xc, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, - 0xc0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfe, 0x30, 0x0, - 0x0, 0x5, 0x10, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xf6, 0xc7, 0x0, 0x0, 0xc, 0xc1, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xe4, 0xfe, 0x40, 0x0, 0xc, - 0xfc, 0x10, 0xbb, 0xbb, 0xff, 0xff, 0x4b, 0xff, - 0xfc, 0xbb, 0xbe, 0xff, 0xc1, 0xff, 0xff, 0xff, - 0xf6, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x3c, 0xff, 0xff, - 0xff, 0xff, 0xfa, 0x78, 0x88, 0x40, 0x0, 0x0, - 0x0, 0x36, 0x88, 0x8e, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf5, + 0x0, 0x12, 0x22, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x22, 0x9f, 0xff, 0x50, 0xff, 0xff, 0xfe, 0x20, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x45, 0x55, 0xbf, + 0xff, 0x60, 0xaf, 0xff, 0xd5, 0xaf, 0xff, 0x80, + 0x0, 0x0, 0xb, 0xf8, 0xa, 0xff, 0xfe, 0x10, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x70, 0x9f, + 0xff, 0xe2, 0x0, 0x4f, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf3, 0x10, + 0x0, 0x2a, 0x30, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0x41, 0xda, 0x0, 0x7f, 0xf3, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf4, 0xd, 0xff, 0x90, 0x8f, + 0xff, 0x30, 0xef, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, + 0xf6, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xfa, 0x67, 0x77, 0x75, 0x0, 0x0, + 0x0, 0x3, 0x77, 0xbf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x1b, 0xb1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xf6, 0x6f, 0xff, 0xff, 0xc1, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0x60, 0x6, 0xff, 0xff, 0xfc, 0x10, - 0x1c, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xc1, 0xcf, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xfb, 0x9f, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf9, 0xa, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xa0, - 0x0, 0x96, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x89, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xfc, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xfa, 0x5, 0xff, 0xff, 0x70, + 0x0, 0x0, 0x4f, 0xff, 0xfa, 0x0, 0x5, 0xff, + 0xff, 0x70, 0x0, 0x4f, 0xff, 0xf9, 0x0, 0x0, + 0x6, 0xff, 0xff, 0x70, 0x3f, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0x7a, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x2e, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x50, 0x25, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0x40, /* U+F078 "" */ - 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x22, 0x0, 0x3, 0xee, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xee, 0x30, 0x3e, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xe3, 0xcf, 0xff, - 0xfe, 0x30, 0x0, 0x0, 0x3, 0xef, 0xff, 0xfc, - 0x3f, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xf3, 0x3, 0xff, 0xff, 0xfe, 0x30, 0x3, - 0xef, 0xff, 0xff, 0x30, 0x0, 0x3f, 0xff, 0xff, - 0xe3, 0x3e, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x3, - 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x20, - 0x0, 0x0, 0x0, 0x0, + 0x9, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcb, 0x18, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xfc, 0x9f, 0xff, 0xe3, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xd0, 0xbf, 0xff, 0xe3, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xd1, 0x0, 0xbf, + 0xff, 0xe3, 0x0, 0x1, 0xcf, 0xff, 0xd1, 0x0, + 0x0, 0xbf, 0xff, 0xe3, 0x1, 0xcf, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xe4, 0xcf, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, + 0x0, 0x0, /* U+F079 "" */ - 0x0, 0x0, 0x0, 0x0, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x10, 0x0, 0x0, 0x3, 0xe9, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0x0, 0x1e, 0xff, 0x70, 0x4f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x0, 0x1, 0xcf, 0xff, 0xf5, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, - 0xa, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x80, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x80, 0x0, 0x14, 0x4d, 0xff, 0x74, - 0x30, 0x0, 0x0, 0x0, 0xc, 0xff, 0x80, 0x0, - 0x0, 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x23, - 0x3c, 0xff, 0x93, 0x31, 0x0, 0xc, 0xff, 0x40, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0xc, 0xff, 0x63, - 0x33, 0x33, 0x32, 0x6, 0xff, 0xff, 0xff, 0x30, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0xaf, 0xff, 0xf5, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0xc, 0xff, 0x70, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, - 0x1, 0xda, 0x0, 0x0, + 0x0, 0x0, 0x27, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xfd, + 0x10, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xd1, 0x3f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xfd, 0x15, 0xbb, 0xbb, + 0xbb, 0xbb, 0xef, 0xf1, 0x0, 0x0, 0xdf, 0xfb, + 0xef, 0xdc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf1, 0x0, 0x0, 0x9f, 0xc0, 0xef, 0xd1, + 0xdf, 0x70, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, + 0x0, 0x0, 0x3, 0x0, 0xef, 0xd0, 0x3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0x50, 0xaf, 0xf1, + 0x19, 0x30, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf6, 0xaf, 0xf3, 0xdf, 0xe0, + 0x0, 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xef, 0xfe, 0xff, 0xd0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x17, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x6f, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x0, 0x6b, 0xbb, 0xbb, 0xbb, + 0xbb, 0xba, 0x30, 0x6, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x0, 0x0, 0x0, /* U+F07B "" */ - 0x0, 0x43, 0x33, 0x32, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0x83, 0x33, 0x33, 0x33, - 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe6, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x21, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x40, - - /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0xa, 0xe3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x7, 0xbb, 0xbb, 0xb7, 0x3, 0x44, 0x41, 0x2b, - 0xbb, 0xbb, 0xa1, 0xff, 0xff, 0xff, 0xf7, 0x33, - 0x33, 0x4c, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbb, - 0xfb, 0xbf, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf5, 0x7f, 0x75, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x75, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x71, - - /* U+F095 "" */ - 0x0, 0x23, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, - 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xc1, 0x0, - 0x0, 0x12, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, - 0x40, 0x1, 0xcf, 0x81, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf8, 0x2a, 0xff, 0xfe, 0x60, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x1, 0x6b, 0xff, - 0xb5, 0x0, - - /* U+F0C4 "" */ - 0x2, 0x7b, 0x86, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xe6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0xdf, 0xb4, - 0x6c, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, 0x9d, - 0xc4, 0xff, 0x0, 0x0, 0x6f, 0xf2, 0x0, 0x0, - 0x1, 0x7d, 0x40, 0x3f, 0xdf, 0x70, 0x0, 0xa, - 0xf6, 0x0, 0x0, 0x6d, 0x60, 0x4, 0xe3, 0x5f, - 0xf7, 0x10, 0x1b, 0xf7, 0x0, 0x4c, 0x81, 0x0, - 0x7c, 0x10, 0x6, 0xff, 0xfd, 0xff, 0xfd, 0x7a, - 0xa2, 0x0, 0x1a, 0x90, 0x0, 0x0, 0x3a, 0xff, - 0xfe, 0x95, 0xc4, 0x0, 0x3, 0xc5, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x0, 0x7f, 0x4b, 0x50, 0x5c, - 0x30, 0x0, 0x0, 0x0, 0x0, 0x13, 0x31, 0x8c, - 0x29, 0x59, 0xbd, 0x40, 0x0, 0x0, 0x0, 0x5c, - 0xff, 0xff, 0xb1, 0x8a, 0xb7, 0x1, 0xc7, 0x0, - 0x0, 0xa, 0xff, 0xec, 0xdf, 0xfd, 0x68, 0xe4, - 0x0, 0x8, 0xb1, 0x0, 0x7f, 0xf6, 0x0, 0xb, - 0xf6, 0x0, 0x2b, 0xa2, 0x0, 0x5c, 0x30, 0xef, - 0x40, 0x0, 0xb, 0xf6, 0x0, 0x0, 0x4c, 0x71, - 0x2, 0xc6, 0xff, 0x10, 0x0, 0x8f, 0xf1, 0x0, - 0x0, 0x0, 0x6d, 0x60, 0x5e, 0xbf, 0xb7, 0x7d, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x1, 0x8e, 0xa2, - 0x2e, 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x68, 0x83, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x8b, 0xbb, 0xbb, 0xba, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xcc, - 0xcc, 0xef, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xfc, 0x0, 0x0, 0x8f, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xfa, 0xcc, 0x0, 0x0, 0x8f, - 0x40, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xa0, 0xcc, - 0x0, 0x0, 0x8f, 0x42, 0x33, 0x33, 0x30, 0xa, - 0xfa, 0x0, 0xcc, 0x0, 0x0, 0x8f, 0xdf, 0xff, - 0xff, 0xfc, 0x8f, 0xe7, 0x77, 0xdc, 0x0, 0x0, - 0x8f, 0xfe, 0x88, 0x88, 0xcf, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x3, 0xef, 0xec, 0x0, 0x0, 0x8f, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xf3, 0xcc, - 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x3, - 0xef, 0x30, 0xcc, 0x0, 0x0, 0x8f, 0xf8, 0x0, - 0x0, 0x0, 0x3e, 0xf3, 0x0, 0xcc, 0x0, 0x0, - 0x8f, 0xf8, 0x0, 0x0, 0x0, 0xef, 0xdb, 0xbb, - 0xec, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x2, - 0xfe, 0xcc, 0xcc, 0xc3, 0x0, 0x0, 0x8f, 0xf8, - 0x0, 0x0, 0x4, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x4, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf9, 0x33, 0x33, - 0x36, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0x28, 0x88, 0x88, 0x8a, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, - 0x0, 0x4, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0x0, 0x0, 0x0, 0x4, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x4, - 0xfb, 0x77, 0x77, 0x77, 0x77, 0x77, 0xbf, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x40, - - /* U+F0C7 "" */ - 0x23, 0x33, 0x33, 0x33, 0x33, 0x33, 0x32, 0x0, - 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0xfa, 0x4d, 0xff, 0xfe, 0x44, - 0x5f, 0xab, 0xf9, 0x0, 0xf, 0x80, 0xcf, 0xff, - 0xc0, 0x0, 0xf8, 0xa, 0xf9, 0x0, 0xf8, 0xc, - 0xff, 0xfc, 0x0, 0xf, 0x80, 0xa, 0xf9, 0xf, - 0x80, 0xcf, 0xff, 0xc0, 0x0, 0xf8, 0x0, 0xa, - 0xf6, 0xf8, 0xc, 0xff, 0xfc, 0x0, 0xf, 0x80, - 0x0, 0xe, 0xcf, 0x80, 0xcf, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0xcc, 0xf8, 0x3, 0x88, 0x88, - 0x88, 0x88, 0x10, 0x0, 0xc, 0xcf, 0x80, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xcf, 0x80, 0x13, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x0, 0xcc, 0xf8, 0xb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xc, 0xcf, 0x80, 0xcd, 0x44, 0x44, - 0x44, 0x44, 0x4d, 0xc0, 0xcc, 0xf8, 0xc, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xcc, 0xc, 0xcf, 0x80, - 0xcc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xc0, 0xcc, - 0xf8, 0xc, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcc, - 0xc, 0xcf, 0x80, 0xcc, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xc0, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc5, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x83, - - /* U+F0E7 "" */ - 0x0, 0x13, 0x33, 0x32, 0x0, 0x0, 0xa, 0xff, - 0xff, 0x70, 0x0, 0x0, 0xef, 0xff, 0xf2, 0x0, - 0x0, 0x2f, 0xff, 0xfd, 0x0, 0x0, 0x5, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x9f, 0xff, 0xf1, 0x0, - 0x0, 0xd, 0xff, 0xfa, 0x25, 0x9d, 0xf1, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x5f, 0xff, 0xff, 0xff, - 0xff, 0x29, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xdf, - 0xff, 0xed, 0xff, 0xf2, 0xc, 0xa6, 0x20, 0x9f, - 0xfa, 0x0, 0x0, 0x0, 0xc, 0xff, 0x40, 0x0, - 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x4f, - 0xf4, 0x0, 0x0, 0x0, 0x8, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0x60, 0x0, 0x0, 0x0, 0xf, - 0xe0, 0x0, 0x0, 0x0, 0x4, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, 0xc, - 0x80, 0x0, 0x0, 0x0, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xba, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xcf, 0xff, 0xfc, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x3f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0xfb, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc9, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1b, 0xef, 0xb1, 0x0, 0x0, - 0x0, 0x0, - - /* U+F11C "" */ - 0x2, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, - 0x33, 0x33, 0x33, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, - 0xfc, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, - 0x88, 0x88, 0x88, 0xf8, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, - 0xf8, 0xc, 0xc0, 0xcc, 0x8, 0xf0, 0x8f, 0x34, - 0xf4, 0x3f, 0x80, 0xf8, 0xf8, 0x6, 0x60, 0x66, - 0x4, 0x80, 0x48, 0x22, 0x82, 0x4f, 0x80, 0xf8, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0x80, 0xf8, 0xf8, 0x9, 0xbb, 0x33, - 0xb6, 0xc, 0x60, 0x99, 0x9, 0xcf, 0x80, 0xf8, - 0xf8, 0x9, 0xcc, 0x32, 0xc6, 0xc, 0x60, 0x99, - 0x9, 0xcc, 0x60, 0xf8, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, - 0xf8, 0x9, 0x90, 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, - 0xb3, 0x2b, 0x60, 0xf8, 0xf8, 0x9, 0x90, 0x9c, - 0xcc, 0xcc, 0xcc, 0xcc, 0xc3, 0x3c, 0x60, 0xf8, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf8, 0xfb, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xf8, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, - - /* U+F124 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xbf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xbf, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xbf, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x4, - 0xbf, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x4, - 0xbf, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x4, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x4, - 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x9c, 0xcc, 0xcc, 0xcd, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x72, 0x0, 0x0, - 0x0, 0x0, - - /* U+F15B "" */ - 0x9b, 0xbb, 0xbb, 0xbb, 0xbb, 0xb0, 0x20, 0x0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8, - 0x90, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf0, 0x8f, 0x90, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x8, 0xff, 0x90, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf0, 0x8f, 0xff, 0x90, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8, 0xff, 0xff, - 0x90, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x48, - 0x88, 0x88, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, + 0x5, 0x78, 0x88, 0x88, 0x71, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xcc, + 0xcc, 0xcc, 0xcb, 0x91, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfb, 0x4, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x44, 0x43, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, - /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x33, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x6a, 0xff, 0xff, 0xff, 0xfc, 0x63, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x1, 0xbf, + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xfc, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x11, 0x11, 0xef, + 0xff, 0xf9, 0x11, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xe0, 0xdf, 0xff, 0xf8, 0xe, + 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xf3, 0x26, + 0x66, 0x50, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x52, 0x22, 0x25, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb3, 0x0, 0x3, 0xef, 0xff, 0xfd, 0x83, 0x0, - 0x0, 0x3, 0x7d, 0xff, 0xff, 0xe5, 0x5, 0xff, - 0xff, 0xe4, 0x0, 0x25, 0x77, 0x76, 0x30, 0x4, - 0xcf, 0xff, 0xf5, 0x1d, 0xff, 0x80, 0x17, 0xdf, - 0xff, 0xff, 0xff, 0xd7, 0x10, 0x6f, 0xff, 0x30, - 0x1b, 0x40, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x70, 0x3b, 0x30, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xdb, 0x8b, 0xdf, 0xff, 0xff, 0xa1, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xfa, 0x20, 0x0, 0x0, - 0x18, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x1d, - 0xc2, 0x3, 0x8b, 0xbb, 0x84, 0x2, 0xcf, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x10, 0x1b, 0xff, 0xff, - 0xff, 0xfb, 0x30, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xfd, - 0x74, 0x6c, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x16, 0x0, 0x10, 0x4, 0x30, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0x6e, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xaf, + 0x5d, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F095 "" */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xef, 0xe5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0x30, + 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xc8, 0x51, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1b, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x5, 0xb8, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x1, 0x8e, 0xff, + 0xf6, 0x0, 0x8, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xf4, 0x4d, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7b, 0xb9, + 0x74, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - /* U+F240 "" */ - 0x29, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, 0xd, 0xfc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcd, 0xf8, 0x0, 0xf8, 0x0, 0x0, + /* U+F0C4 "" */ + 0x1, 0x8c, 0xda, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x20, 0x0, 0x1d, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xf1, 0xef, 0xe1, + 0xc, 0xff, 0x20, 0x0, 0xbf, 0xff, 0xfe, 0x30, + 0xff, 0xd0, 0xa, 0xff, 0x30, 0xb, 0xff, 0xff, + 0xe3, 0x0, 0xbf, 0xfc, 0xbf, 0xff, 0x10, 0xcf, + 0xff, 0xfe, 0x30, 0x0, 0x3f, 0xff, 0xff, 0xff, + 0xdc, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x3, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0x1, 0x2d, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0x8c, + 0xef, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x33, 0xef, + 0xff, 0xfc, 0x0, 0x0, 0xef, 0xe1, 0xc, 0xff, + 0x20, 0x2e, 0xff, 0xff, 0xc1, 0x0, 0xff, 0xd0, + 0xa, 0xff, 0x30, 0x2, 0xef, 0xff, 0xfc, 0x10, + 0xbf, 0xfc, 0xbf, 0xff, 0x0, 0x0, 0x1d, 0xff, + 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xd1, 0x3, 0xdf, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x4, 0x75, 0x0, 0x0, 0x1, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x0, 0x0, 0x12, 0x22, 0x22, 0x22, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xfe, 0xe, 0x70, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xfe, 0xe, 0xf7, 0x0, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xfe, 0xe, 0xff, 0x70, + 0x1, 0x22, 0x5, 0xff, 0xff, 0xff, 0xfe, 0xe, + 0xff, 0xf2, 0xdf, 0xff, 0x25, 0xff, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0xff, 0xff, 0x25, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0x25, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0x25, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0x24, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0xff, 0xff, 0x50, 0x56, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x50, 0xff, 0xff, + 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0x0, 0x0, 0x8b, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xb7, 0x0, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x2a, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x91, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, 0x10, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xd0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xff, 0xf5, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xf6, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xf6, + 0xff, 0xfb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xfe, 0x51, 0x3b, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xcf, 0xff, + 0xff, 0xf6, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0xf6, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xda, 0xbf, 0xff, 0xff, + 0xff, 0xf6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x0, + + /* U+F0E7 "" */ + 0x0, 0x3, 0x44, 0x44, 0x43, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfe, 0x66, 0x66, 0x51, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x40, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x1, 0x22, 0x22, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0x90, 0x0, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8c, 0xcc, 0xdf, 0xbc, + 0xfc, 0xcc, 0xc6, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xfe, 0x1, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xde, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x92, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xfc, 0x1, 0x22, 0x22, 0x22, 0x1, 0x0, 0x0, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xfc, 0xe, + 0x70, 0x0, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, + 0xfc, 0xe, 0xf7, 0x0, 0xff, 0xff, 0xf8, 0x1f, + 0xff, 0xff, 0xfc, 0xe, 0xff, 0x70, 0xff, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xfc, 0xe, 0xff, 0xf2, + 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xf8, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, + 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x58, 0x88, 0x84, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x8, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x80, + + /* U+F0F3 "" */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xc0, 0xf, 0x80, 0x67, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x40, - 0xcc, 0x0, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xc, 0xe8, - 0xf, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x9d, 0xf3, 0xf8, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x4f, 0x4f, 0x80, 0xcf, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xef, 0xf9, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xfb, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf3, 0x6c, 0xdd, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7b, 0x81, 0x0, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0x19, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x80, 0x4, 0xf4, 0xf8, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x0, 0x4f, 0x4f, 0x80, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x4, - 0xf4, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, 0x6, 0x9f, 0x4f, - 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0xcf, 0xd1, 0xf8, 0x9, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xc6, 0xc, 0xc0, 0xf, 0x80, 0x0, 0x0, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0x0, + 0x8f, 0x10, 0x7f, 0x10, 0x5f, 0x30, 0x3f, 0x50, + 0x1f, 0xfc, 0xff, 0xc0, 0x7, 0xe0, 0x6, 0xf0, + 0x4, 0xf2, 0x2, 0xf4, 0x0, 0xff, 0xcf, 0xfc, + 0x0, 0x8f, 0x0, 0x7f, 0x10, 0x5f, 0x30, 0x3f, + 0x50, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, + 0xff, 0xfe, 0x66, 0xbf, 0x66, 0xaf, 0x76, 0x8f, + 0x86, 0x7f, 0xff, 0xfc, 0xff, 0xff, 0xd0, 0x6, + 0xf0, 0x5, 0xf1, 0x3, 0xf3, 0x1, 0xff, 0xff, + 0xcf, 0xff, 0xfd, 0x0, 0x7f, 0x0, 0x5f, 0x10, + 0x3f, 0x30, 0x1f, 0xff, 0xfc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xcf, 0xfe, 0x66, 0xcf, 0x76, 0x66, 0x66, + 0x66, 0x66, 0x9f, 0xa6, 0x7f, 0xfc, 0xff, 0xc0, + 0x7, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xf4, + 0x0, 0xff, 0xcf, 0xfc, 0x0, 0x7e, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0x40, 0xf, 0xfc, 0xff, + 0xfc, 0xce, 0xfc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcd, + 0xfd, 0xcc, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x10, + + /* U+F124 "" */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcc, 0x0, 0xfc, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, - 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x7e, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x5, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x1, 0x22, 0x22, + 0x22, 0x7f, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xb8, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x37, 0x77, 0x77, 0x77, 0x74, 0x5, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xfa, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, 0xfa, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, 0xff, + 0xfa, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xf, + 0xff, 0xfa, 0xf, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0xff, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xe3, 0x22, 0x22, 0x21, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x40, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x9c, 0xde, 0xdc, 0xb8, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xdb, 0x99, 0x9a, + 0xcf, 0xff, 0xff, 0xff, 0xb1, 0x0, 0xa, 0xff, + 0xff, 0xfc, 0x61, 0x0, 0x0, 0x0, 0x0, 0x39, + 0xef, 0xff, 0xfe, 0x40, 0xcf, 0xff, 0xfb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xf4, 0xaf, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0xf2, + 0xa, 0xd2, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xed, + 0xb6, 0x20, 0x0, 0x0, 0x8e, 0x30, 0x0, 0x0, + 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfb, + 0x87, 0x89, 0xdf, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x3, 0xaf, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xba, 0x10, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, /* U+F241 "" */ - 0x29, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, 0xd, 0xfc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcd, 0xf8, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xc0, 0xf, 0x80, 0x67, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x76, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, 0xe8, - 0xf, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, 0x0, 0x0, 0x0, 0x9d, 0xf3, 0xf8, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x4f, 0x4f, 0x80, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x4, 0xf4, 0xf8, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x4f, 0x4f, 0x80, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x4, - 0xf4, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x6, 0x9f, 0x4f, - 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xd1, 0xf8, 0x9, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x90, - 0x0, 0x0, 0xc, 0xc0, 0xf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcc, 0x0, 0xfc, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, - 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x86, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, /* U+F242 "" */ - 0x29, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, 0xd, 0xfc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcd, 0xf8, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xc0, 0xf, 0x80, 0x67, 0x77, 0x77, - 0x77, 0x77, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xc, 0xe8, - 0xf, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9d, 0xf3, 0xf8, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0x4f, 0x80, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xf4, 0xf8, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0x4f, 0x80, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xf4, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x6, 0x9f, 0x4f, - 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd1, 0xf8, 0x9, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x30, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xc0, 0xf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcc, 0x0, 0xfc, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, - 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x88, 0x88, 0x85, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, /* U+F243 "" */ - 0x29, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, 0xd, 0xfc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcd, 0xf8, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xc0, 0xf, 0x80, 0x67, 0x77, 0x77, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0xf8, 0xc, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xe8, - 0xf, 0x80, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9d, 0xf3, 0xf8, - 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0x4f, 0x80, 0xcf, - 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xf4, 0xf8, 0xc, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0x4f, 0x80, 0xcf, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xf4, 0xf8, 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x9f, 0x4f, - 0x80, 0xcf, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd1, 0xf8, 0x9, - 0xcc, 0xcc, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xc0, 0xf, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcc, 0x0, 0xfc, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, - 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0xef, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0xef, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x78, 0x88, + 0x84, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, /* U+F244 "" */ - 0x29, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0x10, 0xd, 0xfc, - 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xcc, 0xcd, 0xf8, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xc0, 0xf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xeb, 0xbb, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xff, 0x50, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xf9, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcc, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xe8, - 0xf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9d, 0xf3, 0xf8, + 0x0, 0x7, 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x7f, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0x4f, 0x80, 0x0, + 0x0, 0x5, 0xdf, 0xfa, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfa, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0xcf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x19, 0xbb, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, + 0x92, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, + 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x12, 0xdf, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xf4, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x76, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x4c, + 0xd5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, + 0x0, 0x0, 0xd, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xd2, 0x0, + 0x4f, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0x40, 0x0, 0xaf, 0xff, 0xfc, 0x1, 0xde, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfa, 0x10, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xdf, 0xff, + 0xff, 0x88, 0x88, 0x9f, 0xe8, 0x88, 0x88, 0x88, + 0x88, 0x8f, 0xff, 0x91, 0x5f, 0xff, 0xf8, 0x0, + 0x0, 0x7, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xc3, 0x0, 0x4, 0xbb, 0x60, 0x0, 0x0, 0x0, + 0xeb, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x30, + 0x8, 0x88, 0x83, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xc1, 0x2f, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0x4f, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xf4, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x9f, 0x4f, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xd1, 0xf8, 0x0, + 0x0, 0x27, 0x9f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xc0, 0xf, 0x80, 0x0, 0x0, + 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcc, 0x0, 0xfc, 0x77, 0x77, 0x77, 0x77, - 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, - 0xa0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, 0x0, 0x0, /* U+F293 "" */ - 0x0, 0x0, 0x26, 0xbb, 0xbb, 0xa5, 0x10, 0x0, - 0x0, 0x0, 0x7e, 0xff, 0xff, 0xff, 0xfe, 0x60, - 0x0, 0x0, 0x8f, 0xff, 0xfc, 0x6f, 0xff, 0xff, - 0x60, 0x0, 0x4f, 0xff, 0xff, 0xc0, 0x6f, 0xff, - 0xfe, 0x20, 0xa, 0xff, 0xff, 0xfc, 0x0, 0x6f, - 0xff, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xc0, 0x30, - 0x6f, 0xff, 0xd0, 0x4f, 0xff, 0x4d, 0xfc, 0xc, - 0x60, 0x6f, 0xff, 0x27, 0xff, 0xa0, 0x1d, 0xc0, - 0xcf, 0x10, 0xcf, 0xf4, 0x8f, 0xff, 0x90, 0x19, - 0xb, 0x30, 0xaf, 0xff, 0x7a, 0xff, 0xff, 0x90, - 0x0, 0x10, 0xaf, 0xff, 0xf8, 0xcf, 0xff, 0xff, - 0x90, 0x0, 0xaf, 0xff, 0xff, 0x8c, 0xff, 0xff, - 0xff, 0x20, 0x1d, 0xff, 0xff, 0xf8, 0xbf, 0xff, - 0xff, 0x30, 0x0, 0x1d, 0xff, 0xff, 0x88, 0xff, - 0xff, 0x30, 0x60, 0x91, 0x1d, 0xff, 0xf8, 0x8f, - 0xff, 0x30, 0xac, 0xc, 0xb0, 0x2f, 0xff, 0x44, - 0xff, 0xc1, 0xaf, 0xc0, 0xca, 0x3, 0xef, 0xf3, - 0x1f, 0xff, 0xef, 0xfc, 0x6, 0x3, 0xef, 0xff, - 0x0, 0xcf, 0xff, 0xff, 0xc0, 0x3, 0xef, 0xff, - 0xa0, 0x6, 0xff, 0xff, 0xfc, 0x3, 0xef, 0xff, - 0xf3, 0x0, 0xc, 0xff, 0xff, 0xc3, 0xef, 0xff, - 0xf9, 0x0, 0x0, 0x1c, 0xff, 0xfd, 0xef, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x6, 0xbf, 0xff, 0xff, - 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, - 0x0, 0x0, 0x0, 0x0 + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x9e, 0xff, 0xff, 0xc7, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xdf, 0xff, 0xfd, + 0x20, 0x0, 0x8, 0xff, 0xff, 0xf2, 0xdf, 0xff, + 0xfe, 0x0, 0x3, 0xff, 0xff, 0xff, 0x11, 0xdf, + 0xff, 0xf9, 0x0, 0xaf, 0xff, 0xff, 0xf1, 0x1, + 0xef, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0x12, + 0x12, 0xef, 0xff, 0x53, 0xff, 0xf4, 0x7f, 0xf1, + 0x3d, 0x13, 0xff, 0xf8, 0x6f, 0xff, 0x40, 0x7f, + 0x13, 0xf5, 0xc, 0xff, 0xb8, 0xff, 0xff, 0x40, + 0x71, 0x35, 0xa, 0xff, 0xfd, 0x9f, 0xff, 0xff, + 0x40, 0x0, 0x8, 0xff, 0xff, 0xea, 0xff, 0xff, + 0xff, 0x30, 0x6, 0xff, 0xff, 0xfe, 0xaf, 0xff, + 0xff, 0xf4, 0x0, 0x6f, 0xff, 0xff, 0xe9, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x7f, 0xff, 0xfe, 0x8f, + 0xff, 0xf4, 0x6, 0x13, 0x50, 0x8f, 0xff, 0xd6, + 0xff, 0xf4, 0x7, 0xf1, 0x3f, 0x40, 0x9f, 0xfb, + 0x3f, 0xff, 0x47, 0xff, 0x13, 0xd1, 0x1d, 0xff, + 0x90, 0xff, 0xff, 0xff, 0xf1, 0x21, 0x1d, 0xff, + 0xf5, 0xa, 0xff, 0xff, 0xff, 0x20, 0x2e, 0xff, + 0xff, 0x0, 0x2f, 0xff, 0xff, 0xf2, 0x2e, 0xff, + 0xff, 0x80, 0x0, 0x6f, 0xff, 0xff, 0x4e, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x0, 0x5, 0x9c, 0xdd, + 0xc9, 0x40, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0x0, 0xac, 0xcc, 0xcd, 0xff, + 0xff, 0xff, 0xfd, 0xcc, 0xcc, 0xc1, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x0, 0xa, 0xff, 0xe1, 0xef, 0xf2, 0xcf, + 0xf3, 0xbf, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, + 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, + 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, + 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, + 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, + 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, + 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, + 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, + 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, 0xf1, 0x9f, + 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, 0xf0, 0xbf, + 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, 0xd0, 0xdf, + 0xf0, 0xbf, 0xf1, 0x9f, 0xfe, 0x0, 0xa, 0xff, + 0xe1, 0xef, 0xf1, 0xcf, 0xf3, 0xaf, 0xfe, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x7b, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcb, 0x91, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xf4, 0xc, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xf4, 0xc, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xf4, 0xc, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xf4, 0xc, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xb9, 0x75, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x2, 0x68, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x75, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0x80, 0xcf, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xc, 0xfc, 0x0, + 0xc, 0xff, 0xff, 0xf8, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x90, 0x0, 0x5f, 0xff, + 0xff, 0xf8, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xf8, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x10, 0x0, 0xcf, 0xff, + 0xff, 0xf8, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x5, 0xf5, 0x0, 0xd, 0xff, 0xff, 0xf8, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x5f, + 0xff, 0x50, 0x2e, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0xe8, 0xff, 0xff, 0xf8, + 0xef, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x9, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0x50, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xfe, + 0x70, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x2, 0xef, 0xbb, 0xfc, 0xbf, 0xdb, + 0xbf, 0xf9, 0x2, 0xef, 0xd0, 0x2f, 0x40, 0xe7, + 0x1, 0xff, 0xa2, 0xef, 0xfd, 0x2, 0xf4, 0xe, + 0x70, 0x1f, 0xfa, 0xef, 0xff, 0xd0, 0x2f, 0x40, + 0xe7, 0x1, 0xff, 0xaf, 0xff, 0xfd, 0x24, 0xf6, + 0x2e, 0x82, 0x3f, 0xfa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x9, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2c, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0x10, 0x0, 0x3, 0xed, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xf1, 0x0, 0x4, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0x10, 0x5, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xf1, 0x6, 0xff, 0xff, + 0xf6, 0x66, 0x66, 0x66, 0x66, 0x66, 0x9f, 0xff, + 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd0, 0x2, 0xef, 0xff, 0xf1, 0x11, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x0, 0x2, + 0xdf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xb8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0 }; @@ -2402,152 +2759,159 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { *--------------------*/ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_h = 0, .box_w = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 87, .box_h = 0, .box_w = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 93, .box_h = 16, .box_w = 3, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 24, .adv_w = 126, .box_h = 6, .box_w = 6, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 42, .adv_w = 219, .box_h = 16, .box_w = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 146, .adv_w = 205, .box_h = 22, .box_w = 11, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 267, .adv_w = 257, .box_h = 17, .box_w = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 395, .adv_w = 219, .box_h = 17, .box_w = 14, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 514, .adv_w = 76, .box_h = 6, .box_w = 3, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 523, .adv_w = 117, .box_h = 23, .box_w = 7, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 604, .adv_w = 118, .box_h = 23, .box_w = 6, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 673, .adv_w = 152, .box_h = 8, .box_w = 8, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 705, .adv_w = 200, .box_h = 12, .box_w = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 777, .adv_w = 78, .box_h = 6, .box_w = 3, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 786, .adv_w = 159, .box_h = 3, .box_w = 8, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 798, .adv_w = 94, .box_h = 3, .box_w = 3, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 803, .adv_w = 146, .box_h = 18, .box_w = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 884, .adv_w = 198, .box_h = 17, .box_w = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 978, .adv_w = 198, .box_h = 16, .box_w = 6, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1026, .adv_w = 198, .box_h = 16, .box_w = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1114, .adv_w = 198, .box_h = 17, .box_w = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1208, .adv_w = 198, .box_h = 16, .box_w = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1304, .adv_w = 198, .box_h = 17, .box_w = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1398, .adv_w = 198, .box_h = 17, .box_w = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1492, .adv_w = 198, .box_h = 16, .box_w = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1580, .adv_w = 198, .box_h = 17, .box_w = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1674, .adv_w = 198, .box_h = 17, .box_w = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1759, .adv_w = 89, .box_h = 12, .box_w = 3, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1777, .adv_w = 90, .box_h = 15, .box_w = 4, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1807, .adv_w = 179, .box_h = 10, .box_w = 10, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 1857, .adv_w = 198, .box_h = 7, .box_w = 10, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 1892, .adv_w = 184, .box_h = 10, .box_w = 10, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 1942, .adv_w = 167, .box_h = 16, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2022, .adv_w = 315, .box_h = 21, .box_w = 18, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 2211, .adv_w = 223, .box_h = 16, .box_w = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2323, .adv_w = 223, .box_h = 16, .box_w = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2419, .adv_w = 223, .box_h = 17, .box_w = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2521, .adv_w = 238, .box_h = 16, .box_w = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2625, .adv_w = 193, .box_h = 16, .box_w = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2713, .adv_w = 193, .box_h = 16, .box_w = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2801, .adv_w = 238, .box_h = 17, .box_w = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2903, .adv_w = 247, .box_h = 16, .box_w = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3007, .adv_w = 99, .box_h = 16, .box_w = 3, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3031, .adv_w = 193, .box_h = 17, .box_w = 11, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3125, .adv_w = 223, .box_h = 16, .box_w = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3229, .adv_w = 193, .box_h = 16, .box_w = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3317, .adv_w = 303, .box_h = 16, .box_w = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3453, .adv_w = 247, .box_h = 16, .box_w = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3557, .adv_w = 240, .box_h = 17, .box_w = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3668, .adv_w = 223, .box_h = 16, .box_w = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3764, .adv_w = 245, .box_h = 18, .box_w = 14, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 3890, .adv_w = 223, .box_h = 16, .box_w = 13, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 3994, .adv_w = 215, .box_h = 17, .box_w = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4096, .adv_w = 211, .box_h = 16, .box_w = 13, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4200, .adv_w = 238, .box_h = 17, .box_w = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4311, .adv_w = 223, .box_h = 16, .box_w = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4423, .adv_w = 303, .box_h = 16, .box_w = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4575, .adv_w = 223, .box_h = 16, .box_w = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4687, .adv_w = 223, .box_h = 16, .box_w = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 4799, .adv_w = 211, .box_h = 16, .box_w = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 4895, .adv_w = 95, .box_h = 22, .box_w = 5, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 4950, .adv_w = 145, .box_h = 18, .box_w = 9, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5031, .adv_w = 95, .box_h = 22, .box_w = 5, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 5086, .adv_w = 147, .box_h = 9, .box_w = 9, .ofs_x = 0, .ofs_y = 7}, - {.bitmap_index = 5127, .adv_w = 160, .box_h = 2, .box_w = 10, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 5137, .adv_w = 110, .box_h = 4, .box_w = 5, .ofs_x = 1, .ofs_y = 13}, - {.bitmap_index = 5147, .adv_w = 194, .box_h = 13, .box_w = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5212, .adv_w = 200, .box_h = 18, .box_w = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5311, .adv_w = 184, .box_h = 13, .box_w = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5376, .adv_w = 200, .box_h = 18, .box_w = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5466, .adv_w = 184, .box_h = 13, .box_w = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5531, .adv_w = 107, .box_h = 17, .box_w = 8, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 5599, .adv_w = 200, .box_h = 17, .box_w = 10, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 5684, .adv_w = 200, .box_h = 17, .box_w = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5769, .adv_w = 89, .box_h = 17, .box_w = 3, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5795, .adv_w = 91, .box_h = 22, .box_w = 5, .ofs_x = -1, .ofs_y = -5}, - {.bitmap_index = 5850, .adv_w = 180, .box_h = 17, .box_w = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5935, .adv_w = 89, .box_h = 17, .box_w = 3, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 5961, .adv_w = 308, .box_h = 12, .box_w = 17, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6063, .adv_w = 200, .box_h = 12, .box_w = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6123, .adv_w = 200, .box_h = 13, .box_w = 11, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6195, .adv_w = 200, .box_h = 17, .box_w = 11, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 6289, .adv_w = 200, .box_h = 17, .box_w = 10, .ofs_x = 1, .ofs_y = -5}, - {.bitmap_index = 6374, .adv_w = 123, .box_h = 12, .box_w = 7, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6416, .adv_w = 184, .box_h = 13, .box_w = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6481, .adv_w = 112, .box_h = 16, .box_w = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 6537, .adv_w = 200, .box_h = 13, .box_w = 10, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6602, .adv_w = 177, .box_h = 12, .box_w = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6668, .adv_w = 266, .box_h = 12, .box_w = 16, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6764, .adv_w = 177, .box_h = 12, .box_w = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6830, .adv_w = 177, .box_h = 17, .box_w = 11, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 6924, .adv_w = 177, .box_h = 12, .box_w = 10, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 6984, .adv_w = 120, .box_h = 21, .box_w = 8, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 7068, .adv_w = 87, .box_h = 19, .box_w = 3, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 7097, .adv_w = 120, .box_h = 21, .box_w = 7, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 7171, .adv_w = 239, .box_h = 5, .box_w = 13, .ofs_x = 1, .ofs_y = 4}, - {.bitmap_index = 7204, .adv_w = 302, .box_h = 22, .box_w = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 7413, .adv_w = 377, .box_h = 22, .box_w = 24, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 7677, .adv_w = 352, .box_h = 18, .box_w = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7875, .adv_w = 352, .box_h = 15, .box_w = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 8025, .adv_w = 277, .box_h = 16, .box_w = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8145, .adv_w = 302, .box_h = 21, .box_w = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8345, .adv_w = 302, .box_h = 20, .box_w = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8535, .adv_w = 277, .box_h = 20, .box_w = 18, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 8715, .adv_w = 327, .box_h = 16, .box_w = 20, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8875, .adv_w = 327, .box_h = 19, .box_w = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9075, .adv_w = 302, .box_h = 16, .box_w = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9227, .adv_w = 302, .box_h = 20, .box_w = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 9417, .adv_w = 151, .box_h = 16, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9497, .adv_w = 226, .box_h = 16, .box_w = 15, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 9617, .adv_w = 327, .box_h = 18, .box_w = 21, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 9806, .adv_w = 377, .box_h = 20, .box_w = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10046, .adv_w = 302, .box_h = 19, .box_w = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10227, .adv_w = 201, .box_h = 20, .box_w = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10357, .adv_w = 277, .box_h = 20, .box_w = 18, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10537, .adv_w = 302, .box_h = 20, .box_w = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10727, .adv_w = 302, .box_h = 20, .box_w = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 10917, .adv_w = 201, .box_h = 20, .box_w = 13, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11047, .adv_w = 302, .box_h = 16, .box_w = 19, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11199, .adv_w = 251, .box_h = 21, .box_w = 13, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 11336, .adv_w = 251, .box_h = 21, .box_w = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 11473, .adv_w = 277, .box_h = 18, .box_w = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 11635, .adv_w = 277, .box_h = 5, .box_w = 18, .ofs_x = 0, .ofs_y = 6}, - {.bitmap_index = 11680, .adv_w = 352, .box_h = 21, .box_w = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 11911, .adv_w = 352, .box_h = 21, .box_w = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12142, .adv_w = 352, .box_h = 13, .box_w = 20, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 12272, .adv_w = 352, .box_h = 14, .box_w = 20, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 12412, .adv_w = 377, .box_h = 15, .box_w = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12592, .adv_w = 327, .box_h = 18, .box_w = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12781, .adv_w = 327, .box_h = 20, .box_w = 21, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12991, .adv_w = 277, .box_h = 18, .box_w = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13153, .adv_w = 352, .box_h = 18, .box_w = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13351, .adv_w = 352, .box_h = 23, .box_w = 22, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 13604, .adv_w = 302, .box_h = 20, .box_w = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13794, .adv_w = 176, .box_h = 21, .box_w = 11, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 13910, .adv_w = 352, .box_h = 22, .box_w = 22, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 14152, .adv_w = 377, .box_h = 15, .box_w = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14332, .adv_w = 277, .box_h = 18, .box_w = 18, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14494, .adv_w = 302, .box_h = 23, .box_w = 19, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 14713, .adv_w = 402, .box_h = 18, .box_w = 25, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14938, .adv_w = 453, .box_h = 16, .box_w = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15170, .adv_w = 453, .box_h = 16, .box_w = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15402, .adv_w = 453, .box_h = 16, .box_w = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15634, .adv_w = 453, .box_h = 16, .box_w = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 15866, .adv_w = 453, .box_h = 16, .box_w = 29, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 16098, .adv_w = 302, .box_h = 23, .box_w = 17, .ofs_x = 1, .ofs_y = -4} + {.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 = 87, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 91, .box_w = 4, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 32, .adv_w = 113, .box_w = 5, .box_h = 6, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 47, .adv_w = 219, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 151, .adv_w = 198, .box_w = 11, .box_h = 21, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 267, .adv_w = 258, .box_w = 15, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 387, .adv_w = 219, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 491, .adv_w = 61, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 497, .adv_w = 120, .box_w = 7, .box_h = 24, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 581, .adv_w = 122, .box_w = 7, .box_h = 24, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 665, .adv_w = 152, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 715, .adv_w = 200, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 787, .adv_w = 69, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 799, .adv_w = 97, .box_w = 6, .box_h = 2, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 805, .adv_w = 93, .box_w = 4, .box_h = 3, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 811, .adv_w = 145, .box_w = 9, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 888, .adv_w = 198, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 976, .adv_w = 198, .box_w = 7, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1032, .adv_w = 198, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1120, .adv_w = 198, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1200, .adv_w = 198, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1296, .adv_w = 198, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1384, .adv_w = 197, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1472, .adv_w = 198, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1568, .adv_w = 198, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1656, .adv_w = 198, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1736, .adv_w = 85, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1754, .adv_w = 74, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1784, .adv_w = 179, .box_w = 10, .box_h = 10, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1834, .adv_w = 193, .box_w = 10, .box_h = 6, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 1864, .adv_w = 184, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1914, .adv_w = 166, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1994, .adv_w = 316, .box_w = 18, .box_h = 21, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 2183, .adv_w = 230, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2303, .adv_w = 219, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2399, .adv_w = 229, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2503, .adv_w = 231, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2607, .adv_w = 200, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2695, .adv_w = 195, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2783, .adv_w = 240, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2887, .adv_w = 251, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2991, .adv_w = 96, .box_w = 4, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3023, .adv_w = 194, .box_w = 11, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3111, .adv_w = 221, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3215, .adv_w = 189, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3303, .adv_w = 307, .box_w = 17, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3439, .adv_w = 251, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3543, .adv_w = 242, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3647, .adv_w = 222, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3751, .adv_w = 242, .box_w = 13, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3875, .adv_w = 217, .box_w = 13, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3979, .adv_w = 209, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4083, .adv_w = 210, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4187, .adv_w = 228, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4283, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4395, .adv_w = 312, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4555, .adv_w = 221, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4667, .adv_w = 211, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4779, .adv_w = 211, .box_w = 13, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4883, .adv_w = 93, .box_w = 5, .box_h = 22, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4938, .adv_w = 144, .box_w = 9, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5015, .adv_w = 93, .box_w = 5, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 5070, .adv_w = 147, .box_w = 9, .box_h = 8, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 5106, .adv_w = 159, .box_w = 10, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5116, .adv_w = 109, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 14}, + {.bitmap_index = 5125, .adv_w = 191, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5185, .adv_w = 197, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5273, .adv_w = 184, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5339, .adv_w = 199, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5419, .adv_w = 186, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5479, .adv_w = 122, .box_w = 8, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5547, .adv_w = 197, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 5632, .adv_w = 194, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5712, .adv_w = 85, .box_w = 3, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5736, .adv_w = 84, .box_w = 5, .box_h = 21, .ofs_x = -1, .ofs_y = -5}, + {.bitmap_index = 5789, .adv_w = 178, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5877, .adv_w = 85, .box_w = 3, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5901, .adv_w = 309, .box_w = 17, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6003, .adv_w = 194, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6063, .adv_w = 201, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6135, .adv_w = 197, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6229, .adv_w = 200, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = -5}, + {.bitmap_index = 6314, .adv_w = 119, .box_w = 7, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6356, .adv_w = 182, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6416, .adv_w = 115, .box_w = 7, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6469, .adv_w = 194, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6529, .adv_w = 171, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6595, .adv_w = 265, .box_w = 17, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6697, .adv_w = 174, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6763, .adv_w = 167, .box_w = 11, .box_h = 17, .ofs_x = 0, .ofs_y = -5}, + {.bitmap_index = 6857, .adv_w = 174, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6923, .adv_w = 119, .box_w = 8, .box_h = 22, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 7011, .adv_w = 86, .box_w = 3, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 7040, .adv_w = 119, .box_w = 7, .box_h = 22, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 7117, .adv_w = 239, .box_w = 13, .box_h = 4, .ofs_x = 1, .ofs_y = 4}, + {.bitmap_index = 7143, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 7408, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7595, .adv_w = 352, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7815, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8002, .adv_w = 242, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8130, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8383, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 8636, .adv_w = 396, .box_w = 25, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8886, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9139, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9352, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 9605, .adv_w = 176, .box_w = 11, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9704, .adv_w = 264, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9857, .adv_w = 396, .box_w = 25, .box_h = 22, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 10132, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10319, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 10477, .adv_w = 308, .box_w = 20, .box_h = 24, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 10717, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10917, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11117, .adv_w = 308, .box_w = 15, .box_h = 21, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 11275, .adv_w = 308, .box_w = 21, .box_h = 20, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 11485, .adv_w = 220, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11605, .adv_w = 220, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 11725, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11925, .adv_w = 308, .box_w = 20, .box_h = 5, .ofs_x = 0, .ofs_y = 6}, + {.bitmap_index = 11975, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12188, .adv_w = 440, .box_w = 28, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 12510, .adv_w = 396, .box_w = 27, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 12821, .adv_w = 352, .box_w = 22, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13052, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 13166, .adv_w = 308, .box_w = 19, .box_h = 12, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 13280, .adv_w = 440, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 13532, .adv_w = 352, .box_w = 22, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 13719, .adv_w = 352, .box_w = 22, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 13972, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 14237, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14437, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 14667, .adv_w = 308, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 14867, .adv_w = 220, .box_w = 15, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 15040, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15270, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15500, .adv_w = 396, .box_w = 25, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 15713, .adv_w = 352, .box_w = 24, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 15989, .adv_w = 264, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 16185, .adv_w = 440, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 16479, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 16689, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 16899, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 17109, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 17319, .adv_w = 440, .box_w = 28, .box_h = 15, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 17529, .adv_w = 440, .box_w = 28, .box_h = 18, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 17781, .adv_w = 308, .box_w = 17, .box_h = 23, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 17977, .adv_w = 308, .box_w = 20, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 18207, .adv_w = 352, .box_w = 23, .box_h = 23, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 18472, .adv_w = 440, .box_w = 28, .box_h = 17, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 18710, .adv_w = 264, .box_w = 17, .box_h = 23, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 18906, .adv_w = 354, .box_w = 23, .box_h = 14, .ofs_x = 0, .ofs_y = 1} }; /*--------------------- @@ -2555,25 +2919,26 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { *--------------------*/ static const uint16_t unicode_list_1[] = { - 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x13, - 0x14, 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, - 0x3f, 0x47, 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, - 0x53, 0x66, 0x67, 0x70, 0x73, 0x76, 0x77, 0x78, - 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xe6, 0xf2, - 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, 0x240, 0x241, 0x242, - 0x243, 0x292 + 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x14, + 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, 0x47, + 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, 0x53, 0x66, + 0x67, 0x6d, 0x6f, 0x70, 0x73, 0x76, 0x77, 0x78, + 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xe6, 0xe9, + 0xf2, 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, 0x240, 0x241, + 0x242, 0x243, 0x286, 0x292, 0x2ec, 0x303, 0x559, 0x7c1, + 0x8a1 }; /*Collect the unicode lists and glyph_id offsets*/ static const lv_font_fmt_txt_cmap_t cmaps[] = { { - .range_start = 32, .range_length = 95, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY, - .glyph_id_start = 1, .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0 + .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 = 61441, .range_length = 659, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY, - .glyph_id_start = 96, .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 50 + .range_start = 61441, .range_length = 2210, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 57, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; @@ -2582,569 +2947,245 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = *----------------*/ -/*Pair left and right glyphs for kerning*/ -static const uint8_t kern_pair_glyph_ids[] = +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { - 9, 43, - 9, 55, - 9, 56, - 9, 58, - 17, 17, - 17, 18, - 17, 20, - 17, 21, - 17, 22, - 17, 23, - 17, 24, - 17, 26, - 18, 19, - 18, 20, - 18, 22, - 18, 24, - 19, 17, - 19, 18, - 19, 19, - 19, 22, - 19, 23, - 19, 24, - 19, 25, - 19, 26, - 20, 18, - 20, 19, - 20, 20, - 20, 21, - 20, 22, - 20, 23, - 20, 24, - 20, 25, - 20, 26, - 21, 17, - 21, 19, - 21, 21, - 21, 22, - 21, 23, - 21, 24, - 21, 25, - 22, 18, - 22, 19, - 22, 20, - 22, 21, - 22, 22, - 22, 23, - 22, 24, - 22, 25, - 22, 26, - 23, 17, - 23, 18, - 23, 19, - 23, 21, - 23, 22, - 23, 23, - 23, 24, - 23, 25, - 24, 18, - 24, 21, - 24, 22, - 24, 23, - 24, 24, - 24, 25, - 24, 26, - 25, 17, - 25, 18, - 25, 20, - 25, 21, - 25, 22, - 25, 23, - 26, 17, - 26, 18, - 26, 19, - 26, 21, - 26, 22, - 26, 23, - 26, 24, - 26, 26, - 34, 36, - 34, 40, - 34, 48, - 34, 50, - 34, 53, - 34, 54, - 34, 55, - 34, 56, - 34, 58, - 34, 66, - 34, 68, - 34, 69, - 34, 70, - 34, 72, - 34, 80, - 34, 82, - 34, 84, - 34, 85, - 34, 86, - 34, 87, - 34, 88, - 34, 91, - 35, 58, - 35, 66, - 35, 74, - 35, 77, - 35, 80, - 35, 83, - 35, 86, - 35, 90, - 36, 36, - 36, 40, - 36, 48, - 36, 50, - 36, 74, - 36, 83, - 36, 86, - 36, 90, - 36, 91, - 37, 55, - 37, 56, - 37, 66, - 37, 70, - 37, 80, - 37, 86, - 38, 55, - 38, 56, - 38, 58, - 38, 67, - 38, 68, - 38, 69, - 38, 70, - 38, 71, - 38, 72, - 38, 74, - 38, 75, - 38, 76, - 38, 77, - 38, 78, - 38, 79, - 38, 80, - 38, 81, - 38, 82, - 38, 83, - 38, 85, - 38, 86, - 38, 87, - 38, 88, - 38, 89, - 38, 90, - 38, 91, - 39, 13, - 39, 15, - 39, 34, - 39, 66, - 39, 70, - 39, 74, - 39, 77, - 39, 80, - 39, 83, - 39, 86, - 39, 90, - 40, 66, - 40, 70, - 40, 79, - 40, 80, - 40, 83, - 40, 86, - 40, 90, - 41, 66, - 41, 70, - 41, 80, - 41, 86, - 41, 90, - 42, 66, - 42, 68, - 42, 69, - 42, 71, - 42, 72, - 42, 78, - 42, 79, - 42, 80, - 42, 81, - 42, 83, - 42, 84, - 42, 85, - 42, 86, - 42, 87, - 42, 88, - 42, 90, - 43, 66, - 43, 80, - 44, 36, - 44, 40, - 44, 48, - 44, 50, - 44, 66, - 44, 70, - 44, 74, - 44, 80, - 44, 83, - 44, 86, - 44, 88, - 44, 90, - 45, 34, - 45, 36, - 45, 40, - 45, 48, - 45, 50, - 45, 53, - 45, 54, - 45, 55, - 45, 56, - 45, 58, - 45, 75, - 45, 86, - 45, 88, - 45, 90, - 46, 66, - 46, 70, - 46, 75, - 46, 79, - 46, 80, - 46, 86, - 46, 90, - 47, 70, - 47, 80, - 47, 90, - 48, 34, - 48, 53, - 48, 55, - 48, 56, - 48, 57, - 48, 58, - 48, 68, - 48, 69, - 48, 70, - 48, 71, - 48, 72, - 48, 75, - 48, 80, - 48, 81, - 48, 82, - 48, 84, - 48, 85, - 48, 86, - 48, 89, - 48, 90, - 48, 91, - 49, 13, - 49, 15, - 49, 34, - 49, 38, - 49, 41, - 49, 42, - 49, 66, - 49, 70, - 49, 73, - 49, 74, - 49, 77, - 49, 79, - 49, 80, - 49, 83, - 49, 84, - 49, 85, - 49, 90, - 50, 34, - 50, 53, - 50, 54, - 50, 55, - 50, 56, - 50, 57, - 50, 58, - 50, 66, - 50, 86, - 51, 36, - 51, 40, - 51, 48, - 51, 50, - 51, 53, - 51, 54, - 51, 55, - 51, 56, - 51, 58, - 51, 66, - 51, 70, - 51, 80, - 51, 86, - 51, 90, - 52, 66, - 52, 70, - 52, 75, - 52, 78, - 52, 79, - 52, 80, - 52, 81, - 52, 82, - 52, 86, - 52, 88, - 52, 90, - 53, 13, - 53, 14, - 53, 15, - 53, 27, - 53, 28, - 53, 34, - 53, 36, - 53, 40, - 53, 48, - 53, 50, - 53, 52, - 53, 53, - 53, 55, - 53, 56, - 53, 57, - 53, 58, - 53, 66, - 53, 70, - 53, 74, - 53, 78, - 53, 80, - 53, 83, - 53, 84, - 53, 86, - 53, 88, - 53, 90, - 53, 91, - 54, 34, - 54, 69, - 54, 71, - 54, 72, - 54, 78, - 54, 79, - 54, 81, - 54, 83, - 54, 84, - 54, 85, - 54, 89, - 54, 91, - 55, 10, - 55, 13, - 55, 14, - 55, 15, - 55, 27, - 55, 28, - 55, 34, - 55, 36, - 55, 40, - 55, 48, - 55, 50, - 55, 62, - 55, 66, - 55, 70, - 55, 80, - 55, 83, - 55, 86, - 55, 90, - 55, 94, - 56, 10, - 56, 13, - 56, 14, - 56, 15, - 56, 27, - 56, 28, - 56, 34, - 56, 36, - 56, 40, - 56, 48, - 56, 50, - 56, 53, - 56, 62, - 56, 66, - 56, 70, - 56, 80, - 56, 83, - 56, 86, - 56, 90, - 56, 94, - 57, 36, - 57, 40, - 57, 48, - 57, 50, - 57, 70, - 57, 86, - 57, 90, - 58, 10, - 58, 13, - 58, 14, - 58, 15, - 58, 27, - 58, 28, - 58, 34, - 58, 36, - 58, 40, - 58, 48, - 58, 50, - 58, 53, - 58, 55, - 58, 56, - 58, 57, - 58, 58, - 58, 62, - 58, 66, - 58, 70, - 58, 80, - 58, 82, - 58, 85, - 58, 86, - 58, 87, - 58, 94, - 59, 34, - 59, 36, - 59, 40, - 59, 48, - 59, 50, - 59, 66, - 59, 70, - 59, 74, - 59, 80, - 59, 86, - 59, 88, - 59, 90, - 60, 43, - 67, 87, - 67, 88, - 67, 90, - 70, 90, - 71, 3, - 71, 8, - 71, 10, - 71, 62, - 71, 72, - 71, 94, - 76, 70, - 80, 87, - 80, 88, - 80, 89, - 80, 90, - 81, 88, - 83, 13, - 83, 15, - 83, 68, - 83, 69, - 83, 70, - 83, 71, - 83, 76, - 83, 80, - 83, 82, - 83, 85, - 83, 86, - 83, 87, - 83, 88, - 83, 89, - 83, 90, - 83, 91, - 87, 13, - 87, 15, - 87, 66, - 87, 68, - 87, 69, - 87, 70, - 87, 80, - 87, 82, - 88, 13, - 88, 15, - 88, 68, - 88, 69, - 88, 70, - 88, 82, - 89, 68, - 89, 69, - 89, 70, - 89, 80, - 89, 82, - 90, 13, - 90, 15, - 90, 68, - 90, 69, - 90, 70, - 90, 80, - 90, 82, - 91, 68, - 91, 69, - 91, 70, - 91, 80, - 92, 43 + 0, 1, 0, 2, 0, 0, 0, 0, + 2, 3, 0, 0, 0, 4, 0, 4, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 7, 8, 9, 10, 11, + 0, 12, 12, 13, 14, 15, 12, 12, + 9, 16, 17, 18, 0, 19, 13, 20, + 21, 22, 23, 24, 25, 0, 0, 0, + 0, 0, 26, 27, 28, 0, 29, 30, + 0, 31, 0, 0, 32, 0, 31, 31, + 33, 27, 0, 34, 0, 35, 0, 36, + 37, 38, 36, 39, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; -/* Kerning between the respective left and right glyphs - * 4.4 format which needs to scaled with `kern_scale`*/ -static const int8_t kern_pair_values[] = +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { - -16, 7, 6, 8, 1, -6, -1, 1, - -1, 1, -7, 1, -1, -1, -1, 0, - -3, -3, 1, -2, -3, -4, -3, 0, - -3, -1, 1, 3, 1, -1, -5, 1, - 0, 1, -5, 6, 3, 1, -14, 3, - -1, -4, 1, 3, 1, 0, -1, 1, - -5, 0, -7, -4, 4, 2, 0, -7, - 2, 6, -28, -5, -7, 7, -4, -1, - 0, -4, 2, 3, 1, 0, 1, -7, - -2, 1, -1, 1, -8, 1, -7, -7, - -7, -7, -26, -8, -25, -17, -28, 1, - -3, -5, -4, -3, -4, -3, 1, -11, - -4, -14, -12, 4, -28, 2, -1, -1, - 1, 0, 1, 1, -1, -1, -2, -1, - -2, -1, -1, 2, -2, -7, -4, -1, - 1, 1, 1, 3, 3, 3, -2, -7, - -7, -7, -6, -6, -2, -1, -1, -2, - -3, -3, -7, -2, -6, -3, -8, -6, - -9, -8, 1, -8, 1, -53, -53, -21, - -12, -8, -1, -2, -8, -9, -8, -9, - 0, 1, 0, 0, 0, 0, 0, -1, - -2, -2, -2, -1, -1, -1, -3, -2, - -1, -1, -1, -2, -1, -1, -1, -2, - -1, -1, -1, -1, -2, -2, -10, -10, - -11, -10, -2, -9, -2, -9, -1, -8, - -14, -14, 7, -7, -8, -9, -8, -27, - -9, -32, -19, -30, 0, -5, -15, -19, - -1, -2, -1, -1, -2, -1, -1, -2, - -2, -1, -7, -9, -8, -4, -8, -10, - 0, -1, 0, 0, 0, -2, 0, 0, - 1, 0, 1, 0, -2, 1, -3, -58, - -58, -19, -1, -1, -1, -4, -4, 0, - -1, -1, -1, -4, -1, -2, 5, 5, - 5, -12, -2, -10, -7, 4, -12, 0, - -1, -2, -2, -2, -2, -7, -2, -7, - -5, -17, -1, -3, -3, -1, 0, 0, - -1, -2, -1, -1, -1, 0, 0, 0, - 1, 1, -28, -27, -28, -26, -27, -28, - -9, -10, -10, -9, -6, 6, 6, 5, - 4, 6, -27, -28, -1, -23, -28, -23, - -27, -23, -17, -17, -21, -8, -3, -1, - -1, -1, -1, -1, -1, -2, 0, -3, - -3, 7, -31, -13, -30, -11, -11, -26, - -7, -7, -8, -7, 6, -16, -16, -16, - -11, -10, -4, 7, 5, -20, -7, -20, - -8, -8, -19, -5, -5, -5, -5, 5, - 4, -12, -11, -11, -7, -7, -2, 5, - -8, -8, -9, -8, -9, -8, -11, 7, - -32, -18, -32, -15, -15, -29, -9, -10, - -10, -10, 6, 6, 6, 5, 6, 6, - -22, -23, -23, -21, -8, -14, -7, 7, - 5, -8, -9, -9, -9, 0, -7, -2, - -8, -7, -10, -9, -6, -4, -3, -4, - -4, 5, 6, 7, 6, -8, 7, -7, - -5, -3, -7, -5, -3, -22, -22, -7, - -6, -7, 5, 0, -7, -6, 6, 0, - 6, 6, 3, 6, 2, -21, -20, -5, - -5, -5, -5, -5, -5, -16, -15, -3, - -3, -4, -3, -7, -6, -7, -7, -6, - -24, -22, -6, -6, -6, -6, -7, -6, - -5, -6, -6, -7 + 0, 1, 0, 2, 0, 0, 0, 3, + 2, 0, 4, 5, 0, 6, 7, 6, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 10, 0, 11, 0, 0, 0, + 11, 0, 0, 12, 0, 0, 0, 0, + 11, 0, 11, 0, 13, 14, 15, 16, + 17, 18, 19, 20, 0, 0, 21, 0, + 0, 0, 22, 0, 23, 23, 23, 24, + 23, 0, 0, 0, 0, 0, 25, 25, + 26, 25, 23, 27, 28, 29, 30, 31, + 32, 33, 31, 34, 0, 0, 35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; -/*Collect the kern pair's data in one place*/ -static const lv_font_fmt_txt_kern_pair_t kern_pairs = +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { - .glyph_ids = kern_pair_glyph_ids, - .values = kern_pair_values, - .pair_cnt = 484, - .glyph_ids_size = 0 + 0, 0, 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, 0, 0, 0, + 0, 0, 0, 0, -18, 0, 0, 0, + 0, 0, 0, 0, -21, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, -10, 0, -3, -10, 0, -14, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 3, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -38, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -21, 0, 0, 0, 0, 0, 0, -10, + 0, -2, 0, 0, -22, -3, -15, -12, + 0, -16, 0, 0, 0, 0, 0, 0, + -2, 0, 0, -3, -2, -9, -6, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -5, + 0, -4, 0, 0, -9, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -5, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, -18, 0, 0, + 0, -4, 0, 0, 0, -5, 0, -4, + 0, -4, -7, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, -3, -3, 0, -3, 0, 0, 0, + -3, -4, -4, 0, 0, 0, 0, 0, + 0, 0, 0, -40, 0, 0, 0, -29, + 0, -45, 0, 3, 0, 0, 0, 0, + 0, 0, 0, -6, -4, 0, 0, -4, + -4, 0, 0, -4, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, -5, 0, + 0, 0, 3, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -11, 0, 0, + 0, -5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, -4, + -5, 0, 0, 0, -4, -7, -11, 0, + 0, 0, 0, -58, 0, 0, 0, 0, + 0, 0, 0, 3, -11, 0, 0, -47, + -9, -30, -25, 0, -41, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -8, + -23, -16, 0, 0, 0, 0, 0, 0, + 0, 0, -56, 0, 0, 0, -24, 0, + -34, 0, 0, 0, 0, 0, -5, 0, + -4, 0, -2, -2, 0, 0, -2, 0, + 0, 2, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -7, 0, -5, + -3, 0, -6, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -14, 0, -3, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -7, 0, + 0, 0, 0, -37, -40, 0, 0, -14, + -5, -41, -3, 3, 0, 3, 3, 0, + 3, 0, 0, -19, -17, 0, -19, -17, + -13, -20, 0, -16, -12, -10, -13, -10, + 0, 0, 0, 0, 3, 0, -39, -6, + 0, 0, -13, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 3, -8, -8, + 0, 0, -8, -5, 0, 0, -5, -2, + 0, 0, 0, 3, 0, 0, 0, 3, + 0, -21, -10, 0, 0, -7, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 2, -6, -5, 0, 0, -5, -4, 0, + 0, -3, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, -8, 0, 0, + 0, -4, 0, 0, 0, 0, 2, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + -4, 0, 0, 0, -4, -5, 0, 0, + 0, 0, 0, 0, -5, 3, -8, -36, + -9, 0, 0, -16, -5, -16, -3, 3, + -16, 3, 3, 2, 3, 0, 3, -13, + -11, -4, -7, -11, -7, -10, -4, -7, + -3, 0, -4, -5, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, 0, 0, -4, 0, + 0, 0, -3, -5, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 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, 0, + 0, -3, 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, 0, 0, + 0, 0, 0, 0, -2, 0, -3, -3, + 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, -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, -2, 0, 0, 0, 0, 0, + 3, 0, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, -18, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -23, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + -4, -3, 0, 0, 3, 0, 0, 0, + -21, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -7, -3, 3, 0, -3, 0, 0, 9, + 0, 3, 3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, -18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -2, + 2, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -21, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + -3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, -3, 0, 0, 0, 0, + 0, 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 = 40, + .right_class_cnt = 35, }; /*-------------------- @@ -3156,12 +3197,12 @@ 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_scale = 16, - .kern_dsc = &kern_pairs, - .kern_classes = 0 + .kern_classes = 1, + .bitmap_format = 0 }; @@ -3171,11 +3212,13 @@ static lv_font_fmt_txt_dsc_t font_dsc = { /*Initialize a public general font descriptor*/ lv_font_t lv_font_roboto_22 = { - .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .line_height = 24, /*The maximum line height required by the font*/ - .base_line = 5, /*Baseline measured from the bottom of the line*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 26, /*The maximum line height required by the font*/ + .base_line = 6, /*Baseline measured from the bottom of the line*/ + .subpx = LV_FONT_SUBPX_NONE, + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; #endif /*#if LV_FONT_ROBOTO_22*/ + diff --git a/src/lv_font/lv_font_roboto_28.c b/src/lv_font/lv_font_roboto_28.c index e1867ef36..f3e58bb33 100644 --- a/src/lv_font/lv_font_roboto_28.c +++ b/src/lv_font/lv_font_roboto_28.c @@ -3,7 +3,7 @@ /******************************************************************************* * Size: 28 px * Bpp: 4 - * Opts: + * Opts: --no-compress --no-prefilter --bpp 4 --size 28 --font Roboto-Regular.woff -r 0x20-0x7F --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 lv_font_roboto_28.c --force-fast-kern-format ******************************************************************************/ #ifndef LV_FONT_ROBOTO_28 @@ -21,2755 +21,2976 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { /* U+20 " " */ /* U+21 "!" */ - 0xcf, 0xfc, 0xff, 0xcf, 0xfc, 0xff, 0xcf, 0xfc, - 0xff, 0xcf, 0xfc, 0xff, 0xcf, 0xfc, 0xff, 0xcf, - 0xfc, 0xff, 0xcf, 0xf6, 0x88, 0x0, 0x0, 0x0, - 0x0, 0x9, 0xbb, 0xcf, 0xfc, 0xff, + 0xbf, 0xe0, 0xbf, 0xe0, 0xbf, 0xe0, 0xaf, 0xe0, + 0xaf, 0xe0, 0xaf, 0xd0, 0xaf, 0xd0, 0x9f, 0xd0, + 0x9f, 0xd0, 0x9f, 0xc0, 0x9f, 0xc0, 0x9f, 0xc0, + 0x8f, 0xc0, 0x8f, 0xc0, 0x13, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x5d, 0x90, 0xcf, 0xf2, 0x6f, 0xb0, /* U+22 "\"" */ - 0x4f, 0xf8, 0xf, 0xfc, 0x4f, 0xf8, 0xf, 0xfc, - 0x4f, 0xf8, 0xf, 0xfc, 0x4f, 0xf8, 0xf, 0xfb, - 0x4f, 0xf2, 0xf, 0xf6, 0x4f, 0xc0, 0xf, 0xf0, - 0x4f, 0x60, 0xf, 0x90, 0x14, 0x0, 0x4, 0x10, + 0x2f, 0xc0, 0x7f, 0x72, 0xfc, 0x7, 0xf7, 0x2f, + 0xb0, 0x7f, 0x62, 0xfa, 0x7, 0xf5, 0x2f, 0x80, + 0x7f, 0x42, 0xf7, 0x7, 0xf2, 0x1b, 0x40, 0x5b, + 0x10, /* U+23 "#" */ - 0x0, 0x0, 0x1, 0xff, 0x0, 0x8, 0xf8, 0x0, - 0x0, 0x0, 0x4, 0xfc, 0x0, 0xc, 0xf5, 0x0, - 0x0, 0x0, 0x8, 0xf9, 0x0, 0xf, 0xf2, 0x0, - 0x0, 0x0, 0xb, 0xf6, 0x0, 0x2f, 0xf0, 0x0, - 0x0, 0x0, 0xe, 0xf3, 0x0, 0x5f, 0xc0, 0x0, - 0x4, 0x33, 0x3f, 0xf3, 0x33, 0x9f, 0xa3, 0x31, - 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xc, 0xcc, 0xef, 0xec, 0xcc, 0xff, 0xcc, 0xc3, - 0x0, 0x0, 0xbf, 0x70, 0x2, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xef, 0x40, 0x4, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x0, 0x8, 0xf9, 0x0, 0x0, - 0x0, 0x4, 0xfd, 0x0, 0xb, 0xf6, 0x0, 0x0, - 0x87, 0x7a, 0xfd, 0x77, 0x7d, 0xf9, 0x77, 0x20, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, - 0x88, 0x8f, 0xfa, 0x88, 0xaf, 0xe8, 0x88, 0x20, - 0x0, 0xf, 0xf0, 0x0, 0x8f, 0x90, 0x0, 0x0, - 0x0, 0x4f, 0xd0, 0x0, 0xbf, 0x70, 0x0, 0x0, - 0x0, 0x7f, 0xa0, 0x0, 0xef, 0x40, 0x0, 0x0, - 0x0, 0xaf, 0x70, 0x1, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0x40, 0x4, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x8f, 0x70, + 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0xb, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0x80, 0x0, 0xef, + 0x10, 0x0, 0x0, 0x0, 0xa, 0xf5, 0x0, 0x1f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x20, 0x4, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xf, 0xe0, 0x0, + 0x7f, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x30, 0xe, 0xee, 0xff, 0xfe, + 0xee, 0xff, 0xee, 0xe3, 0x0, 0x0, 0x9, 0xf5, + 0x0, 0xf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x10, 0x4, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xe0, 0x0, 0x7f, 0x70, 0x0, 0x0, 0x0, 0x4, + 0xfa, 0x0, 0xb, 0xf3, 0x0, 0x0, 0xe, 0xee, + 0xef, 0xfe, 0xee, 0xff, 0xee, 0xe2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xdf, 0x10, 0x4, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xe0, 0x0, 0x7f, 0x70, 0x0, 0x0, + 0x0, 0x3, 0xfb, 0x0, 0xa, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0x80, 0x0, 0xdf, 0x20, 0x0, + 0x0, 0x0, 0x9, 0xf5, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0x20, 0x3, 0xfc, 0x0, + 0x0, 0x0, /* U+24 "$" */ - 0x0, 0x0, 0x0, 0x23, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0x80, 0x0, 0x0, 0x0, 0x1, 0x9d, 0xff, - 0xfc, 0x70, 0x0, 0x0, 0x3d, 0xff, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0xcf, 0xf9, 0x41, 0x5e, 0xff, - 0x80, 0x4, 0xff, 0xb0, 0x0, 0x1, 0xff, 0xe0, - 0x6, 0xff, 0x40, 0x0, 0x0, 0x9f, 0xf3, 0x8, - 0xff, 0x40, 0x0, 0x0, 0x7f, 0xf4, 0x4, 0xff, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xb4, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xd6, - 0x10, 0x0, 0x0, 0x0, 0x29, 0xff, 0xff, 0xe5, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x2c, 0xb6, - 0x0, 0x0, 0x0, 0x4f, 0xf8, 0xf, 0xfa, 0x0, - 0x0, 0x0, 0x4f, 0xf7, 0xf, 0xfe, 0x20, 0x0, - 0x0, 0xbf, 0xf4, 0x6, 0xff, 0xd4, 0x0, 0x39, - 0xff, 0xd0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x5, 0xdf, 0xff, 0xff, 0xa1, 0x0, - 0x0, 0x0, 0x1, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcc, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x30, 0x0, 0x0, 0x0, 0x1, 0x9e, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x1, 0xef, 0xf7, 0x32, 0x6f, + 0xff, 0x20, 0x6, 0xff, 0x50, 0x0, 0x4, 0xff, + 0x90, 0xa, 0xfe, 0x0, 0x0, 0x0, 0xcf, 0xe0, + 0xb, 0xfd, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0x9, + 0xff, 0x10, 0x0, 0x0, 0x25, 0x50, 0x5, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xfd, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xa3, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x5b, + 0xb0, 0x0, 0x0, 0x0, 0x6f, 0xf3, 0x6f, 0xf2, + 0x0, 0x0, 0x0, 0x5f, 0xf3, 0x2f, 0xf8, 0x0, + 0x0, 0x0, 0xaf, 0xf0, 0xc, 0xff, 0x60, 0x0, + 0x8, 0xff, 0xa0, 0x2, 0xff, 0xfe, 0xcd, 0xff, + 0xfe, 0x10, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xa1, + 0x0, 0x0, 0x0, 0x16, 0xff, 0x51, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, /* U+25 "%" */ - 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1a, 0xff, 0xfa, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xfc, 0x8c, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xfc, 0x0, 0xc, - 0xf7, 0x0, 0x0, 0xc5, 0x0, 0x0, 0x8f, 0x80, - 0x0, 0x7f, 0x90, 0x0, 0x7f, 0xa0, 0x0, 0x8, - 0xf8, 0x0, 0x4, 0xfc, 0x0, 0x2e, 0xf1, 0x0, - 0x0, 0x8f, 0x80, 0x0, 0x7f, 0x90, 0xb, 0xf6, - 0x0, 0x0, 0x3, 0xfd, 0x10, 0xc, 0xf6, 0x5, - 0xfc, 0x0, 0x0, 0x0, 0xb, 0xfd, 0xad, 0xfc, - 0x1, 0xdf, 0x20, 0x0, 0x0, 0x0, 0x8, 0xef, - 0xe9, 0x10, 0x9f, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0x1, - 0x9d, 0xeb, 0x40, 0x0, 0x0, 0x0, 0x2, 0xef, - 0x11, 0xef, 0xdc, 0xff, 0x50, 0x0, 0x0, 0x0, - 0xbf, 0x60, 0xaf, 0xa0, 0x4, 0xfe, 0x0, 0x0, - 0x0, 0x5f, 0xc0, 0xd, 0xf3, 0x0, 0xd, 0xf3, - 0x0, 0x0, 0x1d, 0xf2, 0x0, 0xff, 0x0, 0x0, - 0xcf, 0x40, 0x0, 0x9, 0xf8, 0x0, 0xe, 0xf1, - 0x0, 0xc, 0xf4, 0x0, 0x1, 0xfe, 0x0, 0x0, - 0xbf, 0x60, 0x1, 0xef, 0x10, 0x0, 0x1, 0x30, - 0x0, 0x3, 0xff, 0x87, 0xcf, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0x91, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34, 0x0, - 0x0, + 0x0, 0x7d, 0xfd, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xeb, 0xef, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xc0, 0x0, 0xcf, 0x40, + 0x0, 0x9, 0x20, 0x0, 0x8, 0xf6, 0x0, 0x6, + 0xf8, 0x0, 0x7, 0xf8, 0x0, 0x0, 0x9f, 0x50, + 0x0, 0x4f, 0x90, 0x2, 0xfd, 0x0, 0x0, 0x8, + 0xf6, 0x0, 0x5, 0xf8, 0x0, 0xbf, 0x40, 0x0, + 0x0, 0x4f, 0xc0, 0x0, 0xcf, 0x40, 0x6f, 0xa0, + 0x0, 0x0, 0x0, 0xaf, 0xeb, 0xdf, 0xb0, 0x1e, + 0xe1, 0x0, 0x0, 0x0, 0x0, 0x7d, 0xfe, 0x70, + 0xa, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0x60, 0x1a, 0xef, + 0xc4, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xc0, 0x1e, + 0xfc, 0xbf, 0xf6, 0x0, 0x0, 0x0, 0xd, 0xf2, + 0x9, 0xf8, 0x0, 0x2f, 0xf0, 0x0, 0x0, 0x8, + 0xf8, 0x0, 0xdf, 0x10, 0x0, 0xbf, 0x40, 0x0, + 0x2, 0xfd, 0x0, 0xe, 0xf0, 0x0, 0x9, 0xf4, + 0x0, 0x0, 0xcf, 0x30, 0x0, 0xdf, 0x10, 0x0, + 0xbf, 0x40, 0x0, 0x1d, 0x90, 0x0, 0x9, 0xf8, + 0x0, 0x2f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1e, 0xfc, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1a, 0xef, 0xc4, 0x0, /* U+26 "&" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xdf, 0xff, 0xd5, 0x0, 0x0, 0x0, - 0x0, 0x5f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0xff, 0xf3, 0x1, 0xcf, 0xf2, 0x0, 0x0, - 0x4, 0xff, 0x90, 0x0, 0x2f, 0xf6, 0x0, 0x0, - 0x5, 0xff, 0x50, 0x0, 0xf, 0xf7, 0x0, 0x0, - 0x4, 0xff, 0x70, 0x0, 0x6f, 0xf3, 0x0, 0x0, - 0x0, 0xff, 0xd0, 0x6, 0xef, 0xa0, 0x0, 0x0, - 0x0, 0x8f, 0xf9, 0xaf, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x0, 0x19, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xfe, 0x20, 0x0, 0x4, 0x32, - 0x1c, 0xff, 0x76, 0xff, 0xc1, 0x0, 0xf, 0xf4, - 0xaf, 0xf7, 0x0, 0x9f, 0xf9, 0x0, 0x4f, 0xf4, - 0xff, 0xd0, 0x0, 0xb, 0xff, 0x80, 0x7f, 0xf0, - 0xff, 0x90, 0x0, 0x1, 0xdf, 0xf6, 0xef, 0xb0, - 0xff, 0xc0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0x40, - 0xcf, 0xe2, 0x0, 0x0, 0x3, 0xff, 0xf9, 0x0, - 0x4f, 0xfc, 0x40, 0x0, 0x4b, 0xff, 0xfc, 0x10, - 0x7, 0xff, 0xff, 0xbf, 0xff, 0xfd, 0xff, 0x90, - 0x0, 0x4c, 0xff, 0xff, 0xfb, 0x40, 0xcf, 0xf8, - 0x0, 0x0, 0x3, 0x44, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7d, 0xff, 0xc6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf9, 0x22, 0x9f, 0xf5, 0x0, + 0x0, 0x0, 0xd, 0xfc, 0x0, 0x0, 0xcf, 0xa0, + 0x0, 0x0, 0x0, 0xff, 0x90, 0x0, 0xa, 0xfa, + 0x0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0xef, + 0x70, 0x0, 0x0, 0x0, 0x9f, 0xf2, 0x1, 0xcf, + 0xe0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xc5, 0xef, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0x50, 0x0, 0x2, 0x20, 0x0, 0x6f, 0xfb, + 0x2c, 0xff, 0x30, 0x3, 0xff, 0x10, 0x1f, 0xfc, + 0x0, 0x1d, 0xfe, 0x20, 0x5f, 0xf0, 0x7, 0xff, + 0x20, 0x0, 0x2e, 0xfd, 0x19, 0xfd, 0x0, 0x9f, + 0xf0, 0x0, 0x0, 0x4f, 0xfc, 0xff, 0x80, 0x8, + 0xff, 0x10, 0x0, 0x0, 0x5f, 0xff, 0xf1, 0x0, + 0x4f, 0xf9, 0x0, 0x0, 0x0, 0xcf, 0xfa, 0x0, + 0x0, 0xbf, 0xfa, 0x31, 0x15, 0xcf, 0xff, 0xf5, + 0x0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xf8, 0xcf, + 0xf2, 0x0, 0x0, 0x5a, 0xef, 0xfd, 0x82, 0x2, + 0xff, 0xd1, /* U+27 "'" */ - 0x4f, 0xf8, 0x4f, 0xf8, 0x4f, 0xf8, 0x4f, 0xf5, - 0x4f, 0xf0, 0x4f, 0xa0, 0x4f, 0x30, + 0x9f, 0x79, 0xf7, 0x9f, 0x69, 0xf5, 0x9f, 0x49, + 0xf3, 0x48, 0x10, /* U+28 "(" */ - 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, - 0xd0, 0x0, 0x0, 0xa, 0xfd, 0x0, 0x0, 0x8, - 0xfe, 0x10, 0x0, 0x3, 0xff, 0x40, 0x0, 0x0, - 0xdf, 0xa0, 0x0, 0x0, 0x5f, 0xf2, 0x0, 0x0, - 0xb, 0xfb, 0x0, 0x0, 0x2, 0xff, 0x70, 0x0, - 0x0, 0x8f, 0xf2, 0x0, 0x0, 0xc, 0xfe, 0x0, - 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0x0, 0xff, 0x90, 0x0, 0x0, 0x3f, - 0xf8, 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, - 0xf, 0xf9, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, - 0x0, 0xc, 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xd0, - 0x0, 0x0, 0x7, 0xff, 0x20, 0x0, 0x0, 0x2f, - 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xb0, 0x0, 0x0, - 0x5, 0xff, 0x20, 0x0, 0x0, 0xd, 0xfa, 0x0, - 0x0, 0x0, 0x3f, 0xf4, 0x0, 0x0, 0x0, 0x7f, - 0xc1, 0x0, 0x0, 0x0, 0xaf, 0xc1, 0x0, 0x0, - 0x0, 0x8e, 0x0, 0x0, 0x0, 0x0, 0x20, + 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xa, + 0xc0, 0x0, 0x0, 0xb, 0xfb, 0x0, 0x0, 0x9, + 0xfc, 0x0, 0x0, 0x4, 0xff, 0x10, 0x0, 0x0, + 0xdf, 0x70, 0x0, 0x0, 0x6f, 0xe0, 0x0, 0x0, + 0xd, 0xf9, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, + 0x0, 0x7f, 0xf0, 0x0, 0x0, 0xb, 0xfb, 0x0, + 0x0, 0x0, 0xef, 0x90, 0x0, 0x0, 0xf, 0xf7, + 0x0, 0x0, 0x2, 0xff, 0x60, 0x0, 0x0, 0x2f, + 0xf5, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, + 0x2f, 0xf6, 0x0, 0x0, 0x0, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xf9, 0x0, 0x0, 0x0, 0xbf, 0xb0, + 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, 0x2f, + 0xf3, 0x0, 0x0, 0x0, 0xdf, 0x80, 0x0, 0x0, + 0x6, 0xfe, 0x0, 0x0, 0x0, 0xd, 0xf6, 0x0, + 0x0, 0x0, 0x4f, 0xe1, 0x0, 0x0, 0x0, 0x9f, + 0xb0, 0x0, 0x0, 0x0, 0xbf, 0xa0, 0x0, 0x0, + 0x0, 0xad, 0x0, 0x0, 0x0, 0x0, 0x20, /* U+29 ")" */ - 0x20, 0x0, 0x0, 0x0, 0xba, 0x10, 0x0, 0x0, - 0xaf, 0xc1, 0x0, 0x0, 0xb, 0xfa, 0x0, 0x0, - 0x1, 0xff, 0x60, 0x0, 0x0, 0x8f, 0xe2, 0x0, - 0x0, 0x1e, 0xf9, 0x0, 0x0, 0x9, 0xfe, 0x0, - 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, 0xff, 0xb0, - 0x0, 0x0, 0xaf, 0xf0, 0x0, 0x0, 0x8f, 0xf0, - 0x0, 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x6f, 0xf4, - 0x0, 0x0, 0x4f, 0xf6, 0x0, 0x0, 0x4f, 0xf6, - 0x0, 0x0, 0x6f, 0xf4, 0x0, 0x0, 0x8f, 0xf3, - 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0xaf, 0xf0, - 0x0, 0x0, 0xff, 0xb0, 0x0, 0x3, 0xff, 0x50, - 0x0, 0x8, 0xfe, 0x0, 0x0, 0xe, 0xf9, 0x0, - 0x0, 0x6f, 0xf2, 0x0, 0x1, 0xef, 0x60, 0x0, - 0xa, 0xfb, 0x0, 0x0, 0xaf, 0xd1, 0x0, 0x0, - 0xba, 0x10, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x4f, 0x40, 0x0, 0x0, + 0x3e, 0xf5, 0x0, 0x0, 0x3, 0xff, 0x20, 0x0, + 0x0, 0x8f, 0xd0, 0x0, 0x0, 0xe, 0xf7, 0x0, + 0x0, 0x7, 0xfe, 0x0, 0x0, 0x1, 0xff, 0x60, + 0x0, 0x0, 0xbf, 0xb0, 0x0, 0x0, 0x7f, 0xf0, + 0x0, 0x0, 0x3f, 0xf4, 0x0, 0x0, 0xf, 0xf7, + 0x0, 0x0, 0xe, 0xf9, 0x0, 0x0, 0xd, 0xfb, + 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, 0xd, 0xfb, + 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, 0xe, 0xf9, + 0x0, 0x0, 0xf, 0xf7, 0x0, 0x0, 0x3f, 0xf4, + 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0xaf, 0xb0, + 0x0, 0x0, 0xff, 0x60, 0x0, 0x5, 0xfe, 0x0, + 0x0, 0xd, 0xf7, 0x0, 0x0, 0x6f, 0xd0, 0x0, + 0x2, 0xff, 0x30, 0x0, 0x2e, 0xf5, 0x0, 0x0, + 0x4f, 0x50, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, /* U+2A "*" */ - 0x0, 0x0, 0xcb, 0x30, 0x0, 0x0, 0x0, 0xff, - 0x10, 0x0, 0x24, 0x0, 0xff, 0x0, 0x22, 0x7f, - 0xd8, 0xff, 0x5c, 0xf8, 0x8f, 0xff, 0xff, 0xff, - 0xfa, 0x0, 0x3e, 0xff, 0xd6, 0x10, 0x0, 0x6f, - 0xff, 0xf4, 0x0, 0x3, 0xef, 0x79, 0xfe, 0x10, - 0x5, 0xfc, 0x1, 0xef, 0x60, 0x0, 0x32, 0x0, - 0x43, 0x0, + 0x0, 0x0, 0xf, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf0, + 0x0, 0x0, 0x1a, 0x40, 0xe, 0xf0, 0x2, 0x81, + 0x6f, 0xfe, 0x8e, 0xf7, 0xcf, 0xf6, 0x28, 0xdf, + 0xff, 0xff, 0xff, 0xa4, 0x0, 0x2, 0xcf, 0xfc, + 0x40, 0x0, 0x0, 0x4, 0xfe, 0xff, 0x20, 0x0, + 0x0, 0x1e, 0xf5, 0x7f, 0xd0, 0x0, 0x0, 0xbf, + 0xb0, 0xd, 0xf9, 0x0, 0x0, 0xbf, 0x10, 0x3, + 0xfb, 0x0, 0x0, 0x3, 0x0, 0x0, 0x40, 0x0, /* U+2B "+" */ - 0x0, 0x0, 0x4, 0x77, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, - 0x0, 0x0, 0xcb, 0xbb, 0xbd, 0xff, 0xcb, 0xbb, - 0xb9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0xcc, 0xcc, 0xce, 0xff, 0xdc, 0xcc, 0xc9, 0x0, - 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x2, 0x77, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x56, 0x66, 0x69, 0xff, 0x76, 0x66, + 0x64, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x6, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, 0x0, 0x0, /* U+2C "," */ - 0x8f, 0xf4, 0x8f, 0xf4, 0x8f, 0xf4, 0x8f, 0xf2, - 0x8f, 0xc0, 0x8f, 0x60, 0x48, 0x0, + 0x4, 0xff, 0x30, 0x4f, 0xf3, 0x4, 0xff, 0x20, + 0x7f, 0xf0, 0xc, 0xf9, 0x5, 0xff, 0x10, 0x1b, + 0x40, 0x0, /* U+2D "-" */ - 0x57, 0x77, 0x77, 0x77, 0x2b, 0xff, 0xff, 0xff, - 0xf5, 0x7a, 0xaa, 0xaa, 0xaa, 0x30, + 0x1, 0x11, 0x11, 0x10, 0x8f, 0xff, 0xff, 0xf2, + 0x8f, 0xff, 0xff, 0xf2, /* U+2E "." */ - 0x9c, 0xac, 0xfe, 0xcf, 0xe0, + 0x9, 0xfa, 0x0, 0xff, 0xf1, 0x9, 0xfa, 0x0, /* U+2F "/" */ - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xa0, 0x0, 0x0, - 0x0, 0x1e, 0xf4, 0x0, 0x0, 0x0, 0x6, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0x80, 0x0, 0x0, - 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x0, 0x9, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x5f, 0xf0, 0x0, 0x0, 0x0, 0xb, 0xfa, - 0x0, 0x0, 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x7f, 0xd0, 0x0, 0x0, 0x0, 0xe, 0xf7, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x10, 0x0, 0x0, - 0x0, 0xaf, 0xa0, 0x0, 0x0, 0x0, 0x1e, 0xf5, - 0x0, 0x0, 0x0, 0x6, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0x80, 0x0, 0x0, 0x0, 0x2f, 0xf2, - 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x60, 0x0, 0x0, 0x0, 0x5f, 0xf0, - 0x0, 0x0, 0x0, 0x8, 0xc8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, + 0x0, 0xf, 0xf2, 0x0, 0x0, 0x0, 0x6, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0x50, 0x0, 0x0, + 0x0, 0x2f, 0xf0, 0x0, 0x0, 0x0, 0x9, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x30, 0x0, 0x0, + 0x0, 0x5f, 0xd0, 0x0, 0x0, 0x0, 0xb, 0xf6, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x7f, 0xa0, 0x0, 0x0, 0x0, 0xe, 0xf4, + 0x0, 0x0, 0x0, 0x4, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0x80, 0x0, 0x0, 0x0, 0x1f, 0xf2, + 0x0, 0x0, 0x0, 0x6, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0x50, 0x0, 0x0, 0x0, 0x3f, 0xe0, + 0x0, 0x0, 0x0, 0x9, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x30, 0x0, 0x0, 0x0, 0x5f, 0xc0, + 0x0, 0x0, 0x0, 0x5, 0x84, 0x0, 0x0, 0x0, 0x0, /* U+30 "0" */ - 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xae, 0xff, 0xd9, 0x10, 0x0, 0x0, 0x6e, - 0xff, 0xff, 0xff, 0xd3, 0x0, 0x2, 0xff, 0xd4, - 0x0, 0x6f, 0xfd, 0x0, 0xb, 0xff, 0x10, 0x0, - 0x4, 0xff, 0x70, 0x1f, 0xf9, 0x0, 0x0, 0x0, - 0xdf, 0xc0, 0x4f, 0xf6, 0x0, 0x0, 0x0, 0x9f, - 0xf0, 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xf2, - 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x8f, - 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x8f, 0xf4, - 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x8f, 0xf4, 0x0, - 0x0, 0x0, 0x8f, 0xf4, 0x8f, 0xf4, 0x0, 0x0, - 0x0, 0x8f, 0xf4, 0x8f, 0xf4, 0x0, 0x0, 0x0, - 0x8f, 0xf4, 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x8f, - 0xf2, 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x9f, 0xf0, - 0x1f, 0xf9, 0x0, 0x0, 0x0, 0xdf, 0xe0, 0xc, - 0xfe, 0x10, 0x0, 0x4, 0xff, 0x80, 0x3, 0xff, - 0xc2, 0x0, 0x3e, 0xff, 0x10, 0x0, 0x7f, 0xff, - 0xde, 0xff, 0xf4, 0x0, 0x0, 0x3, 0xdf, 0xff, - 0xfb, 0x20, 0x0, 0x0, 0x0, 0x0, 0x43, 0x0, - 0x0, 0x0, + 0x0, 0x2, 0x9d, 0xff, 0xc8, 0x10, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x2, 0xff, + 0xd5, 0x12, 0x7f, 0xfd, 0x0, 0xa, 0xff, 0x10, + 0x0, 0x5, 0xff, 0x50, 0xf, 0xf9, 0x0, 0x0, + 0x0, 0xdf, 0xb0, 0x2f, 0xf5, 0x0, 0x0, 0x0, + 0x9f, 0xe0, 0x5f, 0xf2, 0x0, 0x0, 0x0, 0x7f, + 0xf0, 0x6f, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xf1, + 0x6f, 0xf1, 0x0, 0x0, 0x0, 0x6f, 0xf2, 0x6f, + 0xf1, 0x0, 0x0, 0x0, 0x6f, 0xf2, 0x6f, 0xf1, + 0x0, 0x0, 0x0, 0x6f, 0xf2, 0x6f, 0xf1, 0x0, + 0x0, 0x0, 0x6f, 0xf2, 0x5f, 0xf2, 0x0, 0x0, + 0x0, 0x6f, 0xf1, 0x5f, 0xf3, 0x0, 0x0, 0x0, + 0x7f, 0xf0, 0x2f, 0xf5, 0x0, 0x0, 0x0, 0x9f, + 0xe0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0xef, 0xa0, + 0x9, 0xff, 0x20, 0x0, 0x5, 0xff, 0x50, 0x2, + 0xff, 0xe5, 0x11, 0x6f, 0xfc, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x2, 0x9d, + 0xff, 0xd8, 0x10, 0x0, /* U+31 "1" */ - 0x0, 0x0, 0x0, 0x3, 0x27, 0xab, 0xcf, 0xfc, - 0x4f, 0xff, 0xff, 0xfc, 0x28, 0x88, 0x8f, 0xfc, - 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0xf, 0xfc, + 0x0, 0x0, 0x3, 0x9e, 0x0, 0x17, 0xdf, 0xff, + 0x4b, 0xff, 0xff, 0xff, 0xaf, 0xfd, 0x7a, 0xff, + 0x99, 0x30, 0x9, 0xff, 0x0, 0x0, 0x9, 0xff, + 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x9, 0xff, + 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x9, 0xff, + 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x9, 0xff, + 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x9, 0xff, + 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x9, 0xff, + 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x9, 0xff, + 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x9, 0xff, /* U+32 "2" */ - 0x0, 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, 0x2, - 0xae, 0xff, 0xfb, 0x40, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x3, 0xff, 0xe5, 0x0, 0x4e, - 0xff, 0x30, 0xbf, 0xf2, 0x0, 0x0, 0x4f, 0xf8, - 0xf, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xc0, 0xcc, - 0x60, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x3, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x2, 0xef, 0xf1, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf7, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, + 0x0, 0x4, 0xae, 0xff, 0xc8, 0x10, 0x0, 0x0, + 0xaf, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xa, 0xff, + 0xb3, 0x12, 0x8f, 0xff, 0x10, 0x3f, 0xf9, 0x0, + 0x0, 0x6, 0xff, 0x70, 0x8f, 0xf1, 0x0, 0x0, + 0x0, 0xff, 0xb0, 0xbf, 0xe0, 0x0, 0x0, 0x0, + 0xcf, 0xc0, 0x1, 0x10, 0x0, 0x0, 0x0, 0xef, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xe2, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x31, 0x11, 0x11, 0x11, 0x10, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x5f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, /* U+33 "3" */ - 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xaf, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6, 0xff, 0xd4, - 0x0, 0x4e, 0xff, 0x40, 0xf, 0xff, 0x10, 0x0, - 0x4, 0xff, 0x90, 0x1f, 0xf8, 0x0, 0x0, 0x0, - 0xff, 0xc0, 0x14, 0x42, 0x0, 0x0, 0x0, 0xcf, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, 0x0, - 0x0, 0x13, 0x36, 0x9f, 0xfa, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x3c, - 0xcd, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1a, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf1, 0x13, 0x31, 0x0, 0x0, 0x0, 0x8f, 0xf4, - 0x4f, 0xf6, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0xf, - 0xfc, 0x0, 0x0, 0x1, 0xef, 0xd0, 0x9, 0xff, - 0xa2, 0x0, 0x2c, 0xff, 0x50, 0x0, 0xbf, 0xff, - 0xde, 0xff, 0xfa, 0x0, 0x0, 0x5, 0xef, 0xff, - 0xfe, 0x50, 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, - 0x0, 0x0, + 0x0, 0x4, 0xae, 0xfe, 0xc7, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x9, 0xff, 0xa4, + 0x13, 0x8f, 0xfc, 0x2, 0xff, 0xa0, 0x0, 0x0, + 0x7f, 0xf4, 0x6f, 0xf2, 0x0, 0x0, 0x1, 0xff, + 0x83, 0x77, 0x0, 0x0, 0x0, 0xf, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xf1, 0x0, 0x0, 0x1, 0x14, + 0xbf, 0xf6, 0x0, 0x0, 0xa, 0xff, 0xff, 0xe4, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xa1, 0x0, + 0x0, 0x0, 0x0, 0x28, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xfc, 0x35, 0x40, 0x0, 0x0, 0x0, + 0xaf, 0xea, 0xff, 0x0, 0x0, 0x0, 0xc, 0xfc, + 0x6f, 0xf6, 0x0, 0x0, 0x4, 0xff, 0x80, 0xdf, + 0xf9, 0x31, 0x27, 0xef, 0xe1, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xe3, 0x0, 0x0, 0x6b, 0xef, 0xfc, + 0x71, 0x0, /* U+34 "4" */ - 0x0, 0x0, 0x0, 0x0, 0xef, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x2e, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x1d, 0xfb, 0x8f, - 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xf1, 0x8f, 0xf4, - 0x0, 0x0, 0x2, 0xff, 0x70, 0x8f, 0xf4, 0x0, - 0x0, 0xc, 0xfd, 0x0, 0x8f, 0xf4, 0x0, 0x0, - 0x5f, 0xf3, 0x0, 0x8f, 0xf4, 0x0, 0x1, 0xef, - 0x90, 0x0, 0x8f, 0xf4, 0x0, 0x9, 0xff, 0x10, - 0x0, 0x8f, 0xf4, 0x0, 0x3f, 0xf6, 0x0, 0x0, - 0x8f, 0xf4, 0x0, 0xcf, 0xfb, 0xbb, 0xbb, 0xdf, - 0xfc, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x88, 0x88, 0x88, 0x88, 0xcf, 0xfa, 0x88, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfe, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf5, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x1, 0xef, 0x73, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xa, 0xfc, 0x3, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x4f, 0xf3, 0x3, 0xff, 0x50, 0x0, + 0x0, 0x0, 0xef, 0x80, 0x3, 0xff, 0x50, 0x0, + 0x0, 0x9, 0xfd, 0x0, 0x3, 0xff, 0x50, 0x0, + 0x0, 0x4f, 0xf3, 0x0, 0x3, 0xff, 0x50, 0x0, + 0x0, 0xef, 0x90, 0x0, 0x3, 0xff, 0x50, 0x0, + 0x9, 0xfd, 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, /* U+35 "5" */ - 0x8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x9f, - 0xff, 0xff, 0xff, 0xff, 0x80, 0xc, 0xfe, 0x88, - 0x88, 0x88, 0x84, 0x0, 0xcf, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x57, - 0xbc, 0xb7, 0x10, 0x0, 0x4f, 0xff, 0xff, 0xff, - 0xfe, 0x50, 0x8, 0xff, 0xfa, 0x88, 0xdf, 0xfe, - 0x20, 0x8f, 0xf3, 0x0, 0x0, 0x9f, 0xfa, 0x2, - 0x44, 0x0, 0x0, 0x0, 0xef, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xf4, 0x33, 0x30, 0x0, 0x0, 0x8, - 0xff, 0x2c, 0xfc, 0x0, 0x0, 0x0, 0xbf, 0xf0, - 0x9f, 0xe1, 0x0, 0x0, 0x2f, 0xfc, 0x4, 0xff, - 0xc2, 0x0, 0x3c, 0xff, 0x40, 0x9, 0xff, 0xfd, - 0xef, 0xff, 0x80, 0x0, 0x5, 0xef, 0xff, 0xfe, - 0x40, 0x0, 0x0, 0x0, 0x4, 0x40, 0x0, 0x0, - 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x5f, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x6, 0xff, 0x55, + 0x55, 0x55, 0x55, 0x0, 0x8f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x90, 0x0, 0x0, 0x0, 0x0, 0xd, + 0xf7, 0x2, 0x33, 0x0, 0x0, 0x0, 0xff, 0xbe, + 0xff, 0xff, 0x91, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xd1, 0x1, 0xef, 0xc3, 0x0, 0x4d, 0xff, + 0xa0, 0x0, 0x20, 0x0, 0x0, 0xd, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xf9, 0x68, 0x40, 0x0, 0x0, 0x0, + 0xff, 0x8b, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0xf5, + 0x6f, 0xf4, 0x0, 0x0, 0xc, 0xff, 0x10, 0xdf, + 0xf7, 0x21, 0x3b, 0xff, 0x70, 0x2, 0xdf, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x7c, 0xff, 0xea, + 0x40, 0x0, /* U+36 "6" */ - 0x0, 0x0, 0x0, 0x2, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x3b, 0xef, 0xff, 0xd8, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x6f, 0xfd, - 0x40, 0x1, 0x65, 0x0, 0x1, 0xef, 0xd1, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1f, 0xf8, 0x2, 0x79, 0x85, 0x20, 0x0, 0xf, - 0xf9, 0x8f, 0xff, 0xff, 0xe6, 0x0, 0xf, 0xff, - 0xfa, 0x76, 0x9f, 0xff, 0x40, 0xf, 0xff, 0x30, - 0x0, 0x3, 0xff, 0xd0, 0xf, 0xf9, 0x0, 0x0, - 0x0, 0xaf, 0xf4, 0xf, 0xf8, 0x0, 0x0, 0x0, - 0x4f, 0xf6, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x4f, - 0xf8, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x4f, 0xf7, - 0xb, 0xff, 0x20, 0x0, 0x0, 0x6f, 0xf4, 0x4, - 0xff, 0x80, 0x0, 0x0, 0xef, 0xf1, 0x0, 0xaf, - 0xf8, 0x0, 0x1a, 0xff, 0x70, 0x0, 0x1c, 0xff, - 0xfc, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x8e, 0xff, - 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x24, 0x10, - 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5a, 0xdf, 0x80, 0x0, 0x0, + 0x0, 0x4e, 0xff, 0xff, 0x90, 0x0, 0x0, 0x6, + 0xff, 0xfa, 0x53, 0x10, 0x0, 0x0, 0x4f, 0xfc, + 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xfd, 0x0, 0x1, 0x0, 0x0, + 0x0, 0xc, 0xf9, 0x3b, 0xff, 0xfc, 0x50, 0x0, + 0xf, 0xfc, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x1f, + 0xff, 0xe7, 0x20, 0x4d, 0xff, 0x50, 0x2f, 0xfe, + 0x20, 0x0, 0x1, 0xef, 0xd0, 0x3f, 0xf7, 0x0, + 0x0, 0x0, 0x7f, 0xf2, 0x3f, 0xf5, 0x0, 0x0, + 0x0, 0x4f, 0xf4, 0x2f, 0xf6, 0x0, 0x0, 0x0, + 0x2f, 0xf5, 0xf, 0xf9, 0x0, 0x0, 0x0, 0x4f, + 0xf4, 0xa, 0xfe, 0x0, 0x0, 0x0, 0x8f, 0xf1, + 0x4, 0xff, 0x80, 0x0, 0x1, 0xef, 0xb0, 0x0, + 0xaf, 0xf9, 0x21, 0x5d, 0xff, 0x30, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x5c, + 0xef, 0xd9, 0x20, 0x0, /* U+37 "7" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x34, 0x44, - 0x44, 0x44, 0x44, 0x9f, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xef, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x9, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf6, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x6f, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf7, + 0x0, 0x0, 0x0, 0x0, /* U+38 "8" */ - 0x0, 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xbf, 0xff, 0xfa, 0x30, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x6, 0xff, 0xe4, - 0x0, 0x6f, 0xfe, 0x30, 0xc, 0xff, 0x30, 0x0, - 0x6, 0xff, 0x80, 0xf, 0xfc, 0x0, 0x0, 0x0, - 0xff, 0xb0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0xff, - 0xc0, 0xd, 0xfd, 0x0, 0x0, 0x2, 0xff, 0xa0, - 0x6, 0xff, 0x80, 0x0, 0xb, 0xff, 0x20, 0x0, - 0xaf, 0xfb, 0x77, 0xcf, 0xf6, 0x0, 0x0, 0x5, - 0xef, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x6e, 0xff, - 0xdd, 0xff, 0xd3, 0x0, 0x6, 0xff, 0xa1, 0x0, - 0x2c, 0xfe, 0x40, 0x2f, 0xfb, 0x0, 0x0, 0x1, - 0xef, 0xd0, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x8f, - 0xf4, 0x8f, 0xf2, 0x0, 0x0, 0x0, 0x6f, 0xf4, - 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x8f, 0xf3, 0x4f, - 0xfb, 0x0, 0x0, 0x1, 0xdf, 0xf0, 0xc, 0xff, - 0xa1, 0x0, 0x2b, 0xff, 0x80, 0x1, 0xef, 0xff, - 0xed, 0xff, 0xfc, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x44, 0x0, - 0x0, 0x0, + 0x0, 0x2, 0x9d, 0xff, 0xc7, 0x10, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x3, 0xff, + 0xe5, 0x22, 0x8f, 0xfe, 0x0, 0xa, 0xff, 0x20, + 0x0, 0x7, 0xff, 0x60, 0xe, 0xfb, 0x0, 0x0, + 0x0, 0xff, 0xa0, 0xf, 0xf9, 0x0, 0x0, 0x0, + 0xdf, 0xb0, 0xd, 0xfb, 0x0, 0x0, 0x0, 0xff, + 0x90, 0x8, 0xff, 0x20, 0x0, 0x6, 0xff, 0x30, + 0x1, 0xdf, 0xe5, 0x23, 0x8f, 0xf9, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xa1, 0x0, 0x4, 0xff, 0xb3, + 0x1, 0x5e, 0xfd, 0x10, 0xe, 0xfb, 0x0, 0x0, + 0x1, 0xef, 0xa0, 0x4f, 0xf3, 0x0, 0x0, 0x0, + 0x8f, 0xf0, 0x6f, 0xf1, 0x0, 0x0, 0x0, 0x5f, + 0xf2, 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x7f, 0xf1, + 0x2f, 0xfa, 0x0, 0x0, 0x1, 0xef, 0xd0, 0xa, + 0xff, 0xb4, 0x12, 0x5d, 0xff, 0x50, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x4, 0xae, + 0xff, 0xd9, 0x20, 0x0, /* U+39 "9" */ - 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x6c, 0xff, 0xfb, 0x60, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xb1, 0x0, 0x8f, 0xfb, 0x20, 0x2a, - 0xff, 0x90, 0x2e, 0xfd, 0x0, 0x0, 0xa, 0xff, - 0x37, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xf8, 0x8f, - 0xf2, 0x0, 0x0, 0x0, 0xff, 0xbc, 0xff, 0x0, - 0x0, 0x0, 0xc, 0xfc, 0xaf, 0xf0, 0x0, 0x0, - 0x0, 0xcf, 0xf8, 0xff, 0x40, 0x0, 0x0, 0xc, - 0xff, 0x3f, 0xfa, 0x0, 0x0, 0x3, 0xff, 0xf0, - 0xcf, 0xf7, 0x0, 0x5, 0xef, 0xff, 0x2, 0xef, - 0xff, 0xbf, 0xff, 0xef, 0xf0, 0x1, 0x9f, 0xff, - 0xfd, 0x3c, 0xff, 0x0, 0x0, 0x3, 0x43, 0x0, - 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfb, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, - 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, 0x72, 0x0, - 0x2, 0xcf, 0xf8, 0x0, 0x3f, 0xfe, 0xbe, 0xff, - 0xfa, 0x0, 0x2, 0xbf, 0xff, 0xff, 0xd4, 0x0, - 0x0, 0x0, 0x4, 0x43, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xae, 0xfe, 0xa3, 0x0, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x7, 0xff, 0xb4, + 0x14, 0xcf, 0xf6, 0x0, 0xff, 0xc0, 0x0, 0x0, + 0xcf, 0xe0, 0x5f, 0xf3, 0x0, 0x0, 0x3, 0xff, + 0x58, 0xff, 0x0, 0x0, 0x0, 0xe, 0xf9, 0x9f, + 0xe0, 0x0, 0x0, 0x0, 0xbf, 0xc9, 0xff, 0x0, + 0x0, 0x0, 0xa, 0xfd, 0x6f, 0xf3, 0x0, 0x0, + 0x0, 0xbf, 0xe1, 0xff, 0xb0, 0x0, 0x0, 0x6f, + 0xfd, 0xa, 0xff, 0xb2, 0x2, 0x9f, 0xff, 0xc0, + 0xc, 0xff, 0xff, 0xff, 0xcc, 0xfb, 0x0, 0x8, + 0xef, 0xfd, 0x70, 0xdf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x1, 0xef, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf2, 0x0, 0x0, + 0x13, 0x59, 0xff, 0xf5, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xd4, 0x0, 0x0, 0x0, 0xde, 0xda, 0x50, + 0x0, 0x0, /* U+3A ":" */ - 0x9b, 0xbc, 0xff, 0xcf, 0xf0, 0x0, 0x0, 0x0, + 0xb, 0xf8, 0x1f, 0xff, 0xb, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9b, 0xbc, 0xff, 0xcf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xf8, 0x2f, 0xff, 0xb, 0xf8, /* U+3B ";" */ - 0x9b, 0xb0, 0xcf, 0xf0, 0xcf, 0xf0, 0x0, 0x0, + 0x2, 0xde, 0x40, 0x7f, 0xf9, 0x2, 0xde, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf4, 0x8f, 0xf4, 0x8f, 0xf4, 0x8f, 0xf2, - 0x8f, 0xc0, 0x8f, 0x60, 0x48, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x60, 0x1f, 0xf6, 0x2, 0xff, 0x50, 0x4f, 0xf2, + 0xa, 0xfc, 0x2, 0xff, 0x30, 0x9, 0x60, 0x0, /* U+3C "<" */ - 0x0, 0x0, 0x0, 0x0, 0x2, 0x83, 0x0, 0x0, - 0x0, 0x2, 0x9f, 0xf4, 0x0, 0x0, 0x4, 0xbf, - 0xff, 0xf4, 0x0, 0x6, 0xbf, 0xff, 0xf9, 0x20, - 0x6, 0xdf, 0xff, 0xd6, 0x10, 0x0, 0xff, 0xff, - 0xa4, 0x0, 0x0, 0x0, 0xff, 0xc5, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xd7, 0x20, 0x0, 0x0, - 0x2, 0x8f, 0xff, 0xfa, 0x40, 0x0, 0x0, 0x1, - 0x8e, 0xff, 0xfd, 0x61, 0x0, 0x0, 0x0, 0x6e, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x5c, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x42, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x20, 0x0, + 0x0, 0x0, 0x4, 0xbf, 0xf2, 0x0, 0x0, 0x0, + 0x5c, 0xff, 0xff, 0x20, 0x0, 0x6, 0xdf, 0xff, + 0xd6, 0x0, 0x1, 0x7e, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0xff, 0xfd, 0x71, 0x0, 0x0, 0x0, 0xf, + 0xfe, 0x60, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, + 0xf9, 0x30, 0x0, 0x0, 0x0, 0x5, 0xcf, 0xff, + 0xc6, 0x0, 0x0, 0x0, 0x0, 0x4b, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x3, 0xaf, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x29, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, /* U+3D "=" */ - 0x87, 0x77, 0x77, 0x77, 0x77, 0x74, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xcc, 0xcc, 0xcc, 0xcc, - 0xcc, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcb, 0xbb, 0xbb, 0xbb, - 0xbb, 0xb6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, - 0x88, 0x88, 0x88, 0x88, 0x88, 0x84, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x23, 0x33, 0x33, 0x33, + 0x33, 0x31, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x21, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, /* U+3E ">" */ - 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xfd, - 0x51, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xe7, - 0x20, 0x0, 0x0, 0x0, 0x6c, 0xff, 0xff, 0x93, - 0x0, 0x0, 0x0, 0x2, 0x8e, 0xff, 0xfb, 0x40, - 0x0, 0x0, 0x0, 0x5, 0xbf, 0xff, 0xd4, 0x0, - 0x0, 0x0, 0x0, 0x1a, 0xef, 0x80, 0x0, 0x0, - 0x2, 0x7d, 0xff, 0xf6, 0x0, 0x0, 0x5a, 0xff, - 0xff, 0x82, 0x0, 0x28, 0xef, 0xff, 0xe6, 0x10, - 0x0, 0x4f, 0xff, 0xfc, 0x50, 0x0, 0x0, 0x4, - 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x38, 0x20, + 0x2a, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xc5, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xfe, + 0x71, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xf9, + 0x20, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, 0xb4, + 0x0, 0x0, 0x0, 0x0, 0x39, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x4b, 0xff, 0x80, 0x0, 0x0, + 0x28, 0xef, 0xff, 0x92, 0x0, 0x5, 0xbf, 0xff, + 0xe8, 0x10, 0x0, 0x8e, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x2f, 0xff, 0xb4, 0x0, 0x0, 0x0, 0x2, + 0xf9, 0x20, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+3F "?" */ - 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x17, - 0xef, 0xff, 0xe7, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xc0, 0xa, 0xff, 0xb4, 0x15, 0xcf, 0xf8, - 0xf, 0xfc, 0x0, 0x0, 0x1f, 0xfc, 0x1c, 0xc6, - 0x0, 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, - 0x0, 0x3, 0xef, 0xe1, 0x0, 0x0, 0x0, 0x1e, - 0xff, 0x30, 0x0, 0x0, 0x1, 0xcf, 0xf6, 0x0, - 0x0, 0x0, 0xa, 0xff, 0x60, 0x0, 0x0, 0x0, - 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x28, 0x84, 0x0, 0x0, + 0x0, 0x3a, 0xef, 0xec, 0x60, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x4f, 0xfd, 0x63, 0x5c, + 0xff, 0x80, 0xbf, 0xe1, 0x0, 0x0, 0xdf, 0xe0, + 0xcd, 0x80, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x3e, 0xfd, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xe2, 0x0, 0x0, 0x0, 0x1e, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xa0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x55, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xb9, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xac, 0x40, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0x60, 0x0, 0x0, /* U+40 "@" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0x67, 0x77, 0x42, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9e, - 0xff, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xef, 0xd7, 0x43, 0x14, 0x5a, 0xff, - 0xb1, 0x0, 0x0, 0x0, 0x6, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x1, 0xbf, 0xc1, 0x0, 0x0, 0x5, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0x90, 0x0, 0x2, 0xef, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xef, 0x30, 0x0, 0xaf, 0xa0, - 0x0, 0x0, 0x25, 0x75, 0x20, 0x0, 0x6, 0xfa, - 0x0, 0x2f, 0xf2, 0x0, 0x0, 0x7f, 0xff, 0xff, - 0x81, 0x0, 0xf, 0xe1, 0x9, 0xfa, 0x0, 0x0, - 0x9f, 0xf9, 0x56, 0xef, 0x40, 0x0, 0x9f, 0x40, - 0xdf, 0x40, 0x0, 0x2f, 0xf6, 0x0, 0xf, 0xf4, - 0x0, 0x8, 0xf8, 0x1f, 0xf1, 0x0, 0xa, 0xfc, - 0x0, 0x0, 0xff, 0x30, 0x0, 0x4f, 0x84, 0xff, - 0x0, 0x0, 0xff, 0x60, 0x0, 0xf, 0xf0, 0x0, - 0x4, 0xfc, 0x4f, 0xc0, 0x0, 0x4f, 0xf2, 0x0, - 0x3, 0xff, 0x0, 0x0, 0x4f, 0xc8, 0xfa, 0x0, - 0x7, 0xff, 0x0, 0x0, 0x4f, 0xf0, 0x0, 0x3, - 0xfa, 0x8f, 0xc0, 0x0, 0x8f, 0xc0, 0x0, 0x4, - 0xfc, 0x0, 0x0, 0x5f, 0x88, 0xfc, 0x0, 0x8, - 0xfc, 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x9, 0xf4, - 0x5f, 0xc0, 0x0, 0x8f, 0xe0, 0x0, 0x8, 0xfc, - 0x0, 0x1, 0xee, 0x2, 0xff, 0x0, 0x5, 0xff, - 0x50, 0x4, 0xef, 0xc0, 0x0, 0xaf, 0x60, 0xf, - 0xf2, 0x0, 0xf, 0xff, 0xbc, 0xf9, 0xff, 0x87, - 0xcf, 0xa0, 0x0, 0xaf, 0xa0, 0x0, 0x3f, 0xff, - 0xf7, 0x6, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xff, - 0x20, 0x0, 0x3, 0x40, 0x0, 0x2, 0x41, 0x0, - 0x0, 0x0, 0xb, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3f, 0xfb, 0x20, 0x0, 0x0, 0x0, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, - 0xc8, 0x77, 0x7a, 0xef, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xae, 0xff, 0xff, 0xfb, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x24, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5a, 0xde, 0xfe, 0xc8, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xef, + 0xff, 0xdd, 0xef, 0xff, 0xb2, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x93, 0x0, 0x0, 0x5, 0xbf, + 0xf4, 0x0, 0x0, 0x0, 0xb, 0xfc, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, 0x0, 0x9, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xd0, 0x0, 0x4, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0x70, 0x0, 0xcf, 0x40, + 0x0, 0x0, 0x39, 0xba, 0x60, 0x0, 0x0, 0xed, + 0x0, 0x3f, 0xd0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xd2, 0x0, 0x9, 0xf2, 0x9, 0xf6, 0x0, 0x0, + 0x7f, 0xe4, 0x2, 0xdf, 0x40, 0x0, 0x5f, 0x60, + 0xdf, 0x20, 0x0, 0x2f, 0xf2, 0x0, 0xd, 0xf3, + 0x0, 0x3, 0xf8, 0x1f, 0xe0, 0x0, 0x9, 0xf8, + 0x0, 0x0, 0xef, 0x10, 0x0, 0x1f, 0xa3, 0xfb, + 0x0, 0x0, 0xff, 0x20, 0x0, 0xf, 0xf0, 0x0, + 0x1, 0xfa, 0x5f, 0xa0, 0x0, 0x3f, 0xe0, 0x0, + 0x1, 0xfe, 0x0, 0x0, 0xf, 0xb6, 0xf9, 0x0, + 0x6, 0xfc, 0x0, 0x0, 0x2f, 0xd0, 0x0, 0x2, + 0xfa, 0x6f, 0x90, 0x0, 0x8f, 0xa0, 0x0, 0x4, + 0xfb, 0x0, 0x0, 0x4f, 0x85, 0xf9, 0x0, 0x8, + 0xfb, 0x0, 0x0, 0x7f, 0xa0, 0x0, 0x7, 0xf4, + 0x4f, 0xb0, 0x0, 0x6f, 0xe0, 0x0, 0xe, 0xfa, + 0x0, 0x0, 0xee, 0x1, 0xfe, 0x0, 0x2, 0xff, + 0x70, 0x1b, 0xff, 0xe0, 0x0, 0x9f, 0x70, 0xd, + 0xf3, 0x0, 0xa, 0xff, 0xff, 0xf3, 0xcf, 0xda, + 0xdf, 0xa0, 0x0, 0x7f, 0x90, 0x0, 0x9, 0xef, + 0xb3, 0x1, 0xae, 0xfd, 0x60, 0x0, 0x1, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfb, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0x72, 0x0, 0x0, 0x4, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfd, 0xcb, 0xcf, 0xff, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x6b, 0xdf, 0xfe, 0xc8, 0x20, + 0x0, 0x0, 0x0, /* U+41 "A" */ - 0x0, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xe0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xbf, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf6, 0x9f, - 0xe0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x13, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xef, 0xa0, - 0xe, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, - 0x0, 0x9f, 0xf1, 0x0, 0x0, 0x0, 0xa, 0xff, - 0x0, 0x3, 0xff, 0x60, 0x0, 0x0, 0x0, 0xff, - 0xa0, 0x0, 0xe, 0xfb, 0x0, 0x0, 0x0, 0x6f, - 0xf5, 0x0, 0x0, 0x9f, 0xf2, 0x0, 0x0, 0xb, - 0xff, 0x77, 0x77, 0x79, 0xff, 0x70, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xfd, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xb7, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x51, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x0, 0xbf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xfa, 0x0, 0x5f, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf4, 0x0, 0xf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xe0, 0x0, 0xa, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x90, 0x0, 0x4, + 0xff, 0x40, 0x0, 0x0, 0x6, 0xff, 0x30, 0x0, + 0x0, 0xef, 0xa0, 0x0, 0x0, 0xc, 0xfe, 0x22, + 0x22, 0x22, 0xaf, 0xf1, 0x0, 0x0, 0x2f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, - 0xd, 0xfe, 0x0, 0x0, 0x0, 0x3, 0xff, 0x90, - 0x2, 0xff, 0x90, 0x0, 0x0, 0x0, 0xe, 0xfd, - 0x0, 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xf3, 0xe, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xff, 0x93, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0xd, 0xfe, + 0xef, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x20, + 0x4, 0xff, 0x60, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x80, 0xa, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xe0, 0x1f, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf5, 0x6f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfb, /* U+42 "B" */ - 0xcf, 0xff, 0xff, 0xfb, 0xb7, 0x20, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xcf, - 0xf4, 0x44, 0x44, 0x9f, 0xff, 0x70, 0xc, 0xff, - 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0xcf, 0xf0, - 0x0, 0x0, 0x0, 0x8f, 0xf3, 0xc, 0xff, 0x0, - 0x0, 0x0, 0x6, 0xff, 0x40, 0xcf, 0xf0, 0x0, - 0x0, 0x0, 0x9f, 0xf3, 0xc, 0xff, 0x0, 0x0, - 0x0, 0x3e, 0xfc, 0x0, 0xcf, 0xf7, 0x77, 0x77, - 0x9f, 0xfc, 0x10, 0xc, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x51, 0x0, 0xcf, 0xfc, 0xcc, 0xcc, 0xcf, - 0xff, 0xc1, 0xc, 0xff, 0x0, 0x0, 0x0, 0x7, - 0xff, 0xc0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x8, - 0xff, 0x6c, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xf8, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xbc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x5c, - 0xff, 0x0, 0x0, 0x3, 0x4b, 0xff, 0xb0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xc, 0xff, - 0xff, 0xff, 0xff, 0xcb, 0x40, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xda, 0x40, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0xbf, 0xf2, + 0x22, 0x23, 0x5c, 0xff, 0x90, 0xbf, 0xf0, 0x0, + 0x0, 0x0, 0xdf, 0xf0, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0x7f, 0xf3, 0xbf, 0xf0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x7f, + 0xf2, 0xbf, 0xf0, 0x0, 0x0, 0x1, 0xef, 0xd0, + 0xbf, 0xf1, 0x11, 0x13, 0x6e, 0xff, 0x30, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x10, 0xbf, 0xf0, 0x0, + 0x0, 0x16, 0xff, 0xd0, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0x5f, 0xf6, 0xbf, 0xf0, 0x0, 0x0, 0x0, + 0xe, 0xfb, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0xc, + 0xfd, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0xf7, 0xbf, + 0xf2, 0x22, 0x22, 0x5a, 0xff, 0xe1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x30, 0xbf, 0xff, 0xff, + 0xff, 0xeb, 0x60, 0x0, /* U+43 "C" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0xcf, 0xff, 0xc9, 0x10, 0x0, - 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xe7, 0x0, - 0x0, 0x7f, 0xff, 0x51, 0x2, 0x6f, 0xff, 0x40, - 0x1, 0xef, 0xd1, 0x0, 0x0, 0x2, 0xff, 0xd1, - 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, 0x7f, 0xf4, - 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, - 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, 0x84, - 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, 0x32, - 0xf, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, - 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, 0x6f, 0xf4, - 0x2, 0xff, 0xc1, 0x0, 0x0, 0x1, 0xef, 0xe0, - 0x0, 0x8f, 0xfc, 0x30, 0x0, 0x4d, 0xff, 0x40, - 0x0, 0x7, 0xff, 0xff, 0xcf, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x3c, 0xff, 0xff, 0xfa, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xbe, 0xfe, 0xc8, 0x10, 0x0, + 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x3f, 0xff, 0x94, 0x23, 0x7e, 0xff, 0x60, + 0x0, 0xdf, 0xf3, 0x0, 0x0, 0x1, 0xef, 0xf1, + 0x7, 0xff, 0x50, 0x0, 0x0, 0x0, 0x4f, 0xf7, + 0xd, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x6, 0x87, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5, 0x76, + 0xd, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xe, 0xfc, + 0x7, 0xff, 0x40, 0x0, 0x0, 0x0, 0x4f, 0xf7, + 0x1, 0xef, 0xe2, 0x0, 0x0, 0x0, 0xdf, 0xf1, + 0x0, 0x4f, 0xff, 0x83, 0x23, 0x7e, 0xff, 0x60, + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x7, 0xce, 0xfe, 0xc8, 0x10, 0x0, /* U+44 "D" */ - 0xcf, 0xff, 0xff, 0xeb, 0x86, 0x10, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, - 0xcf, 0xf4, 0x44, 0x46, 0x9f, 0xff, 0xb0, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0x1, 0xcf, 0xf8, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0xd, 0xff, 0x30, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xc0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf3, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xe0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x40, - 0xcf, 0xf0, 0x0, 0x0, 0x1, 0x9f, 0xf9, 0x0, - 0xcf, 0xf0, 0x0, 0x13, 0x7d, 0xff, 0xd1, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xfd, 0xb8, 0x30, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xfd, 0xa4, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0xbf, + 0xf2, 0x22, 0x35, 0xaf, 0xff, 0x30, 0xb, 0xff, + 0x0, 0x0, 0x0, 0x3e, 0xfe, 0x10, 0xbf, 0xf0, + 0x0, 0x0, 0x0, 0x3f, 0xf9, 0xb, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xf1, 0xbf, 0xf0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0x5b, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xf8, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xab, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xfb, 0xbf, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xbb, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfa, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x8b, 0xff, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xf5, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x1b, 0xff, 0x0, 0x0, 0x0, 0x4, 0xff, 0x90, + 0xbf, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xe1, 0xb, + 0xff, 0x22, 0x23, 0x5b, 0xff, 0xf3, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xb, 0xff, + 0xff, 0xfe, 0xd9, 0x40, 0x0, 0x0, /* U+45 "E" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf4, 0xcf, 0xf4, 0x44, - 0x44, 0x44, 0x44, 0x1c, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0x33, 0x33, - 0x33, 0x30, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xcf, 0xfc, 0xcc, 0xcc, 0xcc, 0xc0, 0xc, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfd, 0xbf, 0xf2, 0x22, + 0x22, 0x22, 0x22, 0x2b, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf2, 0x22, 0x22, + 0x22, 0x21, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x90, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xb, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x22, 0x22, 0x22, 0x22, 0x22, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, /* U+46 "F" */ - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcc, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xf4, 0x44, - 0x44, 0x44, 0x44, 0x3c, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x40, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xc, - 0xff, 0x44, 0x44, 0x44, 0x44, 0x10, 0xcf, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xab, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xf2, 0x22, + 0x22, 0x22, 0x22, 0x1b, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xb, + 0xff, 0x22, 0x22, 0x22, 0x22, 0x0, 0xbf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+47 "G" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2a, 0xcf, 0xff, 0xd9, 0x20, 0x0, - 0x0, 0x6, 0xef, 0xff, 0xff, 0xff, 0xf7, 0x0, - 0x0, 0x7f, 0xff, 0x52, 0x1, 0x6f, 0xff, 0x50, - 0x1, 0xef, 0xe2, 0x0, 0x0, 0x1, 0xff, 0xe1, - 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, 0x6f, 0xf4, - 0xf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, - 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, 0x42, - 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xf4, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, - 0x4f, 0xf4, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, - 0x4f, 0xf7, 0x0, 0x0, 0x24, 0x44, 0x4f, 0xfc, - 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, - 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, - 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, 0xf, 0xfc, - 0x2, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1f, 0xfc, - 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x6, 0xdf, 0xf6, - 0x0, 0x7, 0xff, 0xff, 0xcd, 0xff, 0xff, 0x80, - 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xa2, 0x0, - 0x0, 0x0, 0x0, 0x1, 0x44, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xbe, 0xff, 0xd9, 0x30, 0x0, + 0x0, 0x0, 0x4e, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x4f, 0xff, 0x94, 0x23, 0x6d, 0xff, + 0x90, 0x0, 0x1e, 0xff, 0x30, 0x0, 0x0, 0xc, + 0xff, 0x30, 0x7, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x2f, 0xfa, 0x0, 0xdf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xbe, 0xd0, 0xf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0x50, 0x0, + 0x0, 0x22, 0x22, 0x22, 0x20, 0x5f, 0xf5, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0x4, 0xff, 0x50, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, 0xb, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, + 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf0, + 0x0, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x0, 0x1, 0xef, 0xfb, 0x52, 0x23, 0x7d, 0xff, + 0xa0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xc8, + 0x20, 0x0, /* U+48 "H" */ - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0xcf, 0xf4, 0x44, 0x44, 0x44, 0x44, 0x7f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf2, 0x22, 0x22, 0x22, 0x22, 0x2f, 0xf9, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, /* U+49 "I" */ - 0x5e, 0xe4, 0x6f, 0xf4, 0x6f, 0xf4, 0x6f, 0xf4, - 0x6f, 0xf4, 0x6f, 0xf4, 0x6f, 0xf4, 0x6f, 0xf4, - 0x6f, 0xf4, 0x6f, 0xf4, 0x6f, 0xf4, 0x6f, 0xf4, - 0x6f, 0xf4, 0x6f, 0xf4, 0x6f, 0xf4, 0x6f, 0xf4, - 0x6f, 0xf4, 0x6f, 0xf4, 0x6f, 0xf4, 0x6f, 0xf4, + 0x8f, 0xf2, 0x8f, 0xf2, 0x8f, 0xf2, 0x8f, 0xf2, + 0x8f, 0xf2, 0x8f, 0xf2, 0x8f, 0xf2, 0x8f, 0xf2, + 0x8f, 0xf2, 0x8f, 0xf2, 0x8f, 0xf2, 0x8f, 0xf2, + 0x8f, 0xf2, 0x8f, 0xf2, 0x8f, 0xf2, 0x8f, 0xf2, + 0x8f, 0xf2, 0x8f, 0xf2, 0x8f, 0xf2, 0x8f, 0xf2, /* U+4A "J" */ - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x87, 0x60, 0x0, 0x0, - 0xb, 0xff, 0xcf, 0xc0, 0x0, 0x0, 0xd, 0xfe, - 0xbf, 0xf2, 0x0, 0x0, 0x4f, 0xfb, 0x4f, 0xfc, - 0x20, 0x3, 0xdf, 0xf3, 0x9, 0xff, 0xfd, 0xef, - 0xff, 0x70, 0x0, 0x5e, 0xff, 0xff, 0xd3, 0x0, - 0x0, 0x0, 0x4, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xf4, 0x2b, 0xb4, 0x0, 0x0, 0x0, 0x6f, + 0xf4, 0x2f, 0xf8, 0x0, 0x0, 0x0, 0x9f, 0xf1, + 0xe, 0xfe, 0x10, 0x0, 0x2, 0xff, 0xd0, 0x6, + 0xff, 0xe6, 0x33, 0x7f, 0xff, 0x40, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x3, 0xad, + 0xff, 0xd9, 0x20, 0x0, /* U+4B "K" */ - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x90, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x6f, 0xfb, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0x3, 0xef, 0xd1, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0x30, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0xdf, 0xf4, 0x0, 0x0, - 0xcf, 0xf0, 0x0, 0xa, 0xff, 0x60, 0x0, 0x0, - 0xcf, 0xf0, 0x0, 0x6f, 0xfa, 0x0, 0x0, 0x0, - 0xcf, 0xf0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0xcf, 0xf0, 0x1e, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf0, 0xa, 0xff, 0x90, 0x0, 0x0, 0x0, - 0xcf, 0xf0, 0x1, 0xdf, 0xf6, 0x0, 0x0, 0x0, - 0xcf, 0xf0, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, - 0xcf, 0xf0, 0x0, 0x4, 0xff, 0xe2, 0x0, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0x7f, 0xfc, 0x10, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0x1, 0xdf, 0xf7, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xe3, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x80, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x7, 0xff, 0xb0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x4, 0xff, 0xd1, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x3f, 0xfe, 0x20, 0x0, 0x0, + 0xbf, 0xf0, 0x2, 0xef, 0xf3, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x1d, 0xff, 0x40, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0xcf, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xfb, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xfe, 0xff, 0x60, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0x91, 0xef, 0xf2, 0x0, 0x0, 0x0, + 0xbf, 0xfa, 0x0, 0x4f, 0xfd, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x8, 0xff, 0xa0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0xbf, 0xf6, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x1e, 0xff, 0x30, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x4, 0xff, 0xd0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x60, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf3, /* U+4C "L" */ - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xcc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfc, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x22, 0x22, 0x22, 0x22, 0x20, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x6b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, /* U+4D "M" */ - 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xcf, 0xff, 0x50, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xef, 0xff, 0xcf, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xcf, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xcf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x3f, - 0xff, 0xff, 0xcf, 0xfa, 0xfd, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xfc, 0xff, 0xcf, 0xf4, 0xff, 0x50, - 0x0, 0x0, 0x0, 0xff, 0x9c, 0xff, 0xcf, 0xf0, - 0xef, 0xa0, 0x0, 0x0, 0x6, 0xff, 0x2c, 0xff, - 0xcf, 0xf0, 0x6f, 0xf1, 0x0, 0x0, 0xc, 0xfb, - 0xc, 0xff, 0xcf, 0xf0, 0x1f, 0xf7, 0x0, 0x0, - 0x2f, 0xf5, 0xc, 0xff, 0xcf, 0xf0, 0xa, 0xfd, - 0x0, 0x0, 0x9f, 0xe0, 0xc, 0xff, 0xcf, 0xf0, - 0x3, 0xff, 0x40, 0x0, 0xff, 0x80, 0xc, 0xff, - 0xcf, 0xf0, 0x0, 0xdf, 0xa0, 0x6, 0xff, 0x20, - 0xc, 0xff, 0xcf, 0xf0, 0x0, 0x6f, 0xe1, 0xc, - 0xfb, 0x0, 0xc, 0xff, 0xcf, 0xf0, 0x0, 0x1f, - 0xf6, 0x2f, 0xf5, 0x0, 0xc, 0xff, 0xcf, 0xf0, - 0x0, 0xa, 0xfc, 0x8f, 0xe0, 0x0, 0xc, 0xff, - 0xcf, 0xf0, 0x0, 0x3, 0xff, 0xef, 0x80, 0x0, - 0xc, 0xff, 0xcf, 0xf0, 0x0, 0x0, 0xdf, 0xff, - 0x20, 0x0, 0xc, 0xff, 0xcf, 0xf0, 0x0, 0x0, - 0x6f, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xcf, 0xf0, - 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, 0xc, 0xff, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0x2b, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xf2, 0xbf, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x2b, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf2, 0xbf, 0xcf, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xfb, 0xff, 0x2b, 0xfb, 0xaf, 0xe0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0x6f, 0xf2, 0xbf, + 0xc4, 0xff, 0x40, 0x0, 0x0, 0x0, 0xdf, 0xa5, + 0xff, 0x2b, 0xfc, 0xd, 0xfb, 0x0, 0x0, 0x0, + 0x4f, 0xf4, 0x5f, 0xf2, 0xbf, 0xd0, 0x7f, 0xf1, + 0x0, 0x0, 0xa, 0xfd, 0x6, 0xff, 0x2b, 0xfd, + 0x1, 0xff, 0x70, 0x0, 0x1, 0xff, 0x70, 0x6f, + 0xf2, 0xbf, 0xe0, 0xa, 0xfe, 0x0, 0x0, 0x7f, + 0xf1, 0x7, 0xff, 0x2b, 0xfe, 0x0, 0x3f, 0xf4, + 0x0, 0xd, 0xfa, 0x0, 0x7f, 0xf2, 0xbf, 0xe0, + 0x0, 0xdf, 0xa0, 0x4, 0xff, 0x30, 0x7, 0xff, + 0x2b, 0xff, 0x0, 0x6, 0xff, 0x10, 0xaf, 0xd0, + 0x0, 0x8f, 0xf2, 0xbf, 0xf0, 0x0, 0xf, 0xf7, + 0x1f, 0xf6, 0x0, 0x8, 0xff, 0x2b, 0xff, 0x0, + 0x0, 0x9f, 0xd7, 0xff, 0x0, 0x0, 0x8f, 0xf2, + 0xbf, 0xf0, 0x0, 0x3, 0xff, 0xff, 0x90, 0x0, + 0x8, 0xff, 0x2b, 0xff, 0x0, 0x0, 0xc, 0xff, + 0xf3, 0x0, 0x0, 0x8f, 0xf2, 0xbf, 0xf0, 0x0, + 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x8, 0xff, 0x2b, + 0xff, 0x0, 0x0, 0x0, 0xff, 0x60, 0x0, 0x0, + 0x8f, 0xf2, /* U+4E "N" */ - 0xcf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf8, 0xff, 0x70, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0xdf, 0xe2, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x4f, 0xfa, 0x0, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x9, 0xff, 0x50, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x1, 0xef, 0xd1, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x5f, 0xf9, 0x0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0xb, 0xff, 0x40, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x2, 0xff, 0xc0, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x7f, 0xf8, 0x4f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0xc, 0xfe, 0x6f, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xef, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xf4, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, + 0xbf, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xff, 0x90, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf7, 0xff, 0x80, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0xcf, 0xf2, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x2f, 0xfc, 0x0, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x8, 0xff, 0x70, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0xdf, 0xf2, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x3f, 0xfc, 0x0, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x8, 0xff, 0x60, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0xdf, 0xf1, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x4f, 0xfb, 0xf, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x9, 0xff, 0x5f, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0xef, 0xef, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xf9, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf9, /* U+4F "O" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0x9c, 0xff, 0xfb, 0x91, 0x0, - 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xe5, - 0x0, 0x0, 0x7, 0xff, 0xf7, 0x30, 0x48, 0xff, - 0xf7, 0x0, 0x1, 0xef, 0xd3, 0x0, 0x0, 0x3, - 0xdf, 0xe2, 0x0, 0xaf, 0xf4, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xa0, 0xf, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x3, 0xff, 0x80, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf4, 0x5f, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x78, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x8f, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x88, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x8f, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x85, 0xff, - 0x50, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, 0x3f, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x40, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf1, - 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xfc, - 0x0, 0x2f, 0xfc, 0x10, 0x0, 0x0, 0x1c, 0xff, - 0x20, 0x0, 0x8f, 0xfe, 0x42, 0x2, 0x4e, 0xff, - 0x80, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, - 0x70, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xeb, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x10, - 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xbe, 0xfe, 0xc7, 0x10, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0x0, 0x2e, 0xff, 0xb6, 0x45, 0x9f, 0xff, + 0x60, 0x0, 0xd, 0xff, 0x50, 0x0, 0x0, 0x2e, + 0xff, 0x20, 0x5, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x3f, 0xfa, 0x0, 0xcf, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xf0, 0xf, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0x43, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf7, 0x5f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0x86, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf9, 0x6f, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x95, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, 0x4f, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x71, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf4, 0xc, + 0xfe, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x10, + 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x2, 0xff, 0xa0, + 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x1, 0xdf, 0xf2, + 0x0, 0x2, 0xef, 0xfa, 0x53, 0x48, 0xff, 0xf6, + 0x0, 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x5b, 0xef, 0xec, 0x71, + 0x0, 0x0, /* U+50 "P" */ - 0xcf, 0xff, 0xff, 0xff, 0xba, 0x71, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0xcf, - 0xf4, 0x44, 0x44, 0x59, 0xff, 0xf5, 0xc, 0xff, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xe2, 0xcf, 0xf0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x4c, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x4f, 0xf8, 0xcf, 0xf0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x8c, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xf5, 0xcf, 0xf0, 0x0, 0x0, - 0x0, 0x1d, 0xff, 0x2c, 0xff, 0x0, 0x0, 0x4, - 0x5d, 0xff, 0x70, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xc, 0xff, 0xff, 0xff, 0xff, 0xca, - 0x20, 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x92, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xbf, + 0xf2, 0x22, 0x22, 0x37, 0xef, 0xf7, 0xb, 0xff, + 0x0, 0x0, 0x0, 0x1, 0xdf, 0xf1, 0xbf, 0xf0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0x6b, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf9, 0xbf, 0xf0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x9b, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf7, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0x3b, 0xff, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xa0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xc0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x60, 0x0, 0xbf, 0xf2, 0x22, 0x21, 0x10, 0x0, + 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+51 "Q" */ - 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x29, 0xcf, 0xff, 0xb9, 0x10, - 0x0, 0x0, 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, - 0xe5, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x73, 0x4, - 0x8f, 0xff, 0x70, 0x0, 0x1, 0xef, 0xd3, 0x0, - 0x0, 0x3, 0xdf, 0xe2, 0x0, 0xa, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x4f, 0xfa, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x0, 0x3f, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, - 0x5f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x70, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x4, - 0xff, 0x80, 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0x80, 0x8f, 0xf4, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x80, 0x8f, 0xf4, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xff, 0x80, 0x5f, 0xf5, 0x0, - 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, 0x3f, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x60, 0xf, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x20, - 0xc, 0xff, 0x40, 0x0, 0x0, 0x0, 0x3f, 0xfc, - 0x0, 0x2, 0xff, 0xc1, 0x0, 0x0, 0x1, 0xcf, - 0xf4, 0x0, 0x0, 0x8f, 0xfe, 0x42, 0x2, 0x4e, - 0xff, 0xe1, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x3b, 0xff, - 0xff, 0xfb, 0x4a, 0xff, 0xe3, 0x0, 0x0, 0x0, - 0x2, 0x44, 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x60, + 0x0, 0x0, 0x6, 0xbe, 0xfe, 0xb7, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x4f, 0xff, 0xa5, 0x45, 0xaf, 0xff, + 0x40, 0x0, 0x1e, 0xff, 0x30, 0x0, 0x0, 0x3e, + 0xfe, 0x10, 0x7, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x4f, 0xf8, 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xe0, 0x2f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0x25, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xf6, 0x7f, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0x78, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf8, 0x8f, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x87, 0xff, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf6, 0x6f, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x52, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0xe, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfe, 0x0, + 0x8f, 0xf5, 0x0, 0x0, 0x0, 0x4, 0xff, 0x80, + 0x1, 0xef, 0xf3, 0x0, 0x0, 0x2, 0xef, 0xe0, + 0x0, 0x4, 0xff, 0xfa, 0x53, 0x59, 0xff, 0xf4, + 0x0, 0x0, 0x3, 0xef, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x6b, 0xef, 0xed, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, /* U+52 "R" */ - 0xcf, 0xff, 0xff, 0xfd, 0xb9, 0x50, 0x0, 0xc, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd3, 0x0, 0xcf, - 0xf4, 0x44, 0x44, 0x6a, 0xff, 0xe1, 0xc, 0xff, - 0x0, 0x0, 0x0, 0x7, 0xff, 0xa0, 0xcf, 0xf0, - 0x0, 0x0, 0x0, 0xd, 0xfc, 0xc, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xf0, 0xcf, 0xf0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xc, 0xff, 0x0, 0x0, - 0x0, 0x2, 0xef, 0xb0, 0xcf, 0xf0, 0x0, 0x0, - 0x4, 0xcf, 0xf3, 0xc, 0xff, 0xbb, 0xbb, 0xbe, - 0xff, 0xe3, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xf7, 0x10, 0xc, 0xff, 0x88, 0x88, 0x88, 0xcf, - 0xfc, 0x10, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0xaf, - 0xf8, 0xc, 0xff, 0x0, 0x0, 0x0, 0x1, 0xff, - 0xc0, 0xcf, 0xf0, 0x0, 0x0, 0x0, 0xc, 0xff, - 0xc, 0xff, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, - 0xcf, 0xf0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xc, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, 0xcf, - 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x4c, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfb, + 0xbf, 0xff, 0xff, 0xff, 0xea, 0x50, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0xbf, + 0xf2, 0x22, 0x23, 0x5c, 0xff, 0xd0, 0xb, 0xff, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x60, 0xbf, 0xf0, + 0x0, 0x0, 0x0, 0xf, 0xfb, 0xb, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xd0, 0xbf, 0xf0, 0x0, + 0x0, 0x0, 0xc, 0xfd, 0xb, 0xff, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb0, 0xbf, 0xf0, 0x0, 0x0, + 0x0, 0xaf, 0xf5, 0xb, 0xff, 0x22, 0x22, 0x25, + 0xcf, 0xfa, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0xbf, 0xf0, 0x0, 0x2, 0xff, 0xa0, + 0x0, 0xb, 0xff, 0x0, 0x0, 0x9, 0xff, 0x30, + 0x0, 0xbf, 0xf0, 0x0, 0x0, 0x1f, 0xfb, 0x0, + 0xb, 0xff, 0x0, 0x0, 0x0, 0x7f, 0xf4, 0x0, + 0xbf, 0xf0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0xb, + 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, 0x60, 0xbf, + 0xf0, 0x0, 0x0, 0x0, 0xd, 0xfe, 0xb, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf7, /* U+53 "S" */ - 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xdf, 0xff, 0xea, 0x30, 0x0, 0x0, - 0x2d, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xd, - 0xff, 0x81, 0x0, 0x5e, 0xff, 0x60, 0x6, 0xff, - 0x80, 0x0, 0x0, 0x1e, 0xfe, 0x20, 0x9f, 0xf1, - 0x0, 0x0, 0x0, 0x5f, 0xf5, 0xb, 0xff, 0x0, - 0x0, 0x0, 0x2, 0xcc, 0x60, 0x8f, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xe5, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x62, - 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xfb, - 0x51, 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xff, - 0xe5, 0x0, 0x0, 0x0, 0x0, 0x2, 0x7d, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0x93, 0xbb, 0x50, 0x0, 0x0, 0x0, 0xf, 0xfc, - 0x1f, 0xf9, 0x0, 0x0, 0x0, 0x1, 0xff, 0xa0, - 0xdf, 0xe3, 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x3, - 0xff, 0xe7, 0x10, 0x1, 0x7f, 0xfd, 0x10, 0x5, - 0xff, 0xff, 0xdd, 0xff, 0xfe, 0x20, 0x0, 0x1, - 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x44, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8c, 0xef, 0xec, 0x71, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x5, + 0xff, 0xe7, 0x32, 0x37, 0xef, 0xf4, 0x0, 0xef, + 0xe1, 0x0, 0x0, 0x1, 0xef, 0xe0, 0x3f, 0xf8, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x44, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x2e, 0xe6, 0x1f, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xb4, 0x0, 0x0, 0x0, 0x0, 0x17, 0xdf, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x27, 0xdf, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xf6, 0xce, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0x8b, 0xff, 0x10, 0x0, 0x0, 0x0, 0x3f, 0xf7, + 0x4f, 0xfb, 0x0, 0x0, 0x0, 0xa, 0xff, 0x30, + 0x9f, 0xfe, 0x74, 0x23, 0x6c, 0xff, 0xb0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x17, 0xce, 0xff, 0xd9, 0x30, 0x0, /* U+54 "T" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x48, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x24, 0x44, 0x44, 0x4f, 0xfd, 0x44, 0x44, - 0x44, 0x10, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x15, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x2, 0x22, 0x22, 0x2f, 0xfb, 0x22, 0x22, + 0x22, 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, /* U+55 "U" */ - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, - 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xcf, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xc, - 0xff, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xef, - 0xc9, 0xff, 0x20, 0x0, 0x0, 0x0, 0x3f, 0xfa, - 0x4f, 0xfb, 0x0, 0x0, 0x0, 0xd, 0xff, 0x50, - 0x9f, 0xfb, 0x30, 0x0, 0x4c, 0xff, 0x90, 0x1, - 0xbf, 0xff, 0xfc, 0xff, 0xff, 0xa0, 0x0, 0x0, - 0x4d, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x24, 0x20, 0x0, 0x0, 0x0, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0x1f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf5, + 0xf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf4, + 0xf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf3, + 0xc, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf0, + 0x6, 0xff, 0x90, 0x0, 0x0, 0x5, 0xff, 0x90, + 0x0, 0xcf, 0xfb, 0x52, 0x24, 0xaf, 0xfd, 0x10, + 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, + 0x0, 0x0, 0x4a, 0xdf, 0xfe, 0xa5, 0x0, 0x0, /* U+56 "V" */ - 0x9f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf4, 0x3f, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xe0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x6, 0xff, 0x80, 0x7, 0xff, 0x70, 0x0, 0x0, - 0x0, 0xb, 0xff, 0x20, 0x1, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x1f, 0xfd, 0x0, 0x0, 0xbf, 0xf2, - 0x0, 0x0, 0x0, 0x6f, 0xf6, 0x0, 0x0, 0x5f, - 0xf7, 0x0, 0x0, 0x0, 0xbf, 0xf1, 0x0, 0x0, - 0xf, 0xfc, 0x0, 0x0, 0x2, 0xff, 0xa0, 0x0, - 0x0, 0xa, 0xff, 0x30, 0x0, 0x7, 0xff, 0x50, - 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, 0xd, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, 0x2f, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf3, 0x0, - 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, - 0x0, 0xef, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xb, - 0xfe, 0x3, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0x59, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x9d, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xdf, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, - 0x30, 0x0, 0x0, 0x0, + 0x6f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf4, 0x1f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xe0, 0xb, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x80, 0x5, 0xff, 0x70, 0x0, 0x0, + 0x0, 0xa, 0xff, 0x20, 0x0, 0xef, 0xc0, 0x0, + 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x9f, 0xf2, + 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x3f, + 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x0, 0x0, + 0xd, 0xfd, 0x0, 0x0, 0x0, 0xff, 0xa0, 0x0, + 0x0, 0x7, 0xff, 0x20, 0x0, 0x5, 0xff, 0x50, + 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, 0xb, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x1f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf3, 0x0, + 0x6f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf9, + 0x0, 0xcf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xfe, 0x1, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0x47, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0x9c, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0x40, 0x0, 0x0, 0x0, /* U+57 "W" */ - 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x0, - 0x0, 0x0, 0x6f, 0xf8, 0x3f, 0xfc, 0x0, 0x0, - 0x0, 0xaf, 0xfc, 0x0, 0x0, 0x0, 0xaf, 0xf4, - 0xf, 0xfe, 0x0, 0x0, 0x0, 0xff, 0xff, 0x10, - 0x0, 0x0, 0xdf, 0xf0, 0xb, 0xff, 0x30, 0x0, - 0x3, 0xff, 0xff, 0x50, 0x0, 0x1, 0xff, 0xd0, - 0x7, 0xff, 0x60, 0x0, 0x7, 0xff, 0xef, 0x90, - 0x0, 0x4, 0xff, 0x90, 0x3, 0xff, 0xa0, 0x0, - 0xc, 0xfe, 0xcf, 0xd0, 0x0, 0x8, 0xff, 0x50, - 0x0, 0xff, 0xc0, 0x0, 0xf, 0xfa, 0x8f, 0xf2, - 0x0, 0xc, 0xff, 0x10, 0x0, 0xbf, 0xf1, 0x0, - 0x5f, 0xf6, 0x3f, 0xf6, 0x0, 0xf, 0xfd, 0x0, - 0x0, 0x8f, 0xf4, 0x0, 0x9f, 0xf1, 0xf, 0xfb, - 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x4f, 0xf8, 0x0, - 0xdf, 0xd0, 0xa, 0xfe, 0x0, 0x6f, 0xf5, 0x0, - 0x0, 0xf, 0xfc, 0x2, 0xff, 0x80, 0x6, 0xff, - 0x30, 0x9f, 0xf1, 0x0, 0x0, 0xc, 0xfe, 0x6, - 0xff, 0x30, 0x1, 0xff, 0x80, 0xdf, 0xe0, 0x0, - 0x0, 0x8, 0xff, 0x3a, 0xfe, 0x0, 0x0, 0xdf, - 0xc0, 0xff, 0xa0, 0x0, 0x0, 0x4, 0xff, 0x6e, - 0xfa, 0x0, 0x0, 0x7f, 0xf4, 0xff, 0x60, 0x0, - 0x0, 0x0, 0xff, 0x8f, 0xf5, 0x0, 0x0, 0x3f, - 0xf8, 0xff, 0x20, 0x0, 0x0, 0x0, 0xcf, 0xdf, - 0xf1, 0x0, 0x0, 0xe, 0xfc, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xc0, 0x0, 0x0, 0xa, - 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0x70, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x1f, 0xff, 0x20, 0x0, 0x0, 0x1, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xd, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf0, 0x0, 0x0, + 0xf, 0xf9, 0x0, 0x0, 0x0, 0xa, 0xfd, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x10, 0xdf, 0xc0, 0x0, + 0x0, 0x0, 0xef, 0xf1, 0x0, 0x0, 0x0, 0xbf, + 0xd0, 0x9, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x0, 0x0, 0xf, 0xfa, 0x0, 0x5f, 0xf4, + 0x0, 0x0, 0x8, 0xff, 0xfa, 0x0, 0x0, 0x2, + 0xff, 0x60, 0x1, 0xff, 0x70, 0x0, 0x0, 0xcf, + 0xcf, 0xe0, 0x0, 0x0, 0x6f, 0xf2, 0x0, 0xd, + 0xfb, 0x0, 0x0, 0x1f, 0xf5, 0xff, 0x30, 0x0, + 0xa, 0xfe, 0x0, 0x0, 0x9f, 0xf0, 0x0, 0x5, + 0xff, 0xc, 0xf7, 0x0, 0x0, 0xdf, 0xa0, 0x0, + 0x5, 0xff, 0x20, 0x0, 0xaf, 0xb0, 0x7f, 0xc0, + 0x0, 0x1f, 0xf6, 0x0, 0x0, 0x2f, 0xf6, 0x0, + 0xe, 0xf6, 0x3, 0xff, 0x0, 0x5, 0xff, 0x30, + 0x0, 0x0, 0xef, 0xa0, 0x3, 0xff, 0x10, 0xe, + 0xf5, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0xa, 0xfd, + 0x0, 0x7f, 0xd0, 0x0, 0xaf, 0x90, 0xc, 0xfb, + 0x0, 0x0, 0x0, 0x6f, 0xf1, 0xc, 0xf8, 0x0, + 0x5, 0xfd, 0x0, 0xff, 0x70, 0x0, 0x0, 0x2, + 0xff, 0x50, 0xff, 0x30, 0x0, 0x1f, 0xf2, 0x3f, + 0xf3, 0x0, 0x0, 0x0, 0xe, 0xf8, 0x5f, 0xe0, + 0x0, 0x0, 0xdf, 0x67, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xb9, 0xfa, 0x0, 0x0, 0x8, 0xfa, + 0x9f, 0xb0, 0x0, 0x0, 0x0, 0x7, 0xfd, 0xdf, + 0x50, 0x0, 0x0, 0x4f, 0xec, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x6f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xff, 0x80, + 0x0, 0x0, /* U+58 "X" */ - 0xbf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xf8, - 0x2f, 0xff, 0x20, 0x0, 0x0, 0x5, 0xff, 0xe1, - 0x7, 0xff, 0xa0, 0x0, 0x0, 0x1d, 0xff, 0x40, - 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x8f, 0xf9, 0x0, - 0x0, 0x3f, 0xfd, 0x0, 0x2, 0xff, 0xf1, 0x0, - 0x0, 0x8, 0xff, 0x80, 0xc, 0xff, 0x50, 0x0, - 0x0, 0x0, 0xdf, 0xe2, 0x4f, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xfa, 0xdf, 0xf2, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xa, 0xff, 0xff, 0x70, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xfb, 0xdf, 0xe2, 0x0, 0x0, - 0x0, 0x1, 0xdf, 0xf2, 0x4f, 0xfb, 0x0, 0x0, - 0x0, 0x9, 0xff, 0x80, 0xa, 0xff, 0x60, 0x0, - 0x0, 0x3f, 0xfe, 0x0, 0x1, 0xff, 0xe1, 0x0, - 0x0, 0xdf, 0xf4, 0x0, 0x0, 0x7f, 0xfa, 0x0, - 0x8, 0xff, 0xb0, 0x0, 0x0, 0xc, 0xff, 0x50, - 0x2f, 0xff, 0x20, 0x0, 0x0, 0x3, 0xff, 0xd1, - 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, + 0xb, 0xff, 0x50, 0x0, 0x0, 0x0, 0xb, 0xff, + 0x50, 0x2f, 0xfe, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xb0, 0x0, 0x7f, 0xf9, 0x0, 0x0, 0x1, 0xef, + 0xf2, 0x0, 0x0, 0xdf, 0xf3, 0x0, 0x0, 0x9f, + 0xf7, 0x0, 0x0, 0x3, 0xff, 0xd0, 0x0, 0x3f, + 0xfc, 0x0, 0x0, 0x0, 0x9, 0xff, 0x70, 0xd, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xe, 0xff, 0x27, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xfc, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xae, 0xfe, 0x10, 0x0, 0x0, 0x0, + 0x1, 0xff, 0xe1, 0x6f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xf5, 0x0, 0xbf, 0xf4, 0x0, 0x0, + 0x0, 0x5f, 0xfb, 0x0, 0x2, 0xff, 0xe0, 0x0, + 0x0, 0x1e, 0xff, 0x20, 0x0, 0x7, 0xff, 0x90, + 0x0, 0x9, 0xff, 0x70, 0x0, 0x0, 0xd, 0xff, + 0x30, 0x4, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x3f, + 0xfd, 0x0, 0xdf, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf7, /* U+59 "Y" */ - 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xe0, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xf6, 0x2, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x4f, - 0xfc, 0x0, 0xa, 0xff, 0x60, 0x0, 0x0, 0xc, - 0xff, 0x40, 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x4, - 0xff, 0xc0, 0x0, 0x0, 0x8f, 0xf6, 0x0, 0x0, - 0xcf, 0xf2, 0x0, 0x0, 0x1, 0xff, 0xd0, 0x0, - 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x8, 0xff, 0x60, - 0xc, 0xff, 0x20, 0x0, 0x0, 0x0, 0xe, 0xfd, - 0x15, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xf8, 0xef, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xc, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0x0, + 0x8f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0x40, 0xef, 0xe0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xb0, 0x6, 0xff, 0x80, 0x0, 0x0, 0x0, 0xbf, + 0xf3, 0x0, 0xd, 0xff, 0x10, 0x0, 0x0, 0x4f, + 0xfa, 0x0, 0x0, 0x5f, 0xf8, 0x0, 0x0, 0xc, + 0xff, 0x10, 0x0, 0x0, 0xcf, 0xf1, 0x0, 0x4, + 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, 0x90, 0x0, + 0xdf, 0xe1, 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, + 0x5f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, + 0xd, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xf8, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xb0, 0x0, 0x0, 0x0, /* U+5A "Z" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x24, - 0x44, 0x44, 0x44, 0x44, 0x8f, 0xfc, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1d, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xdf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, - 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x50, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xb0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xbf, 0xf5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1e, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x12, + 0x22, 0x22, 0x22, 0x22, 0x5f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1e, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xa2, 0x22, 0x22, 0x22, 0x22, 0x21, 0xdf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xad, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, /* U+5B "[" */ - 0xcb, 0xbb, 0xb3, 0xff, 0xff, 0xf4, 0xff, 0xe8, - 0x82, 0xff, 0xc0, 0x0, 0xff, 0xc0, 0x0, 0xff, - 0xc0, 0x0, 0xff, 0xc0, 0x0, 0xff, 0xc0, 0x0, - 0xff, 0xc0, 0x0, 0xff, 0xc0, 0x0, 0xff, 0xc0, - 0x0, 0xff, 0xc0, 0x0, 0xff, 0xc0, 0x0, 0xff, - 0xc0, 0x0, 0xff, 0xc0, 0x0, 0xff, 0xc0, 0x0, - 0xff, 0xc0, 0x0, 0xff, 0xc0, 0x0, 0xff, 0xc0, - 0x0, 0xff, 0xc0, 0x0, 0xff, 0xc0, 0x0, 0xff, - 0xc0, 0x0, 0xff, 0xc0, 0x0, 0xff, 0xc0, 0x0, - 0xff, 0xc0, 0x0, 0xff, 0xeb, 0xb3, 0xff, 0xff, - 0xf4, 0x44, 0x44, 0x41, + 0xff, 0xff, 0xf2, 0xff, 0xff, 0xf2, 0xff, 0x91, + 0x10, 0xff, 0x80, 0x0, 0xff, 0x80, 0x0, 0xff, + 0x80, 0x0, 0xff, 0x80, 0x0, 0xff, 0x80, 0x0, + 0xff, 0x80, 0x0, 0xff, 0x80, 0x0, 0xff, 0x80, + 0x0, 0xff, 0x80, 0x0, 0xff, 0x80, 0x0, 0xff, + 0x80, 0x0, 0xff, 0x80, 0x0, 0xff, 0x80, 0x0, + 0xff, 0x80, 0x0, 0xff, 0x80, 0x0, 0xff, 0x80, + 0x0, 0xff, 0x80, 0x0, 0xff, 0x80, 0x0, 0xff, + 0x80, 0x0, 0xff, 0x80, 0x0, 0xff, 0x80, 0x0, + 0xff, 0x91, 0x10, 0xff, 0xff, 0xf2, 0xff, 0xff, + 0xf2, /* U+5C "\\" */ - 0x5f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x9, 0xfe, 0x10, 0x0, - 0x0, 0x0, 0x2, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0x4, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf7, 0x0, 0x0, - 0x0, 0x0, 0xb, 0xfd, 0x0, 0x0, 0x0, 0x0, - 0x5, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xe1, 0x0, - 0x0, 0x0, 0x0, 0x2f, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0xd, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x1, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x4c, 0xc3, + 0x4f, 0xf2, 0x0, 0x0, 0x0, 0x0, 0xd, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xef, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x18, 0x81, /* U+5D "]" */ - 0x9b, 0xbb, 0xb6, 0xcf, 0xff, 0xf8, 0x68, 0xaf, - 0xf8, 0x0, 0x4f, 0xf8, 0x0, 0x4f, 0xf8, 0x0, - 0x4f, 0xf8, 0x0, 0x4f, 0xf8, 0x0, 0x4f, 0xf8, - 0x0, 0x4f, 0xf8, 0x0, 0x4f, 0xf8, 0x0, 0x4f, - 0xf8, 0x0, 0x4f, 0xf8, 0x0, 0x4f, 0xf8, 0x0, - 0x4f, 0xf8, 0x0, 0x4f, 0xf8, 0x0, 0x4f, 0xf8, - 0x0, 0x4f, 0xf8, 0x0, 0x4f, 0xf8, 0x0, 0x4f, - 0xf8, 0x0, 0x4f, 0xf8, 0x0, 0x4f, 0xf8, 0x0, - 0x4f, 0xf8, 0x0, 0x4f, 0xf8, 0x0, 0x4f, 0xf8, - 0x0, 0x4f, 0xf8, 0x9b, 0xcf, 0xf8, 0xcf, 0xff, - 0xf8, 0x34, 0x44, 0x42, + 0xef, 0xff, 0xf4, 0xef, 0xff, 0xf4, 0x1, 0x4f, + 0xf4, 0x0, 0x3f, 0xf4, 0x0, 0x3f, 0xf4, 0x0, + 0x3f, 0xf4, 0x0, 0x3f, 0xf4, 0x0, 0x3f, 0xf4, + 0x0, 0x3f, 0xf4, 0x0, 0x3f, 0xf4, 0x0, 0x3f, + 0xf4, 0x0, 0x3f, 0xf4, 0x0, 0x3f, 0xf4, 0x0, + 0x3f, 0xf4, 0x0, 0x3f, 0xf4, 0x0, 0x3f, 0xf4, + 0x0, 0x3f, 0xf4, 0x0, 0x3f, 0xf4, 0x0, 0x3f, + 0xf4, 0x0, 0x3f, 0xf4, 0x0, 0x3f, 0xf4, 0x0, + 0x3f, 0xf4, 0x0, 0x3f, 0xf4, 0x0, 0x3f, 0xf4, + 0x11, 0x4f, 0xf4, 0xef, 0xff, 0xf4, 0xef, 0xff, + 0xf4, /* U+5E "^" */ - 0x0, 0x4, 0xfd, 0x0, 0x0, 0x0, 0xa, 0xff, - 0x60, 0x0, 0x0, 0x1f, 0xff, 0xb0, 0x0, 0x0, - 0x8f, 0xef, 0xf2, 0x0, 0x0, 0xef, 0x7e, 0xf9, - 0x0, 0x5, 0xff, 0x27, 0xfe, 0x0, 0xb, 0xfb, - 0x1, 0xff, 0x60, 0x2f, 0xf5, 0x0, 0xaf, 0xc0, - 0x9f, 0xf0, 0x0, 0x4f, 0xf3, 0xff, 0x90, 0x0, - 0xe, 0xfa, + 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x50, 0x0, 0x0, 0x1, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x7f, 0xef, 0xf2, 0x0, 0x0, 0xd, + 0xf6, 0xcf, 0x80, 0x0, 0x4, 0xff, 0x5, 0xfe, + 0x0, 0x0, 0xbf, 0x90, 0xe, 0xf5, 0x0, 0x1f, + 0xf3, 0x0, 0x8f, 0xc0, 0x8, 0xfd, 0x0, 0x2, + 0xff, 0x20, 0xef, 0x60, 0x0, 0xc, 0xf9, /* U+5F "_" */ - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xae, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x11, 0x11, 0x11, - 0x11, 0x11, 0x11, 0x10, + 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x90, /* U+60 "`" */ - 0x6b, 0xb7, 0x0, 0xc, 0xff, 0x30, 0x1, 0xdf, - 0xc0, 0x0, 0x1d, 0xf7, + 0xc, 0xff, 0x20, 0x0, 0x1d, 0xfc, 0x0, 0x0, + 0x1e, 0xf7, 0x0, 0x0, 0x2f, 0xf2, /* U+61 "a" */ - 0x0, 0x2, 0xad, 0xff, 0xc7, 0x10, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x5, 0xff, 0xd5, - 0x13, 0x8f, 0xfc, 0x0, 0xaf, 0xf1, 0x0, 0x0, - 0xaf, 0xf3, 0x3, 0x43, 0x0, 0x0, 0x5, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, - 0x2, 0x67, 0x9b, 0xbc, 0xff, 0x80, 0x19, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0xb, 0xff, 0xc5, 0x44, - 0x47, 0xff, 0x84, 0xff, 0xb0, 0x0, 0x0, 0x4f, - 0xf8, 0x8f, 0xf4, 0x0, 0x0, 0x5, 0xff, 0x88, - 0xff, 0x40, 0x0, 0x1, 0xcf, 0xf8, 0x4f, 0xfc, - 0x20, 0x15, 0xdf, 0xff, 0x80, 0xcf, 0xff, 0xff, - 0xff, 0x7f, 0xf8, 0x1, 0xaf, 0xff, 0xfb, 0x20, - 0xff, 0xb0, 0x0, 0x4, 0x41, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xae, 0xff, 0xc7, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x9, 0xff, 0x93, + 0x12, 0x9f, 0xf9, 0x1, 0xff, 0x90, 0x0, 0x0, + 0xbf, 0xf0, 0x5, 0x51, 0x0, 0x0, 0x6, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf3, 0x0, + 0x6, 0xbe, 0xff, 0xff, 0xff, 0x30, 0x2d, 0xff, + 0xfe, 0xcc, 0xdf, 0xf3, 0xd, 0xfe, 0x50, 0x0, + 0x5, 0xff, 0x35, 0xff, 0x30, 0x0, 0x0, 0x5f, + 0xf3, 0x7f, 0xf0, 0x0, 0x0, 0x6, 0xff, 0x36, + 0xff, 0x50, 0x0, 0x1, 0xdf, 0xf3, 0x1f, 0xff, + 0x73, 0x48, 0xef, 0xff, 0x40, 0x6f, 0xff, 0xff, + 0xff, 0x9f, 0xf6, 0x0, 0x3a, 0xef, 0xe9, 0x20, + 0xbb, 0x70, /* U+62 "b" */ - 0x43, 0x30, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xc0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, 0x19, - 0xef, 0xea, 0x50, 0x0, 0xff, 0xdc, 0xff, 0xff, - 0xff, 0x60, 0xf, 0xff, 0xf8, 0x44, 0x8f, 0xff, - 0x40, 0xff, 0xf4, 0x0, 0x0, 0x6f, 0xfb, 0xf, - 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xf2, 0xff, 0xc0, - 0x0, 0x0, 0x6, 0xff, 0x4f, 0xfc, 0x0, 0x0, - 0x0, 0x4f, 0xf8, 0xff, 0xc0, 0x0, 0x0, 0x3, - 0xff, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xf8, - 0xff, 0xc0, 0x0, 0x0, 0x4, 0xff, 0x7f, 0xfc, - 0x0, 0x0, 0x0, 0x8f, 0xf4, 0xff, 0xe3, 0x0, - 0x0, 0x1e, 0xff, 0x1f, 0xff, 0xe4, 0x0, 0x3c, - 0xff, 0x80, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xc1, - 0xf, 0xf2, 0x3c, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x2, 0x42, 0x0, 0x0, 0x0, + 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf7, 0x19, 0xef, 0xea, 0x30, + 0x0, 0x1f, 0xfa, 0xff, 0xff, 0xff, 0xf6, 0x0, + 0x1f, 0xff, 0xe7, 0x33, 0x6e, 0xff, 0x30, 0x1f, + 0xfe, 0x20, 0x0, 0x2, 0xff, 0xb0, 0x1f, 0xf7, + 0x0, 0x0, 0x0, 0x9f, 0xf1, 0x1f, 0xf7, 0x0, + 0x0, 0x0, 0x4f, 0xf4, 0x1f, 0xf7, 0x0, 0x0, + 0x0, 0x2f, 0xf6, 0x1f, 0xf7, 0x0, 0x0, 0x0, + 0x1f, 0xf6, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x2f, + 0xf6, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xaf, 0xf1, 0x1f, + 0xfe, 0x20, 0x0, 0x2, 0xff, 0xb0, 0x1f, 0xff, + 0xe7, 0x32, 0x6e, 0xff, 0x30, 0x1f, 0xf9, 0xff, + 0xff, 0xff, 0xf6, 0x0, 0x1f, 0xf4, 0x29, 0xef, + 0xea, 0x30, 0x0, /* U+63 "c" */ - 0x0, 0x2, 0x9c, 0xff, 0xb6, 0x0, 0x0, 0x5, - 0xef, 0xff, 0xff, 0xfb, 0x10, 0x4, 0xff, 0xf5, - 0x23, 0x9f, 0xf9, 0x0, 0xcf, 0xf3, 0x0, 0x0, - 0xaf, 0xf2, 0x3f, 0xf9, 0x0, 0x0, 0x4, 0xff, - 0x47, 0xff, 0x40, 0x0, 0x0, 0x4, 0x42, 0x8f, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf1, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf7, 0x0, 0x0, 0x2, 0xbb, 0x40, - 0xef, 0xd1, 0x0, 0x0, 0x7f, 0xf3, 0x6, 0xff, - 0xc2, 0x0, 0x5e, 0xfd, 0x0, 0x9, 0xff, 0xfd, - 0xef, 0xff, 0x10, 0x0, 0x5, 0xdf, 0xff, 0xf9, - 0x10, 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, 0x0, + 0x0, 0x2, 0x9d, 0xff, 0xc7, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xfd, 0x10, 0x5, 0xff, 0xc4, + 0x12, 0x8f, 0xfc, 0x0, 0xef, 0xc0, 0x0, 0x0, + 0x5f, 0xf5, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0xdf, + 0x99, 0xff, 0x0, 0x0, 0x0, 0x2, 0x42, 0xbf, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, 0xad, 0x80, + 0xef, 0xc0, 0x0, 0x0, 0x3f, 0xf6, 0x5, 0xff, + 0xc4, 0x12, 0x7f, 0xfd, 0x0, 0x7, 0xff, 0xff, + 0xff, 0xfd, 0x10, 0x0, 0x2, 0x9d, 0xff, 0xc6, + 0x0, 0x0, /* U+64 "d" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x5a, - 0xef, 0xd7, 0x1c, 0xfc, 0x0, 0x6f, 0xff, 0xff, - 0xfc, 0xcf, 0xc0, 0x5f, 0xff, 0x74, 0x48, 0xff, - 0xfc, 0xc, 0xff, 0x30, 0x0, 0x6, 0xff, 0xc3, - 0xff, 0xa0, 0x0, 0x0, 0xc, 0xfc, 0x6f, 0xf5, - 0x0, 0x0, 0x0, 0xcf, 0xc8, 0xff, 0x40, 0x0, - 0x0, 0xc, 0xfc, 0xaf, 0xf0, 0x0, 0x0, 0x0, - 0xcf, 0xca, 0xff, 0x0, 0x0, 0x0, 0xc, 0xfc, - 0x8f, 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xc5, 0xff, - 0x60, 0x0, 0x0, 0xc, 0xfc, 0x1f, 0xfd, 0x0, - 0x0, 0x3, 0xff, 0xc0, 0x8f, 0xfc, 0x30, 0x5, - 0xef, 0xfc, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xbf, - 0xc0, 0x1, 0x9f, 0xff, 0xfc, 0x25, 0xfc, 0x0, - 0x0, 0x3, 0x42, 0x0, 0x0, 0x0, + 0x4, 0xbe, 0xfd, 0x80, 0xcf, 0xc0, 0x8, 0xff, + 0xff, 0xff, 0xdd, 0xfc, 0x6, 0xff, 0xd5, 0x23, + 0x8f, 0xff, 0xc0, 0xef, 0xd1, 0x0, 0x0, 0x4f, + 0xfc, 0x4f, 0xf6, 0x0, 0x0, 0x0, 0xcf, 0xc8, + 0xff, 0x0, 0x0, 0x0, 0xc, 0xfc, 0xaf, 0xe0, + 0x0, 0x0, 0x0, 0xcf, 0xcb, 0xfd, 0x0, 0x0, + 0x0, 0xc, 0xfc, 0xaf, 0xe0, 0x0, 0x0, 0x0, + 0xcf, 0xc8, 0xff, 0x0, 0x0, 0x0, 0xc, 0xfc, + 0x4f, 0xf6, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0xef, + 0xd0, 0x0, 0x0, 0x4f, 0xfc, 0x5, 0xff, 0xd5, + 0x23, 0x8f, 0xff, 0xc0, 0x8, 0xff, 0xff, 0xff, + 0xec, 0xfc, 0x0, 0x4, 0xbe, 0xfd, 0x81, 0x9f, + 0xc0, /* U+65 "e" */ - 0x0, 0x1, 0x9c, 0xfe, 0xb5, 0x0, 0x0, 0x4, - 0xef, 0xff, 0xff, 0xfa, 0x10, 0x2, 0xff, 0xf5, - 0x14, 0xaf, 0xf8, 0x0, 0xcf, 0xf2, 0x0, 0x0, - 0xcf, 0xe1, 0x3f, 0xf9, 0x0, 0x0, 0x5, 0xff, - 0x46, 0xff, 0x50, 0x0, 0x0, 0x3f, 0xf8, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x8c, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x9f, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x7, 0xff, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xe1, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, - 0xd4, 0x0, 0x2, 0x78, 0x0, 0x7, 0xff, 0xff, - 0xbd, 0xff, 0xd0, 0x0, 0x3, 0xbf, 0xff, 0xff, - 0xc4, 0x0, 0x0, 0x0, 0x2, 0x44, 0x10, 0x0, + 0x0, 0x1, 0x8d, 0xfe, 0xc6, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xfc, 0x10, 0x3, 0xff, 0xd4, + 0x12, 0x8f, 0xfa, 0x0, 0xcf, 0xd0, 0x0, 0x0, + 0x7f, 0xf3, 0x3f, 0xf4, 0x0, 0x0, 0x0, 0xff, + 0x88, 0xff, 0x0, 0x0, 0x0, 0xc, 0xfb, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0xbf, 0xd1, 0x11, 0x11, + 0x11, 0x11, 0x19, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xe1, 0x0, 0x0, 0x6, 0xb1, 0x4, 0xff, + 0xe6, 0x11, 0x3a, 0xff, 0x50, 0x5, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x1, 0x8d, 0xff, 0xd9, + 0x20, 0x0, /* U+66 "f" */ - 0x0, 0x0, 0x3, 0x77, 0x72, 0x0, 0x1, 0xaf, - 0xff, 0xf4, 0x0, 0x9, 0xff, 0xea, 0xa0, 0x0, - 0xf, 0xfe, 0x10, 0x0, 0x0, 0x3f, 0xf8, 0x0, - 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, 0x4f, - 0xf8, 0x0, 0x0, 0x6b, 0xcf, 0xfd, 0xbb, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0x0, 0x24, 0x7f, 0xfa, - 0x44, 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, - 0x4f, 0xf8, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, - 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, 0x4f, - 0xf8, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, - 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, 0x4f, 0xf8, - 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x0, - 0x4f, 0xf8, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x0, - 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, 0x19, + 0xff, 0xfb, 0x0, 0x0, 0xdf, 0xff, 0xfa, 0x0, + 0x7, 0xff, 0x91, 0x0, 0x0, 0xb, 0xfe, 0x0, + 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, 0xd, + 0xfb, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xd0, + 0x2f, 0xff, 0xff, 0xff, 0xc0, 0x0, 0xd, 0xfb, + 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, + 0xd, 0xfb, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, + 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, 0xd, + 0xfb, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, + 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, 0xd, 0xfb, + 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, + 0xd, 0xfb, 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, + 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, /* U+67 "g" */ - 0x0, 0x3, 0xad, 0xfe, 0x91, 0x3b, 0xb0, 0x6, - 0xff, 0xff, 0xff, 0xc7, 0xff, 0x2, 0xff, 0xf9, - 0x44, 0x8f, 0xff, 0xf0, 0xaf, 0xf6, 0x0, 0x0, - 0x3f, 0xff, 0x1f, 0xfd, 0x0, 0x0, 0x0, 0xcf, - 0xf4, 0xff, 0x70, 0x0, 0x0, 0xc, 0xff, 0x5f, - 0xf4, 0x0, 0x0, 0x0, 0xcf, 0xf8, 0xff, 0x40, - 0x0, 0x0, 0xc, 0xff, 0x8f, 0xf4, 0x0, 0x0, - 0x0, 0xcf, 0xf5, 0xff, 0x40, 0x0, 0x0, 0xc, - 0xff, 0x4f, 0xf9, 0x0, 0x0, 0x0, 0xcf, 0xf0, - 0xef, 0xe1, 0x0, 0x0, 0x2e, 0xff, 0x6, 0xff, - 0xc3, 0x0, 0x4c, 0xff, 0xf0, 0xb, 0xff, 0xff, - 0xff, 0xfe, 0xff, 0x0, 0x9, 0xff, 0xff, 0xc3, - 0xcf, 0xf0, 0x0, 0x0, 0x24, 0x20, 0xc, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xc0, 0x1, - 0x0, 0x0, 0x0, 0x7f, 0xf9, 0x0, 0xac, 0x75, - 0x36, 0xaf, 0xff, 0x10, 0xd, 0xff, 0xff, 0xff, - 0xfe, 0x40, 0x0, 0x17, 0xcf, 0xfd, 0xc7, 0x10, + 0x0, 0x5, 0xbe, 0xfd, 0x80, 0x8f, 0xd0, 0x9, + 0xff, 0xff, 0xff, 0xdb, 0xfd, 0x6, 0xff, 0xd5, + 0x23, 0x8f, 0xff, 0xd0, 0xef, 0xe1, 0x0, 0x0, + 0x4f, 0xfd, 0x4f, 0xf7, 0x0, 0x0, 0x0, 0xbf, + 0xd8, 0xff, 0x10, 0x0, 0x0, 0xb, 0xfd, 0xaf, + 0xf0, 0x0, 0x0, 0x0, 0xbf, 0xda, 0xfd, 0x0, + 0x0, 0x0, 0xb, 0xfd, 0xaf, 0xf0, 0x0, 0x0, + 0x0, 0xbf, 0xd8, 0xff, 0x10, 0x0, 0x0, 0xb, + 0xfd, 0x4f, 0xf6, 0x0, 0x0, 0x0, 0xcf, 0xd0, + 0xef, 0xd1, 0x0, 0x0, 0x4f, 0xfd, 0x5, 0xff, + 0xd5, 0x23, 0x8f, 0xff, 0xd0, 0x8, 0xff, 0xff, + 0xff, 0xdd, 0xfd, 0x0, 0x4, 0xbe, 0xfd, 0x81, + 0xbf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfb, + 0x0, 0x10, 0x0, 0x0, 0x1, 0xff, 0x90, 0x4e, + 0x20, 0x0, 0x0, 0x9f, 0xf4, 0xb, 0xff, 0x72, + 0x13, 0xaf, 0xfb, 0x0, 0x1c, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x5, 0xae, 0xfe, 0xb6, 0x0, 0x0, /* U+68 "h" */ - 0x43, 0x30, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xc0, 0x6d, 0xff, 0xb6, 0x0, - 0xff, 0xca, 0xff, 0xff, 0xff, 0xa0, 0xff, 0xff, - 0x74, 0x46, 0xff, 0xf4, 0xff, 0xf1, 0x0, 0x0, - 0x4f, 0xfc, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xfc, - 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xc, 0xff, + 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf7, 0x7, 0xdf, 0xfc, 0x50, 0x1, 0xff, 0x8d, + 0xff, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xf8, 0x33, + 0x7f, 0xff, 0x11, 0xff, 0xf3, 0x0, 0x0, 0x6f, + 0xf5, 0x1f, 0xf8, 0x0, 0x0, 0x1, 0xff, 0x71, + 0xff, 0x70, 0x0, 0x0, 0xf, 0xf8, 0x1f, 0xf7, + 0x0, 0x0, 0x0, 0xff, 0x81, 0xff, 0x70, 0x0, + 0x0, 0xf, 0xf8, 0x1f, 0xf7, 0x0, 0x0, 0x0, + 0xff, 0x81, 0xff, 0x70, 0x0, 0x0, 0xf, 0xf8, + 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xff, 0x81, 0xff, + 0x70, 0x0, 0x0, 0xf, 0xf8, 0x1f, 0xf7, 0x0, + 0x0, 0x0, 0xff, 0x81, 0xff, 0x70, 0x0, 0x0, + 0xf, 0xf8, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xff, + 0x80, /* U+69 "i" */ - 0x33, 0x3c, 0xff, 0xcf, 0xf6, 0x88, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xbb, 0xcf, 0xfc, 0xff, 0xcf, - 0xfc, 0xff, 0xcf, 0xfc, 0xff, 0xcf, 0xfc, 0xff, - 0xcf, 0xfc, 0xff, 0xcf, 0xfc, 0xff, 0xcf, 0xfc, - 0xff, + 0xa, 0xf8, 0xf, 0xfe, 0x8, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xfa, 0xd, 0xfa, 0xd, 0xfa, + 0xd, 0xfa, 0xd, 0xfa, 0xd, 0xfa, 0xd, 0xfa, + 0xd, 0xfa, 0xd, 0xfa, 0xd, 0xfa, 0xd, 0xfa, + 0xd, 0xfa, 0xd, 0xfa, 0xd, 0xfa, 0xd, 0xfa, /* U+6A "j" */ - 0x0, 0x3, 0x33, 0x0, 0xc, 0xff, 0x0, 0xc, - 0xff, 0x0, 0x3, 0x44, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xbb, - 0x0, 0xc, 0xff, 0x0, 0xc, 0xff, 0x0, 0xc, - 0xff, 0x0, 0xc, 0xff, 0x0, 0xc, 0xff, 0x0, - 0xc, 0xff, 0x0, 0xc, 0xff, 0x0, 0xc, 0xff, - 0x0, 0xc, 0xff, 0x0, 0xc, 0xff, 0x0, 0xc, - 0xff, 0x0, 0xc, 0xff, 0x0, 0xc, 0xff, 0x0, - 0xc, 0xff, 0x0, 0xc, 0xff, 0x0, 0xc, 0xff, - 0x0, 0xe, 0xfe, 0x33, 0x9f, 0xfa, 0xcf, 0xff, - 0xf1, 0xbf, 0xda, 0x10, + 0x0, 0xc, 0xf5, 0x0, 0x3f, 0xfa, 0x0, 0xb, + 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xf8, 0x0, 0xf, 0xf8, 0x0, 0xf, 0xf8, + 0x0, 0xf, 0xf8, 0x0, 0xf, 0xf8, 0x0, 0xf, + 0xf8, 0x0, 0xf, 0xf8, 0x0, 0xf, 0xf8, 0x0, + 0xf, 0xf8, 0x0, 0xf, 0xf8, 0x0, 0xf, 0xf8, + 0x0, 0xf, 0xf8, 0x0, 0xf, 0xf8, 0x0, 0xf, + 0xf8, 0x0, 0xf, 0xf8, 0x0, 0xf, 0xf8, 0x0, + 0xf, 0xf8, 0x0, 0x1f, 0xf6, 0x23, 0xaf, 0xf4, + 0xef, 0xff, 0xc0, 0xcf, 0xea, 0x10, /* U+6B "k" */ - 0x43, 0x30, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0xab, 0xb4, - 0xff, 0xc0, 0x0, 0x8, 0xff, 0xb0, 0xff, 0xc0, - 0x0, 0x3f, 0xfe, 0x10, 0xff, 0xc0, 0x1, 0xdf, - 0xf3, 0x0, 0xff, 0xc0, 0xa, 0xff, 0x70, 0x0, - 0xff, 0xc0, 0x5f, 0xfb, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0xff, 0xd4, 0x9f, 0xf9, 0x0, 0x0, - 0xff, 0xc0, 0xc, 0xff, 0x50, 0x0, 0xff, 0xc0, - 0x2, 0xff, 0xe1, 0x0, 0xff, 0xc0, 0x0, 0x7f, - 0xfa, 0x0, 0xff, 0xc0, 0x0, 0xc, 0xff, 0x70, - 0xff, 0xc0, 0x0, 0x2, 0xff, 0xe2, 0xff, 0xc0, - 0x0, 0x0, 0x6f, 0xfc, + 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x2e, 0xfe, + 0x20, 0x1f, 0xf7, 0x0, 0x1, 0xdf, 0xe2, 0x0, + 0x1f, 0xf7, 0x0, 0x1d, 0xff, 0x30, 0x0, 0x1f, + 0xf7, 0x0, 0xcf, 0xf4, 0x0, 0x0, 0x1f, 0xf7, + 0xc, 0xff, 0x50, 0x0, 0x0, 0x1f, 0xf7, 0xaf, + 0xf7, 0x0, 0x0, 0x0, 0x1f, 0xfd, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x1f, 0xff, 0xaa, 0xff, 0x60, 0x0, + 0x0, 0x1f, 0xfb, 0x0, 0xdf, 0xf2, 0x0, 0x0, + 0x1f, 0xf7, 0x0, 0x2f, 0xfd, 0x0, 0x0, 0x1f, + 0xf7, 0x0, 0x6, 0xff, 0x90, 0x0, 0x1f, 0xf7, + 0x0, 0x0, 0xaf, 0xf5, 0x0, 0x1f, 0xf7, 0x0, + 0x0, 0xd, 0xfe, 0x20, 0x1f, 0xf7, 0x0, 0x0, + 0x3, 0xff, 0xc0, /* U+6C "l" */ - 0x45, 0x4d, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, - 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, - 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, - 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, 0xfd, 0xdf, 0xdd, - 0xfd, + 0xdf, 0xad, 0xfa, 0xdf, 0xad, 0xfa, 0xdf, 0xad, + 0xfa, 0xdf, 0xad, 0xfa, 0xdf, 0xad, 0xfa, 0xdf, + 0xad, 0xfa, 0xdf, 0xad, 0xfa, 0xdf, 0xad, 0xfa, + 0xdf, 0xad, 0xfa, 0xdf, 0xad, 0xfa, 0xdf, 0xa0, /* U+6D "m" */ - 0xcb, 0x61, 0x7d, 0xff, 0xd5, 0x0, 0x19, 0xef, - 0xda, 0x20, 0xf, 0xf9, 0xcf, 0xff, 0xff, 0xf6, - 0x2d, 0xff, 0xff, 0xfe, 0x30, 0xff, 0xfd, 0x64, - 0x4a, 0xff, 0xeb, 0xf7, 0x44, 0xaf, 0xfb, 0xf, - 0xff, 0x10, 0x0, 0xb, 0xff, 0xf5, 0x0, 0x0, - 0xcf, 0xf3, 0xff, 0xc0, 0x0, 0x0, 0x5f, 0xfd, - 0x0, 0x0, 0x5, 0xff, 0x4f, 0xfc, 0x0, 0x0, - 0x4, 0xff, 0x90, 0x0, 0x0, 0x4f, 0xf8, 0xff, - 0xc0, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x4, - 0xff, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0xff, 0x80, - 0x0, 0x0, 0x4f, 0xf8, 0xff, 0xc0, 0x0, 0x0, - 0xf, 0xf8, 0x0, 0x0, 0x4, 0xff, 0x8f, 0xfc, - 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0x4f, - 0xf8, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xf8, 0x0, - 0x0, 0x4, 0xff, 0x8f, 0xfc, 0x0, 0x0, 0x0, - 0xff, 0x80, 0x0, 0x0, 0x4f, 0xf8, 0xff, 0xc0, - 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x4, 0xff, - 0x8f, 0xfc, 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, - 0x0, 0x4f, 0xf8, 0xff, 0xc0, 0x0, 0x0, 0xf, - 0xf8, 0x0, 0x0, 0x4, 0xff, 0x80, + 0x1f, 0xf5, 0x19, 0xdf, 0xeb, 0x40, 0x1, 0x9d, + 0xff, 0xc5, 0x0, 0x1f, 0xf9, 0xff, 0xff, 0xff, + 0xf5, 0x4f, 0xff, 0xff, 0xff, 0x80, 0x1f, 0xff, + 0xd5, 0x23, 0x8f, 0xff, 0xff, 0x73, 0x36, 0xef, + 0xf2, 0x1f, 0xfd, 0x0, 0x0, 0x7, 0xff, 0xf3, + 0x0, 0x0, 0x4f, 0xf7, 0x1f, 0xf7, 0x0, 0x0, + 0x2, 0xff, 0xb0, 0x0, 0x0, 0xf, 0xf9, 0x1f, + 0xf7, 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, + 0xe, 0xfa, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xff, + 0x80, 0x0, 0x0, 0xe, 0xfa, 0x1f, 0xf7, 0x0, + 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0xe, 0xfa, + 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, + 0x0, 0xe, 0xfa, 0x1f, 0xf7, 0x0, 0x0, 0x0, + 0xff, 0x80, 0x0, 0x0, 0xe, 0xfa, 0x1f, 0xf7, + 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0xe, + 0xfa, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0xe, 0xfa, 0x1f, 0xf7, 0x0, 0x0, + 0x0, 0xff, 0x80, 0x0, 0x0, 0xe, 0xfa, 0x1f, + 0xf7, 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, + 0xe, 0xfa, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xff, + 0x80, 0x0, 0x0, 0xe, 0xfa, /* U+6E "n" */ - 0xcb, 0x50, 0x7d, 0xff, 0xb6, 0x0, 0xff, 0x8a, - 0xff, 0xff, 0xff, 0xa0, 0xff, 0xef, 0x74, 0x46, - 0xef, 0xf4, 0xff, 0xf2, 0x0, 0x0, 0x4f, 0xfc, - 0xff, 0xc0, 0x0, 0x0, 0xe, 0xfc, 0xff, 0xc0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, - 0xff, 0xc0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xc, 0xff, + 0x1f, 0xf5, 0x7, 0xdf, 0xfc, 0x50, 0x1, 0xff, + 0x7d, 0xff, 0xff, 0xff, 0x70, 0x1f, 0xff, 0xf8, + 0x33, 0x7f, 0xff, 0x11, 0xff, 0xf3, 0x0, 0x0, + 0x6f, 0xf5, 0x1f, 0xf8, 0x0, 0x0, 0x1, 0xff, + 0x71, 0xff, 0x70, 0x0, 0x0, 0xf, 0xf8, 0x1f, + 0xf7, 0x0, 0x0, 0x0, 0xff, 0x81, 0xff, 0x70, + 0x0, 0x0, 0xf, 0xf8, 0x1f, 0xf7, 0x0, 0x0, + 0x0, 0xff, 0x81, 0xff, 0x70, 0x0, 0x0, 0xf, + 0xf8, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xff, 0x81, + 0xff, 0x70, 0x0, 0x0, 0xf, 0xf8, 0x1f, 0xf7, + 0x0, 0x0, 0x0, 0xff, 0x81, 0xff, 0x70, 0x0, + 0x0, 0xf, 0xf8, 0x1f, 0xf7, 0x0, 0x0, 0x0, + 0xff, 0x80, /* U+6F "o" */ - 0x0, 0x1, 0x8b, 0xff, 0xb8, 0x10, 0x0, 0x0, - 0x4e, 0xff, 0xff, 0xff, 0xd3, 0x0, 0x2, 0xff, - 0xf6, 0x23, 0x7f, 0xfe, 0x10, 0xb, 0xff, 0x30, - 0x0, 0x3, 0xff, 0xa0, 0x3f, 0xfa, 0x0, 0x0, - 0x0, 0xcf, 0xf2, 0x6f, 0xf4, 0x0, 0x0, 0x0, - 0x5f, 0xf4, 0x8f, 0xf2, 0x0, 0x0, 0x0, 0x4f, - 0xf8, 0xbf, 0xf0, 0x0, 0x0, 0x0, 0x3f, 0xf8, - 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x4f, 0xf8, 0x7f, - 0xf4, 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x4f, 0xf8, - 0x0, 0x0, 0x0, 0xaf, 0xf3, 0xd, 0xfe, 0x10, - 0x0, 0x1, 0xff, 0xc0, 0x4, 0xff, 0xc2, 0x0, - 0x4d, 0xff, 0x30, 0x0, 0x7f, 0xff, 0xee, 0xff, - 0xf6, 0x0, 0x0, 0x3, 0xdf, 0xff, 0xfb, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x0, - - /* U+70 "p" */ - 0xcb, 0x11, 0x9e, 0xfd, 0xa4, 0x0, 0xf, 0xf7, - 0xef, 0xff, 0xff, 0xf6, 0x0, 0xff, 0xff, 0x64, - 0x49, 0xff, 0xf4, 0xf, 0xff, 0x30, 0x0, 0x6, - 0xff, 0xa0, 0xff, 0xc0, 0x0, 0x0, 0xd, 0xff, - 0x2f, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xf4, 0xff, - 0xc0, 0x0, 0x0, 0x4, 0xff, 0x7f, 0xfc, 0x0, - 0x0, 0x0, 0x4f, 0xf8, 0xff, 0xc0, 0x0, 0x0, - 0x3, 0xff, 0x8f, 0xfc, 0x0, 0x0, 0x0, 0x4f, - 0xf6, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0x4f, - 0xfd, 0x0, 0x0, 0x1, 0xef, 0xf1, 0xff, 0xfa, - 0x20, 0x2, 0xcf, 0xf8, 0xf, 0xff, 0xff, 0xde, - 0xff, 0xfc, 0x10, 0xff, 0xc4, 0xef, 0xff, 0xf9, - 0x0, 0xf, 0xfc, 0x0, 0x24, 0x20, 0x0, 0x0, - 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xcc, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x8d, 0xff, 0xd8, 0x10, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x3, 0xff, + 0xe5, 0x11, 0x6e, 0xff, 0x30, 0xd, 0xfe, 0x10, + 0x0, 0x2, 0xef, 0xd0, 0x4f, 0xf6, 0x0, 0x0, + 0x0, 0x6f, 0xf3, 0x8f, 0xf0, 0x0, 0x0, 0x0, + 0x1f, 0xf8, 0xaf, 0xd0, 0x0, 0x0, 0x0, 0xe, + 0xfa, 0xbf, 0xc0, 0x0, 0x0, 0x0, 0xd, 0xfb, + 0xbf, 0xd0, 0x0, 0x0, 0x0, 0xd, 0xfa, 0x8f, + 0xf0, 0x0, 0x0, 0x0, 0xf, 0xf8, 0x4f, 0xf6, + 0x0, 0x0, 0x0, 0x6f, 0xf4, 0xd, 0xfe, 0x10, + 0x0, 0x1, 0xef, 0xd0, 0x3, 0xff, 0xd5, 0x11, + 0x5e, 0xff, 0x30, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x1, 0x8d, 0xff, 0xd8, 0x10, 0x0, + /* U+70 "p" */ + 0x1f, 0xf4, 0x29, 0xef, 0xea, 0x30, 0x0, 0x1f, + 0xf9, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x1f, 0xff, + 0xd6, 0x33, 0x8f, 0xff, 0x30, 0x1f, 0xfd, 0x10, + 0x0, 0x4, 0xff, 0xb0, 0x1f, 0xf7, 0x0, 0x0, + 0x0, 0xaf, 0xf0, 0x1f, 0xf7, 0x0, 0x0, 0x0, + 0x5f, 0xf3, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x3f, + 0xf5, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x2f, 0xf6, + 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x3f, 0xf5, 0x1f, + 0xf7, 0x0, 0x0, 0x0, 0x5f, 0xf3, 0x1f, 0xf7, + 0x0, 0x0, 0x0, 0xaf, 0xf0, 0x1f, 0xfc, 0x0, + 0x0, 0x3, 0xff, 0xa0, 0x1f, 0xff, 0xc4, 0x11, + 0x6f, 0xff, 0x20, 0x1f, 0xfc, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0x1f, 0xf7, 0x2a, 0xef, 0xea, 0x30, + 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, + /* U+71 "q" */ - 0x0, 0x5, 0xae, 0xfd, 0x71, 0x6b, 0x90, 0x6, - 0xff, 0xff, 0xff, 0xcc, 0xfc, 0x5, 0xff, 0xf6, - 0x22, 0x8f, 0xff, 0xc0, 0xcf, 0xf3, 0x0, 0x0, - 0x5f, 0xfc, 0x3f, 0xfa, 0x0, 0x0, 0x0, 0xff, - 0xc6, 0xff, 0x50, 0x0, 0x0, 0xf, 0xfc, 0x8f, - 0xf4, 0x0, 0x0, 0x0, 0xff, 0xca, 0xff, 0x0, - 0x0, 0x0, 0xf, 0xfc, 0xaf, 0xf0, 0x0, 0x0, - 0x0, 0xff, 0xc8, 0xff, 0x40, 0x0, 0x0, 0xf, - 0xfc, 0x5f, 0xf6, 0x0, 0x0, 0x0, 0xff, 0xc1, - 0xff, 0xd0, 0x0, 0x0, 0x3f, 0xfc, 0x8, 0xff, - 0xa1, 0x0, 0x4d, 0xff, 0xc0, 0x1d, 0xff, 0xfd, - 0xef, 0xff, 0xfc, 0x0, 0x19, 0xff, 0xff, 0xc3, - 0xff, 0xc0, 0x0, 0x0, 0x34, 0x20, 0xf, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xc0, 0x0, - 0x0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, - 0xf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, - 0x90, + 0x0, 0x5, 0xbe, 0xfd, 0x81, 0x9f, 0xc0, 0x9, + 0xff, 0xff, 0xff, 0xec, 0xfc, 0x7, 0xff, 0xd5, + 0x12, 0x7f, 0xff, 0xc0, 0xef, 0xd1, 0x0, 0x0, + 0x3f, 0xfc, 0x5f, 0xf6, 0x0, 0x0, 0x0, 0xcf, + 0xc8, 0xff, 0x10, 0x0, 0x0, 0xc, 0xfc, 0xaf, + 0xe0, 0x0, 0x0, 0x0, 0xcf, 0xcb, 0xfd, 0x0, + 0x0, 0x0, 0xc, 0xfc, 0xaf, 0xe0, 0x0, 0x0, + 0x0, 0xcf, 0xc8, 0xff, 0x0, 0x0, 0x0, 0xc, + 0xfc, 0x4f, 0xf6, 0x0, 0x0, 0x0, 0xcf, 0xc0, + 0xef, 0xd0, 0x0, 0x0, 0x3f, 0xfc, 0x6, 0xff, + 0xd4, 0x12, 0x6f, 0xff, 0xc0, 0x9, 0xff, 0xff, + 0xff, 0xee, 0xfc, 0x0, 0x5, 0xbe, 0xfd, 0x81, + 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xc0, /* U+72 "r" */ - 0xcb, 0x51, 0x9f, 0xf4, 0xff, 0x8d, 0xff, 0xf2, - 0xff, 0xdf, 0xa8, 0x80, 0xff, 0xf6, 0x0, 0x0, - 0xff, 0xc0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, - 0xff, 0xc0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, - 0xff, 0xc0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, - 0xff, 0xc0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, - 0xff, 0xc0, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, - 0xff, 0xc0, 0x0, 0x0, + 0x1f, 0xf6, 0x3b, 0xfe, 0x1, 0xff, 0xaf, 0xff, + 0xf1, 0x1f, 0xff, 0xfa, 0x77, 0x1, 0xff, 0xf3, + 0x0, 0x0, 0x1f, 0xf8, 0x0, 0x0, 0x1, 0xff, + 0x70, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, 0x1, + 0xff, 0x70, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x0, + 0x1, 0xff, 0x70, 0x0, 0x0, 0x1f, 0xf7, 0x0, + 0x0, 0x1, 0xff, 0x70, 0x0, 0x0, 0x1f, 0xf7, + 0x0, 0x0, 0x1, 0xff, 0x70, 0x0, 0x0, 0x1f, + 0xf7, 0x0, 0x0, 0x0, /* U+73 "s" */ - 0x0, 0x6, 0xbe, 0xfe, 0xa4, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x9, 0xff, 0xb3, - 0x5, 0xdf, 0xf7, 0x0, 0xff, 0xd0, 0x0, 0x1, - 0xef, 0xc0, 0xf, 0xfa, 0x0, 0x0, 0x6, 0x88, - 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0xfd, 0x94, 0x10, 0x0, 0x0, 0x2, 0xaf, - 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, 0x16, 0xaf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xe0, 0x47, 0x72, 0x0, 0x0, 0x9, 0xff, 0x35, - 0xff, 0x60, 0x0, 0x0, 0x9f, 0xf2, 0x1f, 0xfe, - 0x50, 0x0, 0x5e, 0xfe, 0x0, 0x4f, 0xff, 0xfb, - 0xff, 0xff, 0x30, 0x0, 0x2b, 0xff, 0xff, 0xfa, - 0x20, 0x0, 0x0, 0x0, 0x24, 0x30, 0x0, 0x0, + 0x0, 0x7, 0xcf, 0xfe, 0xa4, 0x0, 0x0, 0x1d, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xb, 0xff, 0x72, + 0x14, 0xdf, 0xf5, 0x1, 0xff, 0x80, 0x0, 0x1, + 0xef, 0xc0, 0x2f, 0xf6, 0x0, 0x0, 0x5, 0x87, + 0x0, 0xef, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xfe, 0xa6, 0x10, 0x0, 0x0, 0x2, 0x9e, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x3, 0x7b, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, + 0xd0, 0x7b, 0xa0, 0x0, 0x0, 0x8, 0xff, 0x7, + 0xff, 0x30, 0x0, 0x0, 0xaf, 0xf0, 0x1e, 0xff, + 0x72, 0x13, 0x9f, 0xf9, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x17, 0xcf, 0xfe, 0xb5, + 0x0, 0x0, /* U+74 "t" */ - 0x0, 0x13, 0x32, 0x0, 0x0, 0x4, 0xff, 0x80, - 0x0, 0x0, 0x4f, 0xf8, 0x0, 0x0, 0x4, 0xff, - 0x80, 0x0, 0x9b, 0xcf, 0xfd, 0xbb, 0x3c, 0xff, - 0xff, 0xff, 0xf4, 0x34, 0x7f, 0xfa, 0x44, 0x10, - 0x4, 0xff, 0x80, 0x0, 0x0, 0x4f, 0xf8, 0x0, - 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x4f, 0xf8, - 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x4f, - 0xf8, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, - 0x4f, 0xf8, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, - 0x0, 0x2f, 0xfb, 0x10, 0x0, 0x0, 0xcf, 0xff, - 0xf1, 0x0, 0x3, 0xdf, 0xff, 0x30, 0x0, 0x0, - 0x34, 0x20, + 0x0, 0x18, 0x82, 0x0, 0x0, 0x3, 0xff, 0x50, + 0x0, 0x0, 0x3f, 0xf5, 0x0, 0x0, 0x3, 0xff, + 0x50, 0x0, 0xef, 0xff, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x3f, 0xf5, 0x0, 0x0, + 0x3, 0xff, 0x50, 0x0, 0x0, 0x3f, 0xf5, 0x0, + 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x3f, 0xf5, + 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, 0x3f, + 0xf5, 0x0, 0x0, 0x3, 0xff, 0x50, 0x0, 0x0, + 0x3f, 0xf5, 0x0, 0x0, 0x2, 0xff, 0x60, 0x0, + 0x0, 0xf, 0xfc, 0x33, 0x0, 0x0, 0xaf, 0xff, + 0xf2, 0x0, 0x0, 0x9e, 0xfd, 0x20, /* U+75 "u" */ - 0xcb, 0x60, 0x0, 0x0, 0x9, 0xbb, 0xff, 0x80, - 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, 0x0, - 0xc, 0xff, 0xff, 0x80, 0x0, 0x0, 0xc, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, - 0x0, 0x0, 0xc, 0xff, 0xff, 0x80, 0x0, 0x0, - 0xc, 0xff, 0xff, 0x80, 0x0, 0x0, 0xc, 0xff, - 0xff, 0x80, 0x0, 0x0, 0xc, 0xff, 0xff, 0xb0, - 0x0, 0x0, 0xc, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0xc, 0xff, 0xcf, 0xe1, 0x0, 0x0, 0x3f, 0xff, - 0x6f, 0xf9, 0x10, 0x6, 0xef, 0xff, 0xd, 0xff, - 0xff, 0xff, 0xd9, 0xff, 0x1, 0xaf, 0xff, 0xfa, - 0x18, 0xff, 0x0, 0x0, 0x34, 0x10, 0x0, 0x0, + 0x2f, 0xf6, 0x0, 0x0, 0x0, 0xff, 0x82, 0xff, + 0x60, 0x0, 0x0, 0xf, 0xf8, 0x2f, 0xf6, 0x0, + 0x0, 0x0, 0xff, 0x82, 0xff, 0x60, 0x0, 0x0, + 0xf, 0xf8, 0x2f, 0xf6, 0x0, 0x0, 0x0, 0xff, + 0x82, 0xff, 0x60, 0x0, 0x0, 0xf, 0xf8, 0x2f, + 0xf6, 0x0, 0x0, 0x0, 0xff, 0x82, 0xff, 0x60, + 0x0, 0x0, 0xf, 0xf8, 0x2f, 0xf6, 0x0, 0x0, + 0x0, 0xff, 0x82, 0xff, 0x60, 0x0, 0x0, 0xf, + 0xf8, 0x1f, 0xf7, 0x0, 0x0, 0x0, 0xff, 0x80, + 0xef, 0xc0, 0x0, 0x0, 0x8f, 0xf8, 0x9, 0xff, + 0xa3, 0x24, 0xbf, 0xff, 0x80, 0x1e, 0xff, 0xff, + 0xff, 0xcf, 0xf8, 0x0, 0x19, 0xef, 0xfc, 0x60, + 0xef, 0x80, /* U+76 "v" */ - 0x3b, 0xb6, 0x0, 0x0, 0x0, 0x3b, 0xb5, 0xe, - 0xfc, 0x0, 0x0, 0x0, 0x9f, 0xf2, 0x9, 0xff, - 0x20, 0x0, 0x0, 0xef, 0xd0, 0x2, 0xff, 0x70, - 0x0, 0x3, 0xff, 0x60, 0x0, 0xdf, 0xc0, 0x0, - 0x9, 0xff, 0x10, 0x0, 0x6f, 0xf2, 0x0, 0xe, - 0xfa, 0x0, 0x0, 0x1f, 0xf7, 0x0, 0x3f, 0xf5, - 0x0, 0x0, 0xa, 0xfd, 0x0, 0x9f, 0xf0, 0x0, - 0x0, 0x5, 0xff, 0x30, 0xef, 0x90, 0x0, 0x0, - 0x0, 0xef, 0x92, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x9f, 0xd7, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xfc, 0xf7, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, - 0xf2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0x60, 0x0, + 0x5f, 0xf3, 0x0, 0x0, 0x0, 0xbf, 0xd0, 0xf, + 0xf8, 0x0, 0x0, 0x0, 0xff, 0x80, 0xa, 0xfd, + 0x0, 0x0, 0x5, 0xff, 0x20, 0x4, 0xff, 0x30, + 0x0, 0xa, 0xfc, 0x0, 0x0, 0xef, 0x80, 0x0, + 0xf, 0xf7, 0x0, 0x0, 0x9f, 0xd0, 0x0, 0x5f, + 0xf1, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0xaf, 0xb0, + 0x0, 0x0, 0xd, 0xf8, 0x0, 0xff, 0x60, 0x0, + 0x0, 0x8, 0xfd, 0x4, 0xff, 0x10, 0x0, 0x0, + 0x2, 0xff, 0x39, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x8e, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xfe, 0x0, 0x0, 0x0, /* U+77 "w" */ - 0x3b, 0xb6, 0x0, 0x0, 0x8, 0xb9, 0x0, 0x0, - 0x5, 0xbb, 0x51, 0xff, 0xc0, 0x0, 0x0, 0xff, - 0xf1, 0x0, 0x0, 0xaf, 0xf2, 0xb, 0xff, 0x0, - 0x0, 0x4f, 0xff, 0x60, 0x0, 0xe, 0xfe, 0x0, - 0x7f, 0xf4, 0x0, 0x9, 0xff, 0xfb, 0x0, 0x1, - 0xff, 0x90, 0x2, 0xff, 0x80, 0x0, 0xef, 0x8f, - 0xe0, 0x0, 0x5f, 0xf5, 0x0, 0xe, 0xfc, 0x0, - 0x3f, 0xf1, 0xff, 0x50, 0x9, 0xff, 0x0, 0x0, - 0x9f, 0xf0, 0x9, 0xfd, 0xb, 0xfa, 0x0, 0xcf, - 0xb0, 0x0, 0x5, 0xff, 0x40, 0xdf, 0x70, 0x6f, - 0xe0, 0xf, 0xf6, 0x0, 0x0, 0xf, 0xf8, 0x2f, - 0xf2, 0x1, 0xff, 0x44, 0xff, 0x20, 0x0, 0x0, - 0xbf, 0xc7, 0xfd, 0x0, 0xc, 0xf9, 0x8f, 0xd0, - 0x0, 0x0, 0x6, 0xfe, 0xaf, 0x90, 0x0, 0x7f, - 0xcb, 0xf9, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0xf3, - 0x0, 0x2, 0xfe, 0xdf, 0x40, 0x0, 0x0, 0x0, - 0xdf, 0xfe, 0x0, 0x0, 0xd, 0xff, 0xf0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, 0x0, 0x7f, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf3, 0x0, - 0x0, 0x2, 0xff, 0x60, 0x0, 0x0, + 0x4f, 0xf3, 0x0, 0x0, 0xa, 0xfa, 0x0, 0x0, + 0x4, 0xff, 0x30, 0xff, 0x70, 0x0, 0x0, 0xff, + 0xf0, 0x0, 0x0, 0x8f, 0xf0, 0xb, 0xfc, 0x0, + 0x0, 0x4f, 0xff, 0x40, 0x0, 0xc, 0xfa, 0x0, + 0x6f, 0xf0, 0x0, 0x9, 0xff, 0xf9, 0x0, 0x0, + 0xff, 0x60, 0x1, 0xff, 0x40, 0x0, 0xef, 0x7f, + 0xe0, 0x0, 0x4f, 0xf1, 0x0, 0xd, 0xf8, 0x0, + 0x3f, 0xd0, 0xff, 0x30, 0x8, 0xfc, 0x0, 0x0, + 0x8f, 0xc0, 0x8, 0xf8, 0xa, 0xf8, 0x0, 0xcf, + 0x80, 0x0, 0x4, 0xff, 0x0, 0xdf, 0x30, 0x5f, + 0xd0, 0xf, 0xf3, 0x0, 0x0, 0xf, 0xf4, 0x2f, + 0xe0, 0x0, 0xff, 0x24, 0xfe, 0x0, 0x0, 0x0, + 0xbf, 0x97, 0xfa, 0x0, 0xb, 0xf7, 0x8f, 0xa0, + 0x0, 0x0, 0x6, 0xfd, 0xcf, 0x50, 0x0, 0x6f, + 0xcc, 0xf5, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf0, + 0x0, 0x1, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, + 0xdf, 0xfb, 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0x60, 0x0, 0x0, 0x7f, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf1, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, /* U+78 "x" */ - 0xb, 0xbb, 0x10, 0x0, 0x1, 0xbb, 0xb1, 0x7, - 0xff, 0xa0, 0x0, 0xa, 0xff, 0x70, 0x0, 0xcf, - 0xf3, 0x0, 0x4f, 0xfc, 0x0, 0x0, 0x2f, 0xfb, - 0x0, 0xcf, 0xf2, 0x0, 0x0, 0x7, 0xff, 0x56, - 0xff, 0x70, 0x0, 0x0, 0x0, 0xcf, 0xdd, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xf3, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xa0, 0x0, 0x0, - 0x0, 0x0, 0x2e, 0xff, 0xe2, 0x0, 0x0, 0x0, - 0x0, 0xcf, 0xfe, 0xfb, 0x0, 0x0, 0x0, 0x7, - 0xff, 0x65, 0xff, 0x70, 0x0, 0x0, 0x2e, 0xfd, - 0x0, 0xcf, 0xe2, 0x0, 0x0, 0xcf, 0xf4, 0x0, - 0x3f, 0xfb, 0x0, 0x7, 0xff, 0xa0, 0x0, 0x9, - 0xff, 0x70, 0x2e, 0xff, 0x10, 0x0, 0x1, 0xff, - 0xe2, + 0xe, 0xfe, 0x0, 0x0, 0x2, 0xff, 0xc0, 0x4, + 0xff, 0x80, 0x0, 0xc, 0xff, 0x20, 0x0, 0xaf, + 0xf2, 0x0, 0x5f, 0xf7, 0x0, 0x0, 0x1e, 0xfb, + 0x1, 0xef, 0xc0, 0x0, 0x0, 0x5, 0xff, 0x59, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xbf, 0xef, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0xd0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xde, 0xfa, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x36, 0xff, 0x40, 0x0, 0x0, 0x2f, 0xfa, + 0x0, 0xcf, 0xe0, 0x0, 0x0, 0xcf, 0xe1, 0x0, + 0x3f, 0xf9, 0x0, 0x7, 0xff, 0x60, 0x0, 0x9, + 0xff, 0x40, 0x2f, 0xfc, 0x0, 0x0, 0x0, 0xef, + 0xe0, /* U+79 "y" */ - 0x6b, 0xb6, 0x0, 0x0, 0x0, 0x6b, 0xb6, 0x2f, - 0xfc, 0x0, 0x0, 0x0, 0xcf, 0xf3, 0xd, 0xff, - 0x20, 0x0, 0x1, 0xff, 0xe0, 0x6, 0xff, 0x70, - 0x0, 0x6, 0xff, 0x70, 0x1, 0xff, 0xc0, 0x0, - 0xb, 0xff, 0x20, 0x0, 0xaf, 0xf2, 0x0, 0x1f, - 0xfb, 0x0, 0x0, 0x4f, 0xf7, 0x0, 0x6f, 0xf6, - 0x0, 0x0, 0xe, 0xfc, 0x0, 0xbf, 0xf1, 0x0, - 0x0, 0x8, 0xff, 0x21, 0xff, 0xa0, 0x0, 0x0, - 0x2, 0xff, 0x76, 0xff, 0x50, 0x0, 0x0, 0x0, - 0xcf, 0xcb, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xfe, 0xf9, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x70, 0x0, - 0x0, 0x0, 0x0, 0x8, 0xff, 0x20, 0x0, 0x0, - 0x0, 0x0, 0xe, 0xfb, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xf6, 0x0, 0x0, 0x0, 0x1, 0x37, - 0xff, 0xd0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x6, 0xfe, 0xb2, 0x0, - 0x0, 0x0, 0x0, + 0x8f, 0xf3, 0x0, 0x0, 0x0, 0xef, 0xb2, 0xff, + 0x80, 0x0, 0x0, 0x4f, 0xf6, 0xd, 0xfe, 0x0, + 0x0, 0x9, 0xff, 0x10, 0x7f, 0xf3, 0x0, 0x0, + 0xef, 0xb0, 0x1, 0xff, 0x90, 0x0, 0x3f, 0xf5, + 0x0, 0xb, 0xfe, 0x0, 0x8, 0xff, 0x0, 0x0, + 0x6f, 0xf3, 0x0, 0xdf, 0xa0, 0x0, 0x0, 0xff, + 0x90, 0x2f, 0xf5, 0x0, 0x0, 0xa, 0xfe, 0x7, + 0xff, 0x0, 0x0, 0x0, 0x5f, 0xf3, 0xcf, 0xa0, + 0x0, 0x0, 0x0, 0xef, 0xaf, 0xf4, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x1f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xfd, 0x0, 0x0, 0x0, 0x3, 0x49, 0xff, + 0x50, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0xb, 0xfe, 0x70, 0x0, 0x0, 0x0, + 0x0, /* U+7A "z" */ - 0x6b, 0xbb, 0xbb, 0xbb, 0xbb, 0xb6, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x24, 0x44, 0x44, 0x44, - 0xff, 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x80, - 0x0, 0x0, 0x0, 0x5f, 0xfc, 0x0, 0x0, 0x0, - 0x2, 0xef, 0xf1, 0x0, 0x0, 0x0, 0xd, 0xff, - 0x40, 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2e, - 0xff, 0x10, 0x0, 0x0, 0x0, 0xcf, 0xf4, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x4f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x1, 0x11, 0x11, 0x12, + 0xef, 0xe1, 0x0, 0x0, 0x0, 0xa, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x6f, 0xf8, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xd, 0xfe, + 0x10, 0x0, 0x0, 0x0, 0xaf, 0xf4, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x2f, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xf2, 0x0, + 0x0, 0x0, 0x9, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x5f, 0xfa, 0x11, 0x11, 0x11, 0x10, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, /* U+7B "{" */ - 0x0, 0x0, 0x0, 0x6, 0x80, 0x0, 0x0, 0x3, - 0xdf, 0xf0, 0x0, 0x0, 0x2e, 0xfd, 0x20, 0x0, - 0x0, 0xaf, 0xf2, 0x0, 0x0, 0x0, 0xff, 0xb0, - 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, 0x4, - 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, - 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, - 0x70, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, 0x0, - 0x1d, 0xff, 0x0, 0x0, 0x27, 0xdf, 0xf6, 0x0, - 0x0, 0x4f, 0xff, 0x70, 0x0, 0x0, 0x2b, 0xff, - 0xe4, 0x0, 0x0, 0x0, 0x2f, 0xfd, 0x0, 0x0, - 0x0, 0x9, 0xff, 0x40, 0x0, 0x0, 0x4, 0xff, - 0x60, 0x0, 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, - 0x4, 0xff, 0x80, 0x0, 0x0, 0x4, 0xff, 0x80, - 0x0, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, 0x0, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0xaf, 0xe1, 0x0, - 0x0, 0x0, 0x2f, 0xfb, 0x10, 0x0, 0x0, 0x3, - 0xff, 0xe1, 0x0, 0x0, 0x0, 0x18, 0xb0, + 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, + 0x6e, 0xe0, 0x0, 0x0, 0x9, 0xff, 0x90, 0x0, + 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0xdf, 0xc0, + 0x0, 0x0, 0x0, 0xff, 0x70, 0x0, 0x0, 0x2, + 0xff, 0x50, 0x0, 0x0, 0x3, 0xff, 0x40, 0x0, + 0x0, 0x3, 0xff, 0x40, 0x0, 0x0, 0x3, 0xff, + 0x40, 0x0, 0x0, 0x4, 0xff, 0x30, 0x0, 0x0, + 0x9, 0xff, 0x0, 0x0, 0x1, 0x6f, 0xf9, 0x0, + 0x0, 0x1f, 0xff, 0xa0, 0x0, 0x0, 0x2f, 0xff, + 0xa0, 0x0, 0x0, 0x1, 0x7f, 0xf8, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x0, 0x0, 0x0, 0x5, 0xff, + 0x30, 0x0, 0x0, 0x3, 0xff, 0x40, 0x0, 0x0, + 0x3, 0xff, 0x40, 0x0, 0x0, 0x3, 0xff, 0x40, + 0x0, 0x0, 0x2, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xff, 0x70, 0x0, 0x0, 0x0, 0xdf, 0xb0, 0x0, + 0x0, 0x0, 0x6f, 0xf5, 0x0, 0x0, 0x0, 0xa, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x6e, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x30, /* U+7C "|" */ - 0xee, 0x9f, 0xfa, 0xff, 0xaf, 0xfa, 0xff, 0xaf, - 0xfa, 0xff, 0xaf, 0xfa, 0xff, 0xaf, 0xfa, 0xff, - 0xaf, 0xfa, 0xff, 0xaf, 0xfa, 0xff, 0xaf, 0xfa, - 0xff, 0xaf, 0xfa, 0xff, 0xaf, 0xfa, 0xff, 0xaf, - 0xfa, 0xff, 0xaa, 0xa7, + 0x9f, 0x79, 0xf7, 0x9f, 0x79, 0xf7, 0x9f, 0x79, + 0xf7, 0x9f, 0x79, 0xf7, 0x9f, 0x79, 0xf7, 0x9f, + 0x79, 0xf7, 0x9f, 0x79, 0xf7, 0x9f, 0x79, 0xf7, + 0x9f, 0x79, 0xf7, 0x9f, 0x79, 0xf7, 0x9f, 0x79, + 0xf7, 0x9f, 0x74, 0x83, /* U+7D "}" */ - 0x48, 0x20, 0x0, 0x0, 0x9, 0xff, 0x70, 0x0, - 0x0, 0x7, 0xff, 0x90, 0x0, 0x0, 0xa, 0xff, - 0x10, 0x0, 0x0, 0x3f, 0xf7, 0x0, 0x0, 0x0, - 0xff, 0xa0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, - 0x0, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xfc, 0x0, - 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0xc, 0xfe, - 0x0, 0x0, 0x0, 0x8f, 0xf7, 0x0, 0x0, 0x1, - 0xdf, 0xf9, 0x40, 0x0, 0x1, 0xdf, 0xf8, 0x0, - 0x0, 0xaf, 0xfd, 0x50, 0x0, 0x6f, 0xf7, 0x0, - 0x0, 0xc, 0xff, 0x0, 0x0, 0x0, 0xff, 0xc0, - 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, 0xff, - 0xc0, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x0, - 0xff, 0xa0, 0x0, 0x0, 0x3f, 0xf8, 0x0, 0x0, - 0x9, 0xff, 0x20, 0x0, 0x6, 0xff, 0x90, 0x0, - 0x9, 0xff, 0xa0, 0x0, 0x0, 0x5b, 0x40, 0x0, - 0x0, 0x0, + 0x11, 0x0, 0x0, 0x0, 0x7, 0xfa, 0x10, 0x0, + 0x0, 0x4d, 0xfe, 0x20, 0x0, 0x0, 0x1d, 0xfd, + 0x0, 0x0, 0x0, 0x5f, 0xf4, 0x0, 0x0, 0x0, + 0xff, 0x70, 0x0, 0x0, 0xe, 0xf9, 0x0, 0x0, + 0x0, 0xef, 0xa0, 0x0, 0x0, 0xe, 0xfa, 0x0, + 0x0, 0x0, 0xdf, 0xa0, 0x0, 0x0, 0xc, 0xfb, + 0x0, 0x0, 0x0, 0x9f, 0xe0, 0x0, 0x0, 0x2, + 0xff, 0xb2, 0x0, 0x0, 0x4, 0xef, 0xf8, 0x0, + 0x0, 0x3d, 0xff, 0x90, 0x0, 0x2f, 0xfc, 0x30, + 0x0, 0x9, 0xff, 0x10, 0x0, 0x0, 0xcf, 0xb0, + 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, 0x0, 0xef, + 0xa0, 0x0, 0x0, 0xe, 0xfa, 0x0, 0x0, 0x0, + 0xef, 0x90, 0x0, 0x0, 0xf, 0xf7, 0x0, 0x0, + 0x5, 0xff, 0x40, 0x0, 0x0, 0xdf, 0xd0, 0x0, + 0x4, 0xdf, 0xe2, 0x0, 0x0, 0x8f, 0xb1, 0x0, + 0x0, 0x1, 0x20, 0x0, 0x0, 0x0, /* U+7E "~" */ - 0x0, 0x3a, 0xef, 0xa4, 0x0, 0x0, 0x0, 0x33, - 0x10, 0x3e, 0xff, 0xff, 0xfa, 0x10, 0x0, 0xd, - 0xf3, 0xc, 0xfd, 0x66, 0xcf, 0xfd, 0x40, 0x6, - 0xff, 0x1, 0xff, 0x10, 0x0, 0x7f, 0xff, 0xcc, - 0xff, 0x80, 0x2a, 0x90, 0x0, 0x0, 0x3e, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0x87, 0x30, 0x0, + 0x0, 0x0, 0x22, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xdf, 0xff, 0xa1, 0x0, 0x0, 0xc, + 0xd3, 0x3, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x2, + 0xff, 0x10, 0xcf, 0xc2, 0x6, 0xef, 0xf9, 0x45, + 0xdf, 0xb0, 0x1f, 0xf2, 0x0, 0x1, 0xcf, 0xff, + 0xff, 0xe2, 0x1, 0x88, 0x0, 0x0, 0x0, 0x6c, + 0xfe, 0xa1, 0x0, /* U+F001 "" */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0x6c, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x38, 0xdf, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x9e, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x1, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x38, 0xdf, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x15, 0xae, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x7c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb6, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xfa, 0x50, 0x0, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x93, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xd7, 0x20, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x2, - 0x8c, 0xff, 0xc8, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x2, 0x8c, 0xff, 0xc8, 0xff, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0xf6, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x2, 0x9d, 0xff, 0xd9, 0x20, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2, 0x9d, 0xff, 0xd9, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe9, 0xbf, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x73, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfe, 0xa5, 0x10, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0x7a, 0xcb, + 0xcf, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, + 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, + 0x33, 0x2f, 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x3, 0xcf, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf4, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xfb, 0x20, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x32, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x27, 0xaa, 0x95, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F008 "" */ - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x30, - 0x3, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0x30, 0x3, 0xff, 0xff, 0x0, 0x0, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0xff, 0xff, 0x30, 0x3, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, - 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x30, 0x3, 0xff, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, 0xff, 0x0, - 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x0, 0x0, 0xff, 0xff, 0x30, 0x3, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, - 0xff, 0x30, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x3, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x3, - 0xff, 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, 0xff, - 0x30, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x30, 0x3, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x30, 0x3, 0xff, 0xff, 0x0, 0x0, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, - 0xff, 0xff, 0x30, 0x3, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3, 0xff, 0x30, 0x3, 0xff, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x1c, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, + 0x9b, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb9, 0xfe, 0x44, + 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x44, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x88, 0x8f, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf8, 0x88, 0xff, + 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, 0xfc, 0x0, + 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xb0, 0x0, 0xcf, 0xfd, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xcc, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfc, 0xcc, 0xff, 0xfc, 0x0, + 0xc, 0xff, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, + 0xff, 0xc0, 0x0, 0xcf, 0xfc, 0x0, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0xcf, 0xfc, 0x0, 0xc, 0xff, 0xdd, 0xdd, + 0xdd, 0xdd, 0xdd, 0xdd, 0xff, 0xc0, 0x0, 0xcf, + 0xff, 0xcc, 0xcf, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xfc, 0xcc, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xff, 0xfd, 0x0, 0xd, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, + 0x0, 0xdf, 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, + 0xfc, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xb0, 0x0, 0xcf, 0xff, 0x88, + 0x8f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xf8, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x44, 0x4e, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0x44, 0xef, + 0xab, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xb0, 0x0, 0xb9, /* U+F00B "" */ - 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xfc, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfc, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x21, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, - 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, + 0x9f, 0xff, 0xff, 0xfb, 0x0, 0xaf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, /* U+F00C "" */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x5, 0xe9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0xaf, 0xb1, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xff, 0x30, 0xa, 0xff, 0xfc, 0x10, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0xaf, 0xff, 0xff, 0xc1, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0x96, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x9b, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x8e, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xa, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf6, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x6f, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xf6, 0x6, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xe7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F00D "" */ - 0x0, 0x1, 0x30, 0x0, 0x0, 0x0, 0x0, 0x4, - 0x10, 0x0, 0x0, 0x3e, 0xfb, 0x10, 0x0, 0x0, - 0x0, 0xaf, 0xe3, 0x0, 0x3, 0xef, 0xff, 0xc1, - 0x0, 0x0, 0xa, 0xff, 0xfe, 0x30, 0x1e, 0xff, - 0xff, 0xfc, 0x10, 0x0, 0xaf, 0xff, 0xff, 0xe1, - 0x4f, 0xff, 0xff, 0xff, 0xc1, 0xa, 0xff, 0xff, - 0xff, 0xf4, 0xa, 0xff, 0xff, 0xff, 0xfc, 0x9f, - 0xff, 0xff, 0xff, 0xc0, 0x0, 0xaf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xa, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, - 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xc1, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x10, 0xa, 0xff, 0xff, 0xff, - 0xfd, 0xaf, 0xff, 0xff, 0xff, 0xb0, 0x4f, 0xff, - 0xff, 0xff, 0xd1, 0xa, 0xff, 0xff, 0xff, 0xf4, - 0x1f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0xaf, 0xff, - 0xff, 0xf1, 0x3, 0xff, 0xff, 0xd1, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x30, 0x0, 0x3f, 0xfc, 0x10, - 0x0, 0x0, 0x0, 0xaf, 0xf3, 0x0, 0x0, 0x1, - 0x40, 0x0, 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x2d, 0xfa, 0x0, 0x6f, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xa0, 0xef, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xf2, + 0xcf, 0xff, 0xff, 0xf5, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf1, 0x2e, 0xff, 0xff, 0xff, 0x50, 0x2e, + 0xff, 0xff, 0xff, 0x50, 0x2, 0xef, 0xff, 0xff, + 0xf7, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x2e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xf6, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x2e, 0xff, + 0xff, 0xff, 0x40, 0x2e, 0xff, 0xff, 0xff, 0x50, + 0xcf, 0xff, 0xff, 0xf4, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf1, 0xef, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x2e, 0xff, 0xff, 0xf2, 0x6f, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xa0, 0x6, 0xff, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, /* U+F011 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4e, 0xe4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x69, 0x96, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5e, 0xd4, 0x0, 0xff, 0xff, 0x0, - 0x4d, 0xe5, 0x0, 0x0, 0x0, 0x6, 0xff, 0xfd, - 0x0, 0xff, 0xff, 0x0, 0xef, 0xff, 0x60, 0x0, - 0x0, 0x5f, 0xff, 0xfe, 0x0, 0xff, 0xff, 0x0, - 0xef, 0xff, 0xf5, 0x0, 0x1, 0xef, 0xff, 0xf6, - 0x0, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xfe, 0x10, - 0xa, 0xff, 0xff, 0x60, 0x0, 0xff, 0xff, 0x0, - 0x6, 0xff, 0xff, 0xa0, 0x1f, 0xff, 0xf7, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x7f, 0xff, 0xf1, - 0x6f, 0xff, 0xd0, 0x0, 0x0, 0xff, 0xff, 0x0, - 0x0, 0xe, 0xff, 0xf6, 0xcf, 0xff, 0x70, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x7, 0xff, 0xfc, - 0xcf, 0xff, 0x30, 0x0, 0x0, 0xff, 0xfe, 0x0, - 0x0, 0x4, 0xff, 0xfc, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x4f, 0xf4, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xdf, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xfd, - 0xbf, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7, 0xff, 0xfb, 0x6f, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf6, - 0x2f, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xf2, 0xa, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xa0, - 0x1, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xff, 0x10, 0x0, 0x5f, 0xff, 0xff, - 0xd6, 0x30, 0x3, 0x6d, 0xff, 0xff, 0xf5, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x6b, 0xdf, 0xfd, 0xb6, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xa8, 0x0, 0x3, + 0xff, 0xff, 0x30, 0x0, 0x8a, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0x60, 0x3, 0xff, 0xff, + 0x30, 0x6, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x2, + 0xef, 0xff, 0xe0, 0x3, 0xff, 0xff, 0x30, 0xe, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xd, 0xff, 0xff, + 0xe0, 0x3, 0xff, 0xff, 0x30, 0xe, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x9f, 0xff, 0xfe, 0x30, 0x3, + 0xff, 0xff, 0x30, 0x3, 0xef, 0xff, 0xf9, 0x0, + 0x2, 0xff, 0xff, 0xe2, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x2e, 0xff, 0xff, 0x20, 0x9, 0xff, + 0xff, 0x50, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x5, 0xff, 0xff, 0x90, 0xe, 0xff, 0xfc, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, 0x0, 0xcf, + 0xff, 0xe0, 0x3f, 0xff, 0xf5, 0x0, 0x0, 0x3, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x6f, 0xff, 0xf3, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x30, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x7f, 0xff, + 0xe0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x30, 0x0, + 0x0, 0xe, 0xff, 0xf8, 0x8f, 0xff, 0xd0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, 0x0, 0xd, + 0xff, 0xf8, 0x8f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0xef, 0xfe, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf7, + 0x6f, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x2, 0x20, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xf6, 0x3f, 0xff, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xf3, 0xe, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xe0, 0x9, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x90, + 0x2, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0x20, 0x0, 0x9f, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xf9, 0x0, 0x0, 0x1e, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xd1, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfa, + 0x75, 0x57, 0xaf, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x9d, + 0xff, 0xfe, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F013 "" */ - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6a, 0x30, 0xa, 0xff, 0xff, 0x90, - 0x3, 0xa6, 0x0, 0x0, 0x0, 0x6, 0xff, 0xe5, - 0x6d, 0xff, 0xff, 0xd5, 0x6e, 0xff, 0x60, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0xbf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x5, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xfe, 0x51, 0x15, 0xef, - 0xff, 0xff, 0x60, 0x0, 0x47, 0x9e, 0xff, 0xff, - 0xe1, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xd8, 0x63, - 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x5, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x10, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, - 0x37, 0x8e, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xfa, 0x85, 0x0, 0x6, 0xff, 0xff, - 0xfd, 0x41, 0x14, 0xdf, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x0, 0x1e, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, - 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x6, 0xff, 0xf6, 0x6e, 0xff, 0xff, 0xe6, - 0x5f, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6b, 0x30, - 0xa, 0xff, 0xff, 0xa0, 0x3, 0xb6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - - /* U+F014 "" */ - 0x0, 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xb1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0x20, 0x0, 0x2, 0xff, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x7, 0xfb, 0x0, 0x0, 0x0, - 0xbf, 0x70, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0x0, 0x0, 0x2c, 0xff, 0xff, 0xd6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xc8, 0x0, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x6d, 0x40, + 0x0, 0x0, 0xcf, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcf, 0xfe, 0x20, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, - 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, 0xfe, 0x0, - 0xfe, 0x0, 0xfe, 0x0, 0xff, 0x0, 0x0, 0xff, - 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, - 0xff, 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, 0xff, - 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, - 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, - 0xff, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, - 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, - 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, - 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, - 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, 0xff, 0x0, - 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0x0, 0xff, - 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, - 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0xfe, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1b, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, + 0xff, 0xff, 0xfb, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xe7, 0x32, 0x5d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x13, 0xcf, 0xff, 0xff, + 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xfe, 0x60, 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xfb, 0x10, 0x0, + 0x4, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0x90, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xc0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xfb, 0x10, 0x3, 0xcf, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xfe, 0x60, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xe7, 0x32, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0xcf, 0xfe, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xcf, 0xfe, 0x10, 0x0, 0x1, + 0xc8, 0x0, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x5d, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2c, 0xff, 0xff, 0xd6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F015 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xee, 0x60, - 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x9f, 0xff, 0xf8, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0xff, - 0xff, 0xff, 0xa1, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x2, 0xcf, 0xfd, 0x22, 0xdf, 0xfc, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, - 0xff, 0xb1, 0xa9, 0x1b, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xf9, 0x1b, 0xff, - 0xb1, 0x9f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0x63, 0xdf, 0xff, 0xfd, 0x36, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x1a, 0xff, 0xf3, 0x5e, - 0xff, 0xff, 0xff, 0xe5, 0x3f, 0xff, 0xa1, 0x0, - 0x2, 0xcf, 0xfd, 0x27, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x62, 0xdf, 0xfc, 0x20, 0x3e, 0xff, 0xb2, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x1b, - 0xff, 0xe3, 0x5f, 0xf9, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xc1, 0x9f, 0xf5, 0x9, - 0x60, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfe, 0x6, 0x90, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xf0, 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, - 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, + 0x60, 0x0, 0x0, 0x48, 0x88, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xfd, 0x10, 0x0, 0xaf, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, + 0xff, 0xe3, 0x0, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, + 0xff, 0xff, 0x60, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, + 0xcf, 0xff, 0xf9, 0xbf, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x30, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xd2, 0x3, + 0x10, 0x7f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xfa, 0x0, 0x8f, + 0xd2, 0x4, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x2d, 0xff, 0xff, 0x80, 0xb, 0xff, + 0xff, 0x40, 0x2d, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xf5, 0x2, 0xdf, 0xff, + 0xff, 0xf7, 0x1, 0xbf, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xfe, 0x30, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x9, 0xff, 0xff, 0xc1, 0x0, + 0xa, 0xff, 0xff, 0xc1, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xfe, 0x30, + 0xbf, 0xff, 0xfa, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe3, 0x4, 0xef, 0xff, 0xf4, + 0xbf, 0xff, 0x70, 0x1b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x2d, 0xff, 0xf3, + 0xd, 0xf4, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xbf, 0x60, + 0x1, 0x20, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x3, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf2, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, /* U+F019 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x55, 0x55, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1c, 0xdd, 0xdd, 0xef, + 0xff, 0xff, 0xfe, 0xdd, 0xdd, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xf6, 0x1, 0xdd, 0x10, - 0x3e, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x50, 0x0, 0x3, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, - 0x11, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x10, 0x8, + 0xff, 0xff, 0x80, 0x1, 0x11, 0x11, 0x11, 0x10, + 0xbf, 0xff, 0xff, 0xff, 0xfd, 0x10, 0x8f, 0xf8, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0x6, 0x60, 0x2d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x30, 0x3, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, 0xff, 0x33, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x33, 0xff, 0x33, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x1e, 0xb0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2e, 0xc1, + 0x8f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, /* U+F01C "" */ - 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x20, 0x0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x1e, 0xff, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xe1, 0x0, - 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xef, 0xf7, 0x0, 0x0, 0xef, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfd, 0x0, - 0x5, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1f, 0xff, 0x50, 0xc, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xb0, - 0x2f, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xf2, 0xaf, 0xfb, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfa, - 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4f, 0xfd, 0xff, 0xff, 0xff, 0xff, - 0x40, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0xc, + 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xff, 0xd8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x9f, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x30, 0x0, + 0x0, 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, 0x0, + 0x1, 0xef, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xf8, 0x0, + 0xa, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xef, 0xff, 0x20, + 0x5f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xd0, + 0xdf, 0xff, 0xb8, 0x88, 0x88, 0x70, 0x0, 0x0, + 0x0, 0x0, 0x48, 0x88, 0x88, 0x8e, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, /* U+F021 "" */ - 0x0, 0x0, 0x0, 0x2, 0x78, 0xbe, 0xfc, 0xa5, - 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0x20, 0x1, 0xcc, - 0x0, 0x0, 0x5e, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe5, 0x1c, 0xff, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0x0, 0x3e, 0xff, 0xff, 0xe7, 0x40, 0x14, 0x8e, - 0xff, 0xff, 0xff, 0xff, 0x2, 0xef, 0xff, 0xf7, - 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, - 0x8, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xff, 0xff, 0xf, 0xff, 0xf7, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0x6f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0xd, - 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x58, 0x86, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x9d, 0xef, 0xfe, 0xb7, 0x20, + 0x0, 0x0, 0xdf, 0xff, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x30, 0x0, + 0xdf, 0xff, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfa, 0x10, 0xcf, 0xff, + 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0xff, 0xe3, 0xbf, 0xff, 0x0, 0x2, + 0xef, 0xff, 0xff, 0x94, 0x0, 0x0, 0x4b, 0xff, + 0xff, 0xfe, 0xdf, 0xff, 0x0, 0xd, 0xff, 0xff, + 0xc2, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0x2, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x11, 0x0, 0x8, 0xff, 0xff, 0xff, 0x9, 0xff, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xee, 0xff, 0xff, 0xff, 0xe, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2b, 0xcc, 0x60, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, 0xca, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, - 0xd0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xf4, - 0xff, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x7f, 0xff, 0xd0, 0xff, 0xff, 0xff, 0xd1, - 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x60, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x7f, 0xff, 0xfd, 0x10, 0xff, 0xff, 0xff, 0xff, - 0xd6, 0x30, 0x4, 0x6d, 0xff, 0xff, 0xf3, 0x0, - 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0xff, 0xd1, 0x5f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe5, 0x0, 0x0, - 0xdd, 0x10, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, - 0x7b, 0xdf, 0xfc, 0x97, 0x10, 0x0, 0x0, 0x0, + 0xac, 0xcc, 0xcc, 0xcc, 0xcc, 0xcb, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xbc, 0xb2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xf2, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xe0, 0xff, 0xff, 0xff, 0xee, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0x90, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x11, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xff, 0xff, 0x20, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xb2, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xd0, 0x0, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xa4, + 0x0, 0x0, 0x4a, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0xff, 0xfb, 0x3e, 0xff, 0xff, 0xff, 0xfe, 0xef, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0xff, 0xfc, + 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0x10, 0x0, 0x0, 0xff, 0xfd, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x60, 0x0, + 0x0, 0x0, 0xff, 0xfd, 0x0, 0x0, 0x2, 0x7c, + 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x68, 0x85, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F026 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xb6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xff, 0x38, 0x88, 0x88, 0x8f, 0xff, 0xff, + 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, /* U+F027 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x6a, 0x20, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xbf, 0xe3, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1b, - 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x1, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x1a, 0xfa, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xbf, 0xf2, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x6b, 0x20, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x55, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3b, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x38, + 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x1, 0xb9, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x6f, 0xfc, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xcf, + 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xef, 0xdf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xdf, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xbf, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x6f, 0xfd, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x2, 0xdb, 0x10, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, + 0x0, 0x0, /* U+F028 "" */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xf8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x55, 0x0, 0x0, 0x5, 0xff, 0xd5, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0x0, 0x0, 0x0, 0x2b, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0x0, 0x0, 0x62, - 0x0, 0x7f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0x0, 0x4, 0xff, 0x71, 0x7, 0xfe, - 0x10, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x0, - 0x0, 0x9f, 0xfa, 0x0, 0xcf, 0x80, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3, 0xff, - 0x90, 0x2f, 0xe1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x6a, 0x20, 0x3f, 0xf2, 0xb, 0xf7, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xbf, - 0xe3, 0x9, 0xfa, 0x6, 0xfa, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x1b, 0xfa, 0x4, 0xfc, - 0x4, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x1, 0xfe, 0x0, 0xfe, 0x0, 0xfe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x1, 0xff, - 0x0, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x1a, 0xfa, 0x4, 0xfc, 0x4, - 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xbf, 0xf2, 0x9, 0xfa, 0x6, 0xfa, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x6b, 0x20, 0x3f, - 0xf2, 0xb, 0xf7, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x3, 0xef, 0x90, 0x2f, 0xf1, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0x0, 0x0, - 0x9f, 0xfb, 0x0, 0xcf, 0x80, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0x0, 0x4, 0xff, 0x81, 0x7, - 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0x0, 0x0, 0x62, 0x0, 0x7f, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, - 0x2a, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x55, 0x0, 0x0, 0x5, 0xff, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x18, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xf9, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xb6, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x1c, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0, + 0x0, 0x4, 0xfe, 0x50, 0x1, 0xef, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x4f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0xa, 0xff, 0x40, + 0x38, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x2, 0xff, 0xa0, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xa1, 0x0, 0x8f, 0xf6, 0x0, 0xcf, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x6f, 0xfd, 0x0, 0x1f, 0xfc, 0x0, 0x8f, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xff, 0x80, 0xa, 0xff, 0x0, 0x4f, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xd0, 0x7, 0xff, 0x20, 0x3f, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xaf, 0xf0, 0x6, 0xff, 0x30, 0x2f, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xd0, 0x7, 0xff, 0x20, 0x3f, 0xf7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xff, 0x80, 0xa, 0xff, 0x0, 0x4f, 0xf5, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x6f, 0xfd, 0x0, 0x1f, 0xfc, 0x0, 0x8f, 0xf2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x1c, 0xa1, 0x0, 0x9f, 0xf6, 0x0, 0xdf, 0xe0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x5, 0xff, 0xe0, 0x3, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0x40, 0xa, 0xff, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0x0, + 0x0, 0x5, 0xff, 0xf6, 0x0, 0x4f, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0x0, + 0x0, 0x4, 0xfe, 0x50, 0x1, 0xef, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x0, 0x0, 0x21, 0x0, 0x1d, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xdf, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x3f, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x18, 0x50, 0x0, 0x0, 0x0, /* U+F03E "" */ 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x18, 0xee, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x0, 0x9f, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0x90, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x9f, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xf9, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x19, 0xff, 0x90, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0x90, 0x0, 0x0, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0x90, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x69, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0xff, 0xff, 0x0, 0x0, 0x6, 0xff, - 0x90, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x6f, 0xff, 0xfb, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x93, 0x27, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xff, 0xf9, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0xe, 0xff, 0xff, 0xff, 0xff, 0xd8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x50, 0x3, 0xdf, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x3e, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x3, 0xef, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xc1, 0x0, 0x0, 0x3b, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xfc, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfc, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, - - /* U+F040 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x18, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xcf, 0xfe, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x13, 0x1d, - 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xce, 0x31, 0xdf, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xe3, - 0x1d, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xf8, 0xfe, 0x31, 0xdf, 0xff, 0xf1, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x4c, 0xff, - 0xe3, 0x1d, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xf4, 0xcf, 0xff, 0xfe, 0x31, 0xc3, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0x4c, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xf4, 0xcf, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0x4c, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf4, - 0xcf, 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0x4c, 0xff, 0xff, 0xff, 0xff, - 0x30, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xf4, 0xcf, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xff, 0xed, 0xff, 0xff, 0xff, 0xff, 0x30, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xd2, 0xdf, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x10, 0x1d, 0xff, 0xff, 0xff, 0x30, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x1, 0xdf, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x0, 0x2f, 0xff, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x1, 0xcf, - 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, /* U+F048 "" */ - 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x1d, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, - 0xdf, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, - - /* U+F04B "" */ - 0xfa, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf7, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x92, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x71, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x60, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x50, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfa, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0x40, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x81, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xe6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf9, 0x10, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xfb, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F04C "" */ - 0xdf, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, - - /* U+F04D "" */ - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F051 "" */ - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfc, - 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf3, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, - - /* U+F052 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xd3, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xe3, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, - 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe3, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xe3, 0x0, 0x1, 0xcf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x30, - 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe3, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - - /* U+F053 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5f, 0xff, - 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x5, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf9, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x5, 0x60, 0x0, - - /* U+F054 "" */ - 0x0, 0x5, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x5, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x90, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xfa, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, - - /* U+F067 "" */ - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x8f, 0xff, 0xf8, 0x0, 0x0, + 0x48, 0x88, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0x70, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xf9, 0xbf, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x1c, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, + 0x0, 0x2e, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, + 0x0, 0x3, 0xef, 0xff, 0xff, 0xfc, 0xbf, 0xff, + 0x30, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xfc, 0xbf, + 0xff, 0x30, 0x5, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xbf, 0xff, 0x30, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbf, 0xff, 0x37, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xbf, 0xff, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xbf, + 0xff, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xbf, 0xff, 0x31, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbf, 0xff, 0x30, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, 0x9, + 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xfc, 0xbf, 0xff, 0x30, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xfc, 0xbf, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xfc, 0xbf, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x4, 0xff, 0xfb, + 0x9f, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x3d, + 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - /* U+F068 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* U+F04B "" */ + 0x3, 0x75, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xfc, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x50, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xfc, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x74, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x1a, 0xef, 0xff, 0xff, 0xd5, 0x0, 0x0, 0x1a, + 0xef, 0xff, 0xff, 0xd5, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xf2, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xf2, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0x66, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0x4, 0x89, 0x99, 0x98, + 0x71, 0x0, 0x0, 0x4, 0x89, 0x99, 0x98, 0x71, + 0x0, + + /* U+F04D "" */ + 0x3, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x60, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x1a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, + + /* U+F051 "" */ + 0x5, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, + 0x87, 0x5f, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0x7f, 0xff, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0x60, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xc1, + 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x8f, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x7f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x1c, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x9a, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1e, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x3, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf3, 0x1, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf7, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, + 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xc0, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xfd, 0x10, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf6, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, + + /* U+F054 "" */ + 0x0, 0x78, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x1, 0xcf, 0xff, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xa8, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x23, 0x33, 0x33, 0x33, + 0x8f, 0xff, 0xfe, 0x33, 0x33, 0x33, 0x33, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xff, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0xdc, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F068 "" */ + 0x1, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x10, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe1, 0x1, 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x10, 0x0, + + /* U+F06E "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xef, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xba, + 0xbd, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x39, + 0x95, 0x0, 0x2, 0xef, 0xff, 0xff, 0x70, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3f, + 0xff, 0xd2, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x7, 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x3f, + 0xff, 0xfe, 0x10, 0xd, 0xff, 0xff, 0xff, 0x20, + 0x2f, 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xc0, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x48, 0x6b, 0xff, + 0xff, 0xff, 0xd0, 0x5, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xff, 0xf9, + 0xbf, 0xff, 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x5, 0xff, 0xff, 0xff, 0xf5, + 0x1f, 0xff, 0xff, 0xff, 0x20, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, 0xc0, + 0x6, 0xff, 0xff, 0xff, 0x70, 0x8, 0xff, 0xff, + 0xff, 0xff, 0x20, 0xd, 0xff, 0xff, 0xff, 0x20, + 0x0, 0xaf, 0xff, 0xff, 0xe0, 0x0, 0xaf, 0xff, + 0xff, 0xf4, 0x0, 0x5f, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xfb, 0x0, 0x4, 0xad, + 0xc8, 0x10, 0x2, 0xef, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x3e, 0xff, 0xff, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xfd, 0x50, 0x0, + 0x0, 0x18, 0xff, 0xff, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, 0xff, 0xba, + 0xac, 0xff, 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, 0xad, 0xff, + 0xfe, 0xc9, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F070 "" */ + 0x4, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xff, 0xc1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe3, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x26, 0xad, 0xff, 0xed, + 0xb7, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xfa, 0x16, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xba, 0xbe, 0xff, 0xff, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xc5, 0x0, 0x0, 0x3, 0xbf, 0xff, 0xff, + 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1b, 0xff, 0xff, 0xc1, 0x6, 0xba, 0x50, + 0x0, 0x7f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xe4, 0x7f, + 0xff, 0xc1, 0x0, 0xbf, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0xad, 0x20, 0x0, 0x4, 0xff, 0xff, + 0xfc, 0xff, 0xff, 0xc0, 0x3, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x5f, 0xff, 0x50, 0x0, 0x2, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x50, 0xe, 0xff, + 0xff, 0xff, 0x50, 0x0, 0xe, 0xff, 0xff, 0x90, + 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0xbf, 0xff, 0xff, 0xfe, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xc2, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xb0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xe, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x3e, 0xff, + 0xff, 0xfa, 0x0, 0xcf, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xd2, 0xe, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x4, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xcf, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, 0xff, + 0xfe, 0xba, 0xb5, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xdf, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x37, 0xbd, 0xef, 0xfd, 0xb4, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x44, 0x0, /* U+F071 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xe5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0x87, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xef, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, + 0x8f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x8, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0x30, + 0x2f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xc, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, - 0xdf, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xff, 0xfc, 0x0, 0x0, 0xcf, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, - 0xff, 0xfc, 0x0, 0x0, 0xcf, 0xff, 0xd0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xfc, - 0x0, 0x0, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0x0, 0x0, - 0xff, 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x8, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, - 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf2, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0x10, 0x1, 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, - 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0xc, + 0xb, 0xff, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0x80, 0x0, 0x1e, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0xf6, 0x0, 0x0, 0xef, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0x70, 0x0, 0xf, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0x80, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xf9, 0x0, + 0x1, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, + 0xd1, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xb0, 0x0, 0x0, 0x4f, 0xff, 0xff, - 0xff, 0xff, 0x10, 0x1, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xe, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x10, 0x1, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xd0, 0x8f, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x40, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf6, 0x13, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x7f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x48, + 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, + 0x99, 0x99, 0x99, 0x99, 0x98, 0x71, 0x0, /* U+F074 "" */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf9, 0x0, - 0xff, 0xff, 0xfb, 0x82, 0x0, 0x0, 0x0, 0x28, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0x90, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0x36, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0x0, 0x6, 0xff, 0xfe, 0x1e, 0xff, 0xff, - 0x50, 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xf5, 0xaf, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xe2, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x48, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1e, 0xff, 0xf6, 0x0, + 0xf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xe3, 0x0, 0x24, 0x44, 0x44, 0x30, 0x0, 0x0, + 0x0, 0x0, 0x2, 0x44, 0x4f, 0xff, 0xfe, 0x30, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, + 0x12, 0x22, 0x26, 0xff, 0xff, 0xa0, 0x1d, 0xff, + 0xff, 0xd2, 0x2f, 0xff, 0xfd, 0x10, 0x0, 0x0, + 0x0, 0x7f, 0xfb, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0xf, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xc0, 0xc, 0xff, 0xff, 0xe2, 0x0, 0xe, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xfe, 0x20, 0x0, 0x4, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xff, 0xff, 0x40, 0x0, 0x0, + 0x4, 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xf5, 0x5, 0xe2, 0x0, 0xe, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x60, 0x4f, 0xfd, 0x10, 0xf, 0xff, 0xe2, 0x0, + 0x12, 0x22, 0x26, 0xff, 0xff, 0xf7, 0x3, 0xff, + 0xff, 0xd2, 0x2f, 0xff, 0xfe, 0x20, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x1, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe2, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x24, 0x44, + 0x44, 0x30, 0x0, 0x0, 0x0, 0x0, 0x2, 0x44, + 0x4f, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xef, 0xff, 0x84, 0x0, 0x0, 0x0, 0x0, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, - 0x2e, 0x70, 0x0, 0x0, 0x0, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x3e, 0xff, 0xfa, 0x5f, 0xe3, - 0x0, 0x0, 0x0, 0xff, 0x90, 0x0, 0x0, 0x0, - 0x5, 0xef, 0xff, 0xf1, 0xef, 0xfe, 0x50, 0x0, - 0x0, 0xff, 0xf9, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x63, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x90, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, - 0xfd, 0x92, 0x0, 0x0, 0x0, 0x2a, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xa0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xaa, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0xff, 0xfa, 0x0, 0xaf, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xa0, - 0x0, 0xa, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xaf, - 0xff, 0xff, 0xff, 0x60, 0x5f, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xf5, 0x7f, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xaf, 0xff, 0xff, 0xf7, 0xa, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, - 0xff, 0xff, 0xa0, 0x0, 0xaf, 0xfa, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfa, 0x0, - 0x0, 0x8, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x80, 0x0, + 0x0, 0x8, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x3f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x8, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, + 0xe2, 0x6, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe0, 0x9f, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0x11, 0xdf, 0xfa, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x60, 0x1, + 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3b, 0x50, 0x0, /* U+F078 "" */ - 0x0, 0x8, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0x70, 0x0, 0x0, 0xaf, 0xf9, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xf9, 0x0, 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x90, 0x7f, - 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xaf, 0xff, 0xff, 0xf7, 0x5f, 0xff, 0xff, 0xff, - 0x90, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, - 0xf5, 0x6, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0x60, 0x0, 0x6f, - 0xff, 0xff, 0xff, 0x90, 0x0, 0xa, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0xaf, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0x9a, 0xff, - 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6f, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf6, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3b, 0x60, 0x1, 0xdf, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0x60, 0x9f, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0x16, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xd0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x8, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, 0xff, 0xfa, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xfa, 0x0, 0x3f, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xff, 0xff, 0xe2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, /* U+F079 "" */ - 0x0, 0x0, 0x1c, 0xc1, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, - 0x0, 0xbf, 0xfa, 0x0, 0x6f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x9, - 0xff, 0xff, 0x90, 0x8, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0xf6, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, - 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, - 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf9, 0x0, 0x6f, 0xff, 0xff, 0xf6, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x80, 0x9, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf6, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x1d, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x42, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xf4, + 0x0, 0x0, 0x57, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x60, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xf4, 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xf4, 0x2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x9f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xef, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, + 0x0, 0x0, 0xf, 0xff, 0xf4, 0xef, 0xf9, 0x9f, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0x90, 0x0, 0x0, 0x7f, 0xf5, 0xe, 0xff, + 0x90, 0xaf, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x32, 0x0, + 0xef, 0xf9, 0x0, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, 0x80, + 0xe, 0xff, 0x90, 0x2a, 0x70, 0x0, 0x0, 0xe, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xa0, 0xef, 0xf9, 0x2e, 0xff, 0x60, 0x0, + 0x0, 0xef, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xef, 0xff, 0x9e, 0xff, 0xad, 0xff, 0xf9, + 0x0, 0x0, 0xe, 0xff, 0xc7, 0x77, 0x77, 0x77, + 0x77, 0x73, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0x10, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x4, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x3, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xfc, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdb, 0x0, 0x0, + 0x0, /* U+F07B "" */ - 0x4, 0xcf, 0xff, 0xff, 0xfc, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, - 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd8, 0x88, 0x88, 0x88, 0x88, 0x87, 0x30, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -2788,377 +3009,502 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf4, 0x5, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfd, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb1, /* U+F093 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1c, 0xff, 0xc1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, 0xc1, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, - 0xcf, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, - 0x10, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, - 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x22, 0x22, 0xcf, + 0xff, 0xff, 0xf6, 0x22, 0x22, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xfd, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, - 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x10, - 0x0, 0x1, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x11, 0x11, 0x11, 0x0, 0xbf, + 0xff, 0xff, 0xf4, 0x0, 0x11, 0x11, 0x11, 0x10, + 0xbf, 0xff, 0xff, 0xff, 0xc0, 0xaf, 0xff, 0xff, + 0xf3, 0xc, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x18, 0x99, 0x99, 0x60, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0xcc, 0xcc, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x33, 0xff, 0x33, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, - 0xff, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0x1e, 0xb0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x2e, 0xc1, + 0x8f, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x37, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x73, /* U+F095 "" */ - 0x0, 0x8c, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x9, 0xff, 0xfd, 0x10, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, 0xfa, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xef, 0xff, 0xff, 0xf3, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xff, 0xfd, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x4f, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xe, 0xff, 0xf9, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, - 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xf9, 0x0, - 0x0, 0x3, 0xea, 0x10, 0x0, 0x0, 0x0, 0x1d, - 0xff, 0xff, 0xc4, 0x0, 0x1e, 0xff, 0xe7, 0x10, - 0x0, 0x0, 0x1, 0xdf, 0xff, 0xff, 0x83, 0xcf, - 0xff, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x1d, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xfd, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x17, 0xef, 0xff, 0xff, 0xff, 0x90, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xae, 0xfe, - 0xa4, 0x0, + 0x0, 0x0, 0x6, 0x62, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xfe, 0xb7, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, + 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xff, 0xff, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6f, 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x26, 0x10, 0x0, 0x0, 0x0, 0x5f, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xbf, 0xfc, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, + 0xfa, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xfe, 0x10, + 0x0, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x5, 0xef, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfd, 0x20, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe9, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xd9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17, + 0x76, 0x53, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F0C4 "" */ - 0x1, 0x7b, 0xfd, 0xb5, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfc, 0x8a, 0xef, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, - 0xdd, 0x50, 0xff, 0xb0, 0x0, 0x6, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0x3, 0xbe, 0x44, 0xcc, - 0xff, 0x90, 0x0, 0x0, 0x3f, 0xfb, 0x0, 0x0, - 0x0, 0x2, 0x9f, 0x60, 0x0, 0xad, 0xbf, 0xe3, - 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, 0x1, 0x7e, - 0x81, 0x0, 0x2c, 0xa1, 0x4f, 0xfe, 0x50, 0x0, - 0xb, 0xff, 0x0, 0x0, 0x6d, 0xa2, 0x0, 0x4, - 0xe7, 0x0, 0x6, 0xff, 0xfd, 0x97, 0xbf, 0xff, - 0x81, 0x4c, 0xc4, 0x0, 0x0, 0x8f, 0x30, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0xff, 0xf4, 0xbf, 0xe5, - 0x0, 0x0, 0x1a, 0xd1, 0x0, 0x0, 0x0, 0x0, - 0x6c, 0xef, 0xea, 0xf5, 0xf8, 0x0, 0x0, 0x3, - 0xc9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x3c, 0xf0, 0xdc, 0x0, 0x6e, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, - 0xc0, 0xdd, 0x9, 0xee, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6b, 0xdf, 0xd9, 0xf6, 0x4, 0x52, - 0xcb, 0x13, 0xd8, 0x0, 0x0, 0x0, 0x0, 0x6e, - 0xff, 0xff, 0xff, 0xe4, 0x9f, 0xff, 0x80, 0x0, - 0x1b, 0xc1, 0x0, 0x0, 0x6, 0xff, 0xfe, 0xa8, - 0xcf, 0xff, 0x91, 0x4d, 0xb4, 0x0, 0x0, 0x7f, - 0x30, 0x0, 0x4f, 0xff, 0x60, 0x0, 0xb, 0xfe, - 0x0, 0x0, 0x6e, 0x92, 0x0, 0x4, 0xf6, 0x0, - 0xbf, 0xf3, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, - 0x1, 0x8f, 0x71, 0x0, 0x2d, 0x91, 0xff, 0x90, - 0x0, 0x0, 0x3e, 0xfb, 0x0, 0x0, 0x0, 0x2, - 0xaf, 0x50, 0x0, 0xac, 0xef, 0xa0, 0x0, 0x6, - 0xef, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x3, 0xcd, - 0x44, 0xbd, 0xaf, 0xfb, 0x79, 0xdf, 0xff, 0x60, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xee, 0x60, - 0x1d, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8c, - 0xfe, 0xc6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x99, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7b, 0xb8, + 0x10, 0x1e, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x2, 0xef, 0xff, 0xfe, 0x38, 0xff, 0xff, + 0xef, 0xff, 0xf1, 0x0, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf4, 0xdf, 0xfe, 0x10, 0x7f, 0xff, 0x50, + 0x0, 0x2, 0xef, 0xff, 0xff, 0xf5, 0xf, 0xff, + 0x80, 0x0, 0xff, 0xf7, 0x0, 0x2, 0xef, 0xff, + 0xff, 0xf5, 0x0, 0xef, 0xfc, 0x0, 0x4f, 0xff, + 0x60, 0x2, 0xef, 0xff, 0xff, 0xf5, 0x0, 0xa, + 0xff, 0xfd, 0xbf, 0xff, 0xf4, 0x3, 0xef, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, + 0xff, 0xe5, 0xef, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x18, 0xcd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xef, 0xff, + 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5, 0x99, 0xef, 0xff, 0xff, 0xff, 0xff, 0xe2, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, + 0x1e, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, + 0xff, 0xe2, 0x0, 0x0, 0x8, 0xff, 0xff, 0xef, + 0xff, 0xf6, 0x5, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0xdf, 0xfe, 0x10, 0x7f, 0xff, 0x50, 0x5, + 0xff, 0xff, 0xff, 0xe2, 0x0, 0xf, 0xff, 0x80, + 0x0, 0xff, 0xf7, 0x0, 0x5, 0xff, 0xff, 0xff, + 0xe2, 0x0, 0xef, 0xfc, 0x0, 0x4f, 0xff, 0x60, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xe2, 0xa, 0xff, + 0xfd, 0xbf, 0xff, 0xf2, 0x0, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xe2, 0x2f, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, 0x40, + 0x4f, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xbe, 0xfb, 0x30, 0x0, 0x18, 0xcd, 0xb5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, /* U+F0C5 "" */ - 0x0, 0x0, 0x0, 0x1, 0x9e, 0xff, 0xff, 0xff, - 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, - 0xff, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1c, 0xfd, 0xff, 0x0, - 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xcf, 0xd1, 0xff, 0x0, 0x0, 0x0, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, - 0xfd, 0x10, 0xff, 0x0, 0x0, 0x0, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xd1, 0x0, - 0xff, 0x0, 0x0, 0x0, 0xff, 0x9e, 0xff, 0xff, - 0xff, 0xf8, 0x1c, 0xfd, 0x10, 0x0, 0xff, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xaf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x1, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xf8, 0x0, 0x0, 0x1c, 0xfd, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xd1, 0xff, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x1c, 0xfd, 0x10, 0xff, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x1, 0xcf, 0xd1, - 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x1c, 0xfd, 0x10, 0x0, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, + 0x42, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0x80, 0xeb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0xe, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, + 0xfb, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xf4, 0xaf, 0xff, 0xf4, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0xbb, 0xbb, 0xb3, 0xff, 0xff, 0xf4, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf4, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, + 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, + 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0x40, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xff, 0xff, 0xf5, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xa2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x37, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x60, 0x0, + 0x0, 0x0, 0x0, /* U+F0C7 "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xe9, 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x0, 0x0, - 0xff, 0x0, 0xff, 0xff, 0xff, 0x10, 0x1, 0xff, - 0x2d, 0xfe, 0x30, 0x0, 0xff, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0x1, 0xdf, 0xe3, 0x0, - 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0x0, 0x1d, 0xfe, 0x30, 0xff, 0x0, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0x0, 0x1, 0xdf, 0xe1, - 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0x0, 0x0, 0x1d, 0xfa, 0xff, 0x0, 0xff, 0xff, - 0xff, 0x10, 0x1, 0xff, 0x0, 0x0, 0x2, 0xfe, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf8, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, - 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, - 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, + 0x4, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x20, 0x0, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0x40, 0x0, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0x40, 0xf, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, + 0xff, 0xff, 0x30, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xfe, 0xf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xf3, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0x4f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0xff, 0xff, 0xf4, 0xff, 0xfd, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x7e, 0xff, 0xff, + 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x82, 0x15, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0x70, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0xff, 0x30, 0x0, 0x0, 0xef, 0xff, 0xff, + 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0xa9, 0xdf, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x1a, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, + 0x0, /* U+F0E7 "" */ - 0x0, 0xc, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, - 0x1f, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x5f, - 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x9f, 0xff, - 0xff, 0xa0, 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, - 0x50, 0x0, 0x0, 0x1, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x5, 0xff, 0xff, 0xf9, 0x0, 0x0, - 0x33, 0x9, 0xff, 0xff, 0xf2, 0x46, 0xae, 0xff, - 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x1f, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0xcf, 0xff, 0xff, 0xce, - 0xff, 0xfa, 0x0, 0xff, 0xc8, 0x40, 0xf, 0xff, - 0xf2, 0x0, 0x20, 0x0, 0x0, 0x4f, 0xff, 0xa0, - 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x40, 0x0, - 0x0, 0x0, 0x0, 0xcf, 0xfc, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, - 0x3, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x7, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfe, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf6, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x7f, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xbf, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb8, 0x0, 0x0, 0x0, 0x0, - - /* U+F0F3 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdd, 0x20, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x8d, - 0xff, 0xd8, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x1, 0xaf, 0xff, 0xff, 0xff, 0xfa, - 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x60, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xf, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, - 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, - 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, - 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, - 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xf9, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, - 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0xa, 0xff, + 0x0, 0x8, 0xbb, 0xbb, 0xbb, 0xbb, 0x80, 0x0, + 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xa0, 0x0, 0x0, 0x2f, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, - 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x80, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfe, 0x4f, 0xff, 0xff, 0xff, 0xff, - 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, - 0x0, 0x0, 0x0, 0x0, 0xf, 0x8f, 0xff, 0xff, - 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xb, 0xba, 0xff, 0xff, 0xb0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xfb, - 0x7d, 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xb2, 0x0, + 0x70, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x0, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfd, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0xaf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + /* U+F0EA "" */ + 0x0, 0x0, 0x0, 0x1, 0x43, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x49, 0x99, 0x99, 0xff, 0xef, 0xfe, 0x99, + 0x99, 0x81, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xa0, 0x1e, 0xff, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x1, 0xef, + 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfa, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xfc, 0x64, 0x44, 0x44, 0x44, + 0x30, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0x20, 0xaf, 0xff, 0xff, + 0xff, 0xa0, 0xd6, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0xe, 0xf6, + 0x0, 0xf, 0xff, 0xff, 0xff, 0x1, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0xef, 0xf6, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, 0xe, + 0xff, 0xf6, 0xf, 0xff, 0xff, 0xff, 0x1, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0xef, 0xff, 0xf3, 0xff, + 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfa, + 0x4, 0x44, 0x44, 0x1f, 0xff, 0xff, 0xff, 0x1, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xff, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, + 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0xff, 0xff, 0xff, 0xf0, 0x1f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, + 0xff, 0xff, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0xaf, 0xff, 0xff, 0xf0, 0x1f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x42, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x8d, 0xff, 0xfa, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xd4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x6, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x9, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x0, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xa0, 0x1, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x70, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0x6f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x15, 0x73, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + /* U+F11C "" */ - 0x4e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xff, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, - 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, - 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, 0xff, - 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, 0xff, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, - 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, 0xff, - 0x0, 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, - 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, 0xff, 0x0, - 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0x0, 0xff, 0xff, 0x0, 0xff, 0x0, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xff, 0xfd, 0x88, 0x9f, 0xf8, 0x88, 0xff, 0x98, + 0x8e, 0xfa, 0x88, 0xbf, 0xd8, 0x89, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0xcf, 0x0, + 0xa, 0xf1, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0xcf, 0x0, + 0xa, 0xf1, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xf9, 0x0, 0x1f, 0xd0, 0x0, 0xdf, 0x10, + 0xc, 0xf3, 0x0, 0x6f, 0x90, 0x1, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xdc, 0xce, 0xfe, 0xcc, 0xdf, + 0xfc, 0xcd, 0xff, 0xcc, 0xcf, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x3f, + 0x80, 0x0, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x2f, + 0x80, 0x0, 0xed, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0x20, 0x6, 0xf6, 0x0, 0x3f, + 0x80, 0x0, 0xfd, 0x0, 0xa, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xdc, 0xce, 0xfe, 0xcc, 0xdf, + 0xfc, 0xcd, 0xff, 0xcc, 0xcf, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xf9, 0x0, 0x1f, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0x90, 0x1, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xf8, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0x70, 0x0, 0xff, 0xf8, + 0xff, 0xfd, 0x88, 0x9f, 0xf8, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0xbf, 0xd8, 0x89, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x50, /* U+F124 "" */ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xdf, 0xfe, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, - 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, - 0xdf, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0x60, 0x0, - 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, - 0xfe, 0x0, 0x0, 0x0, 0x0, 0x6, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x6, - 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, - 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x60, 0x0, 0x6, 0xdf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xdf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x0, - 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xf6, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xe0, + 0x0, 0x0, 0x6, 0xef, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xdd, 0x0, 0x0, 0x0, - 0x0, 0x0, + 0x18, 0xef, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3a, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x4, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xbf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x44, 0x44, 0x44, 0x44, 0x4d, 0xff, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, + 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, + 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0xff, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x17, 0x60, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, /* U+F15B "" */ - 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x10, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xf3, 0x0, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xfe, 0x30, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xe3, 0x0, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xfe, 0x30, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xe3, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xfe, 0x30, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xe1, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x10, 0x30, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xf, 0xa0, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x40, 0xff, 0xa0, 0x0, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf, 0xff, + 0xa0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf4, 0xf, 0xff, 0xff, 0xa0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, 0xff, 0xff, + 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + 0xb, 0xbb, 0xbb, 0xbb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -3182,332 +3528,614 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x14, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x10, /* U+F1EB "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x37, 0xbb, 0xcf, - 0xfc, 0xbb, 0x73, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4, 0x9e, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xe9, 0x40, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0xbf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfb, 0x40, 0x0, 0x0, - 0x0, 0x2, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x20, 0x0, - 0x0, 0x4e, 0xff, 0xff, 0xff, 0xfa, 0x54, 0x20, - 0x2, 0x45, 0xaf, 0xff, 0xff, 0xff, 0xe4, 0x0, - 0x7, 0xff, 0xff, 0xff, 0xc4, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x4c, 0xff, 0xff, 0xff, 0x60, - 0x3f, 0xff, 0xff, 0xc4, 0x0, 0x5, 0x8b, 0xcf, - 0xfc, 0xb8, 0x40, 0x0, 0x4c, 0xff, 0xff, 0xf3, - 0xa, 0xff, 0xf8, 0x0, 0x29, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x92, 0x0, 0x8f, 0xff, 0xa0, - 0x0, 0x9f, 0x40, 0x9, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x80, 0x4, 0xf9, 0x0, - 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, - 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xa5, 0x20, - 0x2, 0x59, 0xef, 0xff, 0xff, 0xe0, 0x0, 0x0, - 0x0, 0x0, 0x9, 0xff, 0xff, 0x60, 0x0, 0x0, - 0x0, 0x0, 0x18, 0xff, 0xff, 0x90, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xaf, 0xa1, 0x0, 0x69, 0xcf, - 0xfc, 0x95, 0x0, 0x2c, 0xfa, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0x0, 0x5d, 0xff, 0xff, - 0xff, 0xff, 0xd5, 0x0, 0x30, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xfa, 0x40, - 0x4, 0xaf, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x20, 0x0, - 0x0, 0x2, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xae, - 0xea, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, - 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xaf, - 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, - 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0x69, 0xab, 0xcb, 0xa9, 0x63, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x27, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb3, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x20, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xba, + 0xaa, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xc7, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x37, 0xcf, 0xff, 0xff, + 0xff, 0xd1, 0x3, 0xef, 0xff, 0xff, 0xf9, 0x20, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x29, + 0xff, 0xff, 0xff, 0xe3, 0xef, 0xff, 0xff, 0xb2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xbf, 0xff, 0xff, 0xe7, 0xff, 0xff, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf7, 0x7, + 0xfe, 0x20, 0x0, 0x0, 0x0, 0x48, 0xbe, 0xff, + 0xfd, 0xb8, 0x40, 0x0, 0x0, 0x0, 0x2d, 0xf7, + 0x0, 0x4, 0x10, 0x0, 0x0, 0x18, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe8, 0x10, 0x0, 0x0, + 0x14, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xb1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xff, 0xff, 0xc8, 0x76, 0x78, 0xcf, + 0xff, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xe7, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xef, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0x70, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xdb, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F240 "" */ - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xff, 0x10, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0xff, 0x0, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xe4, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xfe, 0xff, 0x0, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0xff, 0xf4, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0x0, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F241 "" */ - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xff, 0x10, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xe4, 0xff, 0x0, 0xff, 0xff, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x0, 0xcf, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x1c, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F242 "" */ - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xe4, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F243 "" */ - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xe4, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, - 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, 0xff, 0x0, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0xe, 0xff, + 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0xef, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0xe, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0xef, 0xff, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0xe, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F244 "" */ - 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x2, 0x67, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x74, + 0x0, 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xb1, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xfb, 0x0, 0xff, 0x10, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x1, 0xff, 0x0, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xe4, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xfe, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0xff, 0xf4, 0xff, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, - 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xff, 0x0, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x1, 0xff, 0x0, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf1, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x1c, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x9f, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x28, 0xcf, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xff, 0xfe, 0xff, 0xfb, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x79, 0xff, 0xfa, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x1, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x5e, 0xfe, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x23, 0xff, 0xff, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xbf, 0xff, 0xff, + 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xcd, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xe1, 0x0, 0xcf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0x50, 0x0, 0x7, 0xa7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x10, 0x0, 0x0, 0x4, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4, 0xef, 0xfc, 0x20, 0x0, 0xc, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x40, + 0x0, 0x0, 0x4f, 0xff, 0xff, 0xe1, 0x0, 0x4f, + 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xfb, 0x20, 0x0, 0xcf, 0xff, 0xff, 0xfa, + 0x35, 0xef, 0x94, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x4d, 0xff, 0xf7, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0xef, 0xff, 0xff, 0xfe, 0xbb, 0xbb, 0xbc, 0xff, + 0xcb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbb, 0xbf, 0xff, + 0xfe, 0x50, 0x8f, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0x80, 0x0, 0xb, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0xe, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xb2, 0x0, 0x0, 0x0, 0x58, + 0x73, 0x0, 0x0, 0x0, 0x0, 0x7, 0xfa, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x20, 0x6, 0xdd, 0xdd, 0xc2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xc0, 0x9, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, 0xde, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xff, 0xff, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x19, 0xff, 0xff, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, /* U+F293 "" */ - 0x0, 0x0, 0x0, 0x39, 0xbf, 0xff, 0xfb, 0x93, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x2b, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x3, - 0xef, 0xff, 0xff, 0x6f, 0xff, 0xff, 0xfe, 0x30, - 0x0, 0x0, 0x1d, 0xff, 0xff, 0xff, 0x6, 0xff, - 0xff, 0xff, 0xd1, 0x0, 0x0, 0x8f, 0xff, 0xff, - 0xff, 0x0, 0x6f, 0xff, 0xff, 0xf8, 0x0, 0x1, - 0xef, 0xff, 0xff, 0xff, 0x0, 0x6, 0xff, 0xff, - 0xfe, 0x10, 0x6, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x0, 0x6f, 0xff, 0xff, 0x60, 0xa, 0xff, 0xff, - 0xdf, 0xff, 0x0, 0x60, 0x6, 0xff, 0xff, 0xa0, - 0xe, 0xff, 0xf3, 0x1d, 0xff, 0x0, 0xc9, 0x0, - 0x6f, 0xff, 0xd0, 0xf, 0xff, 0xe3, 0x1, 0xdf, - 0x0, 0xcf, 0x20, 0x1d, 0xff, 0xf0, 0x3f, 0xff, - 0xfe, 0x30, 0x1d, 0x0, 0xb3, 0x1, 0xcf, 0xff, - 0xf2, 0x4f, 0xff, 0xff, 0xe3, 0x1, 0x0, 0x10, - 0x1c, 0xff, 0xff, 0xf4, 0x4f, 0xff, 0xff, 0xfe, - 0x30, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xf4, 0x4f, - 0xff, 0xff, 0xff, 0xe3, 0x0, 0x1c, 0xff, 0xff, - 0xff, 0xf4, 0x4f, 0xff, 0xff, 0xff, 0xf3, 0x0, - 0x1d, 0xff, 0xff, 0xff, 0xf4, 0x4f, 0xff, 0xff, - 0xff, 0x30, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xf4, - 0x4f, 0xff, 0xff, 0xf3, 0x1, 0x0, 0x10, 0x1d, - 0xff, 0xff, 0xf4, 0x2f, 0xff, 0xff, 0x30, 0x1c, - 0x0, 0xb3, 0x1, 0xdf, 0xff, 0xf2, 0xf, 0xff, - 0xf3, 0x1, 0xcf, 0x0, 0xce, 0x20, 0x1e, 0xff, - 0xf0, 0xe, 0xff, 0xe3, 0x1c, 0xff, 0x0, 0xca, - 0x0, 0x6f, 0xff, 0xd0, 0xa, 0xff, 0xfe, 0xcf, - 0xff, 0x0, 0xa0, 0x6, 0xff, 0xff, 0xa0, 0x6, - 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x6f, 0xff, - 0xff, 0x60, 0x1, 0xff, 0xff, 0xff, 0xff, 0x0, - 0x6, 0xff, 0xff, 0xff, 0x10, 0x0, 0x8f, 0xff, - 0xff, 0xff, 0x0, 0x6f, 0xff, 0xff, 0xf8, 0x0, - 0x0, 0x1e, 0xff, 0xff, 0xff, 0x6, 0xff, 0xff, - 0xff, 0xe1, 0x0, 0x0, 0x3, 0xff, 0xff, 0xff, - 0x6f, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, - 0x2c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x3a, 0xcf, 0xff, 0xfc, - 0xa3, 0x0, 0x0, 0x0 + 0x0, 0x0, 0x0, 0x0, 0x1, 0x34, 0x32, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3a, 0xef, + 0xff, 0xff, 0xfb, 0x50, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, + 0x0, 0x0, 0x1, 0xcf, 0xff, 0xff, 0xc7, 0xff, + 0xff, 0xff, 0xd1, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xc0, 0x8f, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x5f, 0xff, 0xff, 0xff, 0xc0, 0x9, 0xff, 0xff, + 0xff, 0x50, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0xaf, 0xff, 0xff, 0xb0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xc0, 0x0, 0xb, 0xff, 0xff, 0xf1, + 0x6, 0xff, 0xff, 0xaf, 0xff, 0xc0, 0x39, 0x0, + 0xcf, 0xff, 0xf5, 0xa, 0xff, 0xf9, 0x3, 0xef, + 0xc0, 0x3f, 0x90, 0x1d, 0xff, 0xf8, 0xc, 0xff, + 0xfd, 0x10, 0x3e, 0xc0, 0x2f, 0xb0, 0xc, 0xff, + 0xfa, 0xe, 0xff, 0xff, 0xd1, 0x3, 0xb0, 0x2b, + 0x0, 0xaf, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xfd, + 0x10, 0x10, 0x0, 0x9, 0xff, 0xff, 0xfd, 0xf, + 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0x7f, 0xff, + 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0x10, + 0x5, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0x3, 0xff, 0xff, 0xff, 0xfe, + 0xf, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3f, + 0xff, 0xff, 0xfd, 0xf, 0xff, 0xff, 0xfb, 0x0, + 0x20, 0x11, 0x4, 0xff, 0xff, 0xfd, 0xe, 0xff, + 0xff, 0xb0, 0x5, 0xc0, 0x2d, 0x10, 0x5f, 0xff, + 0xfc, 0xc, 0xff, 0xfb, 0x0, 0x5f, 0xc0, 0x2f, + 0xd0, 0x7, 0xff, 0xfa, 0x9, 0xff, 0xfb, 0x5, + 0xff, 0xc0, 0x3f, 0x60, 0x1d, 0xff, 0xf7, 0x5, + 0xff, 0xff, 0xdf, 0xff, 0xc0, 0x36, 0x1, 0xdf, + 0xff, 0xf4, 0x1, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x1d, 0xff, 0xff, 0xf0, 0x0, 0xaf, 0xff, + 0xff, 0xff, 0xd0, 0x1, 0xdf, 0xff, 0xff, 0xa0, + 0x0, 0x2f, 0xff, 0xff, 0xff, 0xd0, 0x1d, 0xff, + 0xff, 0xff, 0x20, 0x0, 0x6, 0xff, 0xff, 0xff, + 0xd1, 0xcf, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xec, 0xff, 0xff, 0xff, 0xb0, + 0x0, 0x0, 0x0, 0x2, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xe7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x58, 0xab, 0xba, 0x84, 0x0, 0x0, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x0, 0x0, 0x14, 0x44, 0x44, 0x43, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x58, 0x88, 0x88, 0x8c, 0xff, 0xff, 0xff, + 0xff, 0xf8, 0x88, 0x88, 0x88, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8b, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x28, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x86, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xc0, 0x0, 0x4f, 0xff, 0xf5, 0x5f, 0xff, 0x92, + 0xff, 0xfc, 0x1c, 0xff, 0xfc, 0x0, 0x4, 0xff, + 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, 0xa0, 0xaf, + 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, 0x2f, 0xff, + 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, 0x0, 0x4, + 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, 0xa0, + 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, 0x2f, + 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, 0x0, + 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, 0xff, + 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, 0xf2, + 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, 0xfc, + 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, 0xe, + 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, 0xff, + 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, 0xff, + 0xfc, 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, 0xf6, + 0xe, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, 0x4f, + 0xff, 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, 0xa, + 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0x22, 0xff, + 0xf6, 0xe, 0xff, 0xa0, 0xaf, 0xff, 0xc0, 0x0, + 0x4f, 0xff, 0xf2, 0x2f, 0xff, 0x60, 0xef, 0xfa, + 0xa, 0xff, 0xfc, 0x0, 0x4, 0xff, 0xff, 0x55, + 0xff, 0xf9, 0x2f, 0xff, 0xc1, 0xcf, 0xff, 0xc0, + 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x0, 0x2, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x4, + 0x78, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x61, 0x0, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x66, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xdf, 0xfe, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xff, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0xbf, 0xff, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xec, + 0x0, 0xbf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xfc, 0x0, + 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xfc, 0x0, 0xbf, + 0xff, 0xfe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xfc, 0x0, 0xbf, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xfc, 0x0, 0xbe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xf, 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xef, 0xff, 0xff, 0xec, 0x20, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x76, + 0x42, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xd5, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xb, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99, 0xff, + 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x8, 0xff, 0xff, 0x80, 0x7, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe0, 0x0, 0x8, 0xff, 0x80, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x8, 0x80, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x0, 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0x0, 0x8, 0x80, 0x0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0xe, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8, + 0xff, 0xff, 0x80, 0x8, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x99, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, 0x0, + + /* U+F7C2 "" */ + 0x0, 0x0, 0x0, 0x17, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x50, 0x0, 0x0, 0x0, 0x1d, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xc1, 0x0, 0x0, 0x2d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, + 0x0, 0x2e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x2e, 0xff, 0x20, 0x1f, 0xa0, + 0xe, 0xd0, 0x8, 0xff, 0xf0, 0x2e, 0xff, 0xf2, + 0x1, 0xfa, 0x0, 0xed, 0x0, 0x8f, 0xff, 0x3e, + 0xff, 0xff, 0x20, 0x1f, 0xa0, 0xe, 0xd0, 0x8, + 0xff, 0xfe, 0xff, 0xff, 0xf2, 0x1, 0xfa, 0x0, + 0xed, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x20, + 0x1f, 0xa0, 0xe, 0xd0, 0x8, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfe, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, 0xaf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x24, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x20, + 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x5c, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x7f, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, 0xf1, 0x0, + 0x0, 0x8f, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4, 0xff, 0xff, 0x10, 0x0, 0x9f, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xf1, 0x0, 0xaf, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0xff, 0x10, 0xbf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0x2e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfe, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x55, 0x55, 0x10, 0x0, 0x1c, 0xff, 0xff, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xff, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0 }; @@ -3516,152 +4144,159 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { *--------------------*/ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { - {.bitmap_index = 0, .adv_w = 0, .box_h = 0, .box_w = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, - {.bitmap_index = 0, .adv_w = 111, .box_h = 0, .box_w = 0, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 0, .adv_w = 118, .box_h = 20, .box_w = 3, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 30, .adv_w = 160, .box_h = 8, .box_w = 8, .ofs_x = 1, .ofs_y = 12}, - {.bitmap_index = 62, .adv_w = 279, .box_h = 20, .box_w = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 222, .adv_w = 261, .box_h = 27, .box_w = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 411, .adv_w = 328, .box_h = 22, .box_w = 19, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 620, .adv_w = 279, .box_h = 22, .box_w = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 796, .adv_w = 97, .box_h = 7, .box_w = 4, .ofs_x = 1, .ofs_y = 13}, - {.bitmap_index = 810, .adv_w = 149, .box_h = 30, .box_w = 9, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 945, .adv_w = 150, .box_h = 30, .box_w = 8, .ofs_x = 0, .ofs_y = -7}, - {.bitmap_index = 1065, .adv_w = 193, .box_h = 10, .box_w = 10, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 1115, .adv_w = 254, .box_h = 15, .box_w = 14, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 1220, .adv_w = 100, .box_h = 7, .box_w = 4, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 1234, .adv_w = 202, .box_h = 3, .box_w = 9, .ofs_x = 2, .ofs_y = 7}, - {.bitmap_index = 1248, .adv_w = 120, .box_h = 3, .box_w = 3, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1253, .adv_w = 186, .box_h = 22, .box_w = 11, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 1374, .adv_w = 252, .box_h = 22, .box_w = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1528, .adv_w = 252, .box_h = 21, .box_w = 8, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1612, .adv_w = 252, .box_h = 21, .box_w = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1749, .adv_w = 252, .box_h = 22, .box_w = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 1903, .adv_w = 252, .box_h = 20, .box_w = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2043, .adv_w = 252, .box_h = 21, .box_w = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 2180, .adv_w = 252, .box_h = 22, .box_w = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2334, .adv_w = 252, .box_h = 20, .box_w = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2474, .adv_w = 252, .box_h = 22, .box_w = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2628, .adv_w = 252, .box_h = 22, .box_w = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 2771, .adv_w = 113, .box_h = 15, .box_w = 3, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2794, .adv_w = 115, .box_h = 19, .box_w = 4, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 2832, .adv_w = 228, .box_h = 13, .box_w = 12, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 2910, .adv_w = 252, .box_h = 9, .box_w = 12, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 2964, .adv_w = 235, .box_h = 13, .box_w = 13, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 3049, .adv_w = 213, .box_h = 21, .box_w = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3175, .adv_w = 401, .box_h = 27, .box_w = 23, .ofs_x = 1, .ofs_y = -7}, - {.bitmap_index = 3486, .adv_w = 283, .box_h = 20, .box_w = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 3656, .adv_w = 283, .box_h = 20, .box_w = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 3806, .adv_w = 284, .box_h = 22, .box_w = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 3982, .adv_w = 303, .box_h = 20, .box_w = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4142, .adv_w = 246, .box_h = 20, .box_w = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4272, .adv_w = 246, .box_h = 20, .box_w = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4402, .adv_w = 303, .box_h = 22, .box_w = 16, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4578, .adv_w = 315, .box_h = 20, .box_w = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4738, .adv_w = 126, .box_h = 20, .box_w = 4, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 4778, .adv_w = 246, .box_h = 21, .box_w = 12, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 4904, .adv_w = 283, .box_h = 20, .box_w = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5064, .adv_w = 246, .box_h = 20, .box_w = 13, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5194, .adv_w = 386, .box_h = 20, .box_w = 20, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5394, .adv_w = 315, .box_h = 20, .box_w = 16, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5554, .adv_w = 305, .box_h = 22, .box_w = 17, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 5741, .adv_w = 283, .box_h = 20, .box_w = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 5891, .adv_w = 312, .box_h = 23, .box_w = 18, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 6098, .adv_w = 284, .box_h = 20, .box_w = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 6248, .adv_w = 274, .box_h = 22, .box_w = 15, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 6413, .adv_w = 268, .box_h = 20, .box_w = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6583, .adv_w = 303, .box_h = 21, .box_w = 15, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 6741, .adv_w = 283, .box_h = 20, .box_w = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 6921, .adv_w = 386, .box_h = 20, .box_w = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7161, .adv_w = 283, .box_h = 20, .box_w = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7321, .adv_w = 283, .box_h = 20, .box_w = 17, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 7491, .adv_w = 268, .box_h = 20, .box_w = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 7641, .adv_w = 121, .box_h = 28, .box_w = 6, .ofs_x = 2, .ofs_y = -5}, - {.bitmap_index = 7725, .adv_w = 185, .box_h = 22, .box_w = 12, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 7857, .adv_w = 121, .box_h = 28, .box_w = 6, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 7941, .adv_w = 187, .box_h = 10, .box_w = 10, .ofs_x = 1, .ofs_y = 10}, - {.bitmap_index = 7991, .adv_w = 204, .box_h = 3, .box_w = 13, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 8011, .adv_w = 140, .box_h = 4, .box_w = 6, .ofs_x = 1, .ofs_y = 17}, - {.bitmap_index = 8023, .adv_w = 246, .box_h = 16, .box_w = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8127, .adv_w = 255, .box_h = 23, .box_w = 13, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 8277, .adv_w = 235, .box_h = 16, .box_w = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8381, .adv_w = 255, .box_h = 23, .box_w = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8531, .adv_w = 235, .box_h = 16, .box_w = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 8635, .adv_w = 137, .box_h = 22, .box_w = 10, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 8745, .adv_w = 255, .box_h = 21, .box_w = 13, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 8882, .adv_w = 255, .box_h = 22, .box_w = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9014, .adv_w = 113, .box_h = 22, .box_w = 3, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9047, .adv_w = 116, .box_h = 28, .box_w = 6, .ofs_x = -1, .ofs_y = -6}, - {.bitmap_index = 9131, .adv_w = 230, .box_h = 22, .box_w = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9263, .adv_w = 113, .box_h = 22, .box_w = 3, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9296, .adv_w = 392, .box_h = 15, .box_w = 21, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9454, .adv_w = 255, .box_h = 15, .box_w = 12, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9544, .adv_w = 255, .box_h = 16, .box_w = 14, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 9656, .adv_w = 255, .box_h = 21, .box_w = 13, .ofs_x = 2, .ofs_y = -6}, - {.bitmap_index = 9793, .adv_w = 255, .box_h = 21, .box_w = 13, .ofs_x = 1, .ofs_y = -6}, - {.bitmap_index = 9930, .adv_w = 157, .box_h = 15, .box_w = 8, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 9990, .adv_w = 234, .box_h = 16, .box_w = 13, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 10094, .adv_w = 143, .box_h = 20, .box_w = 9, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 10184, .adv_w = 255, .box_h = 16, .box_w = 12, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 10280, .adv_w = 225, .box_h = 15, .box_w = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10385, .adv_w = 339, .box_h = 15, .box_w = 21, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10543, .adv_w = 225, .box_h = 15, .box_w = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 10648, .adv_w = 225, .box_h = 21, .box_w = 14, .ofs_x = 0, .ofs_y = -6}, - {.bitmap_index = 10795, .adv_w = 225, .box_h = 15, .box_w = 12, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 10885, .adv_w = 152, .box_h = 27, .box_w = 10, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 11020, .adv_w = 111, .box_h = 24, .box_w = 3, .ofs_x = 2, .ofs_y = -4}, - {.bitmap_index = 11056, .adv_w = 152, .box_h = 27, .box_w = 9, .ofs_x = 0, .ofs_y = -5}, - {.bitmap_index = 11178, .adv_w = 304, .box_h = 6, .box_w = 17, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 11229, .adv_w = 384, .box_h = 26, .box_w = 24, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 11541, .adv_w = 480, .box_h = 26, .box_w = 30, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 11931, .adv_w = 448, .box_h = 22, .box_w = 28, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 12239, .adv_w = 448, .box_h = 19, .box_w = 24, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 12467, .adv_w = 352, .box_h = 20, .box_w = 20, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 12667, .adv_w = 384, .box_h = 26, .box_w = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 12979, .adv_w = 384, .box_h = 24, .box_w = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13267, .adv_w = 352, .box_h = 24, .box_w = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 13531, .adv_w = 416, .box_h = 20, .box_w = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 13791, .adv_w = 416, .box_h = 24, .box_w = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14103, .adv_w = 384, .box_h = 20, .box_w = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14343, .adv_w = 384, .box_h = 24, .box_w = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 14631, .adv_w = 192, .box_h = 20, .box_w = 12, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14751, .adv_w = 288, .box_h = 20, .box_w = 18, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 14931, .adv_w = 416, .box_h = 22, .box_w = 26, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 15217, .adv_w = 480, .box_h = 24, .box_w = 30, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15577, .adv_w = 384, .box_h = 24, .box_w = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 15865, .adv_w = 256, .box_h = 24, .box_w = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16057, .adv_w = 352, .box_h = 24, .box_w = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16321, .adv_w = 384, .box_h = 24, .box_w = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16609, .adv_w = 384, .box_h = 24, .box_w = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 16897, .adv_w = 256, .box_h = 24, .box_w = 16, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 17089, .adv_w = 385, .box_h = 20, .box_w = 24, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 17329, .adv_w = 320, .box_h = 26, .box_w = 17, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 17550, .adv_w = 320, .box_h = 26, .box_w = 17, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 17771, .adv_w = 352, .box_h = 22, .box_w = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 18013, .adv_w = 352, .box_h = 6, .box_w = 22, .ofs_x = 0, .ofs_y = 8}, - {.bitmap_index = 18079, .adv_w = 448, .box_h = 26, .box_w = 28, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18443, .adv_w = 448, .box_h = 26, .box_w = 28, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 18807, .adv_w = 448, .box_h = 17, .box_w = 26, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 19028, .adv_w = 448, .box_h = 17, .box_w = 26, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 19249, .adv_w = 480, .box_h = 18, .box_w = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 19519, .adv_w = 416, .box_h = 22, .box_w = 26, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 19805, .adv_w = 416, .box_h = 25, .box_w = 26, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20130, .adv_w = 352, .box_h = 22, .box_w = 22, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 20372, .adv_w = 448, .box_h = 22, .box_w = 28, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 20680, .adv_w = 448, .box_h = 28, .box_w = 28, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 21072, .adv_w = 384, .box_h = 24, .box_w = 24, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 21360, .adv_w = 224, .box_h = 26, .box_w = 14, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 21542, .adv_w = 448, .box_h = 28, .box_w = 26, .ofs_x = 1, .ofs_y = -4}, - {.bitmap_index = 21906, .adv_w = 480, .box_h = 18, .box_w = 30, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 22176, .adv_w = 352, .box_h = 22, .box_w = 22, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 22418, .adv_w = 384, .box_h = 28, .box_w = 24, .ofs_x = 0, .ofs_y = -4}, - {.bitmap_index = 22754, .adv_w = 512, .box_h = 22, .box_w = 32, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23106, .adv_w = 576, .box_h = 20, .box_w = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23466, .adv_w = 576, .box_h = 20, .box_w = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 23826, .adv_w = 576, .box_h = 20, .box_w = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 24186, .adv_w = 576, .box_h = 20, .box_w = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 24546, .adv_w = 576, .box_h = 20, .box_w = 36, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 24906, .adv_w = 384, .box_h = 28, .box_w = 22, .ofs_x = 1, .ofs_y = -4} + {.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 = 111, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 115, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 40, .adv_w = 143, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 14}, + {.bitmap_index = 65, .adv_w = 279, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 235, .adv_w = 252, .box_w = 14, .box_h = 26, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 417, .adv_w = 328, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 607, .adv_w = 278, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 777, .adv_w = 78, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 14}, + {.bitmap_index = 788, .adv_w = 153, .box_w = 9, .box_h = 30, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 923, .adv_w = 156, .box_w = 8, .box_h = 30, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 1043, .adv_w = 193, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 1115, .adv_w = 254, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1220, .adv_w = 88, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 1238, .adv_w = 124, .box_w = 8, .box_h = 3, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 1250, .adv_w = 118, .box_w = 5, .box_h = 3, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1258, .adv_w = 185, .box_w = 11, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1379, .adv_w = 252, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1519, .adv_w = 252, .box_w = 8, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1599, .adv_w = 252, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1739, .adv_w = 252, .box_w = 13, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1869, .adv_w = 252, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2029, .adv_w = 252, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2159, .adv_w = 251, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2299, .adv_w = 252, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2439, .adv_w = 252, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2579, .adv_w = 252, .box_w = 13, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2709, .adv_w = 109, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2739, .adv_w = 95, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 2787, .adv_w = 228, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 2872, .adv_w = 246, .box_w = 12, .box_h = 8, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 2920, .adv_w = 234, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 3005, .adv_w = 212, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3125, .adv_w = 402, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 3424, .adv_w = 292, .box_w = 18, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3604, .adv_w = 279, .box_w = 14, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3744, .adv_w = 292, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3904, .adv_w = 294, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4054, .adv_w = 255, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4184, .adv_w = 248, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4314, .adv_w = 305, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4484, .adv_w = 319, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4644, .adv_w = 122, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4684, .adv_w = 247, .box_w = 14, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4824, .adv_w = 281, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4984, .adv_w = 241, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5114, .adv_w = 391, .box_w = 21, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5324, .adv_w = 319, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5484, .adv_w = 308, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5654, .adv_w = 283, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 5804, .adv_w = 308, .box_w = 17, .box_h = 24, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6008, .adv_w = 276, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 6158, .adv_w = 266, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6308, .adv_w = 267, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6478, .adv_w = 291, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 6638, .adv_w = 285, .box_w = 18, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6818, .adv_w = 397, .box_w = 25, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7068, .adv_w = 281, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7238, .adv_w = 269, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7408, .adv_w = 268, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 7558, .adv_w = 119, .box_w = 6, .box_h = 27, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 7639, .adv_w = 184, .box_w = 12, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7771, .adv_w = 119, .box_w = 6, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 7852, .adv_w = 187, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 7907, .adv_w = 202, .box_w = 13, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7927, .adv_w = 138, .box_w = 7, .box_h = 4, .ofs_x = 0, .ofs_y = 17}, + {.bitmap_index = 7941, .adv_w = 244, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8039, .adv_w = 251, .box_w = 14, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8186, .adv_w = 235, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8284, .adv_w = 253, .box_w = 13, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8421, .adv_w = 237, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8519, .adv_w = 156, .box_w = 10, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8629, .adv_w = 251, .box_w = 13, .box_h = 21, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 8766, .adv_w = 247, .box_w = 13, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8903, .adv_w = 109, .box_w = 4, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 8943, .adv_w = 107, .box_w = 6, .box_h = 26, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 9021, .adv_w = 227, .box_w = 14, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9168, .adv_w = 109, .box_w = 3, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 9200, .adv_w = 393, .box_w = 22, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9365, .adv_w = 247, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9463, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9568, .adv_w = 251, .box_w = 14, .box_h = 21, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 9715, .adv_w = 255, .box_w = 13, .box_h = 21, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 9852, .adv_w = 152, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 9920, .adv_w = 231, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10018, .adv_w = 146, .box_w = 9, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10104, .adv_w = 247, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10202, .adv_w = 217, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10307, .adv_w = 337, .box_w = 21, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10465, .adv_w = 222, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10570, .adv_w = 212, .box_w = 13, .box_h = 21, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 10707, .adv_w = 222, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 10797, .adv_w = 152, .box_w = 10, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 10937, .adv_w = 109, .box_w = 3, .box_h = 24, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 10973, .adv_w = 152, .box_w = 9, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 11099, .adv_w = 305, .box_w = 17, .box_h = 6, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 11150, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11556, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 11850, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 12200, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12494, .adv_w = 308, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12704, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 13110, .adv_w = 448, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 13502, .adv_w = 504, .box_w = 32, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 13902, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 14308, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14644, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 15050, .adv_w = 224, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15211, .adv_w = 336, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 15453, .adv_w = 504, .box_w = 32, .box_h = 27, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 15885, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 16179, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 16413, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 16776, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17089, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 17402, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 17636, .adv_w = 392, .box_w = 26, .box_h = 25, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 17961, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 18161, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 18361, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 18674, .adv_w = 392, .box_w = 25, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 18762, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 19098, .adv_w = 560, .box_w = 35, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 19606, .adv_w = 504, .box_w = 33, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 20085, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 20435, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 20623, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 20811, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21196, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 21490, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 21896, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 22317, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 22630, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 22993, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 23306, .adv_w = 280, .box_w = 19, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 23582, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 23945, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 24308, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 24644, .adv_w = 448, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 25079, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 25384, .adv_w = 560, .box_w = 35, .box_h = 26, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 25839, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 26172, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 26505, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 26838, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 27171, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 27504, .adv_w = 560, .box_w = 36, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 27918, .adv_w = 392, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 28237, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 28600, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 29021, .adv_w = 560, .box_w = 35, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 29389, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 29694, .adv_w = 451, .box_w = 29, .box_h = 19, .ofs_x = 0, .ofs_y = 1} }; /*--------------------- @@ -3669,25 +4304,26 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { *--------------------*/ static const uint16_t unicode_list_1[] = { - 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x13, - 0x14, 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, - 0x3f, 0x47, 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, - 0x53, 0x66, 0x67, 0x70, 0x73, 0x76, 0x77, 0x78, - 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xe6, 0xf2, - 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, 0x240, 0x241, 0x242, - 0x243, 0x292 + 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x14, + 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, 0x47, + 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, 0x53, 0x66, + 0x67, 0x6d, 0x6f, 0x70, 0x73, 0x76, 0x77, 0x78, + 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xe6, 0xe9, + 0xf2, 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, 0x240, 0x241, + 0x242, 0x243, 0x286, 0x292, 0x2ec, 0x303, 0x559, 0x7c1, + 0x8a1 }; /*Collect the unicode lists and glyph_id offsets*/ static const lv_font_fmt_txt_cmap_t cmaps[] = { { - .range_start = 32, .range_length = 95, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY, - .glyph_id_start = 1, .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0 + .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 = 61441, .range_length = 659, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY, - .glyph_id_start = 96, .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 50 + .range_start = 61441, .range_length = 2210, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 57, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; @@ -3696,569 +4332,245 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = *----------------*/ -/*Pair left and right glyphs for kerning*/ -static const uint8_t kern_pair_glyph_ids[] = +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = { - 9, 43, - 9, 55, - 9, 56, - 9, 58, - 17, 17, - 17, 18, - 17, 20, - 17, 21, - 17, 22, - 17, 23, - 17, 24, - 17, 26, - 18, 19, - 18, 20, - 18, 22, - 18, 24, - 19, 17, - 19, 18, - 19, 19, - 19, 22, - 19, 23, - 19, 24, - 19, 25, - 19, 26, - 20, 18, - 20, 19, - 20, 20, - 20, 21, - 20, 22, - 20, 23, - 20, 24, - 20, 25, - 20, 26, - 21, 17, - 21, 19, - 21, 21, - 21, 22, - 21, 23, - 21, 24, - 21, 25, - 22, 18, - 22, 19, - 22, 20, - 22, 21, - 22, 22, - 22, 23, - 22, 24, - 22, 25, - 22, 26, - 23, 17, - 23, 18, - 23, 19, - 23, 21, - 23, 22, - 23, 23, - 23, 24, - 23, 25, - 24, 18, - 24, 21, - 24, 22, - 24, 23, - 24, 24, - 24, 25, - 24, 26, - 25, 17, - 25, 18, - 25, 20, - 25, 21, - 25, 22, - 25, 23, - 26, 17, - 26, 18, - 26, 19, - 26, 21, - 26, 22, - 26, 23, - 26, 24, - 26, 26, - 34, 36, - 34, 40, - 34, 48, - 34, 50, - 34, 53, - 34, 54, - 34, 55, - 34, 56, - 34, 58, - 34, 66, - 34, 68, - 34, 69, - 34, 70, - 34, 72, - 34, 80, - 34, 82, - 34, 84, - 34, 85, - 34, 86, - 34, 87, - 34, 88, - 34, 91, - 35, 58, - 35, 66, - 35, 74, - 35, 77, - 35, 80, - 35, 83, - 35, 86, - 35, 90, - 36, 36, - 36, 40, - 36, 48, - 36, 50, - 36, 74, - 36, 83, - 36, 86, - 36, 90, - 36, 91, - 37, 55, - 37, 56, - 37, 66, - 37, 70, - 37, 80, - 37, 86, - 38, 55, - 38, 56, - 38, 58, - 38, 67, - 38, 68, - 38, 69, - 38, 70, - 38, 71, - 38, 72, - 38, 74, - 38, 75, - 38, 76, - 38, 77, - 38, 78, - 38, 79, - 38, 80, - 38, 81, - 38, 82, - 38, 83, - 38, 85, - 38, 86, - 38, 87, - 38, 88, - 38, 89, - 38, 90, - 38, 91, - 39, 13, - 39, 15, - 39, 34, - 39, 66, - 39, 70, - 39, 74, - 39, 77, - 39, 80, - 39, 83, - 39, 86, - 39, 90, - 40, 66, - 40, 70, - 40, 79, - 40, 80, - 40, 83, - 40, 86, - 40, 90, - 41, 66, - 41, 70, - 41, 80, - 41, 86, - 41, 90, - 42, 66, - 42, 68, - 42, 69, - 42, 71, - 42, 72, - 42, 78, - 42, 79, - 42, 80, - 42, 81, - 42, 83, - 42, 84, - 42, 85, - 42, 86, - 42, 87, - 42, 88, - 42, 90, - 43, 66, - 43, 80, - 44, 36, - 44, 40, - 44, 48, - 44, 50, - 44, 66, - 44, 70, - 44, 74, - 44, 80, - 44, 83, - 44, 86, - 44, 88, - 44, 90, - 45, 34, - 45, 36, - 45, 40, - 45, 48, - 45, 50, - 45, 53, - 45, 54, - 45, 55, - 45, 56, - 45, 58, - 45, 75, - 45, 86, - 45, 88, - 45, 90, - 46, 66, - 46, 70, - 46, 75, - 46, 79, - 46, 80, - 46, 86, - 46, 90, - 47, 70, - 47, 80, - 47, 90, - 48, 34, - 48, 53, - 48, 55, - 48, 56, - 48, 57, - 48, 58, - 48, 68, - 48, 69, - 48, 70, - 48, 71, - 48, 72, - 48, 75, - 48, 80, - 48, 81, - 48, 82, - 48, 84, - 48, 85, - 48, 86, - 48, 89, - 48, 90, - 48, 91, - 49, 13, - 49, 15, - 49, 34, - 49, 38, - 49, 41, - 49, 42, - 49, 66, - 49, 70, - 49, 73, - 49, 74, - 49, 77, - 49, 79, - 49, 80, - 49, 83, - 49, 84, - 49, 85, - 49, 90, - 50, 34, - 50, 53, - 50, 54, - 50, 55, - 50, 56, - 50, 57, - 50, 58, - 50, 66, - 50, 86, - 51, 36, - 51, 40, - 51, 48, - 51, 50, - 51, 53, - 51, 54, - 51, 55, - 51, 56, - 51, 58, - 51, 66, - 51, 70, - 51, 80, - 51, 86, - 51, 90, - 52, 66, - 52, 70, - 52, 75, - 52, 78, - 52, 79, - 52, 80, - 52, 81, - 52, 82, - 52, 86, - 52, 88, - 52, 90, - 53, 13, - 53, 14, - 53, 15, - 53, 27, - 53, 28, - 53, 34, - 53, 36, - 53, 40, - 53, 48, - 53, 50, - 53, 52, - 53, 53, - 53, 55, - 53, 56, - 53, 57, - 53, 58, - 53, 66, - 53, 70, - 53, 74, - 53, 78, - 53, 80, - 53, 83, - 53, 84, - 53, 86, - 53, 88, - 53, 90, - 53, 91, - 54, 34, - 54, 69, - 54, 71, - 54, 72, - 54, 78, - 54, 79, - 54, 81, - 54, 83, - 54, 84, - 54, 85, - 54, 89, - 54, 91, - 55, 10, - 55, 13, - 55, 14, - 55, 15, - 55, 27, - 55, 28, - 55, 34, - 55, 36, - 55, 40, - 55, 48, - 55, 50, - 55, 62, - 55, 66, - 55, 70, - 55, 80, - 55, 83, - 55, 86, - 55, 90, - 55, 94, - 56, 10, - 56, 13, - 56, 14, - 56, 15, - 56, 27, - 56, 28, - 56, 34, - 56, 36, - 56, 40, - 56, 48, - 56, 50, - 56, 53, - 56, 62, - 56, 66, - 56, 70, - 56, 80, - 56, 83, - 56, 86, - 56, 90, - 56, 94, - 57, 36, - 57, 40, - 57, 48, - 57, 50, - 57, 70, - 57, 86, - 57, 90, - 58, 10, - 58, 13, - 58, 14, - 58, 15, - 58, 27, - 58, 28, - 58, 34, - 58, 36, - 58, 40, - 58, 48, - 58, 50, - 58, 53, - 58, 55, - 58, 56, - 58, 57, - 58, 58, - 58, 62, - 58, 66, - 58, 70, - 58, 80, - 58, 82, - 58, 85, - 58, 86, - 58, 87, - 58, 94, - 59, 34, - 59, 36, - 59, 40, - 59, 48, - 59, 50, - 59, 66, - 59, 70, - 59, 74, - 59, 80, - 59, 86, - 59, 88, - 59, 90, - 60, 43, - 67, 87, - 67, 88, - 67, 90, - 70, 90, - 71, 3, - 71, 8, - 71, 10, - 71, 62, - 71, 72, - 71, 94, - 76, 70, - 80, 87, - 80, 88, - 80, 89, - 80, 90, - 81, 88, - 83, 13, - 83, 15, - 83, 68, - 83, 69, - 83, 70, - 83, 71, - 83, 76, - 83, 80, - 83, 82, - 83, 85, - 83, 86, - 83, 87, - 83, 88, - 83, 89, - 83, 90, - 83, 91, - 87, 13, - 87, 15, - 87, 66, - 87, 68, - 87, 69, - 87, 70, - 87, 80, - 87, 82, - 88, 13, - 88, 15, - 88, 68, - 88, 69, - 88, 70, - 88, 82, - 89, 68, - 89, 69, - 89, 70, - 89, 80, - 89, 82, - 90, 13, - 90, 15, - 90, 68, - 90, 69, - 90, 70, - 90, 80, - 90, 82, - 91, 68, - 91, 69, - 91, 70, - 91, 80, - 92, 43 + 0, 1, 0, 2, 0, 0, 0, 0, + 2, 3, 0, 0, 0, 4, 0, 4, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 7, 8, 9, 10, 11, + 0, 12, 12, 13, 14, 15, 12, 12, + 9, 16, 17, 18, 0, 19, 13, 20, + 21, 22, 23, 24, 25, 0, 0, 0, + 0, 0, 26, 27, 28, 0, 29, 30, + 0, 31, 0, 0, 32, 0, 31, 31, + 33, 27, 0, 34, 0, 35, 0, 36, + 37, 38, 36, 39, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; -/* Kerning between the respective left and right glyphs - * 4.4 format which needs to scaled with `kern_scale`*/ -static const int8_t kern_pair_values[] = +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = { - -21, 9, 8, 10, 1, -8, -1, 1, - -1, 1, -9, 1, -1, -1, -1, 0, - -4, -4, 2, -3, -4, -5, -4, 0, - -4, -1, 2, 3, 1, -1, -6, 1, - 0, 1, -7, 7, 4, 1, -18, 4, - -1, -5, 1, 4, 1, 0, -1, 1, - -6, 0, -9, -5, 5, 2, 0, -9, - 2, 8, -35, -7, -9, 8, -5, -2, - 0, -5, 2, 4, 2, 0, 1, -8, - -2, 1, -1, 1, -10, 1, -8, -9, - -9, -9, -33, -10, -32, -22, -36, 1, - -4, -6, -5, -3, -5, -3, 1, -14, - -5, -18, -15, 5, -36, 2, -1, -1, - 1, 0, 1, 1, -1, -1, -2, -1, - -3, -1, -1, 2, -2, -9, -6, -1, - 1, 1, 1, 4, 4, 4, -2, -8, - -9, -9, -8, -7, -2, -2, -2, -2, - -4, -4, -9, -3, -7, -3, -10, -7, - -12, -10, 1, -11, 1, -67, -67, -26, - -15, -10, -2, -2, -10, -12, -10, -11, - 0, 1, 0, 0, 0, 0, 0, -1, - -2, -2, -2, -1, -2, -2, -4, -3, - -2, -2, -2, -3, -1, -2, -2, -2, - -2, -1, -1, -1, -2, -2, -12, -13, - -14, -13, -2, -12, -2, -12, -2, -10, - -17, -18, 9, -9, -10, -11, -10, -34, - -11, -40, -24, -39, 0, -6, -19, -24, - -2, -2, -2, -2, -2, -2, -1, -2, - -2, -1, -9, -12, -10, -5, -10, -13, - 0, -1, 0, 0, 0, -2, 0, 0, - 1, 0, 1, 0, -3, 2, -3, -73, - -73, -24, -1, -1, -1, -5, -6, 0, - -2, -1, -1, -6, -1, -3, 6, 7, - 6, -15, -3, -12, -9, 5, -16, 0, - -1, -2, -2, -3, -2, -9, -3, -9, - -7, -21, -1, -3, -3, -2, 0, 0, - -1, -2, -1, -1, -1, 0, 0, 0, - 1, 1, -36, -35, -36, -34, -34, -35, - -11, -12, -12, -12, -7, 7, 7, 7, - 5, 7, -35, -35, -2, -29, -35, -29, - -34, -29, -21, -22, -27, -10, -3, -1, - -2, -2, -2, -2, -2, -3, 0, -3, - -4, 9, -39, -16, -38, -14, -14, -33, - -9, -9, -10, -9, 7, -21, -20, -21, - -14, -13, -5, 8, 7, -26, -9, -26, - -10, -10, -24, -6, -6, -7, -6, 6, - 5, -15, -14, -14, -9, -9, -2, 6, - -10, -10, -11, -10, -12, -10, -14, 9, - -41, -23, -41, -19, -19, -37, -12, -12, - -13, -12, 7, 8, 7, 6, 8, 8, - -28, -29, -29, -27, -10, -17, -9, 9, - 6, -10, -11, -12, -11, 0, -9, -2, - -10, -8, -12, -12, -8, -5, -3, -5, - -6, 6, 7, 9, 8, -11, 9, -9, - -7, -4, -9, -7, -3, -28, -28, -8, - -8, -8, 7, 0, -9, -8, 7, 0, - 8, 8, 4, 8, 2, -26, -26, -7, - -6, -6, -6, -7, -6, -21, -20, -4, - -4, -5, -4, -9, -8, -9, -9, -8, - -30, -28, -7, -7, -7, -7, -9, -7, - -7, -7, -7, -9 + 0, 1, 0, 2, 0, 0, 0, 3, + 2, 0, 4, 5, 0, 6, 7, 6, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 10, 0, 11, 0, 0, 0, + 11, 0, 0, 12, 0, 0, 0, 0, + 11, 0, 11, 0, 13, 14, 15, 16, + 17, 18, 19, 20, 0, 0, 21, 0, + 0, 0, 22, 0, 23, 23, 23, 24, + 23, 0, 0, 0, 0, 0, 25, 25, + 26, 25, 23, 27, 28, 29, 30, 31, + 32, 33, 31, 34, 0, 0, 35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; -/*Collect the kern pair's data in one place*/ -static const lv_font_fmt_txt_kern_pair_t kern_pairs = +/*Kern values between classes*/ +static const int8_t kern_class_values[] = { - .glyph_ids = kern_pair_glyph_ids, - .values = kern_pair_values, - .pair_cnt = 484, - .glyph_ids_size = 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -23, 0, 0, 0, + 0, 0, 0, 0, -26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, -13, 0, -4, -13, 0, -17, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -37, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -49, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -26, 0, 0, 0, 0, 0, 0, -13, + 0, -2, 0, 0, -28, -4, -19, -15, + 0, -21, 0, 0, 0, 0, 0, 0, + -3, 0, 0, -4, -2, -11, -7, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, -5, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -6, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, -22, 0, 0, + 0, -5, 0, 0, 0, -6, 0, -5, + 0, -5, -9, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -4, -4, 0, -4, 0, 0, 0, + -4, -6, -5, 0, 0, 0, 0, 0, + 0, 0, 0, -51, 0, 0, 0, -37, + 0, -58, 0, 4, 0, 0, 0, 0, + 0, 0, 0, -7, -5, 0, 0, -5, + -6, 0, 0, -5, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, -6, 0, + 0, 0, 4, -6, 0, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -14, 0, 0, + 0, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -6, 0, -5, + -6, 0, 0, 0, -5, -9, -14, 0, + 0, 0, 0, -73, 0, 0, 0, 0, + 0, 0, 0, 4, -14, 0, 0, -60, + -12, -38, -31, 0, -52, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -10, + -29, -20, 0, 0, 0, 0, 0, 0, + 0, 0, -71, 0, 0, 0, -30, 0, + -44, 0, 0, 0, 0, 0, -7, 0, + -6, 0, -2, -3, 0, 0, -3, 0, + 0, 3, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, -6, + -4, 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, 0, 0, 0, + -17, 0, -4, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -9, 0, + 0, 0, 0, -48, -51, 0, 0, -17, + -6, -52, -3, 4, 0, 4, 3, 0, + 4, 0, 0, -25, -22, 0, -24, -22, + -16, -25, 0, -21, -16, -12, -17, -13, + 0, 0, 0, 0, 4, 0, -49, -8, + 0, 0, -16, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, -10, -10, + 0, 0, -10, -7, 0, 0, -6, -2, + 0, 0, 0, 4, 0, 0, 0, 3, + 0, -27, -13, 0, 0, -9, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 3, -7, -7, 0, 0, -7, -5, 0, + 0, -4, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, -5, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, -6, 0, 0, + -5, 0, 0, 0, -5, -7, 0, 0, + 0, 0, 0, 0, -7, 4, -11, -46, + -11, 0, 0, -21, -6, -21, -3, 4, + -21, 4, 4, 3, 4, 0, 4, -16, + -14, -5, -9, -14, -9, -13, -5, -9, + -4, 0, -5, -7, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, 0, 0, -5, 0, + 0, 0, -4, -6, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, -6, + 0, 0, 0, 0, 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, -3, -3, + 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, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 0, + 4, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, -23, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -30, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + -5, -3, 0, 0, 4, 0, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, -4, 3, 0, -4, 0, 0, 11, + 0, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, -23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -3, + 3, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, -4, 0, 0, 0, 0, + 0, 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 = 40, + .right_class_cnt = 35, }; /*-------------------- @@ -4270,12 +4582,12 @@ 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_scale = 16, - .kern_dsc = &kern_pairs, - .kern_classes = 0 + .kern_classes = 1, + .bitmap_format = 0 }; @@ -4285,11 +4597,13 @@ static lv_font_fmt_txt_dsc_t font_dsc = { /*Initialize a public general font descriptor*/ lv_font_t lv_font_roboto_28 = { - .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ - .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ - .line_height = 31, /*The maximum line height required by the font*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 32, /*The maximum line height required by the font*/ .base_line = 7, /*Baseline measured from the bottom of the line*/ + .subpx = LV_FONT_SUBPX_NONE, + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ }; #endif /*#if LV_FONT_ROBOTO_28*/ + diff --git a/src/lv_font/lv_font_roboto_28_compressed.c b/src/lv_font/lv_font_roboto_28_compressed.c new file mode 100644 index 000000000..92e714793 --- /dev/null +++ b/src/lv_font/lv_font_roboto_28_compressed.c @@ -0,0 +1,2451 @@ +#include "../../lvgl.h" + +/******************************************************************************* + * Size: 28 px + * Bpp: 3 + * Opts: --bpp 3 --size 28 --font Roboto-Regular.woff -r 0x20-0x7F --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 lv_font_roboto_28_compressed.c --force-fast-kern-format + ******************************************************************************/ + +#ifndef LV_FONT_ROBOTO_28_COMPRESSED +#define LV_FONT_ROBOTO_28_COMPRESSED 1 +#endif + +#if LV_FONT_ROBOTO_28_COMPRESSED + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { + /* U+20 " " */ + + /* U+21 "!" */ + 0xbf, 0x80, 0xff, 0xe3, 0x90, 0x38, 0x81, 0xff, + 0xcf, 0x9b, 0x80, 0x24, 0x7, 0x2d, 0x4, 0x2c, + 0xd0, 0x88, + + /* U+22 "\"" */ + 0x3f, 0x7, 0xd8, 0x1f, 0xcc, 0xf, 0xf1, 0x0, + 0x40, 0xf7, 0x2, 0x65, 0x10, 0x51, + + /* U+23 "#" */ + 0x3, 0xef, 0xc0, 0x53, 0xb0, 0x3f, 0x20, 0x80, + 0x88, 0x20, 0x7e, 0x20, 0x81, 0x20, 0x80, 0xfd, + 0x86, 0x3, 0xff, 0x84, 0xc3, 0x0, 0x82, 0x3, + 0xf8, 0x82, 0x0, 0x82, 0x7, 0x7f, 0x80, 0x7f, + 0x40, 0xff, 0x10, 0x3f, 0xf8, 0xff, 0xcc, 0x5f, + 0xe0, 0x1f, 0xc4, 0xe, 0x41, 0x0, 0x41, 0x1, + 0xfc, 0x40, 0xc4, 0x60, 0x3f, 0x20, 0x80, 0xb0, + 0x40, 0x77, 0xf5, 0xb, 0xf9, 0xd, 0xf8, 0x81, + 0xff, 0xc7, 0xfe, 0x23, 0xfa, 0x85, 0xfc, 0x40, + 0xe2, 0x6, 0x23, 0x1, 0xf8, 0x84, 0x5, 0x81, + 0x3, 0xf2, 0x4, 0x9, 0x86, 0x7, 0xee, 0x30, + 0x11, 0x4, 0xf, 0xc8, 0x30, 0x4, 0x10, 0x3c, + + /* U+24 "$" */ + 0x3, 0xdb, 0x90, 0x3f, 0xfb, 0x33, 0x91, 0xa9, + 0x3, 0x8f, 0x60, 0x65, 0x98, 0x1b, 0x0, 0x9b, + 0x20, 0x8, 0x40, 0x30, 0x15, 0x92, 0x74, 0x5, + 0x1, 0x80, 0x20, 0x32, 0x21, 0x81, 0x88, 0x1e, + 0x40, 0x62, 0x8, 0x1e, 0xb6, 0x1, 0x80, 0x50, + 0x38, 0xa4, 0x0, 0x88, 0x59, 0x81, 0xfd, 0x88, + 0x33, 0xd2, 0x7, 0xda, 0x10, 0xb, 0x50, 0x3e, + 0x7b, 0x18, 0x5, 0xc0, 0xfc, 0x67, 0x40, 0x28, + 0x1f, 0xea, 0x82, 0xa, 0xd0, 0x1f, 0x60, 0x4, + 0x92, 0x10, 0x3c, 0x40, 0x90, 0xa, 0x7, 0xb8, + 0x2, 0x60, 0xd8, 0xd, 0x10, 0x40, 0x38, 0x9, + 0xf6, 0x76, 0x2, 0x80, 0x39, 0x0, 0x24, 0x1, + 0x70, 0x31, 0xbe, 0x0, 0xbe, 0x81, 0xf9, 0x80, + 0x40, 0x7f, 0xf1, 0xc0, + + /* U+25 "%" */ + 0x0, 0xf7, 0xcc, 0xf, 0xfe, 0xd, 0x85, 0x19, + 0x40, 0xff, 0x92, 0x1f, 0x79, 0x48, 0x6, 0x84, + 0xd, 0x85, 0x2, 0xa3, 0x1, 0x36, 0xa0, 0x78, + 0x81, 0x10, 0x31, 0x86, 0x1, 0xe2, 0x7, 0xe8, + 0x20, 0x1d, 0x85, 0x2, 0x83, 0x6, 0x94, 0x7, + 0x24, 0x3e, 0xe2, 0x90, 0x41, 0x40, 0xfa, 0xc2, + 0x8c, 0xa2, 0x8a, 0x7, 0xf3, 0xdf, 0x98, 0x4b, + 0x1, 0xff, 0xc3, 0xa2, 0x81, 0xff, 0xc3, 0x82, + 0x0, 0xbf, 0xb2, 0x3, 0xf1, 0x65, 0x8e, 0x8a, + 0x35, 0x81, 0xf7, 0x1c, 0x40, 0xf5, 0xc2, 0x1, + 0xe8, 0x59, 0x8, 0x40, 0x5, 0x4, 0x6, 0x2c, + 0xc0, 0x4, 0xe, 0x20, 0x7b, 0x8e, 0x4, 0x40, + 0xe2, 0x7, 0xcc, 0x81, 0x21, 0x0, 0x14, 0x10, + 0x1b, 0x40, 0x34, 0xf, 0x5c, 0x20, 0x1f, 0xfc, + 0xe, 0x8a, 0x35, 0x80, + + /* U+26 "&" */ + 0x3, 0x3d, 0xfb, 0x30, 0x3f, 0xda, 0x10, 0x6, + 0x50, 0x3f, 0x42, 0x1e, 0xc6, 0x12, 0x1, 0xf2, + 0x6, 0x12, 0x84, 0x70, 0x3e, 0x21, 0x1, 0x98, + 0x1f, 0xf1, 0x3, 0x21, 0x80, 0xf9, 0x84, 0x40, + 0x60, 0xc, 0xf, 0xa8, 0xe, 0xb9, 0x18, 0xf, + 0xc6, 0x3, 0x41, 0xe4, 0xf, 0xe4, 0x4, 0x70, + 0x1f, 0xe7, 0x80, 0x8a, 0x3, 0x12, 0x2, 0x70, + 0x2c, 0x45, 0x20, 0xe, 0xc0, 0x28, 0xd, 0x38, + 0x8c, 0x43, 0x3, 0x30, 0x1c, 0xb, 0x80, 0xe3, + 0x2, 0x3, 0x80, 0x20, 0x46, 0x83, 0x98, 0x40, + 0x7f, 0x95, 0x4, 0x4, 0x1, 0x80, 0x40, 0x39, + 0x10, 0x8, 0x9, 0x20, 0x74, 0x80, 0x58, 0x80, + 0x48, 0x5, 0x50, 0x5b, 0xf5, 0x21, 0x91, 0x48, + 0x15, 0xa4, 0x4, 0x5e, 0x9c, 0x7, 0x0, + + /* U+27 "'" */ + 0x9d, 0x81, 0xf8, 0x81, 0xcf, 0x32, + + /* U+28 "(" */ + 0x3, 0xe2, 0x7, 0xd7, 0x81, 0xea, 0x98, 0x1d, + 0x11, 0xa0, 0x64, 0xc6, 0x3, 0xa0, 0x80, 0x73, + 0x21, 0x81, 0xd4, 0x30, 0x38, 0x90, 0xa0, 0x72, + 0x0, 0x40, 0xec, 0x10, 0x1e, 0x40, 0x81, 0xfb, + 0x81, 0xc4, 0xf, 0xf8, 0x81, 0xff, 0xc5, 0x20, + 0x71, 0x3, 0xfe, 0xe0, 0x79, 0x2, 0x7, 0xb0, + 0x40, 0x79, 0x0, 0x20, 0x71, 0x21, 0x40, 0xf5, + 0xc, 0xf, 0x32, 0x18, 0x1e, 0x82, 0x1, 0xe4, + 0xc5, 0x3, 0xd1, 0x25, 0x3, 0xd5, 0x30, 0x3e, + 0xbc, 0x0, + + /* U+29 ")" */ + 0x3, 0xf2, 0xe8, 0xe, 0x62, 0xa0, 0x31, 0xc2, + 0x90, 0x31, 0x63, 0x81, 0xd0, 0x16, 0x7, 0x41, + 0x0, 0xe6, 0x1, 0x81, 0xc8, 0x60, 0x3b, 0x4, + 0x7, 0x20, 0x8, 0xc, 0x40, 0x10, 0x3e, 0xe0, + 0x71, 0x4, 0xf, 0xfe, 0x89, 0x4, 0xf, 0xb8, + 0x18, 0x80, 0x20, 0x64, 0x1, 0x1, 0xb0, 0x40, + 0x72, 0x18, 0xc, 0x80, 0x30, 0x34, 0x10, 0xc, + 0xc9, 0x30, 0x23, 0x7, 0x2, 0x38, 0x52, 0x4, + 0xc5, 0x40, 0x65, 0x90, 0x1c, + + /* U+2A "*" */ + 0x3, 0xbf, 0x1, 0xff, 0xd2, 0xa8, 0xf, 0x18, + 0x1a, 0xbe, 0x0, 0x7b, 0x1b, 0x26, 0x43, 0x1, + 0x8, 0x44, 0xa6, 0xc2, 0x0, 0xdf, 0x50, 0x13, + 0x20, 0xb, 0x3, 0xd4, 0x58, 0x38, 0x1d, 0x42, + 0x46, 0x4a, 0x1, 0xea, 0x3, 0x82, 0x6, 0xb8, + 0x8, 0xda, 0x0, + + /* U+2B "+" */ + 0x3, 0x8b, 0x60, 0x3f, 0xe5, 0x20, 0x81, 0xff, + 0xf1, 0x4d, 0xee, 0x1, 0x37, 0x95, 0x93, 0x30, + 0x12, 0x77, 0x3, 0xff, 0x85, 0xff, 0x40, 0x1b, + 0xfd, 0x40, 0xff, 0xfd, 0x0, + + /* U+2C "," */ + 0xb, 0xf1, 0x3, 0xfe, 0x20, 0x8, 0xa1, 0x84, + 0x44, 0x9, 0x28, 0x0, + + /* U+2D "-" */ + 0x3, 0xf4, 0xff, 0xc4, 0xf, 0xc0, + + /* U+2E "." */ + 0x13, 0xd0, 0xc, 0x20, 0xc, 0x20, + + /* U+2F "/" */ + 0x3, 0xf5, 0xf0, 0xf, 0xc8, 0x50, 0x3e, 0x60, + 0x90, 0x1f, 0x51, 0x0, 0xf8, 0x90, 0x40, 0x7d, + 0x43, 0x3, 0xf3, 0x14, 0xf, 0x90, 0x24, 0x7, + 0xdc, 0x50, 0x3f, 0x20, 0xc0, 0xf9, 0x84, 0x7, + 0xe8, 0x38, 0x1f, 0x20, 0x8, 0xf, 0xb8, 0x60, + 0x7e, 0x42, 0x81, 0xf3, 0x8, 0x81, 0xf5, 0x1c, + 0xf, 0x89, 0x4, 0x7, 0xd4, 0x30, 0x3f, 0x31, + 0x40, 0xf9, 0x2, 0x40, 0x7e, 0x70, 0xf, 0xc0, + + /* U+30 "0" */ + 0x2, 0x33, 0x7e, 0xd0, 0xf, 0x2c, 0xc8, 0x2, + 0xf9, 0x2, 0x34, 0x1b, 0xf4, 0x1, 0xc0, 0xa0, + 0xc, 0x81, 0x74, 0x14, 0x1, 0x6, 0x7, 0x22, + 0x38, 0x20, 0x30, 0x1e, 0x41, 0x6, 0x1, 0x81, + 0xee, 0x4, 0x40, 0xff, 0xe2, 0x10, 0x3f, 0x88, + 0x1f, 0xfd, 0xe2, 0x0, 0x81, 0xfc, 0x40, 0xff, + 0xe1, 0x30, 0xc, 0xf, 0x70, 0x22, 0x3, 0x1, + 0xe6, 0x10, 0x6, 0x19, 0x3, 0x20, 0x1c, 0x5, + 0x1, 0x90, 0x7, 0x41, 0x40, 0xd, 0x1, 0x7f, + 0x40, 0x1c, 0xc, 0xb3, 0x20, 0xb, 0xe4, 0x0, + + /* U+31 "1" */ + 0x3, 0x8c, 0xe0, 0x4f, 0x63, 0xa, 0xf8, 0x40, + 0xba, 0x6, 0x20, 0x5, 0xec, 0x64, 0x4, 0x82, + 0x7, 0xff, 0xfc, 0xf, 0xfe, 0xf0, + + /* U+32 "2" */ + 0x2, 0x57, 0xfb, 0x40, 0x3d, 0x69, 0x1, 0x17, + 0xc8, 0x15, 0x41, 0x6f, 0x98, 0xc, 0x0, 0xa0, + 0xe9, 0x6, 0x40, 0x6, 0x28, 0x8, 0x7, 0x30, + 0x18, 0x10, 0x3f, 0x88, 0x62, 0xfe, 0x3, 0xe2, + 0x10, 0x1f, 0xe2, 0x3, 0x1, 0xfe, 0xe0, 0xa0, + 0x3f, 0xa1, 0x1c, 0xf, 0xe4, 0xc4, 0x20, 0x7e, + 0x54, 0x26, 0x7, 0xe3, 0x42, 0xa0, 0x7e, 0x38, + 0x1a, 0x7, 0xf6, 0x7, 0x1, 0xfd, 0x81, 0xc0, + 0x7f, 0x62, 0x38, 0x1f, 0xd4, 0x8c, 0x40, 0xfc, + 0x90, 0x6, 0xff, 0xf5, 0x3, 0xff, 0x84, + + /* U+33 "3" */ + 0x2, 0x57, 0xfb, 0x30, 0x3a, 0xd2, 0x2, 0x33, + 0x1, 0x44, 0x15, 0xf9, 0x83, 0x81, 0x61, 0x54, + 0xc, 0x80, 0x52, 0x0, 0x80, 0x73, 0x1, 0x94, + 0x82, 0x7, 0xf1, 0x6c, 0x7, 0xf7, 0x3, 0xfa, + 0x0, 0x60, 0x7c, 0xab, 0x10, 0xe, 0xbf, 0xaa, + 0x15, 0x81, 0xff, 0x70, 0x3d, 0x7f, 0x66, 0x16, + 0x3, 0xf1, 0x98, 0x16, 0x7, 0xf1, 0x21, 0x4a, + 0x40, 0x3e, 0x60, 0xcb, 0x40, 0x7c, 0xc1, 0xc0, + 0x18, 0x1c, 0x88, 0x4c, 0x89, 0x4, 0x17, 0x40, + 0x41, 0x88, 0x7b, 0xe8, 0x3, 0x1, 0x68, 0x80, + 0x8c, 0xe4, 0x0, + + /* U+34 "4" */ + 0x3, 0xfa, 0xfe, 0x40, 0x7f, 0xc9, 0x0, 0xff, + 0xe1, 0x50, 0x3f, 0xf8, 0x54, 0xf, 0xfe, 0x12, + 0x41, 0x40, 0xff, 0xe0, 0x51, 0x18, 0x1f, 0xf5, + 0x5, 0x81, 0xff, 0x24, 0x1c, 0xf, 0xfe, 0x5, + 0xc, 0x81, 0xff, 0x40, 0x60, 0x1f, 0xf2, 0x63, + 0x81, 0xff, 0xc0, 0xa1, 0x90, 0x3f, 0xe8, 0xc, + 0x3, 0xfe, 0x2c, 0x1f, 0xfb, 0x0, 0xbf, 0x83, + 0x3, 0xff, 0x86, 0xbf, 0xfd, 0x80, 0x5f, 0xc0, + 0x7f, 0xfd, 0x40, + + /* U+35 "5" */ + 0x7, 0xff, 0xf0, 0x6, 0x7, 0xff, 0x0, 0x80, + 0xb7, 0xf0, 0xe, 0xa, 0x5f, 0x80, 0x10, 0xc0, + 0xff, 0xe0, 0x10, 0x3f, 0xcc, 0x70, 0x4c, 0x7, + 0x88, 0xdf, 0x6b, 0xc0, 0x3c, 0x80, 0xe7, 0x80, + 0xe3, 0xbf, 0x52, 0xd, 0x1, 0xf6, 0x10, 0xb, + 0x10, 0x88, 0x2, 0x7, 0xa0, 0x4, 0x7, 0xf2, + 0x1, 0xc0, 0xff, 0xe0, 0xb8, 0x80, 0xff, 0x67, + 0x0, 0xf2, 0x1, 0xb0, 0x14, 0x7, 0x40, 0x9, + 0x91, 0x59, 0x6, 0x91, 0x0, 0x72, 0x26, 0xf9, + 0x4, 0xc0, 0x1d, 0x8, 0x12, 0xb4, 0x0, + + /* U+36 "6" */ + 0x3, 0xca, 0xef, 0x0, 0xf9, 0x7a, 0x88, 0x1f, + 0x9d, 0x0, 0xae, 0x80, 0x72, 0x80, 0xea, 0x88, + 0x1e, 0x80, 0xe2, 0x7, 0xe4, 0x44, 0x3, 0xfd, + 0x81, 0x40, 0x7f, 0x90, 0x46, 0xff, 0x64, 0x6, + 0x21, 0x64, 0x4, 0x6c, 0x3, 0x88, 0x9b, 0xd2, + 0x1a, 0x4, 0xb, 0x32, 0x16, 0x1, 0x0, 0xd0, + 0x81, 0xd0, 0x12, 0x2, 0x20, 0x78, 0x80, 0x60, + 0x44, 0xf, 0x30, 0x22, 0x3, 0x81, 0xe6, 0x6, + 0x41, 0x81, 0xec, 0x1, 0xe, 0x2, 0x1, 0xcc, + 0x20, 0x9, 0x3, 0x84, 0x2c, 0x2, 0x1, 0x54, + 0x1e, 0xf4, 0x8a, 0x40, 0xd6, 0x88, 0x2, 0xf2, + 0x0, + + /* U+37 "7" */ + 0xff, 0xff, 0x83, 0x0, 0xff, 0xe0, 0xff, 0xff, + 0x40, 0xc, 0xf, 0xf5, 0xc, 0xf, 0xf2, 0x22, + 0x81, 0xfe, 0xe1, 0x10, 0x3f, 0x8a, 0x10, 0xf, + 0xf4, 0x4, 0x80, 0xfe, 0x28, 0x40, 0x3f, 0xd4, + 0x2, 0x3, 0xfc, 0xc4, 0x3, 0xfc, 0xc0, 0x30, + 0x3f, 0xd0, 0x30, 0x3f, 0xcc, 0x5, 0x3, 0xfd, + 0x42, 0x20, 0x7f, 0x22, 0x38, 0x1f, 0xe8, 0xa, + 0x3, 0xf8, 0x90, 0x80, 0x7f, 0xa0, 0x4, 0x7, + 0xf1, 0x42, 0x1, 0xf8, + + /* U+38 "8" */ + 0x2, 0x33, 0x7e, 0xcc, 0xf, 0x3c, 0xc8, 0x3, + 0x39, 0x2, 0x30, 0x5, 0xd8, 0xc0, 0x60, 0x28, + 0x3, 0x22, 0x52, 0x0, 0x30, 0x8, 0x22, 0x6, + 0x60, 0x30, 0x18, 0x81, 0xe2, 0x6, 0x20, 0x81, + 0xe2, 0x8, 0x4, 0x11, 0x3, 0x30, 0x14, 0x4, + 0x23, 0x22, 0x52, 0x3, 0x20, 0x59, 0xb, 0xb1, + 0x87, 0x0, 0xc9, 0x81, 0xe2, 0x6, 0x54, 0xad, + 0xfa, 0x85, 0x80, 0xa8, 0x54, 0x80, 0x5c, 0x1a, + 0x10, 0x8, 0x7, 0x98, 0x40, 0x80, 0x20, 0x7b, + 0x0, 0x20, 0x44, 0xf, 0x10, 0x5, 0x0, 0x80, + 0x7a, 0x2, 0xa, 0xa, 0xa0, 0x56, 0x1, 0x0, + 0x54, 0x15, 0xfa, 0x91, 0x10, 0x15, 0xa4, 0x4, + 0x5e, 0x60, 0x0, + + /* U+39 "9" */ + 0x2, 0x57, 0xfa, 0x90, 0x3a, 0x54, 0x4, 0xb4, + 0x2, 0x6c, 0x15, 0xf4, 0x86, 0xc0, 0x20, 0x35, + 0x5, 0x88, 0x81, 0x0, 0xe0, 0x77, 0x0, 0xb0, + 0x2, 0x7, 0x10, 0x18, 0xf, 0xf2, 0x8, 0xf, + 0xfe, 0xf, 0x0, 0x40, 0xfc, 0x58, 0x8, 0x7, + 0x34, 0x8, 0x41, 0x52, 0xc, 0x80, 0x35, 0x21, + 0x6f, 0x99, 0x20, 0xc0, 0x66, 0x4, 0x66, 0x0, + 0x40, 0xa7, 0xf6, 0x60, 0x8c, 0x7, 0xf2, 0x0, + 0x80, 0xfe, 0xa1, 0x1, 0xf8, 0xe0, 0x10, 0xe, + 0x2a, 0x62, 0x29, 0x3, 0x6c, 0xac, 0x1a, 0x80, + 0xf8, 0xab, 0x90, 0x10, + + /* U+3A ":" */ + 0x17, 0xc0, 0x83, 0x8, 0x31, 0x7c, 0x3, 0xff, + 0xab, 0x7c, 0x28, 0x32, 0x83, + + /* U+3B ";" */ + 0x7, 0x74, 0x11, 0x18, 0x22, 0x30, 0x3b, 0xa0, + 0x3f, 0xfb, 0xdf, 0x98, 0x1e, 0x20, 0x8, 0x60, + 0x18, 0xe0, 0x99, 0xe, 0xb, 0x84, 0x0, + + /* U+3C "<" */ + 0x3, 0xfc, 0x69, 0x3, 0xf2, 0xb9, 0x1, 0xf2, + 0xd5, 0x1, 0xf3, 0xd4, 0x83, 0x39, 0x0, 0xfc, + 0x21, 0x6c, 0x60, 0x5e, 0x3, 0x3d, 0x20, 0x7e, + 0xac, 0xf, 0xd0, 0x89, 0xe1, 0x3, 0xcf, 0x52, + 0x1e, 0xc6, 0x7, 0x96, 0xa8, 0x19, 0xe0, 0x1e, + 0x57, 0x20, 0xc, 0x81, 0xf1, 0xb9, 0x81, 0xff, + 0x19, 0xc8, + + /* U+3D "=" */ + 0xff, 0xfe, 0x60, 0x7f, 0xf0, 0x36, 0xff, 0x99, + 0x3f, 0xf0, 0x1f, 0xfc, 0x12, 0x7f, 0xe1, 0xb7, + 0xfc, 0xc0, 0xff, 0xe0, 0x0, + + /* U+3E ">" */ + 0x34, 0x81, 0xff, 0x2d, 0x88, 0xf, 0xc4, 0x1, + 0xbd, 0x81, 0xf7, 0xa8, 0x4, 0xf0, 0x81, 0xca, + 0xf8, 0x43, 0xd5, 0x1, 0xe7, 0xb1, 0x85, 0x58, + 0x1f, 0x1c, 0x80, 0x70, 0x38, 0xcf, 0x50, 0x74, + 0x9, 0x5c, 0xc0, 0x3f, 0x8, 0x9e, 0xa0, 0x67, + 0x80, 0x45, 0x80, 0x57, 0x30, 0x3e, 0x7a, 0xa0, + 0x3e, 0x3e, 0x10, 0x3f, 0x80, + + /* U+3F "?" */ + 0x0, 0x6f, 0xf6, 0x60, 0x69, 0x90, 0x11, 0x94, + 0x2, 0x60, 0xcd, 0x48, 0x50, 0x70, 0x19, 0x95, + 0x88, 0x61, 0x96, 0x7, 0x20, 0x2d, 0x90, 0xe, + 0xe0, 0x7f, 0xd8, 0xf, 0xf2, 0x41, 0x0, 0xf8, + 0xd0, 0x58, 0x1e, 0x38, 0x7, 0x3, 0xec, 0x3, + 0x10, 0x3d, 0x0, 0x62, 0x7, 0xcc, 0x22, 0x7, + 0xfb, 0x1, 0xfd, 0x69, 0x1, 0xfc, 0x90, 0x81, + 0xff, 0xc9, 0xb9, 0x1, 0xf8, 0xa3, 0xc0, 0xfc, + 0x48, 0x60, 0x38, + + /* U+40 "@" */ + 0x3, 0xf2, 0xbb, 0xfb, 0x42, 0x7, 0xff, 0x1, + 0x7a, 0x89, 0x81, 0x7a, 0x90, 0x3f, 0xad, 0x7, + 0xbe, 0xcf, 0xd5, 0x26, 0x40, 0x7d, 0x51, 0xd0, + 0x81, 0xca, 0xd0, 0xa4, 0xe, 0x89, 0x31, 0x3, + 0xf9, 0x61, 0xc0, 0xc9, 0x8a, 0x7, 0xff, 0x0, + 0xc2, 0xc0, 0xa0, 0xa0, 0x71, 0x96, 0x98, 0x19, + 0x8a, 0x0, 0x99, 0x1, 0xa6, 0x69, 0x26, 0x20, + 0x4c, 0x90, 0xa2, 0x81, 0x9b, 0xb, 0xf1, 0x26, + 0x5, 0x82, 0x8, 0x20, 0x23, 0x6, 0x40, 0x80, + 0x60, 0x4c, 0x70, 0x41, 0x2, 0xa1, 0x90, 0x22, + 0x8, 0x11, 0x4, 0x82, 0x3, 0x31, 0x40, 0xff, + 0xe0, 0xb0, 0x38, 0x80, 0x20, 0x7f, 0xf0, 0x48, + 0x20, 0x48, 0x10, 0x31, 0x4, 0xc, 0x40, 0xfd, + 0xc3, 0x3, 0x30, 0xc0, 0xcc, 0x12, 0x3, 0xff, + 0x80, 0x40, 0xf1, 0x18, 0x1, 0x2, 0xe1, 0x1, + 0xa0, 0x1e, 0x81, 0x20, 0x40, 0x48, 0x3, 0x1, + 0x40, 0x20, 0x28, 0x20, 0x2, 0x8, 0x2, 0x84, + 0xfc, 0xb1, 0x1a, 0xe6, 0x98, 0xa, 0x28, 0x15, + 0x60, 0x16, 0x39, 0x14, 0x25, 0x2, 0x61, 0x90, + 0x29, 0xfa, 0x90, 0x17, 0xf6, 0x60, 0x73, 0x1c, + 0xf, 0xfe, 0x44, 0x25, 0x40, 0xff, 0xe4, 0x62, + 0xbb, 0x20, 0x72, 0x80, 0x7f, 0xda, 0x9, 0xb5, + 0x77, 0xac, 0x81, 0xff, 0x3f, 0x10, 0x28, 0x93, + 0xc4, 0xf, 0x0, + + /* U+41 "A" */ + 0x3, 0xe3, 0xf9, 0x81, 0xff, 0xc2, 0xa0, 0x28, + 0x1f, 0xfc, 0x26, 0x0, 0x90, 0x1f, 0xfc, 0x4, + 0x0, 0x8a, 0x7, 0xff, 0x3, 0x85, 0x43, 0x3, + 0xff, 0x80, 0x87, 0x60, 0x10, 0x1f, 0xe6, 0x1, + 0x4, 0x20, 0x1f, 0xea, 0x10, 0xe, 0x9, 0x1, + 0xf8, 0x90, 0xe0, 0x10, 0xa, 0x7, 0xea, 0x1, + 0x1, 0x20, 0xc0, 0xfc, 0xc3, 0x3, 0x70, 0x8, + 0xf, 0x30, 0x14, 0xc, 0x80, 0x70, 0x3d, 0x40, + 0x89, 0xe4, 0x10, 0x1c, 0x48, 0x6, 0xde, 0x40, + 0x18, 0x1a, 0x81, 0xff, 0xc0, 0xa0, 0x66, 0xf, + 0xff, 0x98, 0x24, 0x1, 0x0, 0xa0, 0x7e, 0xa0, + 0x28, 0xe, 0x1, 0x81, 0xf8, 0x90, 0x60, 0x10, + 0x40, 0x7f, 0xa0, 0x4, 0xc0, 0x70, 0x3f, 0xc8, + 0x7, + + /* U+42 "B" */ + 0xbf, 0xfd, 0xaa, 0x3, 0xfe, 0x2a, 0xd0, 0x1d, + 0xb7, 0x52, 0x14, 0x3, 0x13, 0xcb, 0x10, 0xc0, + 0xff, 0xa8, 0x2, 0x7, 0xf8, 0x80, 0x60, 0x7f, + 0x88, 0x6, 0x7, 0xfa, 0x2, 0x40, 0x7c, 0x5f, + 0x1, 0xc0, 0xdf, 0xed, 0x1, 0xc4, 0xf, 0xf8, + 0xc0, 0x3b, 0xff, 0x40, 0xb0, 0x1f, 0xe7, 0x41, + 0x60, 0x7f, 0x90, 0xc, 0x7, 0xfc, 0x43, 0x3, + 0xfe, 0x20, 0x7f, 0xf0, 0x20, 0xa, 0x4, 0x4f, + 0x2a, 0xc0, 0x30, 0x2d, 0xba, 0xa0, 0x18, 0xf, + 0xf2, 0x9c, 0x80, + + /* U+43 "C" */ + 0x3, 0x9d, 0xfe, 0xd0, 0xf, 0x8e, 0x88, 0x8, + 0xbe, 0xc0, 0xc7, 0x10, 0xee, 0xc8, 0x2, 0x30, + 0x2e, 0x3, 0x44, 0x49, 0xf0, 0x10, 0x3, 0x22, + 0x90, 0x3d, 0x40, 0x31, 0x41, 0x40, 0x7c, 0x80, + 0x50, 0x42, 0x3, 0xfa, 0x3a, 0x80, 0x60, 0x3f, + 0x9c, 0x60, 0x7f, 0xf1, 0x8, 0x1f, 0xfd, 0x32, + 0x7, 0xff, 0x4d, 0x0, 0xc0, 0x7f, 0x26, 0xc0, + 0x84, 0x7, 0xf5, 0x94, 0x50, 0x50, 0x1f, 0x20, + 0x14, 0x30, 0x14, 0x81, 0xe8, 0x1, 0x80, 0xa0, + 0x34, 0x26, 0x7c, 0x88, 0x4, 0xa8, 0x7, 0xb5, + 0x0, 0x46, 0x6, 0x5e, 0x10, 0x22, 0xfb, 0x0, + + /* U+44 "D" */ + 0xbf, 0xfb, 0x54, 0x7, 0xff, 0x0, 0xab, 0x88, + 0x1e, 0xdb, 0x54, 0xe, 0x20, 0x71, 0x39, 0x5c, + 0x3, 0x1, 0xff, 0x1c, 0x2, 0x1, 0xff, 0x14, + 0x18, 0x1f, 0xfc, 0xe, 0x1, 0x1, 0xff, 0x20, + 0x18, 0xf, 0xfe, 0x11, 0x3, 0xff, 0xde, 0x40, + 0xff, 0x90, 0xc, 0x7, 0xfd, 0xc0, 0x20, 0x3f, + 0xc9, 0x3, 0x3, 0xfc, 0xa8, 0x8, 0x6, 0x27, + 0x2b, 0x40, 0x30, 0x1d, 0xb6, 0xa8, 0x1c, 0x40, + 0xfe, 0x2e, 0xe2, 0x4, + + /* U+45 "E" */ + 0xbf, 0xff, 0xd8, 0xf, 0xfe, 0x26, 0xdf, 0xdc, + 0x8, 0x9f, 0xf0, 0x1f, 0xfe, 0xb2, 0x7f, 0x1, + 0xdb, 0x7e, 0x80, 0x7f, 0xf1, 0x7f, 0xfd, 0x0, + 0xff, 0xfc, 0x93, 0xfe, 0x2, 0xdb, 0xfc, 0x7, + 0xff, 0x4, + + /* U+46 "F" */ + 0xbf, 0xff, 0xd4, 0xf, 0xfe, 0x26, 0xdf, 0xd4, + 0x8, 0x9f, 0xe0, 0x3f, 0xff, 0x3f, 0xfe, 0x40, + 0x7f, 0xf1, 0x76, 0xfc, 0x80, 0xc4, 0xfe, 0x3, + 0xff, 0xfe, 0x7, 0xff, 0x18, + + /* U+47 "G" */ + 0x3, 0x9d, 0xfe, 0xd0, 0x81, 0xf2, 0xf1, 0x1, + 0x17, 0xa0, 0x1c, 0xa8, 0x7, 0x76, 0x42, 0x1c, + 0x3, 0x50, 0x1a, 0x22, 0x4f, 0x10, 0xc8, 0x6, + 0x2, 0x90, 0x3d, 0xc0, 0x40, 0x14, 0x2, 0x3, + 0xe2, 0x83, 0x0, 0x43, 0x3, 0xfa, 0xfc, 0x8, + 0xe, 0x7, 0xff, 0x5, 0x80, 0x20, 0x7f, 0xf2, + 0x89, 0xf8, 0xf, 0xe3, 0xb7, 0xc0, 0x7f, 0xf1, + 0x98, 0x2, 0x6, 0x3f, 0xe6, 0x4, 0x40, 0x60, + 0x3f, 0xf8, 0x48, 0x20, 0x3f, 0xf8, 0x5c, 0x4, + 0x3, 0xff, 0x82, 0x88, 0x6c, 0x7, 0xc8, 0xe, + 0xc0, 0x25, 0x44, 0xcf, 0x10, 0x80, 0xdc, 0x85, + 0x76, 0xa1, 0xe, 0x81, 0xda, 0xa2, 0x4, 0x5e, + 0x80, 0x0, + + /* U+48 "H" */ + 0xbf, 0x80, 0xff, 0x7e, 0x80, 0x7f, 0xff, 0xc0, + 0xff, 0xee, 0x13, 0xfe, 0x3, 0xdb, 0x7f, 0x80, + 0xff, 0xe5, 0x7f, 0xfe, 0x3, 0xff, 0xfe, 0x7, + 0xff, 0xb0, + + /* U+49 "I" */ + 0x9f, 0x88, 0x1f, 0xff, 0xf0, + + /* U+4A "J" */ + 0x3, 0xfc, 0xbf, 0x20, 0x3f, 0xff, 0xe0, 0x7f, + 0xff, 0xc0, 0xff, 0xea, 0x1b, 0x48, 0xf, 0x10, + 0x32, 0x4c, 0x7, 0xb8, 0x4, 0x40, 0x30, 0x38, + 0xb0, 0x40, 0x40, 0x1d, 0x92, 0x78, 0x4, 0x0, + 0xd8, 0x4, 0xd9, 0x0, 0x44, 0x5, 0x32, 0x20, + 0xb, 0xcc, 0x0, + + /* U+4B "K" */ + 0xbf, 0x80, 0xfd, 0x7f, 0x40, 0x3f, 0xe8, 0x83, + 0x80, 0x7f, 0x9b, 0x5, 0x0, 0xff, 0x28, 0xd, + 0x3, 0xfc, 0xa8, 0x38, 0xf, 0xf1, 0xa0, 0x38, + 0x1f, 0xe3, 0x80, 0x62, 0x7, 0xfb, 0x80, 0xa4, + 0xf, 0xf6, 0x22, 0x20, 0x3f, 0xd4, 0x80, 0xc0, + 0x7f, 0xc8, 0x9, 0x30, 0x3f, 0xe7, 0xc0, 0x42, + 0x7, 0xf2, 0x82, 0x80, 0xe0, 0x7f, 0x50, 0x9, + 0x83, 0x40, 0xff, 0xe0, 0x44, 0x13, 0x3, 0xff, + 0x81, 0x40, 0x42, 0x7, 0xff, 0x2, 0x80, 0xe0, + 0x7f, 0xf0, 0x14, 0x6, 0x81, 0xff, 0xc0, 0x68, + 0x26, 0x7, 0xff, 0x2, 0x80, 0x84, + + /* U+4C "L" */ + 0xbf, 0x80, 0xff, 0xff, 0x81, 0xff, 0xff, 0x3, + 0xff, 0xf6, 0x4f, 0xf0, 0x1b, 0x6f, 0xe6, 0x7, + 0xff, 0x4, + + /* U+4D "M" */ + 0xbf, 0xc0, 0x7f, 0xf0, 0x1f, 0xf1, 0x3, 0x20, + 0x3f, 0xea, 0x7, 0xee, 0x7, 0xf9, 0x10, 0x3f, + 0x20, 0x3f, 0xdc, 0xf, 0x88, 0x6, 0x7, 0xf2, + 0x8, 0xe, 0x68, 0x40, 0x3f, 0x30, 0x18, 0xe, + 0x7c, 0x2, 0x3, 0xea, 0x11, 0x3, 0xc8, 0x8e, + 0x7, 0x91, 0x1c, 0xf, 0xd4, 0x20, 0x3d, 0xc1, + 0x44, 0xf, 0x98, 0x6, 0x7, 0x21, 0x40, 0xf8, + 0x80, 0x42, 0x1, 0x98, 0x6, 0x7, 0xfa, 0x0, + 0x40, 0x54, 0x20, 0x3f, 0xe2, 0x43, 0x80, 0x44, + 0x40, 0x3f, 0xf8, 0x14, 0x20, 0x1c, 0x12, 0x1, + 0xc0, 0xfe, 0x60, 0x18, 0x42, 0x81, 0xff, 0xc2, + 0x62, 0xb0, 0xc, 0xf, 0xfe, 0x15, 0x6, 0x6, + 0x7, 0xff, 0xc, 0x90, 0x15, 0x3, 0xff, 0x89, + 0x40, 0x12, 0x3, 0xff, 0x88, 0xc0, 0x50, 0x3f, + 0x80, + + /* U+4E "N" */ + 0xbf, 0x90, 0x1f, 0xdf, 0xa0, 0x15, 0x3, 0xff, + 0x89, 0x0, 0xff, 0xe1, 0xb2, 0x7, 0xff, 0xf, + 0x81, 0xff, 0xc1, 0x80, 0xc0, 0x3f, 0xf8, 0xc, + 0x86, 0x40, 0xff, 0xe0, 0x70, 0x1c, 0xf, 0xfe, + 0x1, 0x60, 0xb0, 0x3f, 0xf8, 0x10, 0x88, 0x40, + 0xff, 0xe0, 0x70, 0x1c, 0xf, 0xfe, 0x1, 0x60, + 0xb0, 0x3f, 0xf8, 0x10, 0x88, 0x7, 0xff, 0x6, + 0x0, 0xa0, 0x7f, 0xf0, 0x13, 0x9, 0x0, 0xff, + 0xe0, 0x40, 0x14, 0xf, 0xfe, 0xd, 0x3, 0xff, + 0x86, 0x90, 0xf, 0xfe, 0x1d, 0x3, 0xff, 0x89, + 0x40, 0x80, + + /* U+4F "O" */ + 0x3, 0x95, 0xfe, 0xcc, 0xf, 0xc7, 0x54, 0x4, + 0x67, 0x40, 0x71, 0xc4, 0x29, 0x69, 0x80, 0xac, + 0xd, 0xc0, 0x5a, 0x69, 0x26, 0x1, 0x8, 0x4, + 0x44, 0x40, 0x71, 0xc0, 0x20, 0x8, 0x1, 0x81, + 0xf1, 0x41, 0x0, 0x21, 0x81, 0xfd, 0xc0, 0x22, + 0x3, 0x1, 0xfc, 0xc0, 0x16, 0x7, 0xff, 0x0, + 0x80, 0xe4, 0x3, 0x3, 0xff, 0xa4, 0x40, 0x30, + 0x3f, 0xfa, 0x3d, 0x0, 0xc0, 0x7f, 0x20, 0x4, + 0x10, 0xc0, 0xfe, 0xe0, 0x10, 0xa0, 0x18, 0x1f, + 0x14, 0x10, 0x6, 0x44, 0x40, 0x7b, 0x80, 0x80, + 0x5c, 0x5, 0xa4, 0x54, 0xe4, 0x42, 0x4, 0x71, + 0xa, 0xea, 0xc0, 0x56, 0x7, 0x1d, 0x50, 0x11, + 0x9d, 0x1, 0x0, + + /* U+50 "P" */ + 0xbf, 0xfe, 0xd0, 0x81, 0xff, 0xc0, 0x2f, 0x40, + 0x3b, 0x6f, 0x40, 0xd, 0x80, 0xc4, 0xf9, 0xf2, + 0x20, 0x1f, 0xfc, 0x8, 0x1, 0x81, 0xff, 0x20, + 0x1c, 0xf, 0xfe, 0x71, 0x1, 0xc0, 0xff, 0xa0, + 0x4, 0x7, 0xf2, 0xa8, 0x22, 0x5, 0xff, 0xaa, + 0x6, 0x81, 0xff, 0x19, 0x80, 0xed, 0xb7, 0xf6, + 0x60, 0x78, 0x9c, 0x7, 0xff, 0xfc, 0xf, 0xfe, + 0x58, + + /* U+51 "Q" */ + 0x3, 0x9d, 0xfe, 0xac, 0xf, 0xc7, 0xc4, 0x4, + 0xa7, 0x40, 0x72, 0xc0, 0x15, 0xb2, 0x1, 0x50, + 0x1a, 0x80, 0xd5, 0x2a, 0xe0, 0x14, 0x9, 0x80, + 0xa4, 0xe, 0x34, 0x4, 0x1, 0x1, 0x40, 0x7c, + 0x88, 0x60, 0x80, 0xa0, 0x7f, 0x50, 0x5, 0x80, + 0x20, 0x7f, 0x20, 0x8, 0x80, 0x60, 0x7f, 0xf0, + 0x78, 0x2, 0x7, 0xf1, 0x1, 0xc0, 0xff, 0xe2, + 0xf0, 0x4, 0xf, 0xe2, 0x3, 0x81, 0x30, 0x3f, + 0xf8, 0x5, 0x0, 0x20, 0x7f, 0x20, 0xc, 0x80, + 0xa0, 0x7f, 0x50, 0x4, 0x30, 0x50, 0x1f, 0x22, + 0x18, 0x8, 0x2, 0x90, 0x38, 0xd0, 0x10, 0xa, + 0x80, 0xd5, 0x15, 0x30, 0xa, 0x6, 0x58, 0x2, + 0xba, 0xb0, 0x15, 0x1, 0xc7, 0xc4, 0x4, 0x40, + 0x52, 0x7, 0xce, 0xff, 0x68, 0x3, 0x30, 0x3f, + 0xf8, 0xe, 0x80, 0x88, 0xf, 0xfe, 0x2, 0xc6, + 0x20, 0x3f, 0xf8, 0x27, 0x30, + + /* U+52 "R" */ + 0xbf, 0xfe, 0xa8, 0xf, 0xfe, 0xa, 0xb8, 0xf, + 0x6d, 0xd4, 0x83, 0x80, 0xe2, 0x79, 0x66, 0xb, + 0x3, 0xfe, 0x80, 0x30, 0x1f, 0xfc, 0x2, 0x18, + 0x1f, 0xfc, 0xf2, 0x18, 0x1f, 0xf5, 0x1, 0xc0, + 0xc4, 0xf2, 0xc8, 0x24, 0x3, 0x6d, 0xd4, 0x85, + 0x40, 0xff, 0xe0, 0x5a, 0x3, 0xdf, 0xec, 0x3, + 0x81, 0xff, 0x16, 0x11, 0x3, 0xfe, 0x80, 0x20, + 0x1f, 0xfc, 0x8, 0x12, 0x1, 0xff, 0x30, 0x10, + 0xf, 0xfe, 0x4, 0x5, 0x81, 0xff, 0x32, 0x20, + 0x1f, 0xfc, 0x8, 0x1, 0x80, + + /* U+53 "S" */ + 0x3, 0x4d, 0xfd, 0x98, 0x1e, 0x7d, 0x90, 0x23, + 0x3a, 0x2, 0x50, 0x4, 0xda, 0x80, 0x2a, 0x1, + 0x40, 0x76, 0x4c, 0xf8, 0xa, 0x8, 0x6, 0x7, + 0xd0, 0x2, 0x60, 0x38, 0x1f, 0x20, 0x5, 0x0, + 0xc0, 0x7c, 0x7f, 0x30, 0x82, 0xa0, 0x7f, 0xd4, + 0x85, 0xea, 0x3, 0xfb, 0x30, 0xa, 0xfa, 0x80, + 0xfa, 0x78, 0x40, 0x2b, 0x88, 0x1f, 0x3d, 0x90, + 0x83, 0x90, 0x1f, 0x8b, 0xd4, 0x5, 0x3, 0xfe, + 0x50, 0x3, 0xde, 0x81, 0xf9, 0x0, 0xec, 0x20, + 0x3f, 0xef, 0xc0, 0x28, 0x1f, 0x40, 0x9, 0x18, + 0x5d, 0xa2, 0x4f, 0x20, 0x88, 0x90, 0x2, 0x5d, + 0x90, 0x85, 0x40, 0x9f, 0x84, 0x8, 0xbd, 0x40, + 0x0, + + /* U+54 "T" */ + 0x5f, 0xff, 0xf0, 0xc0, 0xff, 0xe3, 0x2d, 0xbc, + 0x1, 0x6d, 0xe0, 0x4, 0xf8, 0x8, 0x9f, 0x1, + 0xff, 0xff, 0x3, 0xff, 0xfe, 0x7, 0xff, 0xfc, + 0xf, 0xff, 0x20, + + /* U+55 "U" */ + 0x1f, 0xa0, 0x1f, 0x97, 0xe4, 0x7, 0xff, 0xfc, + 0xf, 0xff, 0xf8, 0x1f, 0xff, 0x12, 0x7, 0xe2, + 0x1, 0x82, 0x10, 0x1f, 0xb0, 0x2, 0x28, 0x8, + 0x7, 0x92, 0x6, 0x1, 0x90, 0xea, 0x24, 0xad, + 0x3, 0x0, 0xb2, 0xa, 0xec, 0xa8, 0x1e, 0x7, + 0x5a, 0x44, 0x9, 0x5c, 0x40, 0x0, + + /* U+56 "V" */ + 0x7f, 0x98, 0x1f, 0xe9, 0xf9, 0x30, 0x14, 0xf, + 0xf3, 0x0, 0x82, 0x4, 0xf, 0xe4, 0x1, 0x80, + 0xe0, 0x18, 0x1f, 0xb8, 0xa, 0x1, 0x0, 0xa0, + 0x7e, 0x40, 0x90, 0x13, 0x4, 0x80, 0xf2, 0x1, + 0x40, 0xd4, 0x2, 0x3, 0xdc, 0x3, 0x3, 0x12, + 0x14, 0xf, 0x20, 0x80, 0xf5, 0x4, 0x80, 0xc8, + 0x7, 0x3, 0xcc, 0x5, 0x3, 0x70, 0x8, 0xf, + 0x90, 0x40, 0x64, 0x18, 0x1f, 0xb0, 0x24, 0x1, + 0x80, 0xa0, 0x7e, 0x60, 0x28, 0xa, 0x9, 0x1, + 0xfc, 0x83, 0x0, 0x45, 0x3, 0xfd, 0xc0, 0x26, + 0x1, 0x81, 0xfe, 0x40, 0x35, 0x8, 0xf, 0xfe, + 0x3, 0xc, 0x8e, 0x7, 0xff, 0x2, 0x81, 0x90, + 0x1f, 0xfc, 0x2, 0x40, 0x10, 0x1f, 0xfc, 0x2a, + 0x3, 0x81, 0xf0, + + /* U+57 "W" */ + 0x1f, 0xa0, 0x1f, 0x5f, 0x80, 0xfa, 0x7e, 0x0, + 0x42, 0x3, 0xe4, 0x8, 0x1f, 0x10, 0x40, 0x20, + 0x40, 0xf1, 0x2, 0x60, 0x79, 0x6, 0x3, 0x0, + 0x40, 0x75, 0x2, 0xc0, 0x71, 0x1, 0x80, 0x20, + 0x4, 0xe, 0x40, 0x84, 0x7, 0x20, 0x8, 0x8, + 0x8c, 0x7, 0x11, 0x0, 0x10, 0x36, 0x0, 0x40, + 0x90, 0x40, 0x64, 0x1, 0x10, 0x80, 0xcc, 0x20, + 0x36, 0x0, 0x40, 0xb8, 0x42, 0x8a, 0x6, 0x23, + 0x1, 0x98, 0x4, 0x4, 0x86, 0x8, 0x10, 0x24, + 0x1, 0x1, 0x88, 0xc, 0x0, 0x80, 0x60, 0x80, + 0x40, 0x30, 0x2, 0x7, 0x20, 0xc0, 0x20, 0x40, + 0x90, 0xc0, 0x10, 0x40, 0x7b, 0x2, 0x2, 0x84, + 0x5, 0xc2, 0x0, 0x46, 0x3, 0xc8, 0x2, 0x4, + 0x50, 0x24, 0x9, 0x80, 0x20, 0x3c, 0x40, 0x64, + 0x0, 0x81, 0x88, 0x48, 0x0, 0x81, 0xf2, 0x7, + 0x4, 0x7, 0x21, 0xb8, 0x40, 0x7e, 0xc1, 0xa1, + 0xc0, 0xec, 0x12, 0x2, 0x7, 0xe4, 0x9, 0x4, + 0x7, 0x20, 0x4, 0x60, 0x3f, 0x10, 0x22, 0x7, + 0xc8, 0x9, 0x1, 0xfc, 0x80, 0x50, 0x3e, 0xc0, + 0x8, 0x1f, 0xec, 0x1, 0x1, 0xf2, 0x0, 0x80, + 0xe0, + + /* U+58 "X" */ + 0x17, 0xf2, 0x3, 0xf5, 0xfc, 0x84, 0x1, 0x40, + 0xf9, 0x20, 0x48, 0xc, 0x1, 0x0, 0xf5, 0x1, + 0x0, 0x99, 0xc, 0x81, 0xa0, 0x8, 0x40, 0xdc, + 0x7, 0x2, 0x2c, 0x16, 0x7, 0x16, 0xb, 0x1, + 0xc0, 0x70, 0x3e, 0x80, 0x21, 0x64, 0x32, 0x7, + 0xea, 0x3, 0xc0, 0x60, 0x1f, 0xc9, 0x1, 0x1, + 0x0, 0xff, 0xa8, 0x12, 0x40, 0x3f, 0xe2, 0x7, + 0xff, 0x13, 0x81, 0x26, 0x7, 0xf9, 0x90, 0x80, + 0x40, 0x3f, 0xd0, 0x5, 0x80, 0x28, 0x1f, 0xa8, + 0xa, 0x1a, 0x9, 0x0, 0xf2, 0x40, 0x90, 0x4, + 0x1, 0x40, 0xf5, 0x1, 0x0, 0x8c, 0x1, 0x0, + 0xd0, 0x4, 0x20, 0x66, 0x43, 0x20, 0x13, 0x5, + 0x81, 0xee, 0x3, 0x80, 0x80, 0x38, 0x1f, 0x16, + 0xb, + + /* U+59 "Y" */ + 0x9f, 0x98, 0x1f, 0xd7, 0xf2, 0x80, 0x20, 0x1f, + 0x8a, 0x9, 0x4, 0x1, 0x0, 0xfa, 0x0, 0x80, + 0x19, 0xc, 0xf, 0x24, 0x8, 0x81, 0x40, 0x10, + 0xe, 0x80, 0x28, 0x19, 0x10, 0xc0, 0xc8, 0x86, + 0x7, 0xb8, 0x8, 0x5, 0x0, 0x40, 0x3c, 0x50, + 0x60, 0x11, 0x10, 0xf, 0xd0, 0x4, 0x10, 0x16, + 0x7, 0xe2, 0xc3, 0x84, 0x40, 0x3f, 0xd0, 0x3, + 0x5, 0x1, 0xff, 0x30, 0x28, 0x7, 0xff, 0x2, + 0x0, 0x28, 0xf, 0xfe, 0x1b, 0x3, 0xff, 0xfe, + 0x7, 0xff, 0x58, + + /* U+5A "Z" */ + 0xbf, 0xff, 0xf0, 0x48, 0x1f, 0xfc, 0x3b, 0xb7, + 0xf5, 0x0, 0x48, 0x13, 0xfd, 0x0, 0x70, 0x3f, + 0xd0, 0x88, 0x40, 0xfe, 0x2c, 0x16, 0x7, 0xfb, + 0x80, 0xe0, 0x7f, 0xa1, 0x10, 0x81, 0xfc, 0x98, + 0x4c, 0xf, 0xf5, 0x1, 0x40, 0xff, 0x50, 0x14, + 0xf, 0xf2, 0x40, 0x90, 0xf, 0xf5, 0x1, 0x40, + 0xff, 0x50, 0x14, 0xf, 0xf3, 0x41, 0xa0, 0x3f, + 0x8c, 0x6, 0x1, 0xfe, 0xe0, 0x38, 0x1f, 0xe6, + 0x42, 0x4, 0xff, 0xa, 0x1, 0x6d, 0xfe, 0xa0, + 0x7f, 0xf0, 0xc0, + + /* U+5B "[" */ + 0xff, 0x88, 0x1f, 0x9f, 0xe2, 0x7, 0xff, 0xfc, + 0xf, 0xff, 0x7b, 0xfc, 0x40, 0xf0, + + /* U+5C "\\" */ + 0x5f, 0x88, 0x1f, 0x91, 0x14, 0xf, 0xea, 0x18, + 0x1f, 0xcc, 0x2, 0x3, 0xf9, 0xe, 0x7, 0xf7, + 0x8, 0xf, 0xe4, 0x1, 0x81, 0xfc, 0xc5, 0x3, + 0xfa, 0x82, 0x40, 0x7e, 0x24, 0x28, 0x1f, 0xd4, + 0x30, 0x3f, 0x98, 0x6, 0x7, 0xf3, 0x14, 0xf, + 0xea, 0x9, 0x1, 0xf8, 0x90, 0xa0, 0x7f, 0x50, + 0xc0, 0xfe, 0x60, 0x10, 0x1f, 0xc8, 0x70, 0x3f, + 0xb8, 0x40, 0x7f, 0x20, 0xc, 0xf, 0xe6, 0x28, + 0x1f, 0xd1, 0xa0, + + /* U+5D "]" */ + 0xff, 0x90, 0x1e, 0xfd, 0x40, 0xe6, 0x7, 0xff, + 0xfc, 0xf, 0xff, 0x33, 0x2, 0xfd, 0x40, 0xfe, + + /* U+5E "^" */ + 0x3, 0x1f, 0xc0, 0x7e, 0x80, 0x10, 0x1f, 0x20, + 0x1c, 0xf, 0x30, 0x24, 0x40, 0xea, 0x21, 0x14, + 0xc, 0x88, 0x70, 0x30, 0x37, 0xc, 0x20, 0x8, + 0x9, 0xa, 0x1, 0x88, 0x2, 0x2, 0x40, 0x28, + 0x24, 0x18, 0xa0, 0x44, 0x85, + + /* U+5F "_" */ + 0x3, 0xff, 0x83, 0xff, 0xff, 0x2, 0x1, 0xff, + 0xc1, + + /* U+60 "`" */ + 0x1b, 0xf1, 0x2, 0xc4, 0x70, 0x36, 0x5, 0x81, + 0xb0, 0x84, + + /* U+61 "a" */ + 0x2, 0x57, 0xfb, 0x30, 0x3a, 0xd2, 0x2, 0x33, + 0x1, 0x44, 0x1e, 0xf9, 0x83, 0x0, 0x30, 0xe1, + 0x6, 0x20, 0xc0, 0x5a, 0x80, 0x76, 0x0, 0x42, + 0x40, 0x3c, 0x40, 0xf3, 0xbf, 0xea, 0x6, 0x3a, + 0x20, 0x4, 0xc0, 0x6e, 0x45, 0xfd, 0xb2, 0x1, + 0x22, 0x32, 0x3, 0xf1, 0x0, 0x40, 0xe2, 0x7, + 0x90, 0x1d, 0x40, 0x98, 0xa, 0xca, 0x9c, 0x80, + 0x62, 0x0, 0x9a, 0xb0, 0xc0, 0x10, 0xf2, 0x2, + 0x7a, 0x24, 0x0, + + /* U+62 "b" */ + 0x1f, 0x98, 0x1f, 0xff, 0xf0, 0x3f, 0xd3, 0xfa, + 0x90, 0x3d, 0xbb, 0x2, 0x59, 0x81, 0xc8, 0x4d, + 0x90, 0x4, 0x20, 0x76, 0x64, 0x9e, 0x1, 0x0, + 0xd0, 0x81, 0x8b, 0x8, 0xf, 0xfb, 0x0, 0x40, + 0x7f, 0x98, 0x2, 0x7, 0xf8, 0x81, 0xff, 0xc1, + 0x20, 0x7f, 0xf0, 0x58, 0x2, 0x7, 0xfb, 0x80, + 0x40, 0x50, 0x81, 0x8a, 0x8, 0xe, 0xcc, 0x93, + 0xc0, 0x20, 0x19, 0x89, 0xb2, 0x0, 0x84, 0xd, + 0xb1, 0x81, 0x2c, 0xc0, 0x0, + + /* U+63 "c" */ + 0x2, 0x33, 0x7e, 0xcc, 0xe, 0x79, 0x90, 0x6, + 0x60, 0x25, 0x1, 0xbf, 0x30, 0x70, 0xa, 0xe, + 0x40, 0xca, 0xa, 0x40, 0x10, 0xe, 0x44, 0x6c, + 0x0, 0x80, 0xf7, 0xb4, 0x41, 0x3, 0xe2, 0x88, + 0x1f, 0xfc, 0xe2, 0x8, 0x1f, 0xec, 0x1, 0x1, + 0xeb, 0xa2, 0x1, 0x0, 0xe2, 0x8f, 0x14, 0x1c, + 0x81, 0x78, 0x16, 0x14, 0x6, 0xfd, 0x1, 0xc0, + 0x4f, 0x32, 0x0, 0xcc, 0x0, + + /* U+64 "d" */ + 0x3, 0xfd, 0xbe, 0x3, 0xff, 0xf0, 0xaf, 0xed, + 0x0, 0xf4, 0xa8, 0x1, 0x78, 0xc, 0xd8, 0x1b, + 0xb1, 0x92, 0x2, 0x80, 0xe4, 0x4a, 0x50, 0x24, + 0x2, 0x81, 0xc8, 0x80, 0xc0, 0x18, 0x1f, 0xc4, + 0xf, 0xfe, 0x11, 0x3, 0xff, 0x80, 0x40, 0xff, + 0x10, 0x3f, 0xf8, 0x18, 0x3, 0x3, 0xf9, 0x0, + 0xa0, 0x72, 0x20, 0x54, 0x1c, 0x89, 0x4a, 0x6, + 0x4c, 0x1b, 0xb1, 0x82, 0x6, 0x95, 0x0, 0x2f, + 0xa0, 0x0, + + /* U+65 "e" */ + 0x3, 0x4d, 0xfb, 0x30, 0x39, 0x76, 0x40, 0x19, + 0x80, 0x8d, 0x6, 0xfc, 0xc1, 0xa0, 0x38, 0x39, + 0x3, 0x20, 0x22, 0x61, 0x0, 0xe6, 0x2, 0xd0, + 0x4, 0x7, 0x88, 0x24, 0x3, 0xff, 0x88, 0x60, + 0x7f, 0xf0, 0xcf, 0xff, 0xd8, 0x82, 0x7, 0xfb, + 0x0, 0x60, 0x7f, 0x20, 0x10, 0xf, 0x3a, 0x2, + 0x80, 0xec, 0x1, 0xb1, 0x20, 0x54, 0x4, 0xfd, + 0x90, 0x88, 0x2, 0xec, 0x80, 0x2f, 0x30, + + /* U+66 "f" */ + 0x3, 0xff, 0x87, 0x3f, 0xa8, 0x1b, 0x30, 0x3e, + 0x64, 0x3f, 0xd4, 0xb, 0x0, 0x80, 0x79, 0x84, + 0x7, 0xff, 0x8, 0xfe, 0x21, 0x7e, 0xc0, 0x7f, + 0xc7, 0xf1, 0xb, 0xf6, 0x3, 0xff, 0xfe, 0x7, + 0xff, 0x88, + + /* U+67 "g" */ + 0x2, 0x57, 0xf6, 0x82, 0x7c, 0x2, 0x54, 0x0, + 0xbc, 0x40, 0x9b, 0x3, 0x76, 0x32, 0x80, 0xa0, + 0xc, 0x89, 0x4a, 0x4, 0x80, 0x40, 0x39, 0x20, + 0xc, 0x1, 0x81, 0xfc, 0x40, 0xff, 0xe1, 0x10, + 0x3f, 0xf8, 0x4, 0xf, 0xf1, 0x3, 0xff, 0x81, + 0x80, 0x30, 0x3c, 0xc0, 0x20, 0x14, 0xe, 0x44, + 0xa, 0x83, 0x91, 0x29, 0x40, 0xc9, 0x83, 0x76, + 0x32, 0x40, 0x69, 0x50, 0x2, 0xf3, 0x3, 0x95, + 0xfd, 0xa0, 0x61, 0x81, 0xfe, 0x20, 0x85, 0xc8, + 0x1d, 0x0, 0x61, 0xc6, 0x64, 0x1a, 0xc2, 0x41, + 0x48, 0x9b, 0xe4, 0xd, 0x2, 0xd5, 0x1, 0x29, + 0x80, 0x0, + + /* U+68 "h" */ + 0x1f, 0x98, 0x1f, 0xff, 0xf0, 0x33, 0xdf, 0xb2, + 0x3, 0xbe, 0x84, 0x1, 0xac, 0xc, 0xcb, 0xd9, + 0x0, 0x40, 0x3b, 0x42, 0x4e, 0x0, 0x40, 0x4c, + 0x81, 0x98, 0x2, 0x5, 0xc0, 0xfd, 0xc0, 0xff, + 0xff, 0x81, 0xff, 0xde, + + /* U+69 "i" */ + 0x17, 0xc0, 0x83, 0xc, 0xc1, 0x33, 0x3, 0xb7, + 0xa0, 0x7f, 0xfb, 0x0, + + /* U+6A "j" */ + 0x2, 0xdd, 0x0, 0x24, 0x38, 0x2, 0x8f, 0x2, + 0xb9, 0x1, 0xfd, 0xfa, 0x1, 0xff, 0xff, 0x3, + 0xff, 0x9d, 0xc9, 0x50, 0x7, 0x62, 0x5, 0x10, + 0xb, 0x0, + + /* U+6B "k" */ + 0x1f, 0x98, 0x1f, 0xff, 0xf0, 0x3f, 0xf8, 0x27, + 0xf8, 0x81, 0xfd, 0xc0, 0x62, 0x7, 0xec, 0x46, + 0x20, 0x7e, 0xc4, 0x52, 0x7, 0xec, 0x45, 0x40, + 0x7e, 0xa4, 0x44, 0x7, 0xea, 0x80, 0x30, 0x3f, + 0x88, 0x15, 0x3, 0xfc, 0x90, 0x26, 0x7, 0xe5, + 0x68, 0x88, 0x40, 0xfb, 0x0, 0xe0, 0x38, 0x1f, + 0xe3, 0x1, 0x80, 0x7f, 0x9a, 0xd, 0x1, 0xfe, + 0xa4, 0x52, 0x7, 0xfb, 0x80, 0xe0, + + /* U+6C "l" */ + 0xde, 0x81, 0xff, 0xf0, + + /* U+6D "m" */ + 0x1f, 0x90, 0x9b, 0xf5, 0x40, 0x53, 0x7e, 0xc8, + 0xe, 0xdd, 0x90, 0xa, 0xa4, 0xec, 0x80, 0x36, + 0x1, 0x99, 0xbb, 0x18, 0xb, 0x42, 0x6c, 0x80, + 0x19, 0x2, 0x39, 0x12, 0x90, 0x5, 0x99, 0x27, + 0x40, 0x20, 0x2a, 0x7, 0x20, 0x8, 0x81, 0x90, + 0xe, 0x7, 0xf1, 0x0, 0x40, 0xfc, 0x40, 0xff, + 0xff, 0x81, 0xff, 0xff, 0x3, 0xff, 0xc8, + + /* U+6E "n" */ + 0x1f, 0x90, 0x7b, 0xf6, 0x40, 0x71, 0xd0, 0x80, + 0x35, 0x81, 0xa1, 0x7b, 0x20, 0x8, 0x7, 0x68, + 0x49, 0xc0, 0x8, 0x9, 0x90, 0x33, 0x0, 0x40, + 0xb8, 0x1f, 0xb8, 0x1f, 0xff, 0xf0, 0x3f, 0xfb, + 0xc0, + + /* U+6F "o" */ + 0x3, 0x4d, 0xfb, 0x40, 0x3c, 0xbb, 0x20, 0xb, + 0xe8, 0x8, 0xd0, 0x17, 0xf4, 0x1, 0x48, 0xe, + 0x3, 0xa0, 0xf, 0x0, 0xe1, 0x11, 0x0, 0xe3, + 0x1, 0x2c, 0x1, 0x81, 0xe6, 0x2, 0x90, 0x40, + 0xff, 0x10, 0x3f, 0xe2, 0x7, 0xff, 0x10, 0x82, + 0x7, 0xe2, 0xe, 0x0, 0xc0, 0xf3, 0x1, 0x91, + 0x10, 0xf, 0x40, 0x50, 0xe0, 0x32, 0x0, 0xb8, + 0xe, 0x0, 0xd0, 0x6f, 0xea, 0x2, 0x90, 0x25, + 0xd9, 0x0, 0x5f, 0x40, 0x0, + + /* U+70 "p" */ + 0x1f, 0x91, 0x9f, 0xd4, 0x81, 0xed, 0x8c, 0x9, + 0x66, 0x7, 0x33, 0x36, 0x30, 0x10, 0x81, 0x8e, + 0x64, 0xa5, 0x1, 0x0, 0xd4, 0xe, 0x48, 0x10, + 0x1f, 0xf7, 0x0, 0x40, 0xff, 0x30, 0xc, 0xf, + 0xfe, 0x9, 0x3, 0xff, 0x82, 0x40, 0xff, 0x30, + 0xc, 0xf, 0xf7, 0x0, 0x40, 0xa8, 0x1c, 0x50, + 0x40, 0x63, 0x90, 0x7, 0x80, 0x40, 0x31, 0x2b, + 0xfa, 0x0, 0xa4, 0xd, 0x72, 0x2, 0x59, 0x1, + 0xe3, 0x7f, 0xa9, 0x3, 0xff, 0xfa, + + /* U+71 "q" */ + 0x2, 0x57, 0xf6, 0x82, 0x7c, 0x2, 0x54, 0x0, + 0xbe, 0x80, 0x9b, 0x3, 0x7e, 0x80, 0x81, 0x40, + 0x72, 0x5, 0xe0, 0x24, 0x2, 0x81, 0xc4, 0x80, + 0x60, 0xc, 0xf, 0xe2, 0x7, 0xff, 0x8, 0x81, + 0xff, 0xc0, 0x20, 0x7f, 0x88, 0x1f, 0xfc, 0xc, + 0x1, 0x81, 0xfc, 0x80, 0x50, 0x38, 0x90, 0x14, + 0x7, 0x20, 0x5e, 0x3, 0x36, 0x6, 0xfd, 0x0, + 0xf4, 0xa8, 0x1, 0x7c, 0x81, 0xca, 0xfe, 0xd0, + 0xf, 0xff, 0xc8, + + /* U+72 "r" */ + 0x1f, 0x99, 0xbf, 0x80, 0xdb, 0x10, 0x1e, 0x41, + 0x48, 0x3, 0xb5, 0x6c, 0x6, 0x64, 0xf, 0xb8, + 0x1f, 0xff, 0xf0, 0x3f, 0xe0, + + /* U+73 "s" */ + 0x2, 0x7b, 0xfa, 0xa0, 0x3b, 0x42, 0x4, 0xac, + 0x2, 0xa4, 0x4d, 0xe9, 0xd, 0x0, 0x41, 0xb1, + 0xb, 0x0, 0x80, 0x80, 0xe0, 0x75, 0x74, 0x10, + 0x10, 0x81, 0x94, 0x60, 0x28, 0xd, 0xeb, 0x3, + 0xcb, 0x30, 0xa, 0x7a, 0x40, 0xc6, 0x7d, 0x10, + 0x59, 0x1, 0xe2, 0xee, 0x1, 0x3, 0xb4, 0x7, + 0x16, 0x8, 0x4, 0x84, 0xe, 0x20, 0x4c, 0x6, + 0x64, 0x18, 0x83, 0x1, 0x80, 0x4d, 0xf3, 0x6, + 0x0, 0x3e, 0x10, 0x25, 0x70, 0x0, + + /* U+74 "t" */ + 0x2, 0x90, 0x40, 0xe2, 0xdc, 0x7, 0xff, 0x27, + 0xf6, 0x1, 0x7f, 0x2, 0x7, 0xed, 0xf0, 0xb, + 0xf8, 0xf, 0xff, 0xf8, 0x11, 0x3, 0x88, 0xa, + 0x48, 0xc, 0x81, 0xd8, 0x40, 0xab, 0x0, 0x40, + + /* U+75 "u" */ + 0x3f, 0x98, 0x1e, 0xfd, 0x0, 0xff, 0xff, 0x81, + 0xff, 0xde, 0x20, 0x7f, 0xf0, 0xe8, 0x1d, 0x0, + 0xcc, 0x1a, 0x49, 0x56, 0x6, 0x80, 0x16, 0xca, + 0x88, 0x1d, 0xd8, 0x11, 0x98, 0x8, + + /* U+76 "v" */ + 0x5f, 0x88, 0x1e, 0xbf, 0x4, 0x2, 0x81, 0xe4, + 0x10, 0x4, 0x10, 0x1c, 0x80, 0x50, 0x1c, 0x12, + 0x3, 0x70, 0x48, 0x2, 0x1, 0x40, 0xc8, 0x50, + 0x33, 0x8, 0x9, 0x0, 0x60, 0x6a, 0x9, 0x0, + 0xe1, 0x1, 0xc4, 0x85, 0x0, 0x86, 0x3, 0xc8, + 0x20, 0x80, 0x30, 0x3d, 0x41, 0x2c, 0x10, 0x1f, + 0x12, 0x15, 0x8e, 0x7, 0xea, 0x18, 0x4, 0x7, + 0xe6, 0x4, 0xc0, 0xff, 0x20, 0x18, 0xf, 0xf7, + 0x0, 0x80, 0xe0, + + /* U+77 "w" */ + 0x5f, 0x88, 0x1d, 0x7d, 0x3, 0x97, 0xe2, 0x80, + 0x20, 0x39, 0x4, 0x7, 0x60, 0x4, 0x21, 0x40, + 0xc8, 0x9, 0x1, 0x90, 0x40, 0x30, 0x20, 0x6c, + 0x5, 0x80, 0xc4, 0x60, 0xc, 0x2, 0x2, 0x62, + 0x6, 0x4, 0x80, 0x30, 0x22, 0x30, 0x2, 0xb, + 0x0, 0x40, 0x60, 0x40, 0xc8, 0x20, 0x14, 0x20, + 0x85, 0x0, 0x82, 0x3, 0x60, 0x40, 0x21, 0x47, + 0x8, 0x1, 0x14, 0xc, 0x80, 0x22, 0x40, 0x84, + 0x9, 0x20, 0x4, 0xe, 0x43, 0x20, 0x80, 0x90, + 0x58, 0x20, 0x3d, 0x82, 0xa3, 0x81, 0x61, 0x50, + 0xe0, 0x79, 0x2, 0x41, 0x1, 0x30, 0x48, 0x20, + 0x3c, 0x48, 0x2, 0x3, 0x88, 0x2, 0x7, 0xe4, + 0x3, 0x1, 0xd4, 0x2, 0x3, 0xf6, 0x0, 0xc0, + 0xe4, 0x2, 0x81, 0x80, + + /* U+78 "x" */ + 0x1f, 0xc0, 0x71, 0xfd, 0x80, 0x50, 0x10, 0xd, + 0xc0, 0x70, 0x9, 0x3, 0x20, 0x11, 0x10, 0x81, + 0x50, 0x10, 0x5, 0x5, 0x81, 0xd4, 0x24, 0x80, + 0x38, 0x1e, 0x48, 0x2b, 0xc, 0x81, 0xf5, 0x2, + 0x30, 0xf, 0xe6, 0x2, 0x81, 0xfc, 0x58, 0x8, + 0x7, 0xf7, 0x4, 0x5, 0x3, 0xe6, 0x47, 0x81, + 0x20, 0x1c, 0x60, 0x45, 0x91, 0x40, 0xee, 0x2, + 0x80, 0xe0, 0x20, 0x13, 0x22, 0x1, 0x16, 0x1a, + 0x6, 0x2, 0xc0, 0xd0, 0x5, 0x0, + + /* U+79 "y" */ + 0x9f, 0x88, 0x1e, 0xfd, 0x68, 0x5, 0x3, 0x90, + 0xc, 0x48, 0x30, 0x3b, 0x0, 0x62, 0x80, 0x20, + 0x66, 0x10, 0x6, 0x2, 0x81, 0x10, 0x1c, 0x9, + 0x6, 0x5, 0x40, 0x20, 0x2c, 0x0, 0x80, 0x41, + 0x1, 0x98, 0xa, 0x9, 0xe, 0x7, 0x20, 0xc2, + 0x0, 0x80, 0xee, 0x0, 0xd0, 0x80, 0xf2, 0x1, + 0x8, 0xe0, 0x7c, 0xc2, 0x0, 0x80, 0xfa, 0x81, + 0x30, 0x3f, 0x10, 0x2c, 0x7, 0xf3, 0x0, 0x80, + 0xfe, 0x21, 0x81, 0xfe, 0x42, 0x81, 0xfd, 0x1, + 0x20, 0x3c, 0x54, 0x62, 0x1, 0xf7, 0xac, 0x24, + 0x3, 0xe6, 0x2, 0x50, 0x3e, + + /* U+7A "z" */ + 0xbf, 0xff, 0xa0, 0x1f, 0xfc, 0xb, 0xff, 0xb0, + 0x14, 0x3, 0xe8, 0x2, 0x81, 0xf3, 0x41, 0xa0, + 0x3c, 0x60, 0x30, 0xf, 0xb8, 0xc, 0x7, 0xd4, + 0x8a, 0x7, 0xcd, 0x6, 0x80, 0xf1, 0x80, 0xc0, + 0x3e, 0xe0, 0x38, 0x1f, 0x42, 0x29, 0x3, 0xc9, + 0x84, 0x80, 0x7d, 0x0, 0x2f, 0xff, 0x1, 0xff, + 0xc0, + + /* U+7B "{" */ + 0x3, 0xf1, 0x3, 0xe7, 0xf0, 0x1e, 0x90, 0x18, + 0x1c, 0xd8, 0x58, 0x7, 0x50, 0x50, 0x1e, 0x22, + 0x81, 0xe2, 0x0, 0x81, 0xff, 0xd8, 0x60, 0x18, + 0x1e, 0xc0, 0x8, 0x1c, 0xd8, 0x30, 0x3b, 0xc0, + 0xa0, 0x18, 0x81, 0xfc, 0x7c, 0xa, 0x1, 0xe6, + 0xc1, 0x81, 0xf6, 0x0, 0x40, 0xf3, 0x0, 0xc0, + 0xff, 0xec, 0x10, 0x4, 0xf, 0x88, 0xc0, 0x7d, + 0x42, 0x40, 0x3c, 0xd0, 0xb0, 0xf, 0x58, 0x18, + 0x1f, 0x3f, 0x80, + + /* U+7C "|" */ + 0x9d, 0x81, 0xff, 0xf6, 0xcd, 0x0, + + /* U+7D "}" */ + 0x3, 0xf9, 0xfa, 0x7, 0x89, 0x2e, 0x40, 0xcb, + 0x11, 0xc0, 0xf4, 0x5, 0x1, 0xc8, 0x1, 0x3, + 0xf7, 0x3, 0xf1, 0x3, 0xff, 0x86, 0x40, 0xff, + 0xe2, 0xa0, 0x80, 0xf5, 0x1, 0x48, 0x18, 0xd0, + 0xb4, 0x3, 0x32, 0x7, 0x8e, 0x25, 0xa0, 0x15, + 0x1, 0x88, 0x19, 0x4, 0x7, 0xff, 0xc, 0x81, + 0xff, 0xc7, 0x20, 0x7e, 0xe0, 0x72, 0x0, 0x40, + 0xe8, 0xa, 0x2, 0x58, 0x8e, 0x6, 0xc5, 0x72, + 0x6, 0x9a, 0x81, 0xe0, + + /* U+7E "~" */ + 0x3, 0x12, 0x3, 0xff, 0x82, 0xb6, 0xbd, 0x3, + 0xdb, 0x8, 0x34, 0x81, 0x2e, 0x80, 0x89, 0xc3, + 0x83, 0xbc, 0x1, 0x62, 0x4e, 0x10, 0x2, 0x39, + 0xf, 0x90, 0xed, 0x11, 0x0, 0x36, 0x20, 0x6d, + 0x8, 0x5, 0xc8, + + /* U+F001 "" */ + 0x3, 0xff, 0x9c, 0x40, 0xff, 0xe5, 0x99, 0xbe, + 0x80, 0x7f, 0xf1, 0xd5, 0xf9, 0x90, 0xc, 0xf, + 0xfe, 0x19, 0x7b, 0xd4, 0x7, 0xff, 0x1d, 0x4f, + 0xa1, 0x3, 0xff, 0x8e, 0xef, 0xac, 0xf, 0xfe, + 0x4c, 0xf1, 0x1, 0xff, 0xcc, 0x60, 0x7f, 0xf7, + 0xda, 0x3, 0xff, 0x94, 0x66, 0xf0, 0x81, 0xff, + 0xc7, 0x57, 0xe6, 0x40, 0xff, 0xe3, 0x17, 0xbd, + 0x40, 0x7f, 0xf2, 0x16, 0xc8, 0x40, 0xff, 0xe5, + 0x92, 0x3, 0xff, 0xfe, 0x7, 0xff, 0xf5, 0xdd, + 0x50, 0x1f, 0xfc, 0x95, 0xe2, 0x28, 0x81, 0xff, + 0xc8, 0x34, 0xf, 0xfe, 0x9, 0x30, 0x1f, 0xe4, + 0x7, 0xfc, 0x77, 0xda, 0x3, 0xfc, 0x40, 0xfe, + 0x2b, 0x10, 0x3f, 0xf8, 0x49, 0x0, 0xfd, 0x20, + 0xf, 0xfe, 0x2d, 0x80, 0x72, 0xc8, 0x81, 0xfd, + 0xc0, 0xfc, 0xff, 0x6c, 0xf4, 0x84, 0x7, 0xf2, + 0x3, 0xfe, 0x24, 0x6, 0xa8, 0xf, 0xa9, 0x3, + 0xff, 0x8d, 0x74, 0x48, 0xef, 0x40, 0x7f, 0xf1, + 0x80, + + /* U+F008 "" */ + 0x94, 0xb, 0x7f, 0xff, 0xc4, 0xa0, 0x56, 0x34, + 0xb1, 0x3, 0xff, 0x88, 0x97, 0x30, 0x16, 0xc0, + 0x49, 0x7f, 0xf0, 0x0, 0xad, 0x80, 0xcd, 0xc0, + 0xd, 0xbf, 0xfc, 0x0, 0x26, 0xe0, 0x23, 0x24, + 0x40, 0xff, 0xe2, 0x29, 0x22, 0x7, 0xff, 0x9d, + 0x81, 0xe3, 0xfc, 0x40, 0xff, 0xe2, 0x1f, 0xe2, + 0x4, 0x4c, 0x0, 0x81, 0xff, 0xc3, 0x26, 0x2, + 0x3b, 0x44, 0x6, 0xdf, 0xfc, 0x0, 0x7, 0x68, + 0x81, 0xfc, 0x4f, 0xff, 0x0, 0x3, 0x3, 0xff, + 0x82, 0x4f, 0xff, 0x0, 0x3, 0x3, 0xc7, 0x68, + 0x80, 0xdb, 0xff, 0x80, 0x0, 0xed, 0x10, 0x22, + 0x60, 0x4, 0xf, 0xfe, 0x19, 0x30, 0x11, 0xfe, + 0x20, 0x7f, 0xf1, 0xf, 0xf1, 0x3, 0xff, 0x96, + 0xc0, 0xff, 0xeb, 0x19, 0x22, 0x7, 0xff, 0x11, + 0x49, 0x10, 0x26, 0xe0, 0x6, 0xdf, 0xfe, 0x0, + 0x13, 0x70, 0x1a, 0xd8, 0x9, 0x2f, 0xfe, 0x0, + 0x15, 0xb0, 0x4, 0xb8, 0x81, 0xff, 0xc4, 0x4b, + 0x98, + + /* U+F00B "" */ + 0x9f, 0xfa, 0x80, 0xbf, 0xff, 0xf1, 0x23, 0x3, + 0xc8, 0x84, 0x7, 0xff, 0x11, 0x81, 0xff, 0xff, + 0x3, 0xff, 0xb2, 0x80, 0xf1, 0x20, 0x40, 0xff, + 0xe2, 0x2b, 0xff, 0xb0, 0xd, 0xff, 0xff, 0x12, + 0x81, 0xff, 0xd0, 0x9f, 0xfa, 0x80, 0xbf, 0xff, + 0xf1, 0x23, 0x3, 0xc8, 0x84, 0x7, 0xff, 0x11, + 0x81, 0xff, 0xff, 0x3, 0xff, 0xb2, 0x80, 0xf1, + 0x20, 0x80, 0xff, 0xe2, 0x3b, 0xff, 0xb0, 0xb, + 0xff, 0xff, 0x12, 0x1, 0xff, 0xd0, 0xbf, 0xfb, + 0x0, 0xdf, 0xff, 0xf1, 0x2a, 0x3, 0xc4, 0x81, + 0x3, 0xff, 0x88, 0x80, 0xff, 0xff, 0x81, 0xff, + 0xd9, 0x60, 0x79, 0x10, 0x80, 0xff, 0xe2, 0x30, + + /* U+F00C "" */ + 0x3, 0xff, 0x96, 0xbc, 0x3, 0xff, 0x98, 0xe8, + 0x74, 0xf, 0xfe, 0x53, 0x80, 0x4a, 0x1, 0xff, + 0xc8, 0x70, 0xe, 0x60, 0x7f, 0xf1, 0xdc, 0x3, + 0xcc, 0xf, 0xfe, 0x33, 0x80, 0x79, 0xc0, 0x3f, + 0xf8, 0xae, 0x1, 0xe7, 0x0, 0xa7, 0x40, 0x7f, + 0xce, 0x1, 0xe7, 0x0, 0xab, 0x15, 0x81, 0xfc, + 0xe0, 0x1e, 0x70, 0xa, 0x20, 0x28, 0xc0, 0xf9, + 0xc0, 0x3c, 0xe0, 0x19, 0x81, 0xd1, 0x81, 0xce, + 0x1, 0xe7, 0x0, 0xe6, 0x7, 0xa3, 0x2, 0x70, + 0xf, 0x38, 0x7, 0xa3, 0x3, 0xd1, 0x87, 0x0, + 0xf3, 0x80, 0x7e, 0x8c, 0xf, 0x4b, 0x0, 0xf3, + 0x80, 0x7f, 0xa3, 0x3, 0xc8, 0xf, 0x38, 0x7, + 0xff, 0x2, 0x30, 0x3f, 0xe7, 0x0, 0xff, 0xe1, + 0x46, 0x7, 0xf3, 0x80, 0x7f, 0xf1, 0x23, 0x3, + 0xe9, 0x0, 0x7f, 0xf1, 0xa4, 0x1, 0xd1, 0x81, + 0xff, 0xc8, 0x70, 0xa, 0x30, 0x3f, 0xf9, 0x4e, + 0x8, 0xc0, 0xff, 0xe1, 0x80, + + /* U+F00D "" */ + 0x3, 0xff, 0x92, 0xff, 0x20, 0x3f, 0x8e, 0xf4, + 0x3, 0x80, 0x2a, 0x3, 0xe3, 0x88, 0x54, 0x40, + 0x35, 0x40, 0x71, 0xc0, 0x64, 0x48, 0xe, 0xa8, + 0x8, 0xe0, 0x3c, 0x78, 0x1e, 0xa8, 0x1c, 0x7, + 0xa8, 0x38, 0xf, 0x57, 0x80, 0xf5, 0x40, 0xe, + 0x3, 0xd0, 0xf, 0x54, 0x6, 0x38, 0xf, 0xfa, + 0xa0, 0x3c, 0x70, 0x1f, 0xd5, 0x1, 0xf8, 0xd0, + 0x3e, 0x68, 0xf, 0xe3, 0x40, 0xf9, 0xa0, 0x3f, + 0x1c, 0x7, 0xf5, 0x40, 0x78, 0xe0, 0x3f, 0xea, + 0x80, 0xc7, 0x1, 0xe8, 0x7, 0xaa, 0x0, 0x70, + 0x1e, 0xaf, 0x1, 0xea, 0x87, 0x3, 0xd5, 0x3, + 0x80, 0xf5, 0x4, 0xe, 0xa8, 0x8, 0xe0, 0x3c, + 0x60, 0x1a, 0xa0, 0x38, 0xe0, 0x32, 0x2e, 0x0, + 0xa8, 0xf, 0x8e, 0x21, 0x50, 0xf, 0xf2, 0x3, + 0xf8, 0xef, 0x40, 0x0, + + /* U+F011 "" */ + 0x3, 0xff, 0x80, 0xe4, 0x30, 0x3f, 0xf9, 0x66, + 0x36, 0x84, 0xf, 0xff, 0xd, 0x80, 0x7f, 0xf0, + 0x25, 0x3, 0xfc, 0x7a, 0x6c, 0x7, 0xf9, 0xb2, + 0xe4, 0xf, 0x8e, 0x2, 0x80, 0x7f, 0xa0, 0x16, + 0x20, 0x7b, 0x81, 0xff, 0xc8, 0xe0, 0x74, 0x20, + 0x6c, 0x7, 0xfb, 0x1, 0x8c, 0x2, 0x2c, 0xd, + 0x88, 0x1f, 0xe3, 0x80, 0xcc, 0x80, 0xa0, 0x6a, + 0x40, 0xff, 0xe0, 0x1a, 0x6, 0xa0, 0x18, 0x11, + 0x40, 0x7f, 0xf0, 0x91, 0x2, 0x60, 0x81, 0xa0, + 0x1f, 0xfc, 0x4a, 0x6, 0x28, 0xc, 0x80, 0xff, + 0xe2, 0x30, 0x32, 0x3, 0xff, 0x9f, 0xf8, 0x8, + 0x81, 0xff, 0xc6, 0x20, 0x7e, 0x20, 0x78, 0x81, + 0x88, 0x1e, 0x20, 0x5f, 0x80, 0xff, 0xbe, 0xce, + 0x7, 0xff, 0x1, 0x1, 0x90, 0x1f, 0x12, 0x3, + 0xe4, 0x6, 0x44, 0xd, 0xc0, 0xff, 0xe2, 0x70, + 0x31, 0xc, 0x9, 0x20, 0x1f, 0xfc, 0x24, 0x80, + 0x4c, 0x5, 0x3, 0x52, 0x7, 0xff, 0x0, 0xd0, + 0x35, 0x0, 0x58, 0x1b, 0x10, 0x3f, 0xc7, 0x1, + 0x99, 0x2, 0x80, 0x76, 0x80, 0x7e, 0x98, 0xc, + 0x60, 0x1d, 0x80, 0xe7, 0xeb, 0x48, 0xef, 0x60, + 0x77, 0x3, 0xc7, 0x1, 0xe5, 0x2d, 0x44, 0x7, + 0xb1, 0x3, 0xe3, 0x88, 0x1f, 0xfc, 0x23, 0xc8, + 0x1f, 0xc7, 0x40, 0x3f, 0xf8, 0x13, 0x1, 0xff, + 0xc1, 0x7e, 0xb2, 0x6, 0x2e, 0xf6, 0x7, 0xff, + 0x11, 0x4d, 0xfe, 0xd1, 0x1, 0xfc, + + /* U+F013 "" */ + 0x3, 0xff, 0xb0, 0x77, 0xfb, 0x30, 0x3f, 0xf8, + 0xec, 0x81, 0x8e, 0x3, 0xff, 0xc5, 0x80, 0xf3, + 0x3, 0xff, 0x83, 0xa0, 0x5, 0x98, 0x1e, 0x3e, + 0x0, 0x79, 0x1, 0xd8, 0xbf, 0x68, 0x81, 0xfc, + 0xf6, 0x43, 0x48, 0x13, 0x20, 0x48, 0xf, 0xfe, + 0x1, 0x20, 0x28, 0x5, 0x0, 0xff, 0xe5, 0x24, + 0xc, 0xf, 0xfe, 0x67, 0x14, 0xf, 0xf4, 0xd9, + 0x48, 0x1f, 0xc8, 0x72, 0x7, 0xee, 0xc9, 0x2c, + 0x80, 0xfd, 0x1, 0xd0, 0xf, 0x50, 0x3d, 0x40, + 0xf2, 0xec, 0x8, 0x81, 0xe4, 0x7, 0xcc, 0xe, + 0x20, 0x7f, 0xc4, 0xf, 0xfe, 0x11, 0x3, 0xfe, + 0x20, 0x7f, 0xf0, 0x88, 0x1c, 0x40, 0xf2, 0x3, + 0xe6, 0x7, 0x10, 0x23, 0xa0, 0x1e, 0xa0, 0x7a, + 0x81, 0xe5, 0xd8, 0xe4, 0xf, 0xdd, 0x92, 0x59, + 0x1, 0xfa, 0xa, 0x7, 0xfa, 0x6c, 0xa4, 0xf, + 0xe4, 0x18, 0x1f, 0xfc, 0xce, 0x2, 0x1, 0xff, + 0xca, 0x48, 0x1, 0x90, 0x24, 0x7, 0xff, 0x0, + 0x90, 0x15, 0x3, 0x62, 0xfd, 0xa2, 0x7, 0xf3, + 0xd9, 0x4d, 0x3, 0xda, 0x0, 0x59, 0x81, 0xe3, + 0xe0, 0x5, 0x90, 0x1f, 0xfc, 0xc, 0x7, 0x98, + 0x1f, 0xfe, 0x26, 0x40, 0xc7, 0x1, 0xff, 0xc7, + 0x3b, 0xfd, 0x98, 0x1f, 0xe0, + + /* U+F015 "" */ + 0x3, 0xff, 0x84, 0x5b, 0x1, 0xca, 0x49, 0x1, + 0xff, 0xc6, 0x7a, 0x46, 0x3, 0x76, 0xee, 0x7, + 0xff, 0x16, 0xc0, 0x23, 0xc8, 0x1f, 0xfc, 0xbc, + 0x80, 0xf6, 0x60, 0x7f, 0xf2, 0xf, 0x20, 0x4c, + 0x81, 0x48, 0x3, 0xff, 0x8c, 0xf0, 0x1b, 0x4c, + 0x80, 0x9a, 0x3, 0xff, 0x89, 0x20, 0x8, 0xe2, + 0x42, 0xc0, 0x3f, 0xf8, 0xf5, 0x81, 0x2c, 0x66, + 0xc2, 0xe8, 0x1f, 0xfc, 0x43, 0x90, 0x13, 0xa2, + 0xb0, 0x72, 0x4c, 0x40, 0xff, 0xe0, 0xac, 0x40, + 0xac, 0x39, 0x1, 0xab, 0x39, 0x1, 0x2a, 0x7, + 0x9d, 0x3, 0x64, 0x71, 0x3, 0xd2, 0x8a, 0xc0, + 0x96, 0x3, 0x58, 0x4, 0x79, 0x78, 0xf, 0xe5, + 0x84, 0x80, 0x23, 0xc8, 0xa8, 0x9, 0x61, 0x20, + 0xf, 0xf8, 0xf2, 0xe8, 0x1b, 0x20, 0x34, 0xa2, + 0xb0, 0x3f, 0xf8, 0x59, 0x26, 0x20, 0x4e, 0x91, + 0x59, 0xc8, 0xf, 0xfe, 0x25, 0x87, 0x21, 0x8, + 0xd8, 0x84, 0x20, 0x7f, 0xf1, 0x99, 0x17, 0x30, + 0x22, 0x1, 0x81, 0xff, 0xc8, 0x60, 0x8, 0x1f, + 0xfe, 0x3b, 0xfe, 0x20, 0x7f, 0xf3, 0x98, 0x19, + 0x81, 0xff, 0xff, 0x3, 0xff, 0xf6, 0x80, 0xf1, + 0x20, 0x36, 0x3, 0xe4, 0x7, 0x0, + + /* U+F019 "" */ + 0x3, 0xfe, 0x29, 0x62, 0x7, 0xff, 0x25, 0x6b, + 0x76, 0x40, 0x7f, 0xf2, 0x30, 0x1e, 0xc0, 0x7f, + 0xff, 0xc0, 0xff, 0xff, 0x81, 0xff, 0xff, 0x3, + 0xff, 0x85, 0xb7, 0x30, 0x3c, 0xf6, 0xe0, 0x3f, + 0x91, 0x3c, 0x7, 0xe2, 0x79, 0x1, 0xf9, 0x30, + 0x3f, 0xf8, 0x8d, 0x1, 0xfd, 0x18, 0x1f, 0xfc, + 0x27, 0x0, 0xff, 0xa3, 0x3, 0xff, 0x80, 0xe0, + 0x1f, 0xfc, 0x18, 0xc0, 0xff, 0x38, 0x7, 0xff, + 0xe, 0x30, 0x3f, 0x38, 0x7, 0xff, 0x16, 0x30, + 0x3c, 0xe0, 0x1f, 0xfc, 0x78, 0xc0, 0xce, 0x1, + 0xfe, 0xbf, 0xfe, 0xc2, 0x30, 0xe, 0xd, 0xff, + 0xea, 0x80, 0xfc, 0x79, 0x93, 0x1c, 0x40, 0xfc, + 0x80, 0xff, 0xb1, 0x6c, 0x71, 0x3, 0xff, 0x95, + 0xb6, 0x3, 0xff, 0x9a, 0x48, 0xf, 0xfe, 0xa5, + 0xe1, 0x76, 0x7, 0xff, 0x2c, 0x86, 0x7, 0xff, + 0x32, 0xe0, 0x7b, 0x2, 0xd1, 0xbf, 0xfe, 0x64, + 0xc0, + + /* U+F01C "" */ + 0x3, 0xc6, 0xff, 0xff, 0xc4, 0x80, 0x7f, 0xf0, + 0x72, 0x3, 0xff, 0x88, 0xe0, 0x1f, 0xf5, 0x3, + 0xff, 0x8e, 0xc8, 0x1f, 0xc9, 0x0, 0x16, 0xff, + 0xf8, 0x40, 0x5c, 0xf, 0xea, 0x5, 0xe4, 0xff, + 0xe1, 0x20, 0x6, 0x1, 0xf5, 0x2, 0x64, 0xf, + 0xfe, 0x15, 0x2, 0x64, 0xe, 0x48, 0x0, 0xc0, + 0x3f, 0xf8, 0x94, 0xb, 0x81, 0xd4, 0xb, 0x81, + 0xff, 0xc5, 0x48, 0x0, 0xc0, 0x2a, 0x4, 0xc8, + 0x1f, 0xfc, 0x6a, 0x4, 0xc8, 0x48, 0x0, 0xc0, + 0x3f, 0xf9, 0x14, 0xb, 0x88, 0x4, 0xe4, 0xe6, + 0x7, 0xf2, 0x93, 0xb0, 0x11, 0x44, 0x9, 0x37, + 0xd1, 0x81, 0xfa, 0xb7, 0xe0, 0x31, 0x3, 0xfe, + 0x80, 0x7c, 0xc0, 0xff, 0xb8, 0x1f, 0xfc, 0x6, + 0x7, 0xa0, 0x1f, 0xfc, 0xc9, 0xff, 0x80, 0xff, + 0xff, 0x81, 0xff, 0xf5, 0xe8, 0xf, 0xfe, 0x92, + 0xa8, 0xf, 0xfe, 0x85, 0x20, + + /* U+F021 "" */ + 0x3, 0xff, 0x98, 0xa4, 0x30, 0x3f, 0x94, 0xdf, + 0xea, 0xc8, 0x1d, 0x1b, 0x40, 0x3e, 0x7a, 0xb2, + 0x6, 0x53, 0x52, 0x7, 0xff, 0x6, 0xc2, 0x7, + 0xf9, 0x6a, 0x7, 0xf8, 0xf4, 0x7, 0xff, 0x9, + 0x72, 0xc0, 0xf1, 0xc0, 0x73, 0xbf, 0xea, 0x80, + 0xec, 0xc0, 0xf7, 0x3, 0x1d, 0x10, 0x19, 0x5c, + 0x40, 0xc4, 0xe, 0x84, 0x9, 0xe2, 0x7, 0xe3, + 0x98, 0x1f, 0x8b, 0x2, 0x70, 0xf, 0xfe, 0x4, + 0x60, 0x7d, 0x40, 0x8c, 0x3, 0xf1, 0xff, 0x98, + 0x1f, 0x30, 0x28, 0x7, 0xf3, 0x3, 0xff, 0x80, + 0x40, 0xc8, 0xf, 0xfe, 0x5a, 0x25, 0x0, 0xff, + 0x24, 0x27, 0xfc, 0x8d, 0xd8, 0xc0, 0xff, 0xae, + 0xdf, 0xea, 0x7, 0xff, 0xb2, 0xed, 0xfe, 0xa0, + 0x7f, 0xce, 0xea, 0x51, 0x3f, 0xe4, 0x80, 0x7f, + 0xa2, 0x28, 0xf, 0xfe, 0x5a, 0x3, 0x10, 0x3f, + 0xf8, 0xc, 0xf, 0xe8, 0x4, 0xc0, 0xf9, 0xff, + 0xc4, 0xf, 0xd4, 0x81, 0x50, 0x3e, 0x70, 0xf, + 0xfe, 0x4, 0x40, 0x4c, 0x81, 0xf9, 0xd2, 0x7, + 0xe3, 0x98, 0x11, 0x80, 0x71, 0x3, 0x2d, 0x50, + 0x19, 0x5c, 0x40, 0xdc, 0xf, 0x3c, 0x7, 0x2b, + 0xfe, 0xa8, 0xe, 0xc4, 0xf, 0x33, 0xd0, 0x1f, + 0xfc, 0x25, 0xc8, 0x1f, 0xeb, 0x90, 0x1f, 0xe3, + 0x28, 0x1f, 0xfc, 0x13, 0x74, 0x20, 0x62, 0xee, + 0x60, 0x7d, 0x1b, 0x40, 0x38, 0xbd, 0xfe, 0xd1, + 0x1, 0xfc, + + /* U+F026 "" */ + 0x3, 0xff, 0x9a, 0x6b, 0x3, 0xfc, 0x72, 0x80, + 0x7f, 0x1c, 0x7, 0xfc, 0x70, 0x1f, 0xf1, 0xc0, + 0x71, 0x93, 0xd8, 0xf, 0x66, 0xfc, 0x7, 0xff, + 0xfc, 0xf, 0xff, 0x3, 0x3, 0xff, 0x83, 0x3f, + 0xf3, 0x3, 0xff, 0x83, 0x18, 0x1f, 0xfc, 0x18, + 0xc0, 0xff, 0xe0, 0xc6, 0x7, 0xff, 0x6, 0x30, + 0x40, 0xff, 0xa7, 0xc0, + + /* U+F027 "" */ + 0x3, 0xff, 0xa8, 0x6b, 0x3, 0xff, 0x8a, 0x72, + 0x80, 0x7f, 0xf1, 0xe, 0x3, 0xff, 0x8c, 0x70, + 0x1f, 0xfc, 0x63, 0x80, 0xff, 0xe0, 0x19, 0x3d, + 0x80, 0xff, 0xe0, 0xe6, 0xfc, 0x7, 0xfa, 0xc0, + 0x3f, 0xf8, 0xcd, 0x3c, 0x7, 0xff, 0x15, 0x90, + 0x58, 0x1f, 0xfc, 0x5c, 0x2, 0x81, 0xff, 0xc6, + 0x40, 0x81, 0xff, 0xc6, 0x60, 0x81, 0xff, 0xc5, + 0xa4, 0x20, 0x3f, 0xf8, 0x8d, 0x3, 0x0, 0xff, + 0xe2, 0x22, 0xb0, 0x60, 0x7f, 0xf0, 0xce, 0xa0, + 0x27, 0xfe, 0x60, 0x7f, 0xf2, 0x23, 0x3, 0xff, + 0x91, 0x18, 0x1f, 0xfc, 0x88, 0xc0, 0xff, 0xe4, + 0x46, 0x8, 0x1f, 0xfc, 0x69, 0xb0, 0xf, 0x80, + + /* U+F028 "" */ + 0x3, 0xff, 0x97, 0x10, 0x1f, 0xfd, 0x16, 0xd6, + 0x80, 0xff, 0xe8, 0x20, 0xb, 0x1, 0xff, 0xc4, + 0x35, 0x81, 0xf8, 0xe2, 0xe, 0x3, 0xff, 0x84, + 0x72, 0x80, 0x78, 0x80, 0x38, 0x83, 0x0, 0xff, + 0xe0, 0x1c, 0x7, 0xe5, 0xba, 0x1, 0x80, 0x32, + 0x7, 0xf8, 0xe0, 0x3f, 0xf8, 0x15, 0x80, 0xa0, + 0x38, 0x1f, 0xc7, 0x1, 0xfe, 0x50, 0x4, 0x41, + 0x20, 0x28, 0x19, 0x3d, 0x80, 0xff, 0xe0, 0x3a, + 0x2, 0x80, 0x80, 0x38, 0xcd, 0xf8, 0xf, 0xf6, + 0xa0, 0x13, 0x0, 0xc1, 0x20, 0x80, 0xff, 0xe2, + 0xb2, 0xb0, 0x8, 0x2, 0x80, 0x40, 0x8, 0x1f, + 0xfc, 0x46, 0x41, 0x80, 0x10, 0x20, 0x30, 0x6, + 0x7, 0xff, 0x17, 0x10, 0x80, 0x60, 0x4, 0x30, + 0x4, 0xf, 0xfe, 0x33, 0x4, 0xf, 0xfe, 0x8b, + 0x4, 0xf, 0xfe, 0x86, 0x21, 0x0, 0xc0, 0x8, + 0x60, 0x8, 0x1f, 0xfc, 0x46, 0x41, 0x80, 0x10, + 0x20, 0x30, 0x6, 0x7, 0xff, 0x11, 0x95, 0x80, + 0x40, 0x14, 0x2, 0x0, 0x58, 0x1f, 0xfc, 0x4d, + 0x40, 0x26, 0x1, 0x82, 0x41, 0x9, 0xff, 0x98, + 0x1f, 0xfc, 0x7, 0x40, 0x50, 0x10, 0x7, 0x3, + 0xf4, 0x60, 0x7f, 0x94, 0x1, 0x10, 0x48, 0xa, + 0x3, 0xfa, 0x30, 0x3f, 0xf8, 0x15, 0x80, 0xa0, + 0x38, 0x1f, 0xf4, 0x60, 0x7e, 0x5b, 0xa0, 0x18, + 0x3, 0x20, 0x7f, 0xf0, 0x23, 0x4, 0xf, 0x10, + 0x7, 0x10, 0x60, 0x1f, 0xfc, 0x29, 0xf0, 0x1f, + 0x8e, 0x20, 0xe0, 0x3f, 0xf9, 0xc8, 0x2, 0xc0, + 0x7f, 0xf3, 0xdb, 0x5a, 0x3, 0xc0, + + /* U+F03E "" */ + 0x17, 0xff, 0xfe, 0x65, 0x15, 0x1, 0xff, 0xcc, + 0x55, 0x1, 0xff, 0xce, 0x40, 0x67, 0xb2, 0x1, + 0xff, 0xcb, 0x70, 0x93, 0xa0, 0x7f, 0xf2, 0xa8, + 0x19, 0x1, 0xff, 0xd9, 0x2c, 0xf, 0xf9, 0x1, + 0x88, 0x1f, 0x8e, 0x90, 0x7, 0xfa, 0x20, 0x7, + 0x81, 0xf1, 0xc0, 0x1c, 0x3, 0xfd, 0x7f, 0x62, + 0x7, 0x8e, 0x3, 0x38, 0x7, 0xff, 0x1c, 0xe0, + 0x3c, 0xe0, 0x1f, 0xe3, 0xf0, 0x18, 0xe0, 0x3f, + 0x36, 0x3, 0xf1, 0xc0, 0xe0, 0x7, 0x1, 0xff, + 0xc6, 0x38, 0x8, 0xe5, 0x80, 0xff, 0xe3, 0x1c, + 0x7, 0x1a, 0x7, 0xff, 0x1d, 0x1, 0xff, 0xeb, + 0x52, 0x7f, 0xf2, 0x10, 0x1e, 0x2d, 0xff, 0xf2, + 0x8, 0x12, 0x3, 0xff, 0x9c, 0xaa, 0x3, 0xff, + 0x98, 0xa8, + + /* U+F048 "" */ + 0x52, 0x40, 0x7f, 0xcd, 0x87, 0x6e, 0x20, 0x7f, + 0x59, 0x20, 0x3f, 0xf8, 0x39, 0x0, 0x40, 0x7f, + 0xf0, 0x31, 0x3, 0xff, 0x84, 0x79, 0x3, 0xff, + 0x84, 0x70, 0x1f, 0xfc, 0x35, 0x80, 0xff, 0xe1, + 0xaa, 0x7, 0xff, 0xd, 0xd0, 0x3f, 0xf8, 0x6e, + 0x1, 0xff, 0xc3, 0x90, 0x7, 0xff, 0x11, 0x1, + 0xff, 0xfb, 0xa4, 0xf, 0xfe, 0x23, 0xc4, 0xf, + 0xfe, 0x2e, 0x40, 0x7f, 0xf1, 0x6a, 0x3, 0xff, + 0x8b, 0x58, 0x1f, 0xfc, 0x58, 0xc0, 0xff, 0xe2, + 0xc8, 0x3, 0xff, 0x8a, 0xe8, 0x1f, 0xfc, 0x55, + 0x40, 0x99, 0x3, 0xff, 0x80, 0xb1, 0x29, 0x1f, + 0xc4, 0xf, 0xe3, 0xb0, 0x80, + + /* U+F04B "" */ + 0x5, 0xa0, 0x3f, 0xf9, 0x2f, 0x4b, 0x88, 0x1f, + 0xfc, 0x78, 0x4, 0x74, 0x3, 0xff, 0x98, 0xfb, + 0x3, 0xff, 0x99, 0x31, 0x3, 0xff, 0x96, 0x75, + 0x3, 0xff, 0x98, 0xbb, 0x3, 0xff, 0x99, 0x32, + 0x3, 0xff, 0x96, 0x6d, 0x10, 0x3f, 0xf9, 0x6b, + 0x40, 0x3f, 0xf9, 0x8f, 0xa0, 0x3f, 0xf9, 0x96, + 0x88, 0x1f, 0xfc, 0xb5, 0x98, 0x1f, 0xfc, 0xc8, + 0x80, 0xff, 0xe6, 0x10, 0x3f, 0xf9, 0x84, 0xf, + 0xfe, 0x5c, 0x40, 0x7f, 0xf2, 0x56, 0x60, 0x7f, + 0xf2, 0x6d, 0x10, 0x3f, 0xf9, 0xf, 0xa0, 0x3f, + 0xf9, 0xb, 0x40, 0x3f, 0xf9, 0x6, 0xd1, 0x3, + 0xff, 0x91, 0x32, 0x3, 0xff, 0x90, 0xbb, 0x3, + 0xff, 0x90, 0x75, 0x3, 0xff, 0x93, 0x31, 0x3, + 0xff, 0x90, 0xfb, 0x3, 0xff, 0x89, 0x0, 0x8e, + 0x80, 0x7f, 0xf1, 0x9e, 0x97, 0x10, 0x3f, 0xf8, + 0xe0, + + /* U+F04C "" */ + 0x17, 0xff, 0x64, 0x7, 0x5f, 0xfd, 0x90, 0xa8, + 0xf, 0x1a, 0x40, 0xaa, 0x3, 0xc6, 0x94, 0x7, + 0xf2, 0x2, 0x40, 0x7f, 0x20, 0x3f, 0xdc, 0xf, + 0xfe, 0xf, 0x3, 0xff, 0xfe, 0x7, 0xff, 0xfc, + 0xf, 0xff, 0xf8, 0x1f, 0xff, 0xf0, 0x3f, 0xff, + 0xe0, 0x7f, 0xfc, 0x38, 0x1f, 0xfc, 0x1e, 0x7, + 0xff, 0x36, 0x1, 0xf8, 0xb0, 0x28, 0x7, 0xe2, + 0xda, 0xb7, 0xe9, 0x80, 0xce, 0xb7, 0xe9, 0x80, + + /* U+F04D "" */ + 0x6, 0x4f, 0xfe, 0x43, 0x0, 0xf3, 0x7f, 0xfc, + 0x89, 0x84, 0x3, 0xff, 0x94, 0x58, 0x1f, 0xfe, + 0x5e, 0x7, 0xff, 0xfc, 0xf, 0xff, 0xf8, 0x1f, + 0xff, 0xf0, 0x3f, 0xff, 0xe0, 0x7f, 0xff, 0xc0, + 0xff, 0xff, 0x74, 0x7, 0xff, 0x2d, 0x54, 0x7, + 0xff, 0x20, 0xd2, + + /* U+F051 "" */ + 0xa, 0x1, 0xff, 0x39, 0xd, 0x57, 0xc8, 0x1f, + 0xd1, 0xb4, 0x20, 0x58, 0x81, 0xff, 0xc0, 0xe0, + 0x6c, 0x80, 0xff, 0xe2, 0xd4, 0x7, 0xff, 0x16, + 0xb0, 0x3f, 0xf8, 0xb2, 0x0, 0xff, 0xe2, 0xb8, + 0x7, 0xff, 0x15, 0xd0, 0x3f, 0xf8, 0xaa, 0x81, + 0xff, 0xc5, 0x58, 0xf, 0xfe, 0x29, 0x3, 0xff, + 0xf7, 0x80, 0xff, 0xe2, 0x62, 0x7, 0xff, 0x8, + 0xe2, 0x7, 0xff, 0x8, 0xe2, 0x7, 0xff, 0x8, + 0xe0, 0x3f, 0xf8, 0x6b, 0x1, 0xff, 0xc3, 0x54, + 0xf, 0xfe, 0x1b, 0xa0, 0x7f, 0xdc, 0x9, 0xc0, + 0x3f, 0xf8, 0xc, 0x89, 0x0, 0x7f, 0x10, 0x4, + 0x6e, 0xc0, 0xff, 0x6f, 0xd8, + + /* U+F052 "" */ + 0x3, 0xff, 0x81, 0x2a, 0x3, 0xff, 0x95, 0xda, + 0xb0, 0xf, 0xfe, 0x46, 0x3, 0x36, 0x3, 0xff, + 0x8d, 0x88, 0x1d, 0x10, 0x1f, 0xfc, 0x4a, 0x40, + 0xfa, 0xa0, 0x3f, 0xf8, 0x55, 0x1, 0xfd, 0x48, + 0x1f, 0xfc, 0x8, 0x80, 0xff, 0xb1, 0x3, 0xfd, + 0x18, 0x1f, 0xfc, 0x1c, 0x7, 0xf3, 0x60, 0x3f, + 0xf8, 0x78, 0xf, 0x94, 0x3, 0xff, 0x88, 0x70, + 0x1c, 0xa8, 0x1f, 0xfc, 0x63, 0x40, 0x8d, 0x3, + 0xff, 0x90, 0xa8, 0xe, 0x7, 0xff, 0x29, 0x20, + 0x20, 0x7f, 0xf2, 0xc8, 0x40, 0x7f, 0xf2, 0xd0, + 0xa8, 0xf, 0xfe, 0x4c, 0x20, 0x2f, 0xff, 0xfc, + 0x96, 0x7, 0xff, 0x41, 0xff, 0xff, 0xca, 0xc0, + 0x20, 0x1f, 0xfc, 0xa2, 0xc0, 0xff, 0xe6, 0xf0, + 0x3f, 0xff, 0xe0, 0x38, 0xa0, 0x7f, 0xf2, 0x93, + + /* U+F053 "" */ + 0x3, 0xfe, 0x30, 0x81, 0xff, 0xc0, 0x59, 0xe2, + 0x7, 0xf9, 0x50, 0x2c, 0x7, 0xf2, 0xa0, 0x62, + 0x7, 0xe5, 0x40, 0xc7, 0x1, 0xf2, 0xa0, 0x63, + 0x80, 0xf9, 0x50, 0x31, 0xc0, 0x7c, 0xa8, 0x18, + 0xe0, 0x3e, 0x54, 0xc, 0x70, 0x1f, 0x2a, 0x6, + 0x38, 0xf, 0x95, 0x3, 0x1c, 0x7, 0xc6, 0x81, + 0x8e, 0x3, 0xf2, 0x3, 0xa8, 0x1f, 0xcd, 0x1, + 0xa3, 0x3, 0xfa, 0xa0, 0x34, 0x60, 0x7f, 0x54, + 0x6, 0x8c, 0xf, 0xea, 0x80, 0xd1, 0x81, 0xfd, + 0x50, 0x1a, 0x30, 0x3f, 0xa9, 0x3, 0x46, 0x7, + 0xf6, 0x20, 0x68, 0xc0, 0xfe, 0xc4, 0xd, 0x18, + 0x1f, 0xd8, 0x81, 0xa0, 0x1f, 0xec, 0x40, 0x90, + 0x1f, 0xf6, 0x41, 0x50, 0x3f, 0xf8, 0x17, 0x50, + 0x0, + + /* U+F054 "" */ + 0x0, 0xe0, 0x1f, 0xfc, 0x1b, 0x1d, 0x3, 0xfe, + 0x68, 0x2, 0xa0, 0x7f, 0x88, 0x19, 0x50, 0x3f, + 0x94, 0x3, 0x2a, 0x7, 0xf3, 0x80, 0x65, 0x40, + 0xfe, 0x70, 0xc, 0xa8, 0x1f, 0xce, 0x1, 0x95, + 0x3, 0xf9, 0xc0, 0x32, 0xa0, 0x7f, 0x38, 0x6, + 0x54, 0xf, 0xe7, 0x0, 0xca, 0x81, 0xfc, 0xe0, + 0x19, 0x50, 0x3f, 0x98, 0x1c, 0x80, 0xfe, 0xc0, + 0x75, 0x3, 0xf6, 0x20, 0x6a, 0x80, 0xfb, 0x10, + 0x35, 0x40, 0x7d, 0x88, 0x1a, 0xa0, 0x3e, 0xc4, + 0xd, 0x50, 0x1f, 0x62, 0x6, 0xa8, 0xf, 0xb1, + 0x3, 0x54, 0x7, 0xd8, 0x81, 0xaa, 0x3, 0xe6, + 0x40, 0xd5, 0x1, 0xf9, 0x1, 0xaa, 0x3, 0xf8, + 0xe0, 0x15, 0x1, 0xff, 0x1f, 0xc8, 0xf, 0xf8, + + /* U+F067 "" */ + 0x3, 0xfc, 0xad, 0x40, 0x3f, 0xf9, 0x6, 0xa4, + 0x74, 0xf, 0xfe, 0x3b, 0x3, 0x30, 0x3f, 0xf8, + 0xe4, 0xc, 0x40, 0xff, 0xff, 0x81, 0xff, 0xff, + 0x3, 0xfc, 0xff, 0xfd, 0x0, 0xef, 0xff, 0x61, + 0x0, 0xff, 0xe5, 0x16, 0x7, 0xff, 0x33, 0x81, + 0xff, 0xcc, 0xec, 0xf, 0xfe, 0x5a, 0x9b, 0x7e, + 0x60, 0x76, 0xdf, 0xb9, 0x4, 0xfe, 0xe0, 0x71, + 0x3f, 0x80, 0xff, 0xff, 0x81, 0xff, 0xff, 0x3, + 0xfe, 0x20, 0x62, 0x7, 0xff, 0x1d, 0x32, 0x6e, + 0x7, 0xf8, + + /* U+F068 "" */ + 0x0, 0x4f, 0xff, 0x20, 0xa, 0x7d, 0xbf, 0xf9, + 0x1f, 0x83, 0x3, 0xff, 0x96, 0xc0, 0xff, 0xe6, + 0x70, 0x3f, 0xf9, 0x9e, 0x1, 0xff, 0xcb, 0x6d, + 0xf6, 0xff, 0xe4, 0x7e, 0x0, + + /* U+F06E "" */ + 0x3, 0xfc, 0x5d, 0xdf, 0xed, 0x10, 0x1f, 0xfc, + 0x75, 0xb2, 0x22, 0x6, 0x2e, 0xfa, 0x40, 0xff, + 0xe1, 0x1d, 0x48, 0x19, 0x28, 0x81, 0x96, 0x80, + 0x7f, 0xf0, 0x26, 0x20, 0x46, 0xfb, 0x6d, 0xd8, + 0x19, 0xf4, 0x7, 0xf5, 0x60, 0x65, 0x90, 0x1e, + 0x98, 0xe, 0xac, 0xf, 0xb2, 0x3, 0x2a, 0x4, + 0x64, 0x20, 0x7, 0x1, 0xd1, 0x81, 0xd4, 0x81, + 0xd4, 0xe, 0x6d, 0x71, 0x6, 0x81, 0xd1, 0x1, + 0x34, 0x7, 0x40, 0x3f, 0x8e, 0x0, 0x88, 0x1d, + 0x48, 0x30, 0xf, 0x20, 0x3a, 0x1, 0xd0, 0x2, + 0x3, 0xdc, 0x40, 0x3e, 0x21, 0x47, 0x50, 0x1c, + 0x80, 0x60, 0x3c, 0x52, 0x1, 0xfc, 0x5c, 0x40, + 0x78, 0x81, 0xfe, 0xc8, 0xf, 0xfe, 0x96, 0xa0, + 0x7c, 0x43, 0x3, 0xf9, 0x80, 0xc0, 0x78, 0xa1, + 0x0, 0xf2, 0x0, 0xc0, 0xfd, 0x40, 0x20, 0x3d, + 0xc0, 0x34, 0x7, 0x40, 0x11, 0x1, 0xea, 0x42, + 0x20, 0x75, 0x20, 0x55, 0x1, 0xd4, 0x5, 0xa4, + 0x49, 0xf4, 0xd, 0x3, 0xa2, 0x3, 0xaa, 0x3, + 0x2a, 0x1, 0x5d, 0x90, 0x1, 0xc0, 0x74, 0x60, + 0x7d, 0x60, 0x19, 0x64, 0x7, 0xa6, 0x3, 0xab, + 0x3, 0xf9, 0xe2, 0x4, 0x6f, 0xb6, 0xdd, 0x81, + 0x9f, 0x40, 0x7f, 0xc7, 0x52, 0x6, 0x4a, 0x20, + 0x65, 0xa0, 0x1f, 0xfc, 0x35, 0xb2, 0x22, 0x6, + 0x2e, 0xfa, 0x40, 0xfc, + + /* U+F070 "" */ + 0x9, 0x0, 0xff, 0xea, 0x2b, 0x50, 0xf, 0xfe, + 0x9d, 0x0, 0xf0, 0x1f, 0xfd, 0x26, 0x4, 0x79, + 0x3, 0xff, 0xa1, 0x28, 0x1b, 0x30, 0x31, 0x77, + 0x7f, 0x6a, 0xc8, 0x1f, 0xfc, 0x15, 0x88, 0x14, + 0xa1, 0xec, 0x88, 0x81, 0x15, 0x36, 0x30, 0x3f, + 0xf8, 0x7, 0x20, 0x25, 0xe1, 0x3, 0x25, 0x1, + 0x8c, 0xec, 0xf, 0xfe, 0x5, 0x80, 0x7c, 0x6f, + 0xb6, 0xf9, 0x1, 0xa5, 0x3, 0xff, 0x80, 0xf0, + 0x1c, 0x72, 0x3, 0x8d, 0x80, 0x65, 0xc8, 0x1f, + 0xf1, 0xe8, 0x8, 0xe0, 0xe, 0xd2, 0x0, 0xe0, + 0x1d, 0x88, 0x1f, 0xfc, 0xa, 0xc0, 0x8f, 0x41, + 0x25, 0xc0, 0x1a, 0x3, 0xb8, 0x1f, 0x5c, 0x40, + 0xa5, 0x3, 0x5a, 0x2, 0x38, 0x4, 0x3, 0x8d, + 0x3, 0x92, 0x1c, 0x80, 0x96, 0x20, 0x44, 0xc, + 0x50, 0x20, 0x79, 0x20, 0x1a, 0x81, 0x58, 0x4, + 0x72, 0x3, 0xf7, 0x0, 0x80, 0xf5, 0x2, 0x20, + 0x73, 0xc4, 0xa, 0xc0, 0x3f, 0xf8, 0xc4, 0x1, + 0x3, 0xc7, 0x81, 0x9e, 0x3, 0xf9, 0x81, 0xf1, + 0x2, 0xa0, 0x78, 0x81, 0xc7, 0xa0, 0x33, 0x20, + 0x81, 0xea, 0x6, 0x48, 0x7, 0x90, 0x1e, 0xb0, + 0x8, 0xe8, 0x7, 0x9a, 0x3, 0xa9, 0x3, 0xa0, + 0x1f, 0x3a, 0x6, 0x60, 0x71, 0x80, 0x7d, 0xc0, + 0xe3, 0x0, 0xf9, 0x72, 0x7, 0xec, 0x7, 0xe3, + 0x88, 0x19, 0xb0, 0x1f, 0xb3, 0x3, 0xd8, 0xf, + 0xf1, 0xc8, 0xd, 0x32, 0x3, 0xe9, 0x40, 0xe4, + 0x7, 0xff, 0x2, 0xc0, 0x31, 0xbe, 0xd9, 0x1, + 0x2c, 0x40, 0xa5, 0x3, 0xff, 0x80, 0xfc, 0x20, + 0x64, 0xab, 0x0, 0x8e, 0x40, 0x4b, 0x10, 0x3f, + 0xf8, 0xf, 0x64, 0x44, 0x8, 0x92, 0x3, 0x58, + 0x4, 0x72, 0x3, 0xff, 0x82, 0x5d, 0xdf, 0xda, + 0xa0, 0x39, 0xe0, 0x35, 0x80, 0x7f, 0xf4, 0xf, + 0x20, 0x4c, 0xf, 0xfe, 0x96, 0x60, 0x28, 0x1f, + 0xfd, 0x39, 0x69, 0x0, + + /* U+F071 "" */ + 0x3, 0xff, 0x86, 0xa3, 0x3, 0xff, 0xa2, 0xab, + 0x98, 0xf, 0xfe, 0x85, 0x2, 0x2c, 0xf, 0xfe, + 0x74, 0x3, 0xa0, 0x1f, 0xfc, 0xd2, 0xc0, 0xf5, + 0x3, 0xff, 0x99, 0x0, 0xf9, 0x10, 0x3f, 0xf9, + 0x49, 0x0, 0xfd, 0xc0, 0xff, 0xe5, 0x40, 0x3f, + 0x8a, 0x3, 0xff, 0x90, 0xc8, 0x1f, 0xea, 0x7, + 0xff, 0x22, 0x1, 0xff, 0xc0, 0x80, 0x7f, 0xf1, + 0xa0, 0x19, 0xff, 0x80, 0xcc, 0xf, 0xfe, 0x29, + 0x60, 0x6e, 0x7, 0xf5, 0x3, 0xff, 0x89, 0x0, + 0xff, 0xe1, 0xa2, 0x7, 0xff, 0x9, 0x20, 0x1d, + 0xc0, 0xff, 0x70, 0x3f, 0xf8, 0x50, 0xf, 0xfe, + 0x29, 0x40, 0x7f, 0xf0, 0x19, 0x3, 0xff, 0x8d, + 0x40, 0xff, 0xe0, 0x40, 0x3e, 0x20, 0x44, 0xf, + 0xd0, 0xf, 0xf4, 0x3, 0xff, 0x92, 0xc0, 0xfe, + 0x2c, 0xf, 0xcc, 0x9, 0x1, 0xfd, 0x40, 0xfd, + 0x0, 0xfe, 0x3f, 0xd0, 0xf, 0xe4, 0x40, 0xf2, + 0x40, 0x3f, 0xd7, 0xf2, 0x3, 0xfd, 0xc0, 0xf4, + 0x3, 0xfd, 0x10, 0xa, 0x7, 0xf8, 0xb0, 0x33, + 0x20, 0x7f, 0x88, 0x18, 0x81, 0xfe, 0x80, 0x68, + 0x7, 0xfd, 0x80, 0xc4, 0xf, 0xfa, 0x0, 0x80, + 0x7f, 0xf0, 0x1b, 0x3, 0x80, 0xff, 0xe0, 0x30, + 0xc, 0xf, 0xfe, 0xc, 0xf8, 0x81, 0xff, 0xc1, + 0x60, 0x7f, 0xf5, 0xa0, 0x1f, 0xfd, 0x26, 0x1d, + 0x6f, 0xff, 0x9f, 0x38, + + /* U+F074 "" */ + 0x3, 0xff, 0x92, 0xe9, 0x3, 0xff, 0x9b, 0x16, + 0x20, 0x7f, 0xf3, 0xf1, 0x0, 0x52, 0xe2, 0x7, + 0xf8, 0xa5, 0x1, 0xb1, 0x1a, 0xde, 0xd4, 0xf, + 0xc7, 0x5b, 0x1, 0xd8, 0x81, 0xf2, 0xa0, 0x78, + 0xe0, 0x3f, 0xd8, 0xf, 0xca, 0x1, 0x8e, 0x3, + 0xfe, 0x20, 0x7f, 0x38, 0x5, 0x80, 0xff, 0x8e, + 0xfb, 0x68, 0x6, 0x20, 0x30, 0x18, 0xec, 0x3, + 0x1c, 0x0, 0x9c, 0xe0, 0x5, 0x46, 0x20, 0x47, + 0x12, 0x2, 0x38, 0xf, 0xcd, 0x8d, 0x18, 0x81, + 0xb8, 0x1c, 0x70, 0x1f, 0xe9, 0x85, 0x20, 0x6c, + 0x40, 0xab, 0xc0, 0x7f, 0xf0, 0x6a, 0x3, 0x62, + 0x6, 0x50, 0xf, 0xfe, 0xc, 0x40, 0x6a, 0x40, + 0xe5, 0x0, 0xff, 0xe0, 0x46, 0x6, 0xa9, 0x39, + 0x2, 0xaf, 0x90, 0x3f, 0x9b, 0x1, 0xa2, 0x4a, + 0x38, 0x1e, 0xc4, 0x8, 0x9c, 0xe0, 0x1a, 0x33, + 0x40, 0x1c, 0x48, 0xd, 0x88, 0xfb, 0x68, 0x6, + 0x6c, 0x8, 0x18, 0xec, 0x3, 0xb1, 0x3, 0xf9, + 0xc0, 0x2c, 0x7, 0xff, 0x3, 0x81, 0xf9, 0x40, + 0x31, 0xc0, 0x7f, 0xf1, 0xd5, 0x3, 0xc7, 0x1, + 0xfe, 0xfa, 0xde, 0xd4, 0xf, 0xc7, 0x5b, 0x1, + 0xd8, 0x92, 0x5c, 0x40, 0xff, 0x14, 0xa0, 0x36, + 0x20, 0x7f, 0xf3, 0x71, 0x3, 0xff, 0x97, 0x16, + 0x20, 0x40, + + /* U+F077 "" */ + 0x3, 0xfe, 0x74, 0x81, 0xff, 0xc9, 0x90, 0xb1, + 0x3, 0xff, 0x8f, 0x18, 0x16, 0x20, 0x7f, 0xf1, + 0x63, 0x3, 0xb1, 0x3, 0xff, 0x87, 0x18, 0x1f, + 0x62, 0x7, 0xff, 0x6, 0x30, 0x3f, 0xb1, 0x3, + 0xfe, 0x8c, 0xc, 0xb0, 0x1d, 0x88, 0x1f, 0xd1, + 0x81, 0x95, 0x38, 0xe, 0xc4, 0xf, 0xa3, 0x3, + 0x2a, 0x0, 0xe0, 0x3b, 0x10, 0x3a, 0x30, 0x32, + 0xa0, 0x63, 0x80, 0xec, 0x40, 0xa3, 0x3, 0x2a, + 0x7, 0x8e, 0x3, 0xb1, 0xd, 0x80, 0xca, 0x81, + 0xf8, 0xe0, 0x3b, 0xe, 0x6, 0x54, 0xf, 0xf1, + 0xc0, 0x7a, 0x10, 0xa, 0x81, 0xff, 0xc0, 0x38, + 0xa, 0x0, 0xc9, 0xd0, 0x3f, 0xf8, 0x47, 0x2a, + 0xc0, + + /* U+F078 "" */ + 0x1, 0x60, 0x1f, 0xfc, 0x43, 0x58, 0x16, 0x4e, + 0x81, 0xff, 0xc2, 0x39, 0x46, 0x21, 0x0, 0xa8, + 0x1f, 0xfc, 0x3, 0x80, 0xa0, 0xe0, 0x65, 0x40, + 0xff, 0x1c, 0x6, 0x21, 0xb0, 0x19, 0x50, 0x3f, + 0x1c, 0x7, 0x70, 0x11, 0x81, 0x95, 0x3, 0xc7, + 0x1, 0xd8, 0x81, 0x46, 0x6, 0x54, 0xc, 0x70, + 0x1d, 0x88, 0x1d, 0x18, 0x19, 0x50, 0x7, 0x1, + 0xd8, 0x81, 0xf4, 0x60, 0x65, 0x4e, 0x3, 0xb1, + 0x3, 0xfa, 0x30, 0x32, 0xc0, 0x76, 0x20, 0x7f, + 0xd1, 0x81, 0xfd, 0x88, 0x1f, 0xfc, 0x18, 0xc0, + 0xfb, 0x10, 0x3f, 0xf8, 0x71, 0x81, 0xd8, 0x81, + 0xff, 0xc5, 0x8c, 0xb, 0x10, 0x3f, 0xf8, 0xf2, + 0x16, 0x20, 0x7f, 0x80, + + /* U+F079 "" */ + 0x3, 0xc8, 0x81, 0xff, 0xd4, 0x97, 0x20, 0x3f, + 0xfa, 0x51, 0x80, 0xa8, 0xc, 0x9b, 0xff, 0xe1, + 0x1, 0xfd, 0x18, 0x1a, 0xa0, 0xa, 0xc9, 0xff, + 0xc2, 0x60, 0x7d, 0x18, 0x1e, 0xa8, 0x30, 0x3f, + 0xf8, 0x7c, 0xf, 0x46, 0x7, 0xea, 0x8d, 0x3, + 0xff, 0x91, 0x18, 0x1f, 0xea, 0x93, 0xff, 0xf8, + 0xf, 0xe6, 0x5, 0x40, 0x9b, 0x1, 0x60, 0x3f, + 0xf9, 0x30, 0x5, 0x40, 0x68, 0x80, 0x50, 0x3f, + 0xf9, 0x2f, 0x62, 0x3, 0xd6, 0xb9, 0x3, 0xff, + 0x94, 0x48, 0xf, 0xc8, 0xf, 0xff, 0xf8, 0x1f, + 0xfd, 0xc9, 0x0, 0x7c, 0x6b, 0x3, 0xff, 0x95, + 0x9b, 0x50, 0x38, 0xe5, 0x18, 0x1f, 0xfc, 0x92, + 0x1, 0x40, 0x23, 0xc0, 0xb8, 0x1f, 0x93, 0x7f, + 0xe2, 0x28, 0x13, 0x2, 0x44, 0x1, 0x80, 0x7e, + 0x32, 0x7f, 0xb2, 0x4a, 0x7, 0xf1, 0xc0, 0x7f, + 0xf2, 0x68, 0x54, 0xf, 0x8e, 0x3, 0xe6, 0x7, + 0xff, 0x9, 0x0, 0x58, 0xe, 0x38, 0xf, 0xd3, + 0xff, 0xfe, 0x15, 0x2, 0x38, 0x8, 0xe0, 0x3f, + 0xfa, 0x27, 0x15, 0x80, 0xe0, + + /* U+F07B "" */ + 0x17, 0xff, 0xec, 0x7, 0xff, 0x12, 0xa0, 0x3f, + 0x8e, 0x3, 0xff, 0x86, 0x80, 0xff, 0x8e, 0x3, + 0xff, 0x9e, 0x74, 0x9f, 0xe6, 0x40, 0xff, 0xe1, + 0x96, 0xff, 0xd3, 0x20, 0x3f, 0xf9, 0xf4, 0xf, + 0xff, 0xf8, 0x1f, 0xff, 0xf0, 0x3f, 0xff, 0xe0, + 0x7f, 0xff, 0xc0, 0xff, 0xfa, 0x20, 0x3f, 0xf9, + 0xca, 0xa0, 0x3f, 0xf9, 0x8a, 0x80, + + /* U+F093 "" */ + 0x3, 0xff, 0x82, 0x40, 0xff, 0xe7, 0x3d, 0xc8, + 0x1f, 0xfc, 0xb7, 0x0, 0x62, 0x7, 0xff, 0x25, + 0xc0, 0x36, 0x20, 0x7f, 0xf1, 0xdc, 0x3, 0xd8, + 0x81, 0xff, 0xc5, 0x70, 0xf, 0xd8, 0x81, 0xff, + 0xc3, 0x70, 0xf, 0xf6, 0x20, 0x7f, 0xf0, 0x5c, + 0x3, 0xff, 0x81, 0x88, 0x1f, 0xf3, 0x80, 0x7f, + 0xf0, 0xb1, 0x3, 0xf9, 0x40, 0x3f, 0xf8, 0x98, + 0xf, 0xe2, 0x7, 0xff, 0x3d, 0xed, 0xc4, 0xf, + 0x4d, 0xb7, 0x3, 0xfc, 0x4f, 0x30, 0x3c, 0x4f, + 0x1, 0xff, 0xff, 0x3, 0xff, 0xfe, 0x7, 0xff, + 0xa2, 0xff, 0xf6, 0x3, 0xf3, 0x1b, 0xff, 0xaa, + 0x3, 0xe2, 0x2b, 0x7d, 0x8, 0x20, 0x7c, 0x80, + 0xfe, 0xc2, 0x4e, 0x63, 0x1, 0xff, 0xc6, 0x3f, + 0x6f, 0x72, 0x7, 0xff, 0x20, 0x9f, 0x1, 0xff, + 0xd2, 0xbc, 0x2e, 0xc0, 0xff, 0xe5, 0x90, 0xc0, + 0xff, 0xe6, 0x5c, 0xf, 0x60, 0x5a, 0x37, 0xff, + 0xcc, 0x98, + + /* U+F095 "" */ + 0x3, 0xff, 0x92, 0xd8, 0x81, 0xff, 0xcd, 0x52, + 0x37, 0xac, 0x81, 0xff, 0xc9, 0xe0, 0x65, 0x36, + 0x1, 0xff, 0xc7, 0x28, 0xf, 0x88, 0x1f, 0xfc, + 0x7a, 0x7, 0xff, 0x41, 0x81, 0xff, 0xcf, 0x60, + 0x7f, 0x10, 0x3f, 0xf8, 0xd4, 0xf, 0xe6, 0x7, + 0xff, 0x19, 0x81, 0xfd, 0x80, 0xff, 0xe3, 0x54, + 0x7, 0xe4, 0x7, 0xff, 0x1e, 0xb0, 0x3e, 0x20, + 0x7f, 0xf2, 0x24, 0x1, 0xcc, 0xf, 0xfe, 0x56, + 0x3, 0xb0, 0x1f, 0xfc, 0x92, 0x80, 0xc5, 0x1, + 0xff, 0xc9, 0xe0, 0x74, 0x3, 0xff, 0x93, 0x8, + 0x18, 0xa0, 0x3f, 0xf9, 0xd, 0x80, 0xee, 0x7, + 0xf8, 0xb0, 0x3f, 0x28, 0x7, 0x32, 0x7, 0xe5, + 0x74, 0xc0, 0x79, 0xd0, 0x38, 0xc0, 0x3e, 0x7a, + 0xa0, 0x6, 0x81, 0xac, 0x3, 0xd8, 0xf, 0x3f, + 0x8, 0x1c, 0x98, 0x5d, 0x1, 0xec, 0x7, 0xd0, + 0xf, 0xe9, 0xa8, 0x1f, 0x62, 0x7, 0xc4, 0xf, + 0xf1, 0x3, 0xc7, 0x10, 0x3f, 0x20, 0x3f, 0xf8, + 0x8b, 0x10, 0x3f, 0xb0, 0x1f, 0xfc, 0x39, 0x40, + 0xff, 0x90, 0x1f, 0xfc, 0x17, 0xd8, 0x1f, 0xfc, + 0x12, 0x7, 0xf9, 0xf8, 0x7, 0xff, 0xd, 0x1, + 0xe2, 0xef, 0x80, 0x7f, 0xf1, 0x64, 0xd7, 0x7d, + 0x10, 0x1f, 0xfc, 0x50, + + /* U+F0C4 "" */ + 0x2, 0x52, 0x19, 0x3, 0xff, 0x8c, 0x75, 0x6d, + 0x33, 0x3, 0xfc, 0xed, 0x40, 0x2c, 0x40, 0xe8, + 0xc0, 0xf8, 0xf8, 0x91, 0xf3, 0x0, 0xfd, 0x0, + 0xf1, 0xc0, 0x79, 0xa0, 0x2f, 0xd0, 0x9, 0x1, + 0x8e, 0x3, 0xd5, 0x10, 0xc, 0x3, 0x2, 0x20, + 0x47, 0x1, 0xea, 0x80, 0xc8, 0x2, 0x3, 0xc7, + 0x1, 0xea, 0x80, 0x20, 0x7, 0x5a, 0x2, 0x20, + 0xe0, 0x3d, 0x50, 0x14, 0x2, 0x28, 0xd, 0x56, + 0x3, 0xd5, 0x1, 0x8d, 0x3, 0xfa, 0x81, 0xea, + 0x80, 0xf2, 0xec, 0x90, 0x1f, 0xf5, 0x40, 0x7f, + 0x4d, 0x94, 0xf, 0xea, 0x80, 0xff, 0xe0, 0xa8, + 0x7, 0xd1, 0x1, 0xff, 0xc2, 0x30, 0xf, 0xa1, + 0x3, 0xfe, 0x52, 0x30, 0x1f, 0xd8, 0x81, 0xf8, + 0xea, 0xd8, 0xf, 0xfb, 0x10, 0x3e, 0xc4, 0xf, + 0xcc, 0xf, 0x62, 0x7, 0x40, 0x3f, 0xa4, 0x50, + 0x3d, 0x88, 0x19, 0x1, 0x7e, 0x80, 0x44, 0x2a, + 0x7, 0xb1, 0x2, 0x20, 0x18, 0x6, 0x4, 0x40, + 0x2a, 0x7, 0xb1, 0x3, 0x90, 0x4, 0x7, 0xca, + 0x81, 0xec, 0x42, 0x0, 0x75, 0xa0, 0x24, 0x6, + 0x54, 0xf, 0x63, 0x0, 0x8a, 0x2, 0x64, 0xe, + 0x54, 0xf, 0x33, 0x40, 0xf2, 0x80, 0x7c, 0xb2, + 0x0, 0xb2, 0xb, 0xb2, 0x4a, 0xd0, 0x1f, 0xc6, + 0xfe, 0xa4, 0x0, + + /* U+F0C5 "" */ + 0x3, 0xf2, 0x5f, 0xc4, 0x10, 0x3f, 0xf8, 0x1a, + 0xdf, 0xf0, 0xd4, 0xf, 0xf8, 0x81, 0xff, 0xc0, + 0x54, 0xf, 0xfe, 0x62, 0xa0, 0x7f, 0xf3, 0x15, + 0x3, 0xff, 0x98, 0x92, 0xff, 0x90, 0x1f, 0xf1, + 0x1f, 0xf2, 0x40, 0x3f, 0xf8, 0x8b, 0x5b, 0xc4, + 0xf, 0xfe, 0x31, 0x4b, 0x98, 0x1f, 0xff, 0xf0, + 0x3f, 0xff, 0xe0, 0x7f, 0xff, 0xc0, 0xff, 0xff, + 0x81, 0xff, 0xd4, 0x40, 0x7f, 0xf1, 0x10, 0x1d, + 0xc5, 0xff, 0xff, 0x88, 0x7, 0x95, 0x20, 0x7f, + 0xf2, 0xd6, 0xff, 0xfa, 0x1, 0xff, 0xe5, 0xe0, + 0x7d, 0xa3, 0x7f, 0xfc, 0x28, 0xc0, 0xf8, + + /* U+F0C7 "" */ + 0xa, 0x4f, 0xfe, 0x1b, 0x20, 0x79, 0xd6, 0xff, + 0xf8, 0x73, 0x20, 0x3a, 0x1, 0xff, 0xc6, 0xa8, + 0xf, 0xfe, 0x65, 0x40, 0x79, 0xff, 0xff, 0xc1, + 0x20, 0x55, 0x1, 0xff, 0xc7, 0x60, 0x6a, 0x40, + 0xff, 0xe6, 0x60, 0x3f, 0xf9, 0xa4, 0xf, 0xfe, + 0x63, 0x3, 0xff, 0xa0, 0x9b, 0xff, 0xe0, 0xa0, + 0x3f, 0xc6, 0x4f, 0xfe, 0x8, 0x1f, 0xff, 0x87, + 0xbd, 0x3, 0xff, 0x91, 0x20, 0x85, 0x80, 0xff, + 0xe3, 0xb0, 0x31, 0x40, 0x7f, 0xf1, 0x48, 0x1e, + 0x20, 0x7f, 0xf1, 0x48, 0x1f, 0xfc, 0xd2, 0x7, + 0x30, 0x3f, 0xf8, 0xdc, 0xd, 0x0, 0xff, 0xe3, + 0x9f, 0x66, 0x60, 0x7f, 0xf2, 0x53, 0x20, 0x7f, + 0x9a, 0x3, 0xff, 0x96, 0x6a, 0x3, 0xff, 0x90, + 0x70, + + /* U+F0E7 "" */ + 0x2, 0x96, 0xfe, 0x80, 0x7e, 0x2d, 0x2f, 0xcc, + 0x81, 0xf2, 0x3, 0xfc, 0x40, 0xfb, 0x81, 0xfc, + 0x80, 0xfc, 0x40, 0xfe, 0xe0, 0x7e, 0x60, 0x7f, + 0x20, 0x3f, 0x10, 0x3f, 0x20, 0x3f, 0xf8, 0xd8, + 0xf, 0xc4, 0xf, 0xe6, 0x7, 0xe6, 0x7, 0xf7, + 0xfe, 0xc4, 0x10, 0x3f, 0xf8, 0x65, 0xe, 0x7, + 0xff, 0x11, 0x82, 0x7, 0xff, 0xe, 0x0, 0x60, + 0x7f, 0xf0, 0x8b, 0x0, 0x40, 0xff, 0xe1, 0x40, + 0x24, 0x7, 0xff, 0x5, 0x20, 0x15, 0xff, 0xd4, + 0xf, 0x40, 0x3f, 0xec, 0x7, 0x32, 0x7, 0xfc, + 0x80, 0xe8, 0x7, 0xff, 0x0, 0x81, 0xa0, 0x1f, + 0xfc, 0x2, 0x6, 0x2c, 0xf, 0xfe, 0x2, 0x3, + 0x40, 0x3f, 0xf8, 0x38, 0x9, 0x20, 0x1f, 0xfc, + 0x14, 0x5, 0x0, 0xff, 0xe0, 0x90, 0x26, 0x40, + 0xff, 0xe0, 0xa0, 0x28, 0x7, 0xff, 0xb, 0x0, + 0x80, 0x7f, 0xf0, 0xc8, 0x2c, 0xf, 0xfe, 0x1c, + 0xd8, 0x7, 0xf8, + + /* U+F0EA "" */ + 0x3, 0xf2, 0x20, 0x7f, 0xf2, 0x5f, 0xbb, 0x90, + 0x3f, 0xf8, 0x2a, 0x4f, 0x1, 0xb4, 0x9c, 0x7, + 0xea, 0xdf, 0x5, 0xf8, 0x3, 0x7d, 0x0, 0xff, + 0xe6, 0x10, 0x3f, 0xf8, 0x4b, 0xf0, 0x1f, 0xfe, + 0x43, 0x2d, 0xfa, 0x1, 0xff, 0xc2, 0x59, 0xa5, + 0xf1, 0x3, 0xff, 0x85, 0x5, 0xff, 0xea, 0x33, + 0x3, 0xfe, 0x21, 0x1, 0xfc, 0x63, 0x3, 0xff, + 0x99, 0x18, 0x1f, 0xfc, 0xc8, 0xc0, 0xff, 0xe6, + 0x42, 0x7, 0xff, 0x1e, 0xde, 0x20, 0x7f, 0xf1, + 0x50, 0x4b, 0x80, 0xff, 0xe3, 0xff, 0xe4, 0x7, + 0xff, 0xfc, 0xf, 0xff, 0x32, 0x3, 0xff, 0x99, + 0x7f, 0xf0, 0x1f, 0xff, 0xf0, 0x3f, 0xfb, 0xcc, + 0xf, 0xef, 0x6f, 0xff, 0x7, 0x10, + + /* U+F0F3 "" */ + 0x3, 0xfe, 0x74, 0x81, 0xff, 0xc9, 0x51, 0x70, + 0x3f, 0xf9, 0x24, 0x1, 0x3, 0xff, 0x8e, 0x65, + 0x2, 0xa8, 0xf, 0xfe, 0x24, 0xcc, 0x81, 0x2b, + 0x90, 0x1f, 0xfc, 0x1c, 0xc0, 0xfc, 0x6a, 0x3, + 0xfe, 0xc4, 0xf, 0xfa, 0xa0, 0x3f, 0x99, 0x3, + 0xff, 0x83, 0x0, 0xfe, 0x80, 0x7f, 0xf0, 0x8a, + 0x3, 0xe2, 0x7, 0xff, 0x13, 0x81, 0xf2, 0x3, + 0xff, 0x88, 0xc0, 0xff, 0xe6, 0x10, 0x3e, 0xe0, + 0x7f, 0xf9, 0x50, 0x1f, 0xfc, 0x54, 0x7, 0x88, + 0x1f, 0xfc, 0x52, 0x7, 0x10, 0x3f, 0xf8, 0xd8, + 0xe, 0xa0, 0x7f, 0xf1, 0x90, 0x18, 0xb0, 0x3f, + 0xf8, 0xf4, 0xb, 0x1, 0xff, 0xc8, 0x4c, 0x50, + 0x3f, 0xf9, 0x50, 0xa0, 0x3f, 0xf9, 0x6a, 0x1, + 0xff, 0xca, 0x2d, 0xbf, 0xff, 0xe5, 0x60, 0x3f, + 0xfa, 0xc7, 0xff, 0x50, 0x3f, 0xf8, 0xa4, 0xf, + 0x60, 0x3f, 0xf8, 0xd8, 0xc, 0xd8, 0xf, 0xfe, + 0x31, 0xf6, 0x68, 0x7, 0xf8, + + /* U+F11C "" */ + 0x17, 0xff, 0xfe, 0x82, 0x15, 0x1, 0xff, 0xd0, + 0xa5, 0x1, 0xff, 0xd2, 0x40, 0x45, 0xb8, 0x3, + 0x70, 0x6, 0xe0, 0x9, 0xb2, 0x5, 0xb8, 0xb, + 0x81, 0x29, 0x20, 0x64, 0x88, 0x92, 0x42, 0xc8, + 0xe2, 0xc9, 0x1, 0xff, 0xe9, 0x60, 0x80, 0x23, + 0x81, 0xfe, 0x7f, 0xc0, 0xff, 0x11, 0xfc, 0x46, + 0xfd, 0x3, 0xfe, 0x3, 0xfc, 0x4c, 0x4, 0x4c, + 0x0, 0x98, 0x1, 0x30, 0x1f, 0xfc, 0x1f, 0xb2, + 0x9, 0xb3, 0x87, 0xb4, 0xe, 0xd2, 0x3, 0xff, + 0xfe, 0x3e, 0xc8, 0x26, 0xce, 0x1e, 0xd0, 0x3b, + 0x48, 0xf, 0xfe, 0x1, 0x30, 0x11, 0x30, 0x2, + 0x60, 0x4, 0xc0, 0x7f, 0x9f, 0xf0, 0x3f, 0xff, + 0xf0, 0x60, 0x7f, 0xc0, 0x7f, 0xf3, 0x88, 0xe0, + 0x7f, 0xf7, 0x94, 0x90, 0x32, 0x7f, 0xf0, 0x78, + 0xb2, 0x40, 0x7c, 0x5b, 0x80, 0x37, 0xff, 0xc1, + 0x40, 0xb7, 0x1, 0x74, 0x7, 0xff, 0x49, 0x54, + 0x7, 0xff, 0x42, 0x90, + + /* U+F124 "" */ + 0x3, 0xff, 0x9a, 0x99, 0x3, 0xff, 0x9a, 0xfd, + 0x99, 0x1, 0xff, 0xca, 0x9e, 0x1, 0xa0, 0x1f, + 0xfc, 0x73, 0x3b, 0x3, 0xc4, 0xf, 0xfe, 0x29, + 0xb9, 0x81, 0xf9, 0x81, 0xff, 0xc3, 0x5b, 0x10, + 0x1f, 0xea, 0x7, 0xff, 0x5, 0xea, 0x40, 0xff, + 0x91, 0x3, 0xfe, 0x7e, 0x10, 0x3f, 0xf8, 0x30, + 0xf, 0xf4, 0xf0, 0xf, 0xfe, 0x19, 0x20, 0x3e, + 0x37, 0xb0, 0x3f, 0xf8, 0xb0, 0xf, 0x2b, 0x90, + 0x1f, 0xfc, 0x62, 0x80, 0xeb, 0x48, 0xf, 0xfe, + 0x45, 0x3, 0xaa, 0x3, 0xff, 0x94, 0xc0, 0xe4, + 0x7, 0xff, 0x2a, 0x1, 0xe2, 0x7, 0xff, 0x29, + 0x81, 0xe8, 0x7, 0xff, 0x25, 0x81, 0xf2, 0xfa, + 0xdf, 0xe2, 0x7, 0xf5, 0x3, 0xf8, 0xa5, 0xfc, + 0x7, 0xf2, 0x20, 0x7f, 0xf4, 0x20, 0x1f, 0xfd, + 0x4, 0x40, 0xff, 0xe8, 0x70, 0x3f, 0xfa, 0x5, + 0x1, 0xff, 0xd0, 0x80, 0x7f, 0xf4, 0x50, 0x1f, + 0xfd, 0x8, 0x7, 0xff, 0x2d, 0x81, 0xcc, 0xf, + 0xfe, 0x83, 0x3, 0xff, 0x99, 0x0, 0x8c, 0x3, + 0xff, 0x98, 0x7c, 0x8c, 0x7, 0xff, 0x0, + + /* U+F15B "" */ + 0x9, 0x7f, 0xc0, 0x8, 0x1e, 0xd6, 0xff, 0xc8, + 0x6a, 0x7, 0x10, 0x3f, 0xf8, 0x4a, 0x81, 0xff, + 0xc8, 0x54, 0xf, 0xfe, 0x42, 0xa0, 0x7f, 0xf2, + 0x15, 0x3, 0xff, 0x90, 0xa0, 0x1f, 0xfc, 0x24, + 0xbc, 0x40, 0xff, 0xe0, 0x61, 0x6f, 0xc0, 0x7f, + 0xf0, 0x1f, 0xff, 0x80, 0xff, 0xff, 0x81, 0xff, + 0xff, 0x3, 0xff, 0xfe, 0x7, 0xff, 0xfc, 0xf, + 0xff, 0x69, 0x3, 0xff, 0x8e, 0x75, 0xbf, 0xfc, + 0x7c, + + /* U+F1EB "" */ + 0x3, 0xff, 0xc6, 0x5c, 0xb5, 0xad, 0x46, 0x40, + 0xff, 0xe4, 0x17, 0xbe, 0x8d, 0x21, 0x48, 0xe6, + 0xf9, 0x90, 0x3f, 0xf8, 0x46, 0xe8, 0x40, 0xff, + 0xe0, 0x99, 0xa9, 0x3, 0xfc, 0x76, 0x20, 0x3f, + 0xf8, 0xeb, 0x61, 0x3, 0xe9, 0x88, 0x1f, 0x8a, + 0x5c, 0x40, 0xfc, 0x74, 0x3, 0xb3, 0x3, 0xc6, + 0x6f, 0xad, 0xed, 0xf4, 0x20, 0x79, 0xe0, 0x7, + 0x90, 0x39, 0xec, 0x64, 0xf, 0xe2, 0xf6, 0x30, + 0x38, 0xf3, 0x80, 0xe5, 0xa1, 0x3, 0xff, 0x86, + 0x66, 0x40, 0x76, 0x80, 0x69, 0x48, 0x1f, 0xfc, + 0x73, 0x60, 0x1a, 0x38, 0x3, 0x30, 0x3c, 0xa5, + 0xff, 0x6b, 0x10, 0x1e, 0x78, 0x88, 0xc3, 0xbc, + 0x81, 0xd3, 0xd6, 0x80, 0xc5, 0x3b, 0xe0, 0x1c, + 0x75, 0x60, 0x48, 0xe, 0x7d, 0x81, 0xff, 0xc1, + 0x7d, 0x81, 0xc8, 0xf, 0xeb, 0x0, 0xff, 0xe2, + 0xca, 0x7, 0xff, 0x6, 0xa0, 0x3c, 0x5c, 0x93, + 0x20, 0x79, 0x60, 0x3f, 0xf8, 0x4, 0xe, 0x9f, + 0x46, 0xe9, 0xbc, 0x3, 0x90, 0x1f, 0xfc, 0x8, + 0xc0, 0x3e, 0xc0, 0xfe, 0x7d, 0x80, 0x70, 0xf, + 0xfe, 0xc, 0x8b, 0x0, 0xff, 0xe0, 0xcb, 0x20, + 0xf, 0xfe, 0x1b, 0x40, 0x7f, 0xf0, 0xd3, 0x3, + 0xff, 0x96, 0xff, 0x98, 0x1f, 0xfd, 0x17, 0x0, + 0xa3, 0x3, 0xff, 0xa1, 0x0, 0xe8, 0x7, 0xff, + 0xcc, 0x81, 0xc4, 0xf, 0xfe, 0x84, 0x3, 0xa0, + 0x1f, 0xfd, 0x5, 0x91, 0x59, 0x1, 0xff, 0xc2, + + /* U+F240 "" */ + 0x5, 0xbf, 0xfe, 0x8a, 0x2, 0x5a, 0x4f, 0xfe, + 0x8d, 0x80, 0x20, 0x1f, 0xfd, 0x36, 0x0, 0x81, + 0xff, 0xd4, 0x20, 0x67, 0xff, 0xff, 0x36, 0x81, + 0x68, 0x7, 0xff, 0x59, 0x81, 0xdb, 0xff, 0xfe, + 0x50, 0x1f, 0xfd, 0x86, 0xc4, 0xf, 0xfe, 0xa1, + 0x88, 0xf, 0xff, 0xf8, 0x1f, 0xfc, 0xf3, 0xd8, + 0x1f, 0xfd, 0x46, 0x7, 0xfb, 0x7f, 0xff, 0xca, + 0x3, 0xfc, 0x5b, 0xff, 0xe6, 0xe0, 0x25, 0x80, + 0x94, 0x9f, 0xfc, 0xd6, 0x5, 0xa, 0x3, 0xff, + 0xa8, 0x45, 0x40, 0x7f, 0xf4, 0x4e, 0x2, 0xbf, + 0xff, 0xf4, 0x71, 0x0, + + /* U+F241 "" */ + 0x5, 0xbf, 0xfe, 0x8a, 0x2, 0x5a, 0x4f, 0xfe, + 0x8d, 0x80, 0x20, 0x1f, 0xfd, 0x36, 0x0, 0x81, + 0xff, 0xd4, 0x20, 0x67, 0xff, 0xff, 0x36, 0x81, + 0x68, 0x7, 0xff, 0x59, 0x81, 0xdf, 0xff, 0xf1, + 0x60, 0x1f, 0xfd, 0xd6, 0xc4, 0xf, 0xfe, 0xa1, + 0x88, 0xf, 0xff, 0xf8, 0x1f, 0xfc, 0xf3, 0xd8, + 0x1f, 0xfd, 0x46, 0x7, 0xfb, 0xff, 0xfe, 0x2c, + 0x3, 0xff, 0x86, 0x5b, 0xff, 0xe6, 0xe0, 0x25, + 0x80, 0x94, 0x9f, 0xfc, 0xd6, 0x5, 0xa, 0x3, + 0xff, 0xa8, 0x45, 0x40, 0x7f, 0xf4, 0x4e, 0x2, + 0xbf, 0xff, 0xf4, 0x71, 0x0, + + /* U+F242 "" */ + 0x5, 0xbf, 0xfe, 0x8a, 0x2, 0x5a, 0x4f, 0xfe, + 0x8d, 0x80, 0x20, 0x1f, 0xfd, 0x36, 0x0, 0x81, + 0xff, 0xd4, 0x20, 0x67, 0xff, 0xff, 0x36, 0x81, + 0x68, 0x7, 0xff, 0x59, 0x81, 0xdf, 0xff, 0xf0, + 0x10, 0x1f, 0xfe, 0x26, 0xc4, 0xf, 0xfe, 0xa1, + 0x88, 0xf, 0xff, 0xf8, 0x1f, 0xfc, 0xf3, 0xd8, + 0x1f, 0xfd, 0x46, 0x7, 0xfb, 0xff, 0xfe, 0x2, + 0x3, 0xff, 0x90, 0x5b, 0xff, 0xe6, 0xe0, 0x25, + 0x80, 0x94, 0x9f, 0xfc, 0xd6, 0x5, 0xa, 0x3, + 0xff, 0xa8, 0x45, 0x40, 0x7f, 0xf4, 0x4e, 0x2, + 0xbf, 0xff, 0xf4, 0x71, 0x0, + + /* U+F243 "" */ + 0x5, 0xbf, 0xfe, 0x8a, 0x2, 0x5a, 0x4f, 0xfe, + 0x8d, 0x80, 0x20, 0x1f, 0xfd, 0x36, 0x0, 0x81, + 0xff, 0xd4, 0x20, 0x67, 0xff, 0xff, 0x36, 0x81, + 0x68, 0x7, 0xff, 0x59, 0x81, 0xdf, 0xfc, 0x7, + 0xff, 0xa1, 0xb1, 0x3, 0xff, 0xa8, 0x62, 0x3, + 0xff, 0xfe, 0x7, 0xff, 0x3c, 0xf6, 0x7, 0xff, + 0x51, 0x81, 0xfe, 0xff, 0xe0, 0x3f, 0xf9, 0xc5, + 0xbf, 0xfe, 0x6e, 0x2, 0x58, 0x9, 0x49, 0xff, + 0xcd, 0x60, 0x50, 0xa0, 0x3f, 0xfa, 0x84, 0x54, + 0x7, 0xff, 0x44, 0xe0, 0x2b, 0xff, 0xff, 0x47, + 0x10, 0x0, + + /* U+F244 "" */ + 0x5, 0xbf, 0xfe, 0x8a, 0x2, 0x5a, 0x4f, 0xfe, + 0x8d, 0x80, 0x20, 0x1f, 0xfd, 0x36, 0x0, 0x81, + 0xff, 0xd4, 0x20, 0x67, 0xff, 0xff, 0x36, 0x81, + 0x68, 0x7, 0xff, 0x59, 0x81, 0xff, 0xf4, 0x6c, + 0x40, 0xff, 0xea, 0x18, 0x80, 0xff, 0xff, 0x81, + 0xff, 0xcf, 0x3d, 0x81, 0xff, 0xd4, 0x60, 0x7f, + 0xf7, 0xcb, 0x7f, 0xfc, 0xdc, 0x4, 0xb0, 0x12, + 0x93, 0xff, 0x9a, 0xc0, 0xa1, 0x40, 0x7f, 0xf5, + 0x8, 0xa8, 0xf, 0xfe, 0x89, 0xc0, 0x57, 0xff, + 0xfe, 0x8e, 0x20, 0x0, + + /* U+F287 "" */ + 0x3, 0xff, 0xd4, 0xbf, 0x90, 0x1f, 0xfd, 0x12, + 0x54, 0xa, 0x81, 0xff, 0xcf, 0xbf, 0x60, 0x1c, + 0x80, 0xff, 0xe6, 0xd4, 0x9, 0x1, 0xff, 0xd2, + 0x48, 0x3e, 0xc2, 0x4, 0x50, 0x1f, 0xfc, 0xc8, + 0x28, 0x16, 0x8a, 0x60, 0x3f, 0xf8, 0x84, 0xf, + 0x91, 0x24, 0x6, 0x75, 0x81, 0xff, 0xc3, 0x5f, + 0x7c, 0x40, 0xd0, 0x40, 0x3f, 0xf8, 0x6d, 0x1, + 0xca, 0x81, 0x1c, 0x4, 0x88, 0x40, 0x7f, 0xf0, + 0xed, 0x88, 0x14, 0x3, 0xd4, 0xaa, 0x1a, 0x5f, + 0xfc, 0x40, 0xb, 0x30, 0x4, 0xf, 0x2d, 0x40, + 0x3b, 0x7f, 0xf8, 0x84, 0xa, 0x60, 0x3f, 0x92, + 0xe2, 0x0, 0xa5, 0xff, 0xc0, 0x3, 0xa0, 0x60, + 0x7a, 0xdf, 0x66, 0x1d, 0xbf, 0xfc, 0x2, 0x1, + 0xf4, 0x22, 0x3, 0x34, 0x7, 0xa0, 0x44, 0xf, + 0xfe, 0x2, 0xd0, 0xd, 0x69, 0xcd, 0x0, 0xfd, + 0x4, 0x3, 0xfe, 0xd4, 0x81, 0xe5, 0x19, 0x3, + 0xf9, 0x84, 0x40, 0x3d, 0xb8, 0x81, 0xff, 0xcc, + 0x63, 0x80, 0xe4, 0xf3, 0x3, 0xff, 0x99, 0x9, + 0x7c, 0xc0, 0xff, 0xe9, 0xe4, 0x8, 0x1f, 0xfd, + 0x5b, 0xf9, 0x81, 0xff, 0xfb, 0x9f, 0xf2, 0x3, + 0xf0, + + /* U+F293 "" */ + 0x3, 0xfc, 0x51, 0x20, 0x3f, 0xf8, 0x46, 0xfe, + 0xd7, 0x67, 0xa8, 0xf, 0xf5, 0xc8, 0xf, 0x95, + 0xc0, 0x7e, 0xc8, 0xc, 0x60, 0x1c, 0x70, 0x1e, + 0xa4, 0xf, 0x36, 0x3, 0x8e, 0x3, 0x24, 0x3, + 0xf4, 0x60, 0x71, 0x40, 0x50, 0xf, 0xf4, 0x40, + 0x77, 0x0, 0x48, 0xf, 0xfa, 0xa0, 0x32, 0x0, + 0x80, 0xc8, 0xe, 0x30, 0x52, 0x6, 0x43, 0x1, + 0x3b, 0x80, 0xe7, 0x6, 0x20, 0x58, 0x30, 0x24, + 0xe, 0x3, 0x88, 0x1e, 0x20, 0x81, 0x1c, 0xe, + 0x60, 0x15, 0x14, 0x81, 0x30, 0x3c, 0x70, 0x34, + 0x1a, 0x22, 0x3, 0xff, 0x80, 0x70, 0x1c, 0xd8, + 0xe, 0x20, 0x7e, 0x38, 0x9, 0x40, 0x3f, 0xf8, + 0x8c, 0x9, 0x81, 0xff, 0xc4, 0x54, 0x8, 0xe0, + 0x3c, 0x40, 0xf9, 0x50, 0x40, 0x8d, 0x3, 0xff, + 0x80, 0xa8, 0x5c, 0x1c, 0x15, 0x3, 0xc4, 0x9, + 0x50, 0xa8, 0x11, 0xc1, 0x40, 0x26, 0x10, 0x1c, + 0xa8, 0x1d, 0x40, 0x50, 0x2c, 0x30, 0x12, 0xd4, + 0xe, 0x8c, 0x62, 0x4, 0x42, 0x3, 0x10, 0x38, + 0xb1, 0x88, 0x19, 0x0, 0x40, 0x7f, 0xd8, 0x81, + 0x90, 0x14, 0x3, 0xfd, 0x88, 0x1d, 0x0, 0x8c, + 0x3, 0xf6, 0x20, 0x73, 0x20, 0x67, 0x0, 0xe3, + 0x88, 0x1c, 0xa0, 0x1e, 0x79, 0x1, 0x88, 0x1d, + 0x28, 0x1f, 0x8d, 0xf5, 0xa5, 0x9d, 0xec, 0xc, + + /* U+F2ED "" */ + 0x3, 0xf9, 0x2f, 0x10, 0x3f, 0xf8, 0xbe, 0xdf, + 0x68, 0x7, 0xe5, 0x27, 0xb0, 0x1f, 0x9c, 0x9f, + 0xa, 0xdf, 0x88, 0x1f, 0xcd, 0xfe, 0x3, 0xff, + 0x99, 0xd0, 0x1f, 0xfc, 0xbd, 0x7f, 0xff, 0xe5, + 0xa0, 0x64, 0xff, 0xe4, 0x30, 0x26, 0xff, 0xf9, + 0x34, 0xf, 0xff, 0x75, 0xa0, 0x27, 0x80, 0x8f, + 0x20, 0x7f, 0xf0, 0x1b, 0x1, 0x72, 0x4, 0xc3, + 0x3, 0xff, 0xfe, 0x7, 0xff, 0xfc, 0xf, 0xff, + 0xf8, 0x1f, 0xff, 0x26, 0xc0, 0x5c, 0x81, 0x30, + 0xc0, 0xf9, 0x81, 0xad, 0x1, 0x3c, 0x4, 0x79, + 0x2, 0x60, 0x7f, 0xf4, 0xb, 0x3, 0xff, 0x8f, + 0x0, 0xd2, 0xc6, 0xff, 0xf8, 0x73, 0x90, 0x0, + + /* U+F304 "" */ + 0x3, 0xff, 0x94, 0xd8, 0xf, 0xfe, 0x69, 0xd2, + 0x39, 0x3, 0xff, 0x94, 0x71, 0x2, 0xc4, 0xf, + 0xfe, 0x41, 0xc0, 0x7b, 0x10, 0x3f, 0xf8, 0xf4, + 0xf, 0xd8, 0x81, 0xff, 0xc6, 0x88, 0xf, 0xdc, + 0xf, 0xfe, 0x19, 0xf8, 0x54, 0x7, 0xc4, 0xf, + 0xfe, 0x11, 0xc0, 0xe1, 0x50, 0x1e, 0x40, 0x7f, + 0xf0, 0x4e, 0x2, 0x38, 0x54, 0x7, 0x50, 0x3f, + 0xf8, 0x7, 0x1, 0xc7, 0xa, 0x80, 0xb0, 0x1f, + 0xfc, 0x3, 0x80, 0xf8, 0xe1, 0x50, 0xc4, 0xf, + 0xf8, 0xe0, 0x3f, 0x8e, 0x17, 0x90, 0x3f, 0xe3, + 0x80, 0xff, 0x8d, 0x3, 0xff, 0x82, 0x70, 0x1f, + 0xfc, 0x18, 0x7, 0xff, 0x0, 0xe0, 0x3f, 0xf8, + 0x38, 0x81, 0xff, 0x1c, 0x7, 0xff, 0x7, 0x10, + 0x3f, 0xe3, 0x80, 0xff, 0xe0, 0xe2, 0x7, 0xfc, + 0x70, 0x1f, 0xfc, 0x1c, 0x40, 0xff, 0x8e, 0x3, + 0xff, 0x83, 0x88, 0x1f, 0xf1, 0xc0, 0x7f, 0xf0, + 0x71, 0x3, 0xff, 0x81, 0x80, 0xff, 0xe0, 0xe2, + 0x7, 0xff, 0x1, 0x1, 0xff, 0xc1, 0xc4, 0xf, + 0xfe, 0x9, 0x3, 0xff, 0x81, 0x88, 0x1f, 0xfc, + 0x2e, 0x7, 0xfd, 0x88, 0x1f, 0xfc, 0x32, 0x7, + 0xfb, 0x10, 0x3f, 0xf8, 0x8c, 0xf, 0xec, 0x40, + 0xff, 0xe2, 0x90, 0x3f, 0x62, 0x7, 0xff, 0x34, + 0xe2, 0x7, 0xff, 0x1f, 0x48, 0xbb, 0xf6, 0x20, + 0x7f, 0xf1, 0xc0, + + /* U+F55A "" */ + 0x3, 0xfa, 0x7f, 0xff, 0xca, 0xc8, 0xf, 0xea, + 0xc0, 0xff, 0xe5, 0x1a, 0x80, 0xfa, 0xa0, 0x3f, + 0xf9, 0xb0, 0xf, 0x54, 0x7, 0xff, 0x38, 0x81, + 0xd5, 0x1, 0xfc, 0xd8, 0xf, 0x36, 0x3, 0xff, + 0x83, 0x50, 0x1f, 0xce, 0x43, 0x3, 0x39, 0x20, + 0x3f, 0xea, 0x80, 0xff, 0x40, 0x11, 0x80, 0x70, + 0x3, 0x3, 0xfd, 0x50, 0x1f, 0xf4, 0x2, 0x8d, + 0xa0, 0x14, 0x3, 0xfa, 0xa0, 0x3f, 0xf8, 0xe, + 0x1, 0x48, 0x2, 0x8c, 0xf, 0xd5, 0x1, 0xff, + 0xc2, 0x70, 0xf, 0x46, 0x7, 0xf2, 0x3, 0xff, + 0x88, 0xd0, 0x19, 0x30, 0x3f, 0xc8, 0xf, 0xfe, + 0x23, 0x40, 0x64, 0xc0, 0xff, 0x54, 0x7, 0xff, + 0x9, 0xc0, 0x3d, 0x18, 0x1f, 0xea, 0x80, 0xff, + 0xe0, 0x38, 0x5, 0x20, 0xa, 0x30, 0x3f, 0xd5, + 0x1, 0xff, 0x40, 0x28, 0xda, 0x1, 0x40, 0x3f, + 0xea, 0x80, 0xff, 0x40, 0x11, 0x80, 0x70, 0x4, + 0x3, 0xff, 0x81, 0x50, 0x1f, 0xce, 0x43, 0x3, + 0x39, 0xc, 0xf, 0xfe, 0xd, 0x40, 0x7f, 0x36, + 0x3, 0xcd, 0x80, 0xff, 0xe1, 0xd4, 0x7, 0xff, + 0x38, 0x81, 0xf5, 0x40, 0x7f, 0xf3, 0x60, 0x1f, + 0xab, 0x3, 0xff, 0x94, 0x6a, + + /* U+F7C2 "" */ + 0x3, 0xe7, 0x27, 0xf3, 0x40, 0x7e, 0xd1, 0xbf, + 0xe9, 0x70, 0x1c, 0x71, 0x3, 0xff, 0x80, 0x68, + 0x11, 0xc4, 0xf, 0xfe, 0x12, 0x0, 0x70, 0xd, + 0xf8, 0x2f, 0xc0, 0xfe, 0x60, 0x63, 0x80, 0xff, + 0xe3, 0x1c, 0x7, 0xff, 0x1f, 0x1, 0xff, 0xe3, + 0xdf, 0x82, 0xfc, 0xf, 0xe6, 0x7, 0xff, 0xfc, + 0xf, 0xff, 0xf8, 0x1f, 0xff, 0xf0, 0x3f, 0xff, + 0xe0, 0x7f, 0xf6, 0xd8, 0x1f, 0xfc, 0x77, 0x10, + 0x1f, 0xfc, 0x57, 0x5, 0xd6, 0xff, 0xf0, 0xf4, + 0x0, + + /* U+F8A2 "" */ + 0x3, 0xff, 0x9e, 0x80, 0xff, 0xe7, 0xca, 0x7, + 0xff, 0x3a, 0x30, 0x3f, 0xf9, 0xd1, 0x81, 0xfc, + 0xb2, 0x3, 0xff, 0x84, 0x58, 0x1f, 0xce, 0x98, + 0x7, 0xff, 0x9, 0x81, 0xfd, 0x20, 0xf, 0xfe, + 0x74, 0x60, 0x7f, 0xf3, 0xab, 0x3, 0xff, 0x9d, + 0x50, 0x1c, 0x7f, 0xff, 0xe1, 0x50, 0x3a, 0xa0, + 0x3f, 0xf9, 0xec, 0xf, 0xfe, 0x87, 0x3, 0xff, + 0xa0, 0x79, 0x3, 0xd6, 0xff, 0xf1, 0xb8, 0x16, + 0x20, 0x62, 0x97, 0xff, 0x18, 0xe, 0xc4, 0xf, + 0xfe, 0x86, 0x40, 0x7f, 0xf4, 0x2a, 0x8, 0xf, + 0xfe, 0x75, 0xf0, 0xf, 0xfe, 0x40 +}; + + +/*--------------------- + * 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 = 111, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 115, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 18, .adv_w = 143, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 14}, + {.bitmap_index = 32, .adv_w = 279, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 128, .adv_w = 252, .box_w = 14, .box_h = 26, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 236, .adv_w = 328, .box_w = 19, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 352, .adv_w = 278, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 463, .adv_w = 78, .box_w = 3, .box_h = 7, .ofs_x = 1, .ofs_y = 14}, + {.bitmap_index = 469, .adv_w = 153, .box_w = 9, .box_h = 30, .ofs_x = 1, .ofs_y = -7}, + {.bitmap_index = 543, .adv_w = 156, .box_w = 8, .box_h = 30, .ofs_x = 0, .ofs_y = -7}, + {.bitmap_index = 612, .adv_w = 193, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 655, .adv_w = 254, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 684, .adv_w = 88, .box_w = 5, .box_h = 7, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 696, .adv_w = 124, .box_w = 8, .box_h = 3, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 702, .adv_w = 118, .box_w = 5, .box_h = 3, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 708, .adv_w = 185, .box_w = 11, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 772, .adv_w = 252, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 852, .adv_w = 252, .box_w = 8, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 874, .adv_w = 252, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 953, .adv_w = 252, .box_w = 13, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1036, .adv_w = 252, .box_w = 16, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1103, .adv_w = 252, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1182, .adv_w = 251, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1271, .adv_w = 252, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1339, .adv_w = 252, .box_w = 14, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1438, .adv_w = 252, .box_w = 13, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1522, .adv_w = 109, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1535, .adv_w = 95, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 1558, .adv_w = 228, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1608, .adv_w = 246, .box_w = 12, .box_h = 8, .ofs_x = 2, .ofs_y = 5}, + {.bitmap_index = 1629, .adv_w = 234, .box_w = 13, .box_h = 13, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1682, .adv_w = 212, .box_w = 12, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1749, .adv_w = 402, .box_w = 23, .box_h = 26, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 1936, .adv_w = 292, .box_w = 18, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2041, .adv_w = 279, .box_w = 14, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2116, .adv_w = 292, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2204, .adv_w = 294, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2272, .adv_w = 255, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2306, .adv_w = 248, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2335, .adv_w = 305, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2433, .adv_w = 319, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2459, .adv_w = 122, .box_w = 4, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2464, .adv_w = 247, .box_w = 14, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2507, .adv_w = 281, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2593, .adv_w = 241, .box_w = 13, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2611, .adv_w = 391, .box_w = 21, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2724, .adv_w = 319, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2806, .adv_w = 308, .box_w = 17, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2905, .adv_w = 283, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2962, .adv_w = 308, .box_w = 17, .box_h = 24, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 3087, .adv_w = 276, .box_w = 15, .box_h = 20, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 3164, .adv_w = 266, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3261, .adv_w = 267, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3288, .adv_w = 291, .box_w = 16, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3334, .adv_w = 285, .box_w = 18, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3441, .adv_w = 397, .box_w = 25, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3602, .adv_w = 281, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3707, .adv_w = 269, .box_w = 17, .box_h = 20, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3782, .adv_w = 268, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3857, .adv_w = 119, .box_w = 6, .box_h = 27, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 3871, .adv_w = 184, .box_w = 12, .box_h = 22, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3938, .adv_w = 119, .box_w = 6, .box_h = 27, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 3954, .adv_w = 187, .box_w = 11, .box_h = 10, .ofs_x = 0, .ofs_y = 10}, + {.bitmap_index = 3991, .adv_w = 202, .box_w = 13, .box_h = 3, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4000, .adv_w = 138, .box_w = 7, .box_h = 4, .ofs_x = 0, .ofs_y = 17}, + {.bitmap_index = 4010, .adv_w = 244, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4077, .adv_w = 251, .box_w = 14, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4146, .adv_w = 235, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4207, .adv_w = 253, .box_w = 13, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4273, .adv_w = 237, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4336, .adv_w = 156, .box_w = 10, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4370, .adv_w = 251, .box_w = 13, .box_h = 21, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 4460, .adv_w = 247, .box_w = 13, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4496, .adv_w = 109, .box_w = 4, .box_h = 20, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4508, .adv_w = 107, .box_w = 6, .box_h = 26, .ofs_x = -1, .ofs_y = -6}, + {.bitmap_index = 4534, .adv_w = 227, .box_w = 14, .box_h = 21, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4596, .adv_w = 109, .box_w = 3, .box_h = 21, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 4600, .adv_w = 393, .box_w = 22, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4655, .adv_w = 247, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4688, .adv_w = 256, .box_w = 14, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4757, .adv_w = 251, .box_w = 14, .box_h = 21, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 4827, .adv_w = 255, .box_w = 13, .box_h = 21, .ofs_x = 1, .ofs_y = -6}, + {.bitmap_index = 4894, .adv_w = 152, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4915, .adv_w = 231, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4985, .adv_w = 146, .box_w = 9, .box_h = 19, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5017, .adv_w = 247, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5047, .adv_w = 217, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5114, .adv_w = 337, .box_w = 21, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5222, .adv_w = 222, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5292, .adv_w = 212, .box_w = 13, .box_h = 21, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 5377, .adv_w = 222, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 5426, .adv_w = 152, .box_w = 10, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 5493, .adv_w = 109, .box_w = 3, .box_h = 24, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 5499, .adv_w = 152, .box_w = 9, .box_h = 28, .ofs_x = 0, .ofs_y = -6}, + {.bitmap_index = 5567, .adv_w = 305, .box_w = 17, .box_h = 6, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 5602, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 5739, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5876, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5972, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6105, .adv_w = 308, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6221, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 6419, .adv_w = 448, .box_w = 27, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 6592, .adv_w = 504, .box_w = 32, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6758, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 6887, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7012, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 7206, .adv_w = 224, .box_w = 14, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7258, .adv_w = 336, .box_w = 21, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7354, .adv_w = 504, .box_w = 32, .box_h = 27, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 7568, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7674, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 7767, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 7888, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7952, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7995, .adv_w = 392, .box_w = 18, .box_h = 26, .ofs_x = 3, .ofs_y = -3}, + {.bitmap_index = 8088, .adv_w = 392, .box_w = 26, .box_h = 25, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8200, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 8305, .adv_w = 280, .box_w = 16, .box_h = 25, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 8409, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8483, .adv_w = 392, .box_w = 25, .box_h = 7, .ofs_x = 0, .ofs_y = 7}, + {.bitmap_index = 8512, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8700, .adv_w = 560, .box_w = 35, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 8960, .adv_w = 504, .box_w = 33, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 9148, .adv_w = 448, .box_w = 28, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9326, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 9423, .adv_w = 392, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 9523, .adv_w = 560, .box_w = 35, .box_h = 22, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9672, .adv_w = 448, .box_w = 28, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9726, .adv_w = 448, .box_w = 28, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 9856, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 10028, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10207, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 10294, .adv_w = 392, .box_w = 25, .box_h = 25, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10399, .adv_w = 280, .box_w = 19, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 10530, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 10632, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 10765, .adv_w = 504, .box_w = 32, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10897, .adv_w = 448, .box_w = 30, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 11048, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 11113, .adv_w = 560, .box_w = 35, .box_h = 26, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 11313, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 11397, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 11482, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 11567, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 11649, .adv_w = 560, .box_w = 35, .box_h = 19, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 11725, .adv_w = 560, .box_w = 36, .box_h = 23, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 11886, .adv_w = 392, .box_w = 22, .box_h = 29, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 12070, .adv_w = 392, .box_w = 25, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12166, .adv_w = 448, .box_w = 29, .box_h = 29, .ofs_x = -1, .ofs_y = -4}, + {.bitmap_index = 12353, .adv_w = 560, .box_w = 35, .box_h = 21, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 12518, .adv_w = 336, .box_w = 21, .box_h = 29, .ofs_x = 0, .ofs_y = -4}, + {.bitmap_index = 12591, .adv_w = 451, .box_w = 29, .box_h = 19, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x14, + 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, 0x47, + 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, 0x53, 0x66, + 0x67, 0x6d, 0x6f, 0x70, 0x73, 0x76, 0x77, 0x78, + 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xe6, 0xe9, + 0xf2, 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, 0x240, 0x241, + 0x242, 0x243, 0x286, 0x292, 0x2ec, 0x303, 0x559, 0x7c1, + 0x8a1 +}; + +/*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 = 61441, .range_length = 2210, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 57, .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, 1, 0, 2, 0, 0, 0, 0, + 2, 3, 0, 0, 0, 4, 0, 4, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 7, 8, 9, 10, 11, + 0, 12, 12, 13, 14, 15, 12, 12, + 9, 16, 17, 18, 0, 19, 13, 20, + 21, 22, 23, 24, 25, 0, 0, 0, + 0, 0, 26, 27, 28, 0, 29, 30, + 0, 31, 0, 0, 32, 0, 31, 31, + 33, 27, 0, 34, 0, 35, 0, 36, + 37, 38, 36, 39, 40, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 1, 0, 2, 0, 0, 0, 3, + 2, 0, 4, 5, 0, 6, 7, 6, + 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 9, 0, 10, 0, 11, 0, 0, 0, + 11, 0, 0, 12, 0, 0, 0, 0, + 11, 0, 11, 0, 13, 14, 15, 16, + 17, 18, 19, 20, 0, 0, 21, 0, + 0, 0, 22, 0, 23, 23, 23, 24, + 23, 0, 0, 0, 0, 0, 25, 25, + 26, 25, 23, 27, 28, 29, 30, 31, + 32, 33, 31, 34, 0, 0, 35, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -23, 0, 0, 0, + 0, 0, 0, 0, -26, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -11, -13, 0, -4, -13, 0, -17, 0, + 0, 0, 2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 4, 0, + 5, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -37, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -49, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -26, 0, 0, 0, 0, 0, 0, -13, + 0, -2, 0, 0, -28, -4, -19, -15, + 0, -21, 0, 0, 0, 0, 0, 0, + -3, 0, 0, -4, -2, -11, -7, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -6, + 0, -5, 0, 0, -12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -6, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -6, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, -22, 0, 0, + 0, -5, 0, 0, 0, -6, 0, -5, + 0, -5, -9, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 0, -4, -4, 0, -4, 0, 0, 0, + -4, -6, -5, 0, 0, 0, 0, 0, + 0, 0, 0, -51, 0, 0, 0, -37, + 0, -58, 0, 4, 0, 0, 0, 0, + 0, 0, 0, -7, -5, 0, 0, -5, + -6, 0, 0, -5, -5, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 0, 0, -6, 0, + 0, 0, 4, -6, 0, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -14, 0, 0, + 0, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -6, 0, -5, + -6, 0, 0, 0, -5, -9, -14, 0, + 0, 0, 0, -73, 0, 0, 0, 0, + 0, 0, 0, 4, -14, 0, 0, -60, + -12, -38, -31, 0, -52, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -10, + -29, -20, 0, 0, 0, 0, 0, 0, + 0, 0, -71, 0, 0, 0, -30, 0, + -44, 0, 0, 0, 0, 0, -7, 0, + -6, 0, -2, -3, 0, 0, -3, 0, + 0, 3, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -9, 0, -6, + -4, 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, 0, 0, 0, + -17, 0, -4, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -9, 0, + 0, 0, 0, -48, -51, 0, 0, -17, + -6, -52, -3, 4, 0, 4, 3, 0, + 4, 0, 0, -25, -22, 0, -24, -22, + -16, -25, 0, -21, -16, -12, -17, -13, + 0, 0, 0, 0, 4, 0, -49, -8, + 0, 0, -16, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 4, -10, -10, + 0, 0, -10, -7, 0, 0, -6, -2, + 0, 0, 0, 4, 0, 0, 0, 3, + 0, -27, -13, 0, 0, -9, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 3, -7, -7, 0, 0, -7, -5, 0, + 0, -4, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, -10, 0, 0, + 0, -5, 0, 0, 0, 0, 3, 0, + 0, 0, 0, 0, 0, -6, 0, 0, + -5, 0, 0, 0, -5, -7, 0, 0, + 0, 0, 0, 0, -7, 4, -11, -46, + -11, 0, 0, -21, -6, -21, -3, 4, + -21, 4, 4, 3, 4, 0, 4, -16, + -14, -5, -9, -14, -9, -13, -5, -9, + -4, 0, -5, -7, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 3, -6, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, 0, 0, -5, 0, + 0, 0, -4, -6, -6, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, 0, 0, -4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, -6, + 0, 0, 0, 0, 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, -3, -3, + 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, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 0, + 4, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, -23, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -30, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, 0, + -5, -3, 0, 0, 4, 0, 0, 0, + -27, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -9, -4, 3, 0, -4, 0, 0, 11, + 0, 4, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 0, 0, 0, -23, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -3, -3, + 3, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -27, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -4, 0, 0, + -4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, -4, 0, 0, 0, 0, + 0, 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 = 40, + .right_class_cnt = 35, +}; + +/*-------------------- + * 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 = 3, + .kern_classes = 1, + .bitmap_format = 1 +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +lv_font_t lv_font_roboto_28_compressed = { + .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 = 32, /*The maximum line height required by the font*/ + .base_line = 7, /*Baseline measured from the bottom of the line*/ + .subpx = LV_FONT_SUBPX_NONE, + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + +#endif /*#if LV_FONT_ROBOTO_28_COMPRESSED*/ + diff --git a/src/lv_font/lv_font_unscii_8.c b/src/lv_font/lv_font_unscii_8.c index e86727cf9..1b96823e8 100644 --- a/src/lv_font/lv_font_unscii_8.c +++ b/src/lv_font/lv_font_unscii_8.c @@ -311,7 +311,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { * GLYPH DESCRIPTION *--------------------*/ -static lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 0, .adv_w = 0, .box_h = 0, .box_w = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, {.bitmap_index = 0, .adv_w = 128, .box_h = 0, .box_w = 0, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 0, .adv_w = 128, .box_h = 7, .box_w = 1, .ofs_x = 3, .ofs_y = -1}, @@ -460,4 +460,3 @@ lv_font_t lv_font_unscii_8 = { }; #endif /*#if LV_FONT_UNSCII_8*/ - diff --git a/src/lv_font/lv_symbol_def.h b/src/lv_font/lv_symbol_def.h index 338705e58..6fe823b72 100644 --- a/src/lv_font/lv_symbol_def.h +++ b/src/lv_font/lv_symbol_def.h @@ -11,57 +11,72 @@ extern "C" { #include "../../../lv_conf.h" #endif +/* In the font converter use this list as range: + 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 +*/ -#define LV_SYMBOL_AUDIO "\xef\x80\x81" -#define LV_SYMBOL_VIDEO "\xef\x80\x88" -#define LV_SYMBOL_LIST "\xef\x80\x8b" -#define LV_SYMBOL_OK "\xef\x80\x8c" -#define LV_SYMBOL_CLOSE "\xef\x80\x8d" -#define LV_SYMBOL_POWER "\xef\x80\x91" -#define LV_SYMBOL_SETTINGS "\xef\x80\x93" -#define LV_SYMBOL_TRASH "\xef\x80\x94" -#define LV_SYMBOL_HOME "\xef\x80\x95" -#define LV_SYMBOL_DOWNLOAD "\xef\x80\x99" -#define LV_SYMBOL_DRIVE "\xef\x80\x9c" -#define LV_SYMBOL_REFRESH "\xef\x80\xa1" -#define LV_SYMBOL_MUTE "\xef\x80\xa6" -#define LV_SYMBOL_VOLUME_MID "\xef\x80\xa7" -#define LV_SYMBOL_VOLUME_MAX "\xef\x80\xa8" -#define LV_SYMBOL_IMAGE "\xef\x80\xbe" -#define LV_SYMBOL_EDIT "\xef\x81\x80" -#define LV_SYMBOL_PREV "\xef\x81\x88" -#define LV_SYMBOL_PLAY "\xef\x81\x8b" -#define LV_SYMBOL_PAUSE "\xef\x81\x8c" -#define LV_SYMBOL_STOP "\xef\x81\x8d" -#define LV_SYMBOL_NEXT "\xef\x81\x91" -#define LV_SYMBOL_EJECT "\xef\x81\x92" -#define LV_SYMBOL_LEFT "\xef\x81\x93" -#define LV_SYMBOL_RIGHT "\xef\x81\x94" -#define LV_SYMBOL_PLUS "\xef\x81\xa7" -#define LV_SYMBOL_MINUS "\xef\x81\xa8" -#define LV_SYMBOL_WARNING "\xef\x81\xb1" -#define LV_SYMBOL_SHUFFLE "\xef\x81\xb4" -#define LV_SYMBOL_UP "\xef\x81\xb7" -#define LV_SYMBOL_DOWN "\xef\x81\xb8" -#define LV_SYMBOL_LOOP "\xef\x81\xb9" -#define LV_SYMBOL_DIRECTORY "\xef\x81\xbb" -#define LV_SYMBOL_UPLOAD "\xef\x82\x93" -#define LV_SYMBOL_CALL "\xef\x82\x95" -#define LV_SYMBOL_CUT "\xef\x83\x84" -#define LV_SYMBOL_COPY "\xef\x83\x85" -#define LV_SYMBOL_SAVE "\xef\x83\x87" -#define LV_SYMBOL_CHARGE "\xef\x83\xa7" -#define LV_SYMBOL_BELL "\xef\x83\xb3" -#define LV_SYMBOL_KEYBOARD "\xef\x84\x9c" -#define LV_SYMBOL_GPS "\xef\x84\xa4" -#define LV_SYMBOL_FILE "\xef\x85\x9b" -#define LV_SYMBOL_WIFI "\xef\x87\xab" -#define LV_SYMBOL_BATTERY_FULL "\xef\x89\x80" -#define LV_SYMBOL_BATTERY_3 "\xef\x89\x81" -#define LV_SYMBOL_BATTERY_2 "\xef\x89\x82" -#define LV_SYMBOL_BATTERY_1 "\xef\x89\x83" -#define LV_SYMBOL_BATTERY_EMPTY "\xef\x89\x84" -#define LV_SYMBOL_BLUETOOTH "\xef\x8a\x93" +#define LV_SYMBOL_AUDIO "\xef\x80\x81" /*61441, 0xF001*/ +#define LV_SYMBOL_VIDEO "\xef\x80\x88" /*61448, 0xF008*/ +#define LV_SYMBOL_LIST "\xef\x80\x8b" /*61451, 0xF00B*/ +#define LV_SYMBOL_OK "\xef\x80\x8c" /*61452, 0xF00C*/ +#define LV_SYMBOL_CLOSE "\xef\x80\x8d" /*61453, 0xF00D*/ +#define LV_SYMBOL_POWER "\xef\x80\x91" /*61457, 0xF011*/ +#define LV_SYMBOL_SETTINGS "\xef\x80\x93" /*61459, 0xF013*/ +#define LV_SYMBOL_HOME "\xef\x80\x95" /*61461, 0xF015*/ +#define LV_SYMBOL_DOWNLOAD "\xef\x80\x99" /*61465, 0xF019*/ +#define LV_SYMBOL_DRIVE "\xef\x80\x9c" /*61468, 0xF01C*/ +#define LV_SYMBOL_REFRESH "\xef\x80\xa1" /*61473, 0xF021*/ +#define LV_SYMBOL_MUTE "\xef\x80\xa6" /*61478, 0xF026*/ +#define LV_SYMBOL_VOLUME_MID "\xef\x80\xa7" /*61479, 0xF027*/ +#define LV_SYMBOL_VOLUME_MAX "\xef\x80\xa8" /*61480, 0xF028*/ +#define LV_SYMBOL_IMAGE "\xef\x80\xbe" /*61502, 0xF03E*/ +#define LV_SYMBOL_EDIT "\xef\x8C\x84" /*62212, 0xF304*/ +#define LV_SYMBOL_PREV "\xef\x81\x88" /*61512, 0xF048*/ +#define LV_SYMBOL_PLAY "\xef\x81\x8b" /*61515, 0xF04B*/ +#define LV_SYMBOL_PAUSE "\xef\x81\x8c" /*61516, 0xF04C*/ +#define LV_SYMBOL_STOP "\xef\x81\x8d" /*61517, 0xF04D*/ +#define LV_SYMBOL_NEXT "\xef\x81\x91" /*61521, 0xF051*/ +#define LV_SYMBOL_EJECT "\xef\x81\x92" /*61522, 0xF052*/ +#define LV_SYMBOL_LEFT "\xef\x81\x93" /*61523, 0xF053*/ +#define LV_SYMBOL_RIGHT "\xef\x81\x94" /*61524, 0xF054*/ +#define LV_SYMBOL_PLUS "\xef\x81\xa7" /*61543, 0xF067*/ +#define LV_SYMBOL_MINUS "\xef\x81\xa8" /*61544, 0xF068*/ +#define LV_SYMBOL_EYE_OPEN "\xef\x81\xae" /*61550, 0xF06E*/ +#define LV_SYMBOL_EYE_CLOSE "\xef\x81\xb0" /*61552, 0xF070*/ +#define LV_SYMBOL_WARNING "\xef\x81\xb1" /*61553, 0xF071*/ +#define LV_SYMBOL_SHUFFLE "\xef\x81\xb4" /*61556, 0xF074*/ +#define LV_SYMBOL_UP "\xef\x81\xb7" /*61559, 0xF077*/ +#define LV_SYMBOL_DOWN "\xef\x81\xb8" /*61560, 0xF078*/ +#define LV_SYMBOL_LOOP "\xef\x81\xb9" /*61561, 0xF079*/ +#define LV_SYMBOL_DIRECTORY "\xef\x81\xbb" /*61563, 0xF07B*/ +#define LV_SYMBOL_UPLOAD "\xef\x82\x93" /*61587, 0xF093*/ +#define LV_SYMBOL_CALL "\xef\x82\x95" /*61589, 0xF095*/ +#define LV_SYMBOL_CUT "\xef\x83\x84" /*61636, 0xF0C4*/ +#define LV_SYMBOL_COPY "\xef\x83\x85" /*61637, 0xF0C5*/ +#define LV_SYMBOL_SAVE "\xef\x83\x87" /*61639, 0xF0C7*/ +#define LV_SYMBOL_CHARGE "\xef\x83\xa7" /*61671, 0xF0E7*/ +#define LV_SYMBOL_PASTE "\xef\x83\xAA" /*61674, 0xF0EA*/ +#define LV_SYMBOL_BELL "\xef\x83\xb3" /*61683, 0xF0F3*/ +#define LV_SYMBOL_KEYBOARD "\xef\x84\x9c" /*61724, 0xF11C*/ +#define LV_SYMBOL_GPS "\xef\x84\xa4" /*61732, 0xF124*/ +#define LV_SYMBOL_FILE "\xef\x85\x9b" /*61787, 0xF158*/ +#define LV_SYMBOL_WIFI "\xef\x87\xab" /*61931, 0xF1EB*/ +#define LV_SYMBOL_BATTERY_FULL "\xef\x89\x80" /*62016, 0xF240*/ +#define LV_SYMBOL_BATTERY_3 "\xef\x89\x81" /*62017, 0xF241*/ +#define LV_SYMBOL_BATTERY_2 "\xef\x89\x82" /*62018, 0xF242*/ +#define LV_SYMBOL_BATTERY_1 "\xef\x89\x83" /*62019, 0xF243*/ +#define LV_SYMBOL_BATTERY_EMPTY "\xef\x89\x84" /*62020, 0xF244*/ +#define LV_SYMBOL_USB "\xef\x8a\x87" /*62087, 0xF287*/ +#define LV_SYMBOL_BLUETOOTH "\xef\x8a\x93" /*62099, 0xF293*/ +#define LV_SYMBOL_TRASH "\xef\x8B\xAD" /*62189, 0xF2ED*/ +#define LV_SYMBOL_BACKSPACE "\xef\x95\x9A" /*62810, 0xF55A*/ +#define LV_SYMBOL_SD_CARD "\xef\x9F\x82" /*63426, 0xF7C2*/ +#define LV_SYMBOL_NEW_LINE "\xef\xA2\xA2" /*63650, 0xF8A2*/ /** Invalid symbol at (U+F8FF). If written before a string then `lv_img` will show it as a label*/ #define LV_SYMBOL_DUMMY "\xEF\xA3\xBF" diff --git a/src/lv_hal/lv_hal_disp.c b/src/lv_hal/lv_hal_disp.c index 9e97e6b37..11a3bbcb2 100644 --- a/src/lv_hal/lv_hal_disp.c +++ b/src/lv_hal/lv_hal_disp.c @@ -12,6 +12,7 @@ #include #include #include "lv_hal.h" +#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_mem.h" #include "../lv_core/lv_obj.h" #include "../lv_core/lv_refr.h" @@ -118,7 +119,7 @@ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver) { lv_disp_t * disp = lv_ll_ins_head(&LV_GC_ROOT(_lv_disp_ll)); if(!disp) { - lv_mem_assert(disp); + LV_ASSERT_MEM(disp); return NULL; } @@ -137,7 +138,7 @@ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver) disp->act_scr = lv_obj_create(NULL, NULL); /*Create a default screen on the display*/ disp->top_layer = lv_obj_create(NULL, NULL); /*Create top layer on the display*/ - disp->sys_layer = lv_obj_create(NULL, NULL); /*Create top layer on the display*/ + disp->sys_layer = lv_obj_create(NULL, NULL); /*Create sys layer on the display*/ lv_obj_set_style(disp->top_layer, &lv_style_transp); lv_obj_set_style(disp->sys_layer, &lv_style_transp); @@ -147,7 +148,7 @@ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver) /*Create a refresh task*/ disp->refr_task = lv_task_create(lv_disp_refr_task, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, disp); - lv_mem_assert(disp->refr_task); + LV_ASSERT_MEM(disp->refr_task); if(disp->refr_task == NULL) return NULL; lv_task_ready(disp->refr_task); /*Be sure the screen will be refreshed immediately on start up*/ @@ -190,7 +191,7 @@ void lv_disp_remove(lv_disp_t * disp) indev = lv_indev_get_next(indev); } - lv_ll_rem(&LV_GC_ROOT(_lv_disp_ll), disp); + lv_ll_remove(&LV_GC_ROOT(_lv_disp_ll), disp); lv_mem_free(disp); if(was_default) lv_disp_set_default(lv_ll_get_head(&LV_GC_ROOT(_lv_disp_ll))); @@ -267,14 +268,14 @@ bool lv_disp_get_antialiasing(lv_disp_t * disp) */ LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv) { - disp_drv->buffer->flushing = 0; - /*If the screen is transparent initialize it when the flushing is ready*/ #if LV_COLOR_SCREEN_TRANSP if(disp_drv->screen_transp) { memset(disp_drv->buffer->buf_act, 0x00, disp_drv->buffer->size * sizeof(lv_color32_t)); } #endif + + disp_drv->buffer->flushing = 0; } /** diff --git a/src/lv_hal/lv_hal_indev.c b/src/lv_hal/lv_hal_indev.c index 112734117..35ff1b318 100644 --- a/src/lv_hal/lv_hal_indev.c +++ b/src/lv_hal/lv_hal_indev.c @@ -8,6 +8,7 @@ /********************* * INCLUDES *********************/ +#include "../lv_core/lv_debug.h" #include "../lv_hal/lv_hal_indev.h" #include "../lv_core/lv_indev.h" #include "../lv_misc/lv_mem.h" @@ -77,7 +78,7 @@ lv_indev_t * lv_indev_drv_register(lv_indev_drv_t * driver) lv_indev_t * indev = lv_ll_ins_head(&LV_GC_ROOT(_lv_indev_ll)); if(!indev) { - lv_mem_assert(indev); + LV_ASSERT_MEM(indev); return NULL; } diff --git a/src/lv_hal/lv_hal_indev.h b/src/lv_hal/lv_hal_indev.h index ef1a55596..ee39e6e95 100644 --- a/src/lv_hal/lv_hal_indev.h +++ b/src/lv_hal/lv_hal_indev.h @@ -54,6 +54,18 @@ typedef uint8_t lv_indev_type_t; enum { LV_INDEV_STATE_REL = 0, LV_INDEV_STATE_PR }; typedef uint8_t lv_indev_state_t; + +enum { + LV_DRAG_DIR_NONE = 0x0, /**< Both directions are disabled */ + LV_DRAG_DIR_HOR = 0x1, /**< Object can be dragged horizontally. */ + LV_DRAG_DIR_VER = 0x2, /**< Object can be dragged vertically. */ + LV_DRAG_DIR_BOTH = 0x3, /**< Object can be dragged in all directions. */ + LV_DRAG_DIR_ONE = 0x4, /**< Object can be dragged only one direction (the first move). */ +}; + +typedef uint8_t lv_drag_dir_t; + + /** Data structure passed to an input driver to fill */ typedef struct { @@ -65,6 +77,7 @@ typedef struct lv_indev_state_t state; /**< LV_INDEV_STATE_REL or LV_INDEV_STATE_PR*/ } lv_indev_data_t; + /** Initialized by the user and registered by 'lv_indev_add()'*/ typedef struct _lv_indev_drv_t { @@ -127,6 +140,7 @@ typedef struct _lv_indev_proc_t /*Flags*/ uint8_t drag_limit_out : 1; uint8_t drag_in_prog : 1; + lv_drag_dir_t drag_dir : 3; } pointer; struct { /*Keypad data*/ diff --git a/src/lv_misc/lv_anim.c b/src/lv_misc/lv_anim.c index 5a50165b8..073ba7831 100644 --- a/src/lv_misc/lv_anim.c +++ b/src/lv_misc/lv_anim.c @@ -11,6 +11,7 @@ #if LV_USE_ANIMATION #include #include +#include "../lv_core/lv_debug.h" #include "../lv_hal/lv_hal_tick.h" #include "lv_task.h" #include "lv_math.h" @@ -89,7 +90,7 @@ void lv_anim_create(lv_anim_t * a) /*Add the new animation to the animation linked list*/ lv_anim_t * new_anim = lv_ll_ins_head(&LV_GC_ROOT(_lv_anim_ll)); - lv_mem_assert(new_anim); + LV_ASSERT_MEM(new_anim); if(new_anim == NULL) return; /*Initialize the animation descriptor*/ @@ -124,7 +125,7 @@ bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb) a_next = lv_ll_get_next(&LV_GC_ROOT(_lv_anim_ll), a); if(a->var == var && (a->exec_cb == exec_cb || exec_cb == NULL)) { - lv_ll_rem(&LV_GC_ROOT(_lv_anim_ll), a); + lv_ll_remove(&LV_GC_ROOT(_lv_anim_ll), a); lv_mem_free(a); anim_list_changed = true; /*Read by `anim_task`. It need to know if a delete occurred in the linked list*/ @@ -443,7 +444,7 @@ static bool anim_ready_handler(lv_anim_t * a) * This way the `ready_cb` will see the animations like it's animation is ready deleted*/ lv_anim_t a_tmp; memcpy(&a_tmp, a, sizeof(lv_anim_t)); - lv_ll_rem(&LV_GC_ROOT(_lv_anim_ll), a); + lv_ll_remove(&LV_GC_ROOT(_lv_anim_ll), a); lv_mem_free(a); anim_list_changed = true; diff --git a/src/lv_misc/lv_anim.h b/src/lv_misc/lv_anim.h index 299f7c455..36cc35adc 100644 --- a/src/lv_misc/lv_anim.h +++ b/src/lv_misc/lv_anim.h @@ -129,10 +129,10 @@ static inline void lv_anim_set_exec_cb(lv_anim_t * a, void * var, lv_anim_exec_x * @param duration duration of the animation in milliseconds * @param delay delay before the animation in milliseconds */ -static inline void lv_anim_set_time(lv_anim_t * a, uint16_t duration, uint16_t delay) +static inline void lv_anim_set_time(lv_anim_t * a, uint16_t duration, int16_t delay) { a->time = duration; - a->act_time = -delay; + a->act_time = (int16_t)(-delay); } /** diff --git a/src/lv_misc/lv_area.c b/src/lv_misc/lv_area.c index 025e1733e..de649c5b0 100644 --- a/src/lv_misc/lv_area.c +++ b/src/lv_misc/lv_area.c @@ -192,6 +192,19 @@ bool lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p) return is_in; } +/** + * Increment or decrement an area's size by a single amount + * @param a_p pointer to an area to grow + * @param amount amount to increment the area, or negative to decrement + */ +void lv_area_increment(lv_area_t * a_p, const lv_coord_t amount) +{ + a_p->x1 -= amount; + a_p->y1 -= amount; + a_p->x2 += amount; + a_p->y2 += amount; +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/lv_misc/lv_area.h b/src/lv_misc/lv_area.h index 30b62cbec..211bebd84 100644 --- a/src/lv_misc/lv_area.h +++ b/src/lv_misc/lv_area.h @@ -29,6 +29,9 @@ extern "C" { #define LV_COORD_MAX ((lv_coord_t)((uint32_t)((uint32_t)1 << (8 * sizeof(lv_coord_t) - 1)) - 1000)) #define LV_COORD_MIN (-LV_COORD_MAX) +LV_EXPORT_CONST_INT(LV_COORD_MAX); +LV_EXPORT_CONST_INT(LV_COORD_MIN); + /********************** * TYPEDEFS **********************/ @@ -82,7 +85,7 @@ inline static void lv_area_copy(lv_area_t * dest, const lv_area_t * src) */ static inline lv_coord_t lv_area_get_width(const lv_area_t * area_p) { - return area_p->x2 - area_p->x1 + 1; + return (lv_coord_t)(area_p->x2 - area_p->x1 + 1); } /** @@ -92,7 +95,7 @@ static inline lv_coord_t lv_area_get_width(const lv_area_t * area_p) */ static inline lv_coord_t lv_area_get_height(const lv_area_t * area_p) { - return area_p->y2 - area_p->y1 + 1; + return (lv_coord_t)(area_p->y2 - area_p->y1 + 1); } /** @@ -165,6 +168,13 @@ bool lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p); */ bool lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p); +/** + * Increment or decrement an area's size by a single amount + * @param a_p pointer to an area to grow + * @param amount amount to increment the area, or negative to decrement + */ +void lv_area_increment(lv_area_t * a_p, const lv_coord_t amount); + /********************** * MACROS **********************/ diff --git a/src/lv_misc/lv_bidi.c b/src/lv_misc/lv_bidi.c new file mode 100644 index 000000000..5ab50312d --- /dev/null +++ b/src/lv_misc/lv_bidi.c @@ -0,0 +1,616 @@ +/** + * @file lv_bidi.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include +#include "lv_bidi.h" +#include "lv_txt.h" +#include "../lv_misc/lv_mem.h" + +#if LV_USE_BIDI + +/********************* + * DEFINES + *********************/ +#define LV_BIDI_BRACKLET_DEPTH 4 + +// Highest bit of the 16-bit pos_conv value specifies whether this pos is RTL or not +#define GET_POS(x) ((x) & 0x7FFF) +#define IS_RTL_POS(x) (((x) & 0x8000) != 0) +#define SET_RTL_POS(x, is_rtl) (GET_POS(x) | ((is_rtl)? 0x8000: 0)) + +/********************** + * TYPEDEFS + **********************/ +typedef struct +{ + uint32_t bracklet_pos; + lv_bidi_dir_t dir; +}bracket_stack_t; + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_bidi_dir_t get_next_run(const char * txt, lv_bidi_dir_t base_dir, uint32_t max_len, uint32_t * len, uint16_t * pos_conv_len); +static void rtl_reverse(char * dest, const char * src, uint32_t len, uint16_t *pos_conv_out, uint16_t pos_conv_rd_base, uint16_t pos_conv_len); +static uint32_t char_change_to_pair(uint32_t letter); +static lv_bidi_dir_t bracket_process(const char * txt, uint32_t next_pos, uint32_t len, uint32_t letter, lv_bidi_dir_t base_dir); +static void fill_pos_conv(uint16_t * out, uint16_t len, uint16_t index); +static uint32_t get_txt_len(const char * txt, uint32_t max_len); + +/********************** + * STATIC VARIABLES + **********************/ +static const uint8_t bracket_left[] = {"<({["}; +static const uint8_t bracket_right[] = {">)}]"}; +static bracket_stack_t br_stack[LV_BIDI_BRACKLET_DEPTH]; +static uint8_t br_stack_p; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Convert a text to get the characters in the correct visual order according to + * Unicode Bidirectional Algorithm + * @param str_in the text to process + * @param str_out store the result here. Has the be `strlen(str_in)` length + * @param base_dir `LV_BIDI_DIR_LTR` or `LV_BIDI_DIR_RTL` + */ +void lv_bidi_process(const char * str_in, char * str_out, lv_bidi_dir_t base_dir) +{ + if(base_dir == LV_BIDI_DIR_AUTO) base_dir = lv_bidi_detect_base_dir(str_in); + + uint32_t par_start = 0; + uint32_t par_len; + + while(str_in[par_start] == '\n' || str_in[par_start] == '\r') { + str_out[par_start] = str_in[par_start]; + par_start ++; + } + + while(str_in[par_start] != '\0') { + par_len = lv_bidi_get_next_paragraph(&str_in[par_start]); + lv_bidi_process_paragraph(&str_in[par_start], &str_out[par_start], par_len, base_dir, NULL, 0); + par_start += par_len; + + while(str_in[par_start] == '\n' || str_in[par_start] == '\r') { + str_out[par_start] = str_in[par_start]; + par_start ++; + } + } + + str_out[par_start] = '\0'; +} + +/** + * Auto-detect the direction of a text based on the first strong character + * @param txt the text to process + * @return `LV_BIDI_DIR_LTR` or `LV_BIDI_DIR_RTL` + */ +lv_bidi_dir_t lv_bidi_detect_base_dir(const char * txt) +{ + uint32_t i = 0; + uint32_t letter; + while(txt[i] != '\0') { + letter = lv_txt_encoded_next(txt, &i); + + lv_bidi_dir_t dir; + dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BIDI_DIR_RTL || dir == LV_BIDI_DIR_LTR) return dir; + } + + /*If there were no strong char earlier return with the default base dir */ + if(LV_BIDI_BASE_DIR_DEF == LV_BIDI_DIR_AUTO) return LV_BIDI_DIR_LTR; + else return LV_BIDI_BASE_DIR_DEF; +} +/** + * Get the direction of a character + * @param letter an Unicode character + * @return `LV_BIDI_DIR_RTL/LTR/WEAK/NEUTRAL` + */ +lv_bidi_dir_t lv_bidi_get_letter_dir(uint32_t letter) +{ + if(lv_bidi_letter_is_rtl(letter)) return LV_BIDI_DIR_RTL; + if(lv_bidi_letter_is_neutral(letter)) return LV_BIDI_DIR_NEUTRAL; + if(lv_bidi_letter_is_weak(letter)) return LV_BIDI_DIR_WEAK; + + return LV_BIDI_DIR_LTR; +} +/** + * Tell whether a character is weak or not + * @param letter an Unicode character + * @return true/false + */ +bool lv_bidi_letter_is_weak(uint32_t letter) +{ + uint32_t i = 0; + static const char weaks[] = "0123456789"; + + do { + uint32_t x = lv_txt_encoded_next(weaks, &i); + if(letter == x) { + return true; + } + } while(weaks[i] != '\0'); + + return false; +} +/** + * Tell whether a character is RTL or not + * @param letter an Unicode character + * @return true/false + */ +bool lv_bidi_letter_is_rtl(uint32_t letter) +{ + if(letter >= 0x5d0 && letter <= 0x5ea) return true; + if(letter == 0x202E) return true; /*Unicode of LV_BIDI_RLO*/ + + return false; +} + +/** + * Tell whether a character is neutral or not + * @param letter an Unicode character + * @return true/false + */ +bool lv_bidi_letter_is_neutral(uint32_t letter) +{ + uint16_t i; + static const char neutrals[] = " \t\n\r.,:;'\"`!?%/\\-=()[]{}<>@#&$|"; + for(i = 0; neutrals[i] != '\0'; i++) { + if(letter == (uint32_t)neutrals[i]) return true; + } + + return false; +} + +/** + * Get the logical position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_mem_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BIDI_DIR_LTR` or `LV_BIDI_DIR_RTL` + * @param vicual_pos the visual character position which logical position should be get + * @param is_rtl tell the the char at `viasual_pos` is RTL or LTR context + * @return the logical character position + */ +uint16_t lv_bidi_get_logical_pos(const char * str_in, char **bidi_txt, uint32_t len, lv_bidi_dir_t base_dir, uint32_t visual_pos, bool *is_rtl) +{ + uint32_t pos_conv_len = get_txt_len(str_in, len); + void *buf = lv_mem_buf_get(len + pos_conv_len * sizeof(uint16_t)); + if(buf == NULL) return (uint16_t) -1; + if (bidi_txt) *bidi_txt = buf; + + uint16_t *pos_conv_buf = (uint16_t*) ((char*)buf + len); + lv_bidi_process_paragraph(str_in, bidi_txt? *bidi_txt: NULL, len, base_dir, pos_conv_buf, pos_conv_len); + + if (is_rtl) *is_rtl = IS_RTL_POS(pos_conv_buf[visual_pos]); + + if(bidi_txt == NULL) lv_mem_buf_release(buf); + return GET_POS(pos_conv_buf[visual_pos]); +} + +/** + * Get the visual position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_mem_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BIDI_DIR_LTR` or `LV_BIDI_DIR_RTL` + * @param logical_pos the logical character position which visual position should be get + * @param is_rtl tell the the char at `logical_pos` is RTL or LTR context + * @return the visual character position + */ +uint16_t lv_bidi_get_visual_pos(const char * str_in, char **bidi_txt, uint16_t len, lv_bidi_dir_t base_dir, uint32_t logical_pos, bool *is_rtl) +{ + uint32_t pos_conv_len = get_txt_len(str_in, len); + void *buf = lv_mem_buf_get(len + pos_conv_len * sizeof(uint16_t)); + if(buf == NULL) return (uint16_t) -1; + if (bidi_txt) *bidi_txt = buf; + + uint16_t *pos_conv_buf = (uint16_t*) ((char*)buf + len); + lv_bidi_process_paragraph(str_in, bidi_txt ? *bidi_txt: NULL, len, base_dir, pos_conv_buf, pos_conv_len); + for (uint16_t i = 0; i < pos_conv_len; i++){ + if (GET_POS(pos_conv_buf[i]) == logical_pos){ + if (is_rtl) *is_rtl = IS_RTL_POS(pos_conv_buf[i]); + if(bidi_txt == NULL) lv_mem_buf_release(buf); + return i; + } + } + if(bidi_txt == NULL) lv_mem_buf_release(buf); + return (uint16_t) -1; +} + +/** + * Bidi process a paragraph of text + * @param str_in the string to process + * @param str_out store the result here + * @param len length of teh text + * @param base_dir base dir of the text + * @param pos_conv_out an `uint16_t` array to store the related logical position of the character. + * Can be `NULL` is unused + * @param pos_conv_len length of `pos_conv_out` in element count + */ +void lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_bidi_dir_t base_dir, uint16_t *pos_conv_out, uint16_t pos_conv_len) +{ + uint32_t run_len = 0; + lv_bidi_dir_t run_dir; + uint32_t rd = 0; + uint32_t wr; + uint16_t pos_conv_run_len = 0; + uint16_t pos_conv_rd = 0; + uint16_t pos_conv_wr; + + if(base_dir == LV_BIDI_DIR_AUTO) base_dir = lv_bidi_detect_base_dir(str_in); + if(base_dir == LV_BIDI_DIR_RTL) { + wr = len; + pos_conv_wr = pos_conv_len; + } + else { + wr = 0; + pos_conv_wr = 0; + } + + if (str_out) str_out[len] = '\0'; + + lv_bidi_dir_t dir = base_dir; + + /*Empty the bracket stack*/ + br_stack_p = 0; + + /*Process neutral chars in the beginning*/ + while(rd < len) { + uint32_t letter = lv_txt_encoded_next(str_in, &rd); + pos_conv_rd++; + dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BIDI_DIR_NEUTRAL) dir = bracket_process(str_in, rd, len, letter, base_dir); + if(dir != LV_BIDI_DIR_NEUTRAL && dir != LV_BIDI_DIR_WEAK) break; + } + + if(rd && str_in[rd] != '\0') { + lv_txt_encoded_prev(str_in, &rd); + pos_conv_rd--; + } + + if(rd) { + if(base_dir == LV_BIDI_DIR_LTR) { + if (str_out) { + memcpy(&str_out[wr], str_in, rd); + wr += rd; + } + if (pos_conv_out) { + fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_rd, 0); + pos_conv_wr += pos_conv_rd; + } + } else { + wr -= rd; + pos_conv_wr -= pos_conv_rd; + rtl_reverse(str_out? &str_out[wr]: NULL, str_in, rd, pos_conv_out? &pos_conv_out[pos_conv_wr]: NULL, 0, pos_conv_rd); + } + } + + /*Get and process the runs*/ + + while(rd < len && str_in[rd]) { + run_dir = get_next_run(&str_in[rd], base_dir, len - rd, &run_len, &pos_conv_run_len); + + if(base_dir == LV_BIDI_DIR_LTR) { + if(run_dir == LV_BIDI_DIR_LTR) { + if (str_out) memcpy(&str_out[wr], &str_in[rd], run_len); + if (pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_run_len, pos_conv_rd); + } + else rtl_reverse(str_out? &str_out[wr]: NULL, &str_in[rd], run_len, pos_conv_out? &pos_conv_out[pos_conv_wr] : NULL, pos_conv_rd, pos_conv_run_len); + wr += run_len; + pos_conv_wr += pos_conv_run_len; + } else { + wr -= run_len; + pos_conv_wr -= pos_conv_run_len; + if(run_dir == LV_BIDI_DIR_LTR) { + if (str_out) memcpy(&str_out[wr], &str_in[rd], run_len); + if (pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_run_len, pos_conv_rd); + } + else rtl_reverse(str_out? &str_out[wr]: NULL, &str_in[rd], run_len, pos_conv_out? &pos_conv_out[pos_conv_wr] : NULL, pos_conv_rd, pos_conv_run_len); + } + + rd += run_len; + pos_conv_rd += pos_conv_run_len; + } +} + +/** + * Get the next paragraph from a text + * @param txt the text to process + * @return the length of the current paragraph in byte count + */ +uint32_t lv_bidi_get_next_paragraph(const char * txt) +{ + uint32_t i = 0; + + lv_txt_encoded_next(txt, &i); + + while(txt[i] != '\0' && txt[i] != '\n' && txt[i] != '\r') { + lv_txt_encoded_next(txt, &i); + } + + return i; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static uint32_t get_txt_len(const char * txt, uint32_t max_len) +{ + uint32_t len = 0; + uint32_t i = 0; + + while(i < max_len && txt[i] != '\0') { + lv_txt_encoded_next(txt, &i); + len++; + } + + return len; +} + +static void fill_pos_conv(uint16_t * out, uint16_t len, uint16_t index) +{ + for (uint16_t i = 0; i < len; i++) + { + out[i] = SET_RTL_POS(index, false); + index++; + } +} + +static lv_bidi_dir_t get_next_run(const char * txt, lv_bidi_dir_t base_dir, uint32_t max_len, uint32_t * len, uint16_t * pos_conv_len) +{ + uint32_t i = 0; + uint32_t letter; + + uint16_t pos_conv_i = 0; + + letter = lv_txt_encoded_next(txt, NULL); + lv_bidi_dir_t dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BIDI_DIR_NEUTRAL) dir = bracket_process(txt, 0, max_len, letter, base_dir); + + /*Find the first strong char. Skip the neutrals*/ + while(dir == LV_BIDI_DIR_NEUTRAL || dir == LV_BIDI_DIR_WEAK) { + letter = lv_txt_encoded_next(txt, &i); + pos_conv_i++; + dir = lv_bidi_get_letter_dir(letter); + if(dir == LV_BIDI_DIR_NEUTRAL) dir = bracket_process(txt, i, max_len, letter, base_dir); + + if(i >= max_len || txt[i] == '\0' || txt[i] == '\n' || txt[i] == '\r') { + *len = i; + *pos_conv_len = pos_conv_i; + return base_dir; + } + } + + lv_bidi_dir_t run_dir = dir; + + uint32_t i_prev = i; + uint32_t i_last_strong = i; + uint16_t pos_conv_i_prev = pos_conv_i; + uint16_t pos_conv_i_last_strong = pos_conv_i; + + /*Find the next char which has different direction*/ + lv_bidi_dir_t next_dir = base_dir; + while(i_prev < max_len && txt[i] != '\0' && txt[i] != '\n' && txt[i] != '\r') { + letter = lv_txt_encoded_next(txt, &i); + pos_conv_i++; + next_dir = lv_bidi_get_letter_dir(letter); + if(next_dir == LV_BIDI_DIR_NEUTRAL) next_dir = bracket_process(txt, i, max_len, letter, base_dir); + + /*New dir found?*/ + if((next_dir == LV_BIDI_DIR_RTL || next_dir == LV_BIDI_DIR_LTR) && next_dir != run_dir) { + /*Include neutrals if `run_dir == base_dir` */ + if(run_dir == base_dir) { + *len = i_prev; + *pos_conv_len = pos_conv_i_prev; + } + /*Exclude neutrals if `run_dir != base_dir` */ + else { + *len = i_last_strong; + *pos_conv_len = pos_conv_i_last_strong; + } + + return run_dir; + } + + if(next_dir != LV_BIDI_DIR_NEUTRAL) { + i_last_strong = i; + pos_conv_i_last_strong = pos_conv_i; + } + + i_prev = i; + pos_conv_i_prev = pos_conv_i; + } + + /*Handle end of of string. Apply `base_dir` on trailing neutrals*/ + + /*Include neutrals if `run_dir == base_dir` */ + if(run_dir == base_dir) { + *len = i_prev; + *pos_conv_len = pos_conv_i_prev; + } + /*Exclude neutrals if `run_dir != base_dir` */ + else { + *len = i_last_strong; + *pos_conv_len = pos_conv_i_last_strong; + } + + return run_dir; +} + +static void rtl_reverse(char * dest, const char * src, uint32_t len, uint16_t *pos_conv_out, uint16_t pos_conv_rd_base, uint16_t pos_conv_len) +{ + uint32_t i = len; + uint32_t wr = 0; + uint16_t pos_conv_i = pos_conv_len; + uint16_t pos_conv_wr = 0; + + while(i) { + uint32_t letter = lv_txt_encoded_prev(src, &i); + uint16_t pos_conv_letter = --pos_conv_i; + + /*Keep weak letters (numbers) as LTR*/ + if(lv_bidi_letter_is_weak(letter)) { + uint32_t last_weak = i; + uint32_t first_weak = i; + uint16_t pos_conv_last_weak = pos_conv_i; + uint16_t pos_conv_first_weak = pos_conv_i; + while(i) { + letter = lv_txt_encoded_prev(src, &i); + pos_conv_letter = --pos_conv_i; + + /*No need to call `char_change_to_pair` because there not such chars here*/ + + /*Finish on non-weak char */ + /*but treat number and currency related chars as weak*/ + if (lv_bidi_letter_is_weak(letter) == false && letter != '.' && letter != ',' && letter != '$' && letter != '%') { + lv_txt_encoded_next(src, &i); /*Rewind one letter*/ + pos_conv_i++; + first_weak = i; + pos_conv_first_weak = pos_conv_i; + break; + } + } + if(i == 0) { + first_weak = 0; + pos_conv_first_weak = 0; + } + + if (dest) memcpy(&dest[wr], &src[first_weak], last_weak - first_weak + 1); + if (pos_conv_out) fill_pos_conv(&pos_conv_out[pos_conv_wr], pos_conv_last_weak - pos_conv_first_weak + 1, pos_conv_rd_base + pos_conv_first_weak); + wr += last_weak - first_weak + 1; + pos_conv_wr += pos_conv_last_weak - pos_conv_first_weak + 1; + } + + /*Simply store in reversed order*/ + else { + uint32_t letter_size = lv_txt_encoded_size((const char *)&src[i]); + /*Swap arithmetical symbols*/ + if(letter_size == 1) { + uint32_t new_letter = letter = char_change_to_pair(letter); + if (dest) dest[wr] = (uint8_t)new_letter; + if (pos_conv_out) pos_conv_out[pos_conv_wr] = SET_RTL_POS(pos_conv_rd_base + pos_conv_letter, true); + wr++; + pos_conv_wr++; + } + /*Just store the letter*/ + else { + if (dest) memcpy(&dest[wr], &src[i], letter_size); + if (pos_conv_out) pos_conv_out[pos_conv_wr] = SET_RTL_POS(pos_conv_rd_base + pos_conv_i, true); + wr += letter_size; + pos_conv_wr++; + } + } + } +} + +static uint32_t char_change_to_pair(uint32_t letter) +{ + + uint8_t i; + for(i = 0; bracket_left[i] != '\0'; i++) { + if(letter == bracket_left[i]) return bracket_right[i]; + } + + for(i = 0; bracket_right[i] != '\0'; i++) { + if(letter == bracket_right[i]) return bracket_left[i]; + } + + return letter; +} + +static lv_bidi_dir_t bracket_process(const char * txt, uint32_t next_pos, uint32_t len, uint32_t letter, lv_bidi_dir_t base_dir) +{ + lv_bidi_dir_t bracket_dir = LV_BIDI_DIR_NEUTRAL; + + uint8_t i; + /*Is the letter an opening bracket?*/ + for(i = 0; bracket_left[i] != '\0'; i++) { + if(bracket_left[i] == letter) { + /* If so find it's matching closing bracket. + * If a char with base dir. direction is found then the brackets will have `base_dir` direction*/ + uint32_t txt_i = next_pos; + while(txt_i < len) { + uint32_t letter_next = lv_txt_encoded_next(txt, &txt_i); + if(letter_next == bracket_right[i]) { + /*Closing bracket found*/ + break; + } else { + /*Save the dir*/ + lv_bidi_dir_t letter_dir = lv_bidi_get_letter_dir(letter_next); + if(letter_dir == base_dir) { + bracket_dir = base_dir; + } + } + } + + /*There were no matching closing bracket*/ + if(txt_i > len) return LV_BIDI_DIR_NEUTRAL; + + /*There where a strong char with base dir in the bracket so the dir is found.*/ + if(bracket_dir != LV_BIDI_DIR_NEUTRAL && bracket_dir != LV_BIDI_DIR_WEAK) break; + + /*If there were no matching strong chars in the brackets then check the previous chars*/ + txt_i = next_pos; + if(txt_i) lv_txt_encoded_prev(txt, &txt_i); + while(txt_i > 0) { + uint32_t letter_next = lv_txt_encoded_prev(txt, &txt_i); + lv_bidi_dir_t letter_dir = lv_bidi_get_letter_dir(letter_next); + if(letter_dir == LV_BIDI_DIR_LTR || letter_dir == LV_BIDI_DIR_RTL) { + bracket_dir = letter_dir; + break; + } + } + + + /*There where a previous strong char which can be used*/ + if(bracket_dir != LV_BIDI_DIR_NEUTRAL) break; + + /*There were no strong chars before the bracket, so use the base dir.*/ + if(txt_i == 0) bracket_dir = base_dir; + + break; + } + } + + + /*The letter was an opening bracket*/ + if(bracket_left[i] != '\0') { + + if(bracket_dir == LV_BIDI_DIR_NEUTRAL || br_stack_p == LV_BIDI_BRACKLET_DEPTH) return LV_BIDI_DIR_NEUTRAL; + + br_stack[br_stack_p].bracklet_pos = i; + br_stack[br_stack_p].dir = bracket_dir; + + br_stack_p++; + return bracket_dir; + } else if(br_stack_p > 0) { + /*Is the letter a closing bracket of the last opening?*/ + if(letter == bracket_right[br_stack[br_stack_p - 1].bracklet_pos]) { + bracket_dir = br_stack[br_stack_p - 1].dir; + br_stack_p--; + return bracket_dir; + } + } + + return LV_BIDI_DIR_NEUTRAL; +} + + +#endif /*LV_USE_BIDI*/ diff --git a/src/lv_misc/lv_bidi.h b/src/lv_misc/lv_bidi.h new file mode 100644 index 000000000..dfa6565bd --- /dev/null +++ b/src/lv_misc/lv_bidi.h @@ -0,0 +1,156 @@ +/** + * @file lv_bifi.h + * + */ + +#ifndef LV_BIDI_H +#define LV_BIDI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#ifdef LV_CONF_INCLUDE_SIMPLE +#include "lv_conf.h" +#else +#include "../../../lv_conf.h" +#endif + +#include +#include + +/********************* + * DEFINES + *********************/ +/* Special non printable strong characters. + * They can be inserted to texts to affect the run's direction*/ +#define LV_BIDI_LRO "\xE2\x80\xAD" /*U+202D*/ +#define LV_BIDI_RLO "\xE2\x80\xAE" /*U+202E*/ + +/********************** + * TYPEDEFS + **********************/ +enum +{ + /*The first 4 values are stored in `lv_obj_t` on 2 bits*/ + LV_BIDI_DIR_LTR = 0x00, + LV_BIDI_DIR_RTL = 0x01, + LV_BIDI_DIR_AUTO = 0x02, + LV_BIDI_DIR_INHERIT = 0x03, + + LV_BIDI_DIR_NEUTRAL = 0x20, + LV_BIDI_DIR_WEAK = 0x21, +}; + +typedef uint8_t lv_bidi_dir_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ +#if LV_USE_BIDI + +/** + * Convert a text to get the characters in the correct visual order according to + * Unicode Bidirectional Algorithm + * @param str_in the text to process + * @param str_out store the result here. Has the be `strlen(str_in)` length + * @param base_dir `LV_BIDI_DIR_LTR` or `LV_BIDI_DIR_RTL` + */ +void lv_bidi_process(const char * str_in, char * str_out, lv_bidi_dir_t base_dir); + +/** + * Auto-detect the direction of a text based on the first strong character + * @param txt the text to process + * @return `LV_BIDI_DIR_LTR` or `LV_BIDI_DIR_RTL` + */ +lv_bidi_dir_t lv_bidi_detect_base_dir(const char * txt); + +/** + * Get the direction of a character + * @param letter an Unicode character + * @return `LV_BIDI_DIR_RTL/LTR/WEAK/NEUTRAL` + */ +lv_bidi_dir_t lv_bidi_get_letter_dir(uint32_t letter); + +/** + * Tell whether a character is weak or not + * @param letter an Unicode character + * @return true/false + */ +bool lv_bidi_letter_is_weak(uint32_t letter); + +/** + * Tell whether a character is RTL or not + * @param letter an Unicode character + * @return true/false + */ +bool lv_bidi_letter_is_rtl(uint32_t letter); + +/** + * Tell whether a character is neutral or not + * @param letter an Unicode character + * @return true/false + */ +bool lv_bidi_letter_is_neutral(uint32_t letter); + +/** + * Get the logical position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_mem_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BIDI_DIR_LTR` or `LV_BIDI_DIR_RTL` + * @param vicual_pos the visual character position which logical position should be get + * @param is_rtl tell the the char at `viasual_pos` is RTL or LTR context + * @return the logical character position + */ +uint16_t lv_bidi_get_logical_pos(const char * str_in, char **bidi_txt, uint32_t len, lv_bidi_dir_t base_dir, uint32_t visual_pos, bool *is_rtl); + +/** + * Get the visual position of a character in a line + * @param str_in the input string. Can be only one line. + * @param bidi_txt internally the text is bidi processed which buffer can be get here. + * If not required anymore has to freed with `lv_mem_free()` + * Can be `NULL` is unused + * @param len length of the line in character count + * @param base_dir base direction of the text: `LV_BIDI_DIR_LTR` or `LV_BIDI_DIR_RTL` + * @param logical_pos the logical character position which visual position should be get + * @param is_rtl tell the the char at `logical_pos` is RTL or LTR context + * @return the visual character position + */ +uint16_t lv_bidi_get_visual_pos(const char * str_in, char **bidi_txt, uint16_t len, lv_bidi_dir_t base_dir, uint32_t logical_pos, bool *is_rtl); + +/** + * Bidi process a paragraph of text + * @param str_in the string to process + * @param str_out store the result here + * @param len length of teh text + * @param base_dir base dir of the text + * @param pos_conv_out an `uint16_t` array to store the related logical position of the character. + * Can be `NULL` is unused + * @param pos_conv_len length of `pos_conv_out` in element count + */ +void lv_bidi_process_paragraph(const char * str_in, char * str_out, uint32_t len, lv_bidi_dir_t base_dir, uint16_t *pos_conv_out, uint16_t pos_conv_len); + +/** + * Get the next paragraph from a text + * @param txt the text to process + * @return the length of the current paragraph in byte count + */ +uint32_t lv_bidi_get_next_paragraph(const char * txt); + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_BIDI*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_BIDI_H*/ diff --git a/src/lv_misc/lv_color.c b/src/lv_misc/lv_color.c index f5bec62bb..cd4825dfe 100644 --- a/src/lv_misc/lv_color.c +++ b/src/lv_misc/lv_color.c @@ -7,6 +7,7 @@ * INCLUDES *********************/ #include "lv_color.h" +#include "lv_math.h" /********************* * DEFINES @@ -105,39 +106,66 @@ lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v) } /** - * Convert an RGB color to HSV - * @param r red - * @param g green - * @param b blue - * @return the given RGB color n HSV + * Convert a 32-bit RGB color to HSV + * @param r8 8-bit red + * @param g8 8-bit green + * @param b8 8-bit blue + * @return the given RGB color in HSV */ -lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r, uint8_t g, uint8_t b) +lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r8, uint8_t g8, uint8_t b8) { + uint16_t r = ((uint32_t)r8 << 10) / 255; + uint16_t g = ((uint32_t)g8 << 10) / 255; + uint16_t b = ((uint32_t)b8 << 10) / 255; + + uint16_t rgbMin = r < g ? (r < b ? r : b) : (g < b ? g : b); + uint16_t rgbMax = r > g ? (r > b ? r : b) : (g > b ? g : b); + lv_color_hsv_t hsv; - uint8_t rgbMin, rgbMax; - rgbMin = r < g ? (r < b ? r : b) : (g < b ? g : b); - rgbMax = r > g ? (r > b ? r : b) : (g > b ? g : b); + // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness + hsv.v = (100 * rgbMax) >> 10; - hsv.v = rgbMax; - if(hsv.v == 0) { + int32_t delta = rgbMax - rgbMin; + if (LV_MATH_ABS(delta) < 3) { hsv.h = 0; hsv.s = 0; return hsv; } - hsv.s = 255 * (long)(rgbMax - rgbMin) / hsv.v; - if(hsv.s == 0) { + // https://en.wikipedia.org/wiki/HSL_and_HSV#Saturation + hsv.s = 100 * delta / rgbMax; + if(hsv.s < 3) { hsv.h = 0; return hsv; } + // https://en.wikipedia.org/wiki/HSL_and_HSV#Hue_and_chroma + int32_t h; if(rgbMax == r) - hsv.h = 0 + 43 * (g - b) / (rgbMax - rgbMin); + h = (((g - b) << 10) / delta) + (g < b ? (6 << 10) : 0); // between yellow & magenta else if(rgbMax == g) - hsv.h = 85 + 43 * (b - r) / (rgbMax - rgbMin); + h = (((b - r) << 10) / delta) + (2 << 10); // between cyan & yellow + else if(rgbMax == b) + h = (((r - g) << 10) / delta) + (4 << 10); // between magenta & cyan else - hsv.h = 171 + 43 * (r - g) / (rgbMax - rgbMin); + h = 0; + h *= 60; + h >>= 10; + if (h < 0) h += 360; + hsv.h = h; return hsv; } + +/** + * Convert a color to HSV + * @param color color + * @return the given color in HSV + */ +lv_color_hsv_t lv_color_to_hsv(lv_color_t color) +{ + lv_color32_t color32; + color32.full = lv_color_to32(color); + return lv_color_rgb_to_hsv(color32.ch.red, color32.ch.green, color32.ch.blue); +} diff --git a/src/lv_misc/lv_color.h b/src/lv_misc/lv_color.h index a73ab8c88..606abb245 100644 --- a/src/lv_misc/lv_color.h +++ b/src/lv_misc/lv_color.h @@ -75,8 +75,8 @@ enum { LV_OPA_COVER = 255, }; -#define LV_OPA_MIN 16 /*Opacities below this will be transparent*/ -#define LV_OPA_MAX 251 /*Opacities above this will fully cover*/ +#define LV_OPA_MIN 5 /*Opacities below this will be transparent*/ +#define LV_OPA_MAX 250 /*Opacities above this will fully cover*/ #if LV_COLOR_DEPTH == 1 #define LV_COLOR_SIZE 8 @@ -90,16 +90,123 @@ enum { #error "Invalid LV_COLOR_DEPTH in lv_conf.h! Set it to 1, 8, 16 or 32!" #endif +/*--------------------------------------- + * Macros for all existing color depths + * to set/get values of the color channels + *------------------------------------------*/ +# define LV_COLOR_SET_R1(c, v) (c).ch.red = (uint8_t)((v) & 0x1); +# define LV_COLOR_SET_G1(c, v) (c).ch.green = (uint8_t)((v) & 0x1); +# define LV_COLOR_SET_B1(c, v) (c).ch.blue = (uint8_t)((v) & 0x1); +# define LV_COLOR_SET_A1(c, v) + +# define LV_COLOR_GET_R1(c) (c).ch.red +# define LV_COLOR_GET_G1(c) (c).ch.green +# define LV_COLOR_GET_B1(c) (c).ch.blue +# define LV_COLOR_GET_A1(c) 1 + +# define LV_COLOR_SET_R8(c, v) (c).ch.red = (uint8_t)((v) & 0x7); +# define LV_COLOR_SET_G8(c, v) (c).ch.green = (uint8_t)((v) & 0x7); +# define LV_COLOR_SET_B8(c, v) (c).ch.blue = (uint8_t)((v) & 0x3); +# define LV_COLOR_SET_A8(c, v) do {} while(0) + +# define LV_COLOR_GET_R8(c) (c).ch.red +# define LV_COLOR_GET_G8(c) (c).ch.green +# define LV_COLOR_GET_B8(c) (c).ch.blue +# define LV_COLOR_GET_A8(c) 0xFF + +# define LV_COLOR_SET_R16(c, v) (c).ch.red = (uint8_t)(((uint8_t)(v)) & 0x1F); +# define LV_COLOR_SET_G16(c, v) (c).ch.green = (uint8_t)((v) & 0x3F); +# define LV_COLOR_SET_G16_SWAP(c, v) {(c).ch.green_h = (uint8_t)(((v) >> 3) & 0x7); (c).ch.green_l = (uint8_t)((v) & 0x7);} +# define LV_COLOR_SET_B16(c, v) (c).ch.blue = (uint8_t)((v) & 0x1F); +# define LV_COLOR_SET_A16(c, v) do {} while(0) + +# define LV_COLOR_GET_R16(c) (c).ch.red +# define LV_COLOR_GET_G16(c) (c).ch.green +# define LV_COLOR_GET_G16_SWAP(c) (((c).ch.green_h << 3) + (c).ch.green_l) +# define LV_COLOR_GET_B16(c) (c).ch.blue +# define LV_COLOR_GET_A16(c) 0xFF + +# define LV_COLOR_SET_R32(c, v) (c).ch.red = (uint32_t)((v) & 0xFF); +# define LV_COLOR_SET_G32(c, v) (c).ch.green = (uint32_t)((v) & 0xFF); +# define LV_COLOR_SET_B32(c, v) (c).ch.blue = (uint32_t)((v) & 0xFF); +# define LV_COLOR_SET_A32(c, v) (c).ch.alpha = (uint32_t)((v) & 0xFF); + +# define LV_COLOR_GET_R32(c) (c).ch.red +# define LV_COLOR_GET_G32(c) (c).ch.green +# define LV_COLOR_GET_B32(c) (c).ch.blue +# define LV_COLOR_GET_A32(c) (c).ch.alpha + + +/*--------------------------------------- + * Macros for the current color depth + * to set/get values of the color channels + *------------------------------------------*/ +#if LV_COLOR_DEPTH == 1 +# define LV_COLOR_SET_R(c, v) LV_COLOR_SET_R1(c,v) +# define LV_COLOR_SET_G(c, v) LV_COLOR_SET_G1(c,v) +# define LV_COLOR_SET_B(c, v) LV_COLOR_SET_B1(c,v) +# define LV_COLOR_SET_A(c, v) LV_COLOR_SET_A1(c,v) + +# define LV_COLOR_GET_R(c) LV_COLOR_GET_R1(c) +# define LV_COLOR_GET_G(c) LV_COLOR_GET_G1(c) +# define LV_COLOR_GET_B(c) LV_COLOR_GET_B1(c) +# define LV_COLOR_GET_A(c) LV_COLOR_GET_A1(c) + +#elif LV_COLOR_DEPTH == 8 +# define LV_COLOR_SET_R(c, v) LV_COLOR_SET_R8(c,v) +# define LV_COLOR_SET_G(c, v) LV_COLOR_SET_G8(c,v) +# define LV_COLOR_SET_B(c, v) LV_COLOR_SET_B8(c,v) +# define LV_COLOR_SET_A(c, v) LV_COLOR_SET_A8(c,v) + +# define LV_COLOR_GET_R(c) LV_COLOR_GET_R8(c) +# define LV_COLOR_GET_G(c) LV_COLOR_GET_G8(c) +# define LV_COLOR_GET_B(c) LV_COLOR_GET_B8(c) +# define LV_COLOR_GET_A(c) LV_COLOR_GET_A8(c) + +#elif LV_COLOR_DEPTH == 16 +# define LV_COLOR_SET_R(c, v) LV_COLOR_SET_R16(c,v) +# if LV_COLOR_16_SWAP == 0 +# define LV_COLOR_SET_G(c, v) LV_COLOR_SET_G16(c,v) +# else +# define LV_COLOR_SET_G(c, v) LV_COLOR_SET_G16_SWAP(c,v) +# endif +# define LV_COLOR_SET_B(c, v) LV_COLOR_SET_B16(c,v) +# define LV_COLOR_SET_A(c, v) LV_COLOR_SET_A16(c,v) + +# define LV_COLOR_GET_R(c) LV_COLOR_GET_R16(c) +# if LV_COLOR_16_SWAP == 0 +# define LV_COLOR_GET_G(c) LV_COLOR_GET_G16(c) +# else +# define LV_COLOR_GET_G(c) LV_COLOR_GET_G16_SWAP(c) +# endif +# define LV_COLOR_GET_B(c) LV_COLOR_GET_B16(c) +# define LV_COLOR_GET_A(c) LV_COLOR_GET_A16(c) + +#elif LV_COLOR_DEPTH == 32 +# define LV_COLOR_SET_R(c, v) LV_COLOR_SET_R32(c,v) +# define LV_COLOR_SET_G(c, v) LV_COLOR_SET_G32(c,v) +# define LV_COLOR_SET_B(c, v) LV_COLOR_SET_B32(c,v) +# define LV_COLOR_SET_A(c, v) LV_COLOR_SET_A32(c,v) + +# define LV_COLOR_GET_R(c) LV_COLOR_GET_R32(c) +# define LV_COLOR_GET_G(c) LV_COLOR_GET_G32(c) +# define LV_COLOR_GET_B(c) LV_COLOR_GET_B32(c) +# define LV_COLOR_GET_A(c) LV_COLOR_GET_A32(c) +#endif + /********************** * TYPEDEFS **********************/ typedef union { - uint8_t blue : 1; - uint8_t green : 1; - uint8_t red : 1; - uint8_t full : 1; + struct + { + uint8_t blue : 1; + uint8_t green : 1; + uint8_t red : 1; + } ch; + uint8_t full; } lv_color1_t; typedef union @@ -191,24 +298,19 @@ static inline uint8_t lv_color_to1(lv_color_t color) #if LV_COLOR_DEPTH == 1 return color.full; #elif LV_COLOR_DEPTH == 8 - if((color.ch.red & 0x4) || (color.ch.green & 0x4) || (color.ch.blue & 0x2)) { + if((LV_COLOR_GET_R(color) & 0x4) || (LV_COLOR_GET_G(color) & 0x4) || (LV_COLOR_GET_B(color) & 0x2)) { return 1; } else { return 0; } #elif LV_COLOR_DEPTH == 16 -#if LV_COLOR_16_SWAP == 0 - if((color.ch.red & 0x10) || (color.ch.green & 0x20) || (color.ch.blue & 0x10)) { + if((LV_COLOR_GET_R(color) & 0x10) || (LV_COLOR_GET_G(color) & 0x20) || (LV_COLOR_GET_B(color) & 0x10)) { return 1; -#else - if((color.ch.red & 0x10) || (color.ch.green_h & 0x20) || (color.ch.blue & 0x10)) { - return 1; -#endif } else { return 0; } #elif LV_COLOR_DEPTH == 32 - if((color.ch.red & 0x80) || (color.ch.green & 0x80) || (color.ch.blue & 0x80)) { + if((LV_COLOR_GET_R(color) & 0x80) || (LV_COLOR_GET_G(color) & 0x80) || (LV_COLOR_GET_B(color) & 0x80)) { return 1; } else { return 0; @@ -226,31 +328,23 @@ static inline uint8_t lv_color_to8(lv_color_t color) #elif LV_COLOR_DEPTH == 8 return color.full; #elif LV_COLOR_DEPTH == 16 - -#if LV_COLOR_16_SWAP == 0 lv_color8_t ret; - ret.ch.red = color.ch.red >> 2; /* 5 - 3 = 2*/ - ret.ch.green = color.ch.green >> 3; /* 6 - 3 = 3*/ - ret.ch.blue = color.ch.blue >> 3; /* 5 - 2 = 3*/ + LV_COLOR_SET_R8(ret, LV_COLOR_GET_R(color) >> 2); /* 5 - 3 = 2*/ + LV_COLOR_SET_G8(ret, LV_COLOR_GET_G(color) >> 3); /* 6 - 3 = 3*/ + LV_COLOR_SET_B8(ret, LV_COLOR_GET_B(color) >> 3); /* 5 - 2 = 3*/ return ret.full; -#else - lv_color8_t ret; - ret.ch.red = color.ch.red >> 2; /* 5 - 3 = 2*/ - ret.ch.green = color.ch.green_h; /* 6 - 3 = 3*/ - ret.ch.blue = color.ch.blue >> 3; /* 5 - 2 = 3*/ - return ret.full; -#endif #elif LV_COLOR_DEPTH == 32 lv_color8_t ret; - ret.ch.red = color.ch.red >> 5; /* 8 - 3 = 5*/ - ret.ch.green = color.ch.green >> 5; /* 8 - 3 = 5*/ - ret.ch.blue = color.ch.blue >> 6; /* 8 - 2 = 6*/ + LV_COLOR_SET_R8(ret, LV_COLOR_GET_R(color) >> 5); /* 8 - 3 = 5*/ + LV_COLOR_SET_G8(ret, LV_COLOR_GET_G(color) >> 5); /* 8 - 3 = 5*/ + LV_COLOR_SET_B8(ret, LV_COLOR_GET_B(color) >> 6); /* 8 - 2 = 6*/ return ret.full; #endif } static inline uint16_t lv_color_to16(lv_color_t color) { + #if LV_COLOR_DEPTH == 1 if(color.full == 0) return 0; @@ -258,34 +352,30 @@ static inline uint16_t lv_color_to16(lv_color_t color) return 0xFFFF; #elif LV_COLOR_DEPTH == 8 lv_color16_t ret; + LV_COLOR_SET_R16(ret, LV_COLOR_GET_R(color) * 4); /*(2^5 - 1)/(2^3 - 1) = 31/7 = 4*/ #if LV_COLOR_16_SWAP == 0 - ret.ch.red = color.ch.red * 4; /*(2^5 - 1)/(2^3 - 1) = 31/7 = 4*/ - ret.ch.green = color.ch.green * 9; /*(2^6 - 1)/(2^3 - 1) = 63/7 = 9*/ - ret.ch.blue = color.ch.blue * 10; /*(2^5 - 1)/(2^2 - 1) = 31/3 = 10*/ + LV_COLOR_SET_G16(ret, LV_COLOR_GET_G(color) * 9); /*(2^6 - 1)/(2^3 - 1) = 63/7 = 9*/ #else - ret.red = color.ch.red * 4; - uint8_t g_tmp = color.ch.green * 9; - ret.ch.green_h = (g_tmp & 0x1F) >> 3; - ret.ch.green_l = g_tmp & 0x07; - ret.ch.blue = color.ch.blue * 10; + LV_COLOR_SET_G16_SWAP(ret, (LV_COLOR_GET_G(color) * 9)); /*(2^6 - 1)/(2^3 - 1) = 63/7 = 9*/ #endif + LV_COLOR_SET_B16(ret, LV_COLOR_GET_B(color) * 10); /*(2^5 - 1)/(2^2 - 1) = 31/3 = 10*/ return ret.full; #elif LV_COLOR_DEPTH == 16 return color.full; #elif LV_COLOR_DEPTH == 32 lv_color16_t ret; + LV_COLOR_SET_R16(ret, LV_COLOR_GET_R(color) >> 3); /* 8 - 5 = 3*/ + #if LV_COLOR_16_SWAP == 0 - ret.ch.red = color.ch.red >> 3; /* 8 - 5 = 3*/ - ret.ch.green = color.ch.green >> 2; /* 8 - 6 = 2*/ - ret.ch.blue = color.ch.blue >> 3; /* 8 - 5 = 3*/ + LV_COLOR_SET_G16(ret, LV_COLOR_GET_G(color) >> 2); /* 8 - 6 = 2*/ #else - ret.ch.red = color.ch.red >> 3; - ret.ch.green_h = (color.ch.green & 0xE0) >> 5; - ret.ch.green_l = (color.ch.green & 0x1C) >> 2; - ret.ch.blue = color.ch.blue >> 3; + LV_COLOR_SET_G16_SWAP(ret, ret.ch.green_h = (LV_COLOR_GET_G(color) >> 2); /*(2^6 - 1)/(2^3 - 1) = 63/7 = 9*/ #endif + LV_COLOR_SET_B16(ret, LV_COLOR_GET_B(color) >> 3); /* 8 - 5 = 3*/ return ret.full; #endif + + return 0; } static inline uint32_t lv_color_to32(lv_color_t color) @@ -297,52 +387,68 @@ static inline uint32_t lv_color_to32(lv_color_t color) return 0xFFFFFFFF; #elif LV_COLOR_DEPTH == 8 lv_color32_t ret; - ret.ch.red = color.ch.red * 36; /*(2^8 - 1)/(2^3 - 1) = 255/7 = 36*/ - ret.ch.green = color.ch.green * 36; /*(2^8 - 1)/(2^3 - 1) = 255/7 = 36*/ - ret.ch.blue = color.ch.blue * 85; /*(2^8 - 1)/(2^2 - 1) = 255/3 = 85*/ - ret.ch.alpha = 0xFF; + LV_COLOR_SET_R32(ret, LV_COLOR_GET_R(color) * 36); /*(2^8 - 1)/(2^3 - 1) = 255/7 = 36*/ + LV_COLOR_SET_G32(ret, LV_COLOR_GET_G(color) * 36); /*(2^8 - 1)/(2^3 - 1) = 255/7 = 36*/ + LV_COLOR_SET_B32(ret, LV_COLOR_GET_B(color) * 85); /*(2^8 - 1)/(2^2 - 1) = 255/3 = 85*/ + LV_COLOR_SET_A32(ret, 0xFF); return ret.full; #elif LV_COLOR_DEPTH == 16 -#if LV_COLOR_16_SWAP == 0 + /** + * The floating point math for conversion is: + * valueto = valuefrom * ( (2^bitsto - 1) / (float)(2^bitsfrom - 1) ) + * The faster integer math for conversion is: + * valueto = ( valuefrom * multiplier + adder ) >> divisor + * multiplier = FLOOR( ( (2^bitsto - 1) << divisor ) / (float)(2^bitsfrom - 1) ) + * + * Find the first divisor where ( adder >> divisor ) <= 0 + * + * 5-bit to 8-bit: ( 31 * multiplier + adder ) >> divisor = 255 + * divisor multiplier adder min (0) max (31) + * 0 8 7 7 255 + * 1 16 14 7 255 + * 2 32 28 7 255 + * 3 65 25 3 255 + * 4 131 19 1 255 + * 5 263 7 0 255 + * + * 6-bit to 8-bit: 255 = ( 63 * multiplier + adder ) >> divisor + * divisor multiplier adder min (0) max (63) + * 0 4 3 3 255 + * 1 8 6 3 255 + * 2 16 12 3 255 + * 3 32 24 3 255 + * 4 64 48 3 255 + * 5 129 33 1 255 + * 6 259 3 0 255 + */ lv_color32_t ret; - ret.ch.red = color.ch.red * 8; /*(2^8 - 1)/(2^5 - 1) = 255/31 = 8*/ - ret.ch.green = color.ch.green * 4; /*(2^8 - 1)/(2^6 - 1) = 255/63 = 4*/ - ret.ch.blue = color.ch.blue * 8; /*(2^8 - 1)/(2^5 - 1) = 255/31 = 8*/ - ret.ch.alpha = 0xFF; + LV_COLOR_SET_R32(ret, (LV_COLOR_GET_R(color) * 263 + 7 ) >> 5); + LV_COLOR_SET_G32(ret, (LV_COLOR_GET_G(color) * 259 + 3 ) >> 6); + LV_COLOR_SET_B32(ret, (LV_COLOR_GET_B(color) * 263 + 7 ) >> 5); + LV_COLOR_SET_A32(ret, 0xFF); return ret.full; -#else - lv_color32_t ret; - ret.ch.red = color.ch.red * 8; /*(2^8 - 1)/(2^5 - 1) = 255/31 = 8*/ - ret.ch.green = ((color.ch.green_h << 3) + color.ch.green_l) * 4; /*(2^8 - 1)/(2^6 - 1) = 255/63 = 4*/ - ret.ch.blue = color.ch.blue * 8; /*(2^8 - 1)/(2^5 - 1) = 255/31 = 8*/ - ret.ch.alpha = 0xFF; - return ret.full; -#endif #elif LV_COLOR_DEPTH == 32 return color.full; #endif } +/** + * Mix two colors with a given ratio. + * @param c1 + * @param c2 + * @param mix The ratio of the colors. 0: full `c2`, 255: full `c1`, 127: half `c1` and half`c2` + * @return the mixed color + * @note 255 won't give clearly `c1`. + */ static inline lv_color_t lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix) { lv_color_t ret; #if LV_COLOR_DEPTH != 1 /*LV_COLOR_DEPTH == 8, 16 or 32*/ - ret.ch.red = (uint16_t)((uint16_t)c1.ch.red * mix + (c2.ch.red * (255 - mix))) >> 8; -#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP - /*If swapped Green is in 2 parts*/ - uint16_t g_1 = (c1.ch.green_h << 3) + c1.ch.green_l; - uint16_t g_2 = (c2.ch.green_h << 3) + c2.ch.green_l; - uint16_t g_out = (uint16_t)((uint16_t)g_1 * mix + (g_2 * (255 - mix))) >> 8; - ret.ch.green_h = g_out >> 3; - ret.ch.green_l = g_out & 0x7; -#else - ret.ch.green = (uint16_t)((uint16_t)c1.ch.green * mix + (c2.ch.green * (255 - mix))) >> 8; -#endif - ret.ch.blue = (uint16_t)((uint16_t)c1.ch.blue * mix + (c2.ch.blue * (255 - mix))) >> 8; -#if LV_COLOR_DEPTH == 32 - ret.ch.alpha = 0xFF; -#endif + LV_COLOR_SET_R(ret, (uint16_t)((uint16_t) LV_COLOR_GET_R(c1) * mix + LV_COLOR_GET_R(c2) * (255 - mix)) >> 8); + LV_COLOR_SET_G(ret, (uint16_t)((uint16_t) LV_COLOR_GET_G(c1) * mix + LV_COLOR_GET_G(c2) * (255 - mix)) >> 8); + LV_COLOR_SET_B(ret, (uint16_t)((uint16_t) LV_COLOR_GET_B(c1) * mix + LV_COLOR_GET_B(c2) * (255 - mix)) >> 8); + LV_COLOR_SET_A(ret, 0xFF); #else /*LV_COLOR_DEPTH == 1*/ ret.full = mix > LV_OPA_50 ? c1.full : c2.full; @@ -351,6 +457,66 @@ static inline lv_color_t lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix) return ret; } +/** + * Mix two colors. Both color can have alpha value. It requires ARGB888 colors. + * @param bg_color background color + * @param bg_opa alpha of the background color + * @param fg_color foreground color + * @param fg_opa alpha of the foreground color + * @param res_color the result color + * @param res_opa the result opacity + */ +static inline void lv_color_mix_with_alpha(lv_color_t bg_color, lv_opa_t bg_opa, lv_color_t fg_color, lv_opa_t fg_opa, lv_color_t * res_color, lv_opa_t * res_opa) +{ + /* Pick the foreground if it's fully opaque or the Background is fully transparent*/ + if(fg_opa > LV_OPA_MAX || bg_opa <= LV_OPA_MIN) { + res_color->full = fg_color.full; + *res_opa = fg_opa; + } + /*Transparent foreground: use the Background*/ + else if(fg_opa <= LV_OPA_MIN) { + res_color->full = bg_color.full; + *res_opa = bg_opa; + } + /*Opaque background: use simple mix*/ + else if(bg_opa >= LV_OPA_MAX) { + *res_color = lv_color_mix(fg_color, bg_color, fg_opa); + *res_opa = LV_OPA_COVER; + } + /*Both colors have alpha. Expensive calculation need to be applied*/ + else { + /*Save the parameters and the result. If they will be asked again don't compute again*/ + static lv_opa_t fg_opa_save = 0; + static lv_opa_t bg_opa_save = 0; + static lv_color_t fg_color_save = {{0}}; + static lv_color_t bg_color_save = {{0}}; + static lv_color_t res_color_saved = {{0}}; + static lv_opa_t res_opa_saved = 0; + + if(fg_opa != fg_opa_save || bg_opa != bg_opa_save || fg_color.full != fg_color_save.full || + bg_color.full != bg_color_save.full) { + fg_opa_save = fg_opa; + bg_opa_save = bg_opa; + fg_color_save.full = fg_color.full; + bg_color_save.full = bg_color.full; + /*Info: + * https://en.wikipedia.org/wiki/Alpha_compositing#Analytical_derivation_of_the_over_operator*/ + res_opa_saved = 255 - ((uint16_t)((uint16_t)(255 - fg_opa) * (255 - bg_opa)) >> 8); + if(res_opa_saved == 0) { + while(1) + ; + } + lv_opa_t ratio = (uint16_t)((uint16_t)fg_opa * 255) / res_opa_saved; + res_color_saved = lv_color_mix(fg_color, bg_color, ratio); + + } + + res_color->full = res_color_saved.full; + *res_opa = res_opa_saved; + } +} + + /** * Get the brightness of a color * @param color a color @@ -360,65 +526,30 @@ static inline uint8_t lv_color_brightness(lv_color_t color) { lv_color32_t c32; c32.full = lv_color_to32(color); - uint16_t bright = 3 * c32.ch.red + c32.ch.blue + 4 * c32.ch.green; - return (uint16_t)bright >> 3; + uint16_t bright = (uint16_t)(3u * LV_COLOR_GET_R32(c32) + LV_COLOR_GET_B32(c32) + 4u * LV_COLOR_GET_G32(c32)); + return (uint8_t)(bright >> 3); } /* The most simple macro to create a color from R,G and B values */ #if LV_COLOR_DEPTH == 1 -#define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){(b8 >> 7 | g8 >> 7 | r8 >> 7)}) -static inline lv_color_t lv_color_make(int r8, int g8, int b8) -{ - lv_color_t color; - color.full = (b8 >> 7 | g8 >> 7 | r8 >> 7); - return color; -} +#define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){.full = (b8 >> 7 | g8 >> 7 | r8 >> 7)}) #elif LV_COLOR_DEPTH == 8 -#define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){{b8 >> 6, g8 >> 5, r8 >> 5}}) -static inline lv_color_t lv_color_make(uint8_t r8, int g8, int b8) -{ - lv_color_t color; - color.ch.blue = b8 >> 6; - color.ch.green = g8 >> 5; - color.ch.red = r8 >> 5; - return color; -} +#define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){{(uint8_t)(b8 >> 6), (uint8_t)(g8 >> 5), (uint8_t)(r8 >> 5)}}) #elif LV_COLOR_DEPTH == 16 #if LV_COLOR_16_SWAP == 0 -#define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){{b8 >> 3, g8 >> 2, r8 >> 3}}) -static inline lv_color_t lv_color_make(uint8_t r8, uint8_t g8, uint8_t b8) -{ - lv_color_t color; - color.ch.blue = (uint16_t)(b8 >> 3); - color.ch.green = (uint16_t)(g8 >> 2); - color.ch.red = (uint16_t)(r8 >> 3); - return color; -} +#define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){{(uint16_t)(b8 >> 3), (uint16_t)(g8 >> 2), (uint16_t)(r8 >> 3)}}) #else -#define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){{g8 >> 5, r8 >> 3, b8 >> 3, (g8 >> 2) & 0x7}}) -static inline lv_color_t lv_color_make(uint8_t r8, uint8_t g8, uint8_t b8) -{ - lv_color_t color; - color.ch.green_h = (uint16_t)(g8 >> 5); - color.ch.red = (uint16_t)(r8 >> 3); - color.ch.blue = (uint16_t)(b8 >> 3); - color.ch.green_l = (uint16_t)((g8 >> 2) & 0x7); - return color; -} +#define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){{((uint16_t)(g8 >> 5), (uint16_t)(r8 >> 3), (uint16_t)(b8 >> 3), (uint16_t)((g8 >> 2) & 0x7)}}) #endif #elif LV_COLOR_DEPTH == 32 #define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){{b8, g8, r8, 0xff}}) /*Fix 0xff alpha*/ -static inline lv_color_t lv_color_make(uint8_t r8, uint8_t g8, uint8_t b8) -{ - lv_color_t color; - color.ch.blue = b8; - color.ch.green = g8; - color.ch.red = r8; - color.ch.alpha = 0xff; - return color; -} #endif +static inline lv_color_t lv_color_make(uint8_t r, uint8_t g, uint8_t b) +{ + return LV_COLOR_MAKE(r, g, b); +} + static inline lv_color_t lv_color_hex(uint32_t c) { return lv_color_make((uint8_t)((c >> 16) & 0xFF), (uint8_t)((c >> 8) & 0xFF), (uint8_t)(c & 0xFF)); @@ -440,13 +571,20 @@ static inline lv_color_t lv_color_hex3(uint32_t c) lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v); /** - * Convert an RGB color to HSV - * @param r red - * @param g green - * @param b blue - * @return the given RGB color n HSV + * Convert a 32-bit RGB color to HSV + * @param r8 8-bit red + * @param g8 8-bit green + * @param b8 8-bit blue + * @return the given RGB color in HSV */ -lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r, uint8_t g, uint8_t b); +lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r8, uint8_t g8, uint8_t b8); + +/** + * Convert a color to HSV + * @param color color + * @return the given color in HSV + */ +lv_color_hsv_t lv_color_to_hsv(lv_color_t color); /********************** * MACROS diff --git a/src/lv_misc/lv_fs.c b/src/lv_misc/lv_fs.c index ddf8f3810..d4343c411 100644 --- a/src/lv_misc/lv_fs.c +++ b/src/lv_misc/lv_fs.c @@ -9,6 +9,7 @@ #include "lv_fs.h" #if LV_USE_FILESYSTEM +#include "../lv_core/lv_debug.h" #include "lv_ll.h" #include #include "lv_gc.h" @@ -107,7 +108,7 @@ lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mo } file_p->file_d = lv_mem_alloc(file_p->drv->file_size); - lv_mem_assert(file_p->file_d); + LV_ASSERT_MEM(file_p->file_d); if(file_p->file_d == NULL) { file_p->drv = NULL; return LV_FS_RES_OUT_OF_MEM; /* Out of memory */ @@ -367,7 +368,7 @@ lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path) } rddir_p->dir_d = lv_mem_alloc(rddir_p->drv->rddir_size); - lv_mem_assert(rddir_p->dir_d); + LV_ASSERT_MEM(rddir_p->dir_d); if(rddir_p->dir_d == NULL) { rddir_p->dir_d = NULL; return LV_FS_RES_OUT_OF_MEM; /* Out of memory */ @@ -486,7 +487,7 @@ void lv_fs_drv_register(lv_fs_drv_t * drv_p) /*Save the new driver*/ lv_fs_drv_t * new_drv; new_drv = lv_ll_ins_head(&LV_GC_ROOT(_lv_drv_ll)); - lv_mem_assert(new_drv); + LV_ASSERT_MEM(new_drv); if(new_drv == NULL) return; memcpy(new_drv, drv_p, sizeof(lv_fs_drv_t)); @@ -538,7 +539,7 @@ char * lv_fs_get_letters(char * buf) */ const char * lv_fs_get_ext(const char * fn) { - uint16_t i; + size_t i; for(i = strlen(fn); i > 0; i--) { if(fn[i] == '.') { return &fn[i + 1]; @@ -557,7 +558,7 @@ const char * lv_fs_get_ext(const char * fn) */ char * lv_fs_up(char * path) { - uint16_t len = strlen(path); + size_t len = strlen(path); if(len == 0) return path; len--; /*Go before the trailing '\0'*/ @@ -588,7 +589,7 @@ char * lv_fs_up(char * path) */ const char * lv_fs_get_last(const char * path) { - uint16_t len = strlen(path); + size_t len = strlen(path); if(len == 0) return path; len--; /*Go before the trailing '\0'*/ diff --git a/src/lv_misc/lv_fs.h b/src/lv_misc/lv_fs.h index 5b86b8efd..f18242820 100644 --- a/src/lv_misc/lv_fs.h +++ b/src/lv_misc/lv_fs.h @@ -29,6 +29,7 @@ extern "C" { * DEFINES *********************/ #define LV_FS_MAX_FN_LENGTH 64 +#define LV_FS_MAX_PATH_LENGTH 256 /********************** * TYPEDEFS diff --git a/src/lv_misc/lv_gc.h b/src/lv_misc/lv_gc.h index 0db9f5cb9..64bc178f3 100644 --- a/src/lv_misc/lv_gc.h +++ b/src/lv_misc/lv_gc.h @@ -25,6 +25,7 @@ extern "C" { #include "lv_mem.h" #include "lv_ll.h" #include "../lv_draw/lv_img_cache.h" +#include "../lv_draw/lv_draw.h" /********************* * DEFINES @@ -41,7 +42,7 @@ extern "C" { prefix lv_ll_t _lv_img_defoder_ll; \ prefix lv_img_cache_entry_t * _lv_img_cache_array; \ prefix void * _lv_task_act; \ - prefix void * _lv_draw_buf; + prefix lv_mem_buf_t _lv_mem_buf[LV_MEM_BUF_MAX_NUM]; \ #define LV_NO_PREFIX #define LV_ROOTS LV_GC_ROOTS(LV_NO_PREFIX) diff --git a/src/lv_misc/lv_ll.c b/src/lv_misc/lv_ll.c index 7077fff1f..3f39e71e7 100644 --- a/src/lv_misc/lv_ll.c +++ b/src/lv_misc/lv_ll.c @@ -160,7 +160,7 @@ void * lv_ll_ins_tail(lv_ll_t * ll_p) * @param ll_p pointer to the linked list of 'node_p' * @param node_p pointer to node in 'll_p' linked list */ -void lv_ll_rem(lv_ll_t * ll_p, void * node_p) +void lv_ll_remove(lv_ll_t * ll_p, void * node_p) { if(lv_ll_get_head(ll_p) == node_p) { /*The new head will be the node after 'n_act'*/ @@ -202,7 +202,7 @@ void lv_ll_clear(lv_ll_t * ll_p) while(i != NULL) { i_next = lv_ll_get_next(ll_p, i); - lv_ll_rem(ll_p, i); + lv_ll_remove(ll_p, i); lv_mem_free(i); i = i_next; @@ -219,7 +219,7 @@ void lv_ll_clear(lv_ll_t * ll_p) */ void lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head) { - lv_ll_rem(ll_ori_p, node); + lv_ll_remove(ll_ori_p, node); if(head) { /*Set node as head*/ @@ -362,7 +362,7 @@ void lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after) if(n_act == n_before) return; /*Already before `n_after`*/ /*It's much easier to remove from the list and add again*/ - lv_ll_rem(ll_p, n_act); + lv_ll_remove(ll_p, n_act); /*Add again by setting the prev. and next nodes*/ node_set_next(ll_p, n_before, n_act); diff --git a/src/lv_misc/lv_ll.h b/src/lv_misc/lv_ll.h index 2c02eb480..3c05c1e90 100644 --- a/src/lv_misc/lv_ll.h +++ b/src/lv_misc/lv_ll.h @@ -76,7 +76,7 @@ void * lv_ll_ins_tail(lv_ll_t * ll_p); * @param ll_p pointer to the linked list of 'node_p' * @param node_p pointer to node in 'll_p' linked list */ -void lv_ll_rem(lv_ll_t * ll_p, void * node_p); +void lv_ll_remove(lv_ll_t * ll_p, void * node_p); /** * Remove and free all elements from a linked list. The list remain valid but become empty. @@ -131,6 +131,14 @@ void * lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act); */ uint32_t lv_ll_get_len(const lv_ll_t * ll_p); +/** + * TODO + * @param ll_p + * @param n1_p + * @param n2_p + */ +void lv_ll_swap(lv_ll_t * ll_p, void * n1_p, void * n2_p); + /** * Move a nodw before an other node in the same linked list * @param ll_p pointer to a linked list diff --git a/src/lv_misc/lv_log.c b/src/lv_misc/lv_log.c index 2d12da4e1..acbdfb732 100644 --- a/src/lv_misc/lv_log.c +++ b/src/lv_misc/lv_log.c @@ -12,6 +12,7 @@ #if LV_LOG_PRINTF #include #endif + /********************* * DEFINES *********************/ diff --git a/src/lv_misc/lv_log.h b/src/lv_misc/lv_log.h index 6a6c2d2a4..62c613b43 100644 --- a/src/lv_misc/lv_log.h +++ b/src/lv_misc/lv_log.h @@ -33,6 +33,12 @@ extern "C" { #define LV_LOG_LEVEL_NONE 4 /**< Do not log anything*/ #define _LV_LOG_LEVEL_NUM 5 /**< Number of log levels */ +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_TRACE); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_INFO); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_WARN); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_ERROR); +LV_EXPORT_CONST_INT(LV_LOG_LEVEL_NONE); + typedef int8_t lv_log_level_t; #if LV_USE_LOG diff --git a/src/lv_misc/lv_math.c b/src/lv_misc/lv_math.c index ea332b61b..77db624c4 100644 --- a/src/lv_misc/lv_math.c +++ b/src/lv_misc/lv_math.c @@ -9,6 +9,7 @@ #include "lv_math.h" #include #include +#include /********************* * DEFINES @@ -93,6 +94,223 @@ int32_t lv_bezier3(uint32_t t, int32_t u0, int32_t u1, int32_t u2, int32_t u3) return v1 + v2 + v3 + v4; } +#define BITSPERLONG 32 + +#define TOP2BITS(x) ((x & (3L << (BITSPERLONG-2))) >> (BITSPERLONG-2)) + +void lv_sqrt(uint32_t x, lv_sqrt_res_t * q) +{ + + if(x == 0) { + q->f = 0; + q->i = 0; + return; + } + + /*Look up for x=1..1024*/ + /*Look up for x=1..1024*/ + static const uint8_t ci[] = { + 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, + }; + + static const uint8_t cf[] = { + 0, 106, 187, 0, 60, 115, 165, 212, 0, 42, 81, 119, 155, 190, 223, 0, 32, 62, 92, 121, 149, 177, 204, 230, + 0, 25, 50, 75, 99, 122, 145, 168, 191, 213, 235, 0, 21, 42, 63, 83, 103, 123, 143, 162, 181, 200, 219, + 238, 0, 18, 36, 54, 72, 89, 107, 124, 141, 158, 174, 191, 207, 224, 240, 0, 16, 32, 47, 63, 78, 94, 109, + 124, 139, 154, 169, 184, 198, 213, 227, 242, 0, 14, 28, 42, 56, 70, 84, 97, 111, 125, 138, 151, 165, 178, + 191, 204, 217, 230, 243, 0, 13, 25, 38, 51, 63, 76, 88, 100, 113, 125, 137, 149, 161, 173, 185, 197, 209, + 221, 233, 244, 0, 12, 23, 35, 46, 58, 69, 80, 92, 103, 114, 125, 136, 147, 158, 169, 180, 191, 202, 213, + 224, 235, 245, 0, 11, 21, 32, 42, 53, 63, 74, 84, 95, 105, 115, 125, 136, 146, 156, 166, 176, 186, 196, + 206, 216, 226, 236, 246, 0, 10, 20, 29, 39, 49, 59, 68, 78, 87, 97, 107, 116, 126, 135, 145, 154, 163, + 173, 182, 191, 201, 210, 219, 228, 238, 247, 0, 9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 99, 108, 117, 126, + 135, 143, 152, 161, 170, 178, 187, 196, 204, 213, 222, 230, 239, 247, 0, 9, 17, 26, 34, 42, 51, 59, 68, + 76, 84, 93, 101, 109, 118, 126, 134, 142, 151, 159, 167, 175, 183, 191, 200, 208, 216, 224, 232, 240, 248, + 0, 8, 16, 24, 32, 40, 48, 56, 64, 71, 79, 87, 95, 103, 111, 118, 126, 134, 142, 149, 157, 165, 172, 180, + 188, 195, 203, 211, 218, 226, 233, 241, 248, 0, 8, 15, 23, 30, 37, 45, 52, 60, 67, 75, 82, 89, 97, 104, + 112, 119, 126, 133, 141, 148, 155, 163, 170, 177, 184, 192, 199, 206, 213, 220, 227, 235, 242, 249, 0, 7, + 14, 21, 28, 35, 42, 50, 57, 64, 71, 78, 85, 92, 99, 105, 112, 119, 126, 133, 140, 147, 154, 161, 168, 174, + 181, 188, 195, 202, 209, 215, 222, 229, 236, 243, 249, 0, 7, 13, 20, 27, 34, 40, 47, 54, 60, 67, 74, 80, + 87, 93, 100, 107, 113, 120, 126, 133, 139, 146, 153, 159, 166, 172, 179, 185, 192, 198, 205, 211, 217, + 224, 230, 237, 243, 250, 0, 6, 13, 19, 26, 32, 38, 45, 51, 57, 64, 70, 76, 83, 89, 95, 101, 108, 114, 120, + 126, 133, 139, 145, 151, 158, 164, 170, 176, 182, 189, 195, 201, 207, 213, 219, 225, 232, 238, 244, 250, + 0, 6, 12, 18, 24, 30, 36, 42, 49, 55, 61, 67, 73, 79, 85, 91, 97, 103, 109, 115, 121, 127, 132, 138, 144, + 150, 156, 162, 168, 174, 180, 186, 192, 198, 203, 209, 215, 221, 227, 233, 239, 244, 250, 0, 6, 12, 17, + 23, 29, 35, 41, 46, 52, 58, 64, 69, 75, 81, 87, 92, 98, 104, 109, 115, 121, 127, 132, 138, 144, 149, 155, + 161, 166, 172, 178, 183, 189, 194, 200, 206, 211, 217, 223, 228, 234, 239, 245, 250, 0, 6, 11, 17, 22, 28, + 33, 39, 44, 50, 55, 61, 66, 72, 77, 83, 88, 94, 99, 105, 110, 116, 121, 127, 132, 138, 143, 148, 154, 159, + 165, 170, 175, 181, 186, 192, 197, 202, 208, 213, 219, 224, 229, 235, 240, 245, 251, 0, 5, 11, 16, 21, 27, + 32, 37, 43, 48, 53, 58, 64, 69, 74, 79, 85, 90, 95, 101, 106, 111, 116, 121, 127, 132, 137, 142, 148, 153, + 158, 163, 168, 174, 179, 184, 189, 194, 199, 205, 210, 215, 220, 225, 230, 235, 241, 246, 251, 0, 5, 10, + 15, 20, 26, 31, 36, 41, 46, 51, 56, 61, 66, 71, 76, 81, 86, 92, 97, 102, 107, 112, 117, 122, 127, 132, + 137, 142, 147, 152, 157, 162, 167, 172, 177, 182, 187, 192, 197, 202, 207, 212, 216, 221, 226, 231, 236, + 241, 246, 251, 0, 5, 10, 15, 20, 25, 29, 34, 39, 44, 49, 54, 59, 64, 69, 73, 78, 83, 88, 93, 98, 103, 107, + 112, 117, 122, 127, 132, 136, 141, 146, 151, 156, 161, 165, 170, 175, 180, 185, 189, 194, 199, 204, 208, + 213, 218, 223, 227, 232, 237, 242, 247, 251, 0, 5, 9, 14, 19, 24, 28, 33, 38, 43, 47, 52, 57, 61, 66, 71, + 75, 80, 85, 89, 94, 99, 104, 108, 113, 118, 122, 127, 131, 136, 141, 145, 150, 155, 159, 164, 169, 173, + 178, 182, 187, 192, 196, 201, 206, 210, 215, 219, 224, 229, 233, 238, 242, 247, 251, 0, 5, 9, 14, 18, 23, + 27, 32, 36, 41, 46, 50, 55, 59, 64, 68, 73, 77, 82, 86, 91, 95, 100, 104, 109, 113, 118, 122, 127, 131, + 136, 140, 145, 149, 154, 158, 163, 167, 172, 176, 181, 185, 189, 194, 198, 203, 207, 212, 216, 221, 225, + 229, 234, 238, 243, 247, 252, 0, 4, 9, 13, 18, 22, 26, 31, 35, 40, 44, 48, 53, 57, 62, 66, 70, 75, 79, 83, + 88, 92, 96, 101, 105, 110, 114, 118, 123, 127, 131, 136, 140, 144, 149, 153, 157, 162, 166, 170, 175, 179, + 183, 187, 192, 196, 200, 205, 209, 213, 218, 222, 226, 230, 235, 239, 243, 247, 252, 0, 4, 9, 13, 17, 21, + 26, 30, 34, 38, 43, 47, 51, 55, 60, 64, 68, 72, 76, 81, 85, 89, 93, 98, 102, 106, 110, 114, 119, 123, + 127, 131, 135, 140, 144, 148, 152, 156, 160, 165, 169, 173, 177, 181, 185, 190, 194, 198, 202, 206, 210, + 215, 219, 223, 227, 231, 235, 239, 244, 248, 252, 0, 4, 8, 12, 16, 21, 25, 29, 33, 37, 41, 45, 49, 53, 58, + 62, 66, 70, 74, 78, 82, 86, 90, 94, 98, 103, 107, 111, 115, 119, 123, 127, 131, 135, 139, 143, 147, 151, + 155, 159, 163, 168, 172, 176, 180, 184, 188, 192, 196, 200, 204, 208, 212, 216, 220, 224, 228, 232, 236, + 240, 244, 248, 252, 0, + + }; + if(x <= 64) { + x--; + q->i = ci[x]; + q->f = cf[x]; + return; + } + + /* + * Source: + * http://web.archive.org/web/20080303101624/http://c.snippets.org/snip_lister.php?fname=isqrt.c + * https://stackoverflow.com/questions/1100090/looking-for-an-efficient-integer-square-root-algorithm-for-arm-thumb2 + */ + + uint32_t a = 0L; /* accumulator */ + uint32_t r = 0L; /* remainder */ + uint32_t e = 0L; /* trial product */ + + uint32_t i; + for (i = 0; i < BITSPERLONG / 2 + 8; i++) { + r = (r << 2) + TOP2BITS(x); x <<= 2; + a <<= 1; + e = (a << 1) + 1; + if (r >= e) { + r -= e; + a++; + } + } + + q->f = a & 0xFF; + q->i = a >> 8; +} + +/** + * Calculate the atan2 of a vector. + * @param x + * @param y + * @return the angle in degree calculated from the given parameters in range of [0..360] + */ +uint16_t lv_atan2(int x, int y) +{ + // Fast XY vector to integer degree algorithm - Jan 2011 www.RomanBlack.com + // Converts any XY values including 0 to a degree value that should be + // within +/- 1 degree of the accurate value without needing + // large slow trig functions like ArcTan() or ArcCos(). + // NOTE! at least one of the X or Y values must be non-zero! + // This is the full version, for all 4 quadrants and will generate + // the angle in integer degrees from 0-360. + // Any values of X and Y are usable including negative values provided + // they are between -1456 and 1456 so the 16bit multiply does not overflow. + + unsigned char negflag; + unsigned char tempdegree; + unsigned char comp; + unsigned int degree; // this will hold the result + //signed int x; // these hold the XY vector at the start + //signed int y; // (and they will be destroyed) + unsigned int ux; + unsigned int uy; + + // Save the sign flags then remove signs and get XY as unsigned ints + negflag = 0; + if(x < 0) { + negflag += 0x01; // x flag bit + x = (0 - x); // is now + + } + ux = x; // copy to unsigned var before multiply + if(y < 0) { + negflag += 0x02; // y flag bit + y = (0 - y); // is now + + } + uy = y; // copy to unsigned var before multiply + + // 1. Calc the scaled "degrees" + if(ux > uy) { + degree = (uy * 45) / ux; // degree result will be 0-45 range + negflag += 0x10; // octant flag bit + } else { + degree = (ux * 45) / uy; // degree result will be 0-45 range + } + + // 2. Compensate for the 4 degree error curve + comp = 0; + tempdegree = degree; // use an unsigned char for speed! + if(tempdegree > 22) { // if top half of range + if(tempdegree <= 44) comp++; + if(tempdegree <= 41) comp++; + if(tempdegree <= 37) comp++; + if(tempdegree <= 32) comp++; // max is 4 degrees compensated + } else { // else is lower half of range + if(tempdegree >= 2) comp++; + if(tempdegree >= 6) comp++; + if(tempdegree >= 10) comp++; + if(tempdegree >= 15) comp++; // max is 4 degrees compensated + } + degree += comp; // degree is now accurate to +/- 1 degree! + + // Invert degree if it was X>Y octant, makes 0-45 into 90-45 + if(negflag & 0x10) degree = (90 - degree); + + // 3. Degree is now 0-90 range for this quadrant, + // need to invert it for whichever quadrant it was in + if(negflag & 0x02) { // if -Y + if(negflag & 0x01) // if -Y -X + degree = (180 + degree); + else // else is -Y +X + degree = (180 - degree); + } else { // else is +Y + if(negflag & 0x01) // if +Y -X + degree = (360 - degree); + } + return degree; +} /********************** * STATIC FUNCTIONS diff --git a/src/lv_misc/lv_math.h b/src/lv_misc/lv_math.h index 83ace3a54..2782e887a 100644 --- a/src/lv_misc/lv_math.h +++ b/src/lv_misc/lv_math.h @@ -32,6 +32,12 @@ extern "C" { * TYPEDEFS **********************/ +typedef struct { + uint16_t i; + uint16_t f; + }lv_sqrt_res_t; + + /********************** * GLOBAL PROTOTYPES **********************/ @@ -54,6 +60,16 @@ int16_t lv_trigo_sin(int16_t angle); */ int32_t lv_bezier3(uint32_t t, int32_t u0, int32_t u1, int32_t u2, int32_t u3); +void lv_sqrt(uint32_t x, lv_sqrt_res_t * q); + +/** + * Calculate the atan2 of a vector. + * @param x + * @param y + * @return the angle in degree calculated from the given parameters in range of [0..360] + */ +uint16_t lv_atan2(int x, int y); + /********************** * MACROS **********************/ diff --git a/src/lv_misc/lv_mem.c b/src/lv_misc/lv_mem.c index 9812a95c4..8cd815cdb 100644 --- a/src/lv_misc/lv_mem.c +++ b/src/lv_misc/lv_mem.c @@ -9,6 +9,7 @@ *********************/ #include "lv_mem.h" #include "lv_math.h" +#include "lv_gc.h" #include #if LV_MEM_CUSTOM != 0 @@ -19,7 +20,9 @@ * DEFINES *********************/ /*Add memory junk on alloc (0xaa) and free(0xbb) (just for testing purposes)*/ -#define LV_MEM_ADD_JUNK 1 +#ifndef LV_MEM_ADD_JUNK +#define LV_MEM_ADD_JUNK 0 +#endif #ifdef LV_MEM_ENV64 #define MEM_UNIT uint64_t @@ -105,7 +108,7 @@ void lv_mem_init(void) * @param size size of the memory to allocate in bytes * @return pointer to the allocated memory */ -void * lv_mem_alloc(uint32_t size) +void * lv_mem_alloc(size_t size) { if(size == 0) { return &zero_mem; @@ -220,7 +223,7 @@ void lv_mem_free(const void * data) #if LV_ENABLE_GC == 0 -void * lv_mem_realloc(void * data_p, uint32_t new_size) +void * lv_mem_realloc(void * data_p, size_t new_size) { /*data_p could be previously freed pointer (in this case it is invalid)*/ if(data_p != NULL) { @@ -244,8 +247,12 @@ void * lv_mem_realloc(void * data_p, uint32_t new_size) void * new_p; new_p = lv_mem_alloc(new_size); + if(new_p == NULL) { + LV_LOG_WARN("Couldn't allocate memory"); + return NULL; + } - if(new_p != NULL && data_p != NULL) { + if(data_p != NULL) { /*Copy the old data to the new. Use the smaller size*/ if(old_size != 0) { memcpy(new_p, data_p, LV_MATH_MIN(new_size, old_size)); @@ -253,7 +260,6 @@ void * lv_mem_realloc(void * data_p, uint32_t new_size) } } - if(new_p == NULL) LV_LOG_WARN("Couldn't allocate memory"); return new_p; } @@ -373,6 +379,73 @@ uint32_t lv_mem_get_size(const void * data) #endif /*LV_ENABLE_GC*/ +/** + * Get a temporal buffer with the given size. + * @param size the required size + */ +void * lv_mem_buf_get(uint32_t size) +{ + /*Try to find a free buffer with suitable size */ + uint8_t i; + for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { + if(_lv_mem_buf[i].used == 0 && _lv_mem_buf[i].size >= size) { + _lv_mem_buf[i].used = 1; + return _lv_mem_buf[i].p; + } + } + + /*Reallocate a free buffer*/ + for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { + if(_lv_mem_buf[i].used == 0) { + _lv_mem_buf[i].used = 1; + _lv_mem_buf[i].size = size; + /*if this fails you probably need to increase your LV_MEM_SIZE/heap size*/ + _lv_mem_buf[i].p = lv_mem_realloc(_lv_mem_buf[i].p, size); + if(_lv_mem_buf[i].p == NULL) { + LV_LOG_ERROR("lv_mem_buf_get: Out of memory, can't allocate a new buffer (increase your LV_MEM_SIZE/heap size)") + } + return _lv_mem_buf[i].p; + } + } + + LV_LOG_ERROR("lv_mem_buf_get: no free buffer. Increase LV_DRAW_BUF_MAX_NUM."); + + return NULL; +} + +/** + * Release a memory buffer + * @param p buffer to release + */ +void lv_mem_buf_release(void * p) +{ + uint8_t i; + for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { + if(_lv_mem_buf[i].p == p) { + _lv_mem_buf[i].used = 0; + return; + } + } + + LV_LOG_ERROR("lv_mem_buf_release: p is not a known buffer") +} + +/** + * Free all memory buffers + */ +void lv_mem_buf_free_all(void) +{ + uint8_t i; + for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { + if(_lv_mem_buf[i].p) { + lv_mem_free(_lv_mem_buf[i].p); + _lv_mem_buf[i].p = NULL; + _lv_mem_buf[i].used = 0; + _lv_mem_buf[i].size = 0; + } + } +} + /********************** * STATIC FUNCTIONS **********************/ diff --git a/src/lv_misc/lv_mem.h b/src/lv_misc/lv_mem.h index 81a3e7a2f..09944f787 100644 --- a/src/lv_misc/lv_mem.h +++ b/src/lv_misc/lv_mem.h @@ -22,20 +22,14 @@ extern "C" { #include #include #include "lv_log.h" +#include "lv_types.h" /********************* * DEFINES *********************/ -// Check windows -#ifdef __WIN64 -#define LV_MEM_ENV64 -#endif -// Check GCC -#ifdef __GNUC__ -#if defined(__x86_64__) || defined(__ppc64__) -#define LV_MEM_ENV64 -#endif +#ifndef LV_MEM_BUF_MAX_NUM +#define LV_MEM_BUF_MAX_NUM 16 #endif /********************** @@ -56,6 +50,12 @@ typedef struct uint8_t frag_pct; /**< Amount of fragmentation */ } lv_mem_monitor_t; +typedef struct { + void * p; + uint16_t size; + uint8_t used :1; +}lv_mem_buf_t; + /********************** * GLOBAL PROTOTYPES **********************/ @@ -70,7 +70,7 @@ void lv_mem_init(void); * @param size size of the memory to allocate in bytes * @return pointer to the allocated memory */ -void * lv_mem_alloc(uint32_t size); +void * lv_mem_alloc(size_t size); /** * Free an allocated data @@ -85,7 +85,7 @@ void lv_mem_free(const void * data); * @param new_size the desired new size in byte * @return pointer to the new memory */ -void * lv_mem_realloc(void * data_p, uint32_t new_size); +void * lv_mem_realloc(void * data_p, size_t new_size); /** * Join the adjacent free memory blocks @@ -106,31 +106,27 @@ void lv_mem_monitor(lv_mem_monitor_t * mon_p); */ uint32_t lv_mem_get_size(const void * data); +/** + * Get a temporal buffer with the given size. + * @param size the required size + */ +void * lv_mem_buf_get(uint32_t size); + +/** + * Release a memory buffer + * @param p buffer to release + */ +void lv_mem_buf_release(void * p); + +/** + * Free all memory buffers + */ +void lv_mem_buf_free_all(void); + /********************** * MACROS **********************/ -/** - * Halt on NULL pointer - * p pointer to a memory - */ -#if LV_USE_LOG == 0 -#define lv_mem_assert(p) \ - { \ - if(p == NULL) \ - while(1) \ - ; \ - } -#else -#define lv_mem_assert(p) \ - { \ - if(p == NULL) { \ - LV_LOG_ERROR("Out of memory!"); \ - while(1) \ - ; \ - } \ - } -#endif #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/src/lv_misc/lv_misc.mk b/src/lv_misc/lv_misc.mk index 41e4720f0..d0b682ab2 100644 --- a/src/lv_misc/lv_misc.mk +++ b/src/lv_misc/lv_misc.mk @@ -12,6 +12,8 @@ CSRCS += lv_log.c CSRCS += lv_gc.c CSRCS += lv_utils.c CSRCS += lv_async.c +CSRCS += lv_printf.c +CSRCS += lv_bidi.c DEPPATH += --dep-path $(LVGL_DIR)/lvgl/src/lv_misc VPATH += :$(LVGL_DIR)/lvgl/src/lv_misc diff --git a/src/lv_misc/lv_printf.c b/src/lv_misc/lv_printf.c new file mode 100644 index 000000000..e05f35beb --- /dev/null +++ b/src/lv_misc/lv_printf.c @@ -0,0 +1,852 @@ +/////////////////////////////////////////////////////////////////////////////// +// \author (c) Marco Paland (info@paland.com) +// 2014-2019, PALANDesign Hannover, Germany +// +// \license The MIT License (MIT) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// \brief Tiny printf, sprintf and (v)snprintf implementation, optimized for speed on +// embedded systems with a very limited resources. These routines are thread +// safe and reentrant! +// Use this instead of the bloated standard/newlib printf cause these use +// malloc for printf (and may not be thread safe). +// +/////////////////////////////////////////////////////////////////////////////// + +#include "lv_printf.h" + +#if LV_SPRINTF_CUSTOM == 0 + +#include +#include + + +// 'ntoa' conversion buffer size, this must be big enough to hold one converted +// numeric number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_NTOA_BUFFER_SIZE +#define PRINTF_NTOA_BUFFER_SIZE 32U +#endif + +// 'ftoa' conversion buffer size, this must be big enough to hold one converted +// float number including padded zeros (dynamically created on stack) +// default: 32 byte +#ifndef PRINTF_FTOA_BUFFER_SIZE +#define PRINTF_FTOA_BUFFER_SIZE 32U +#endif + +// support for the floating point type (%f) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_FLOAT +#define PRINTF_SUPPORT_FLOAT +#endif + +// support for exponential floating point notation (%e/%g) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_EXPONENTIAL +#define PRINTF_SUPPORT_EXPONENTIAL +#endif + +// define the default floating point precision +// default: 6 digits +#ifndef PRINTF_DEFAULT_FLOAT_PRECISION +#define PRINTF_DEFAULT_FLOAT_PRECISION 6U +#endif + +// define the largest float suitable to print with %f +// default: 1e9 +#ifndef PRINTF_MAX_FLOAT +#define PRINTF_MAX_FLOAT 1e9 +#endif + +// support for the long long types (%llu or %p) +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_LONG_LONG +#define PRINTF_SUPPORT_LONG_LONG +#endif + +// support for the ptrdiff_t type (%t) +// ptrdiff_t is normally defined in as long or long long type +// default: activated +#ifndef PRINTF_DISABLE_SUPPORT_PTRDIFF_T +#define PRINTF_SUPPORT_PTRDIFF_T +#endif + +/////////////////////////////////////////////////////////////////////////////// + +// internal flag definitions +#define FLAGS_ZEROPAD (1U << 0U) +#define FLAGS_LEFT (1U << 1U) +#define FLAGS_PLUS (1U << 2U) +#define FLAGS_SPACE (1U << 3U) +#define FLAGS_HASH (1U << 4U) +#define FLAGS_UPPERCASE (1U << 5U) +#define FLAGS_CHAR (1U << 6U) +#define FLAGS_SHORT (1U << 7U) +#define FLAGS_LONG (1U << 8U) +#define FLAGS_LONG_LONG (1U << 9U) +#define FLAGS_PRECISION (1U << 10U) +#define FLAGS_ADAPT_EXP (1U << 11U) + + +// import float.h for DBL_MAX +#if defined(PRINTF_SUPPORT_FLOAT) +#include +#endif + + +// output function type +typedef void (*out_fct_type)(char character, void* buffer, size_t idx, size_t maxlen); + + +// wrapper (used as buffer) for output function type +typedef struct { + void (*fct)(char character, void* arg); + void* arg; +} out_fct_wrap_type; + + +// internal buffer output +static inline void _out_buffer(char character, void* buffer, size_t idx, size_t maxlen) +{ + if (idx < maxlen) { + ((char*)buffer)[idx] = character; + } +} + + +// internal null output +static inline void _out_null(char character, void* buffer, size_t idx, size_t maxlen) +{ + (void)character; (void)buffer; (void)idx; (void)maxlen; +} + + + +// internal secure strlen +// \return The length of the string (excluding the terminating 0) limited by 'maxsize' +static inline unsigned int _strnlen_s(const char* str, size_t maxsize) +{ + const char* s; + for (s = str; *s && maxsize--; ++s); + return (unsigned int)(s - str); +} + + +// internal test if char is a digit (0-9) +// \return true if char is a digit +static inline bool _is_digit(char ch) +{ + return (ch >= '0') && (ch <= '9'); +} + + +// internal ASCII string to unsigned int conversion +static unsigned int _atoi(const char** str) +{ + unsigned int i = 0U; + while (_is_digit(**str)) { + i = i * 10U + (unsigned int)(*((*str)++) - '0'); + } + return i; +} + + +// output the specified string in reverse, taking care of any zero-padding +static size_t _out_rev(out_fct_type out, char* buffer, size_t idx, size_t maxlen, const char* buf, size_t len, unsigned int width, unsigned int flags) +{ + const size_t start_idx = idx; + + // pad spaces up to given width + if (!(flags & FLAGS_LEFT) && !(flags & FLAGS_ZEROPAD)) { + size_t i; + for (i = len; i < width; i++) { + out(' ', buffer, idx++, maxlen); + } + } + + // reverse string + while (len) { + out(buf[--len], buffer, idx++, maxlen); + } + + // append pad spaces up to given width + if (flags & FLAGS_LEFT) { + while (idx - start_idx < width) { + out(' ', buffer, idx++, maxlen); + } + } + + return idx; +} + + +// internal itoa format +static size_t _ntoa_format(out_fct_type out, char* buffer, size_t idx, size_t maxlen, char* buf, size_t len, bool negative, unsigned int base, unsigned int prec, unsigned int width, unsigned int flags) +{ + // pad leading zeros + if (!(flags & FLAGS_LEFT)) { + if (width && (flags & FLAGS_ZEROPAD) && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while ((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + while ((flags & FLAGS_ZEROPAD) && (len < width) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + } + + // handle hash + if (flags & FLAGS_HASH) { + if (!(flags & FLAGS_PRECISION) && len && ((len == prec) || (len == width))) { + len--; + if (len && (base == 16U)) { + len--; + } + } + if ((base == 16U) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'x'; + } + else if ((base == 16U) && (flags & FLAGS_UPPERCASE) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'X'; + } + else if ((base == 2U) && (len < PRINTF_NTOA_BUFFER_SIZE)) { + buf[len++] = 'b'; + } + if (len < PRINTF_NTOA_BUFFER_SIZE) { + buf[len++] = '0'; + } + } + + if (len < PRINTF_NTOA_BUFFER_SIZE) { + if (negative) { + buf[len++] = '-'; + } + else if (flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } + else if (flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); +} + + +// internal itoa for 'long' type +static size_t _ntoa_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, unsigned long value, bool negative, unsigned long base, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if (!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if (!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); +} + + +// internal itoa for 'long long' type +#if defined(PRINTF_SUPPORT_LONG_LONG) +static size_t _ntoa_long_long(out_fct_type out, char* buffer, size_t idx, size_t maxlen, unsigned long long value, bool negative, unsigned long long base, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_NTOA_BUFFER_SIZE]; + size_t len = 0U; + + // no hash for 0 values + if (!value) { + flags &= ~FLAGS_HASH; + } + + // write if precision != 0 and value is != 0 + if (!(flags & FLAGS_PRECISION) || value) { + do { + const char digit = (char)(value % base); + buf[len++] = digit < 10 ? '0' + digit : (flags & FLAGS_UPPERCASE ? 'A' : 'a') + digit - 10; + value /= base; + } while (value && (len < PRINTF_NTOA_BUFFER_SIZE)); + } + + return _ntoa_format(out, buffer, idx, maxlen, buf, len, negative, (unsigned int)base, prec, width, flags); +} +#endif // PRINTF_SUPPORT_LONG_LONG + + +#if defined(PRINTF_SUPPORT_FLOAT) + +#if defined(PRINTF_SUPPORT_EXPONENTIAL) +// forward declaration so that _ftoa can switch to exp notation for values > PRINTF_MAX_FLOAT +static size_t _etoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value, unsigned int prec, unsigned int width, unsigned int flags); +#endif + + +// internal ftoa for fixed decimal floating point +static size_t _ftoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value, unsigned int prec, unsigned int width, unsigned int flags) +{ + char buf[PRINTF_FTOA_BUFFER_SIZE]; + size_t len = 0U; + double diff = 0.0; + + // powers of 10 + static const double pow10[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; + + // test for special values + if (value != value) + return _out_rev(out, buffer, idx, maxlen, "nan", 3, width, flags); + if (value < -DBL_MAX) + return _out_rev(out, buffer, idx, maxlen, "fni-", 4, width, flags); + if (value > DBL_MAX) + return _out_rev(out, buffer, idx, maxlen, (flags & FLAGS_PLUS) ? "fni+" : "fni", (flags & FLAGS_PLUS) ? 4U : 3U, width, flags); + + // test for very large values + // standard printf behavior is to print EVERY whole number digit -- which could be 100s of characters overflowing your buffers == bad + if ((value > PRINTF_MAX_FLOAT) || (value < -PRINTF_MAX_FLOAT)) { +#if defined(PRINTF_SUPPORT_EXPONENTIAL) + return _etoa(out, buffer, idx, maxlen, value, prec, width, flags); +#else + return 0U; +#endif + } + + // test for negative + bool negative = false; + if (value < 0) { + negative = true; + value = 0 - value; + } + + // set default precision, if not set explicitly + if (!(flags & FLAGS_PRECISION)) { + prec = PRINTF_DEFAULT_FLOAT_PRECISION; + } + // limit precision to 9, cause a prec >= 10 can lead to overflow errors + while ((len < PRINTF_FTOA_BUFFER_SIZE) && (prec > 9U)) { + buf[len++] = '0'; + prec--; + } + + int whole = (int)value; + double tmp = (value - whole) * pow10[prec]; + unsigned long frac = (unsigned long)tmp; + diff = tmp - frac; + + if (diff > 0.5) { + ++frac; + // handle rollover, e.g. case 0.99 with prec 1 is 1.0 + if (frac >= pow10[prec]) { + frac = 0; + ++whole; + } + } + else if (diff < 0.5) { + } + else if ((frac == 0U) || (frac & 1U)) { + // if halfway, round up if odd OR if last digit is 0 + ++frac; + } + + if (prec == 0U) { + diff = value - (double)whole; + if ((!(diff < 0.5) || (diff > 0.5)) && (whole & 1)) { + // exactly 0.5 and ODD, then round up + // 1.5 -> 2, but 2.5 -> 2 + ++whole; + } + } + else { + unsigned int count = prec; + // now do fractional part, as an unsigned number + while (len < PRINTF_FTOA_BUFFER_SIZE) { + --count; + buf[len++] = (char)(48U + (frac % 10U)); + if (!(frac /= 10U)) { + break; + } + } + // add extra 0s + while ((len < PRINTF_FTOA_BUFFER_SIZE) && (count-- > 0U)) { + buf[len++] = '0'; + } + if (len < PRINTF_FTOA_BUFFER_SIZE) { + // add decimal + buf[len++] = '.'; + } + } + + // do whole part, number is reversed + while (len < PRINTF_FTOA_BUFFER_SIZE) { + buf[len++] = (char)(48 + (whole % 10)); + if (!(whole /= 10)) { + break; + } + } + + // pad leading zeros + if (!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD)) { + if (width && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } + while ((len < width) && (len < PRINTF_FTOA_BUFFER_SIZE)) { + buf[len++] = '0'; + } + } + + if (len < PRINTF_FTOA_BUFFER_SIZE) { + if (negative) { + buf[len++] = '-'; + } + else if (flags & FLAGS_PLUS) { + buf[len++] = '+'; // ignore the space if the '+' exists + } + else if (flags & FLAGS_SPACE) { + buf[len++] = ' '; + } + } + + return _out_rev(out, buffer, idx, maxlen, buf, len, width, flags); +} + + +#if defined(PRINTF_SUPPORT_EXPONENTIAL) +// internal ftoa variant for exponential floating-point type, contributed by Martijn Jasperse +static size_t _etoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, double value, unsigned int prec, unsigned int width, unsigned int flags) +{ + // check for NaN and special values + if ((value != value) || (value > DBL_MAX) || (value < -DBL_MAX)) { + return _ftoa(out, buffer, idx, maxlen, value, prec, width, flags); + } + + // determine the sign + const bool negative = value < 0; + if (negative) { + value = -value; + } + + // default precision + if (!(flags & FLAGS_PRECISION)) { + prec = PRINTF_DEFAULT_FLOAT_PRECISION; + } + + // determine the decimal exponent + // based on the algorithm by David Gay (https://www.ampl.com/netlib/fp/dtoa.c) + union { + uint64_t U; + double F; + } conv; + + conv.F = value; + int exp2 = (int)((conv.U >> 52U) & 0x07FFU) - 1023; // effectively log2 + conv.U = (conv.U & ((1ULL << 52U) - 1U)) | (1023ULL << 52U); // drop the exponent so conv.F is now in [1,2) + // now approximate log10 from the log2 integer part and an expansion of ln around 1.5 + int expval = (int)(0.1760912590558 + exp2 * 0.301029995663981 + (conv.F - 1.5) * 0.289529654602168); + // now we want to compute 10^expval but we want to be sure it won't overflow + exp2 = (int)(expval * 3.321928094887362 + 0.5); + const double z = expval * 2.302585092994046 - exp2 * 0.6931471805599453; + const double z2 = z * z; + conv.U = (uint64_t)(exp2 + 1023) << 52U; + // compute exp(z) using continued fractions, see https://en.wikipedia.org/wiki/Exponential_function#Continued_fractions_for_ex + conv.F *= 1 + 2 * z / (2 - z + (z2 / (6 + (z2 / (10 + z2 / 14))))); + // correct for rounding errors + if (value < conv.F) { + expval--; + conv.F /= 10; + } + + // the exponent format is "%+03d" and largest value is "307", so set aside 4-5 characters + unsigned int minwidth = ((expval < 100) && (expval > -100)) ? 4U : 5U; + + // in "%g" mode, "prec" is the number of *significant figures* not decimals + if (flags & FLAGS_ADAPT_EXP) { + // do we want to fall-back to "%f" mode? + if ((value >= 1e-4) && (value < 1e6)) { + if ((int)prec > expval) { + prec = (unsigned)((int)prec - expval - 1); + } + else { + prec = 0; + } + flags |= FLAGS_PRECISION; // make sure _ftoa respects precision + // no characters in exponent + minwidth = 0U; + expval = 0; + } + else { + // we use one sigfig for the whole part + if ((prec > 0) && (flags & FLAGS_PRECISION)) { + --prec; + } + } + } + + // will everything fit? + unsigned int fwidth = width; + if (width > minwidth) { + // we didn't fall-back so subtract the characters required for the exponent + fwidth -= minwidth; + } else { + // not enough characters, so go back to default sizing + fwidth = 0U; + } + if ((flags & FLAGS_LEFT) && minwidth) { + // if we're padding on the right, DON'T pad the floating part + fwidth = 0U; + } + + // rescale the float value + if (expval) { + value /= conv.F; + } + + // output the floating part + const size_t start_idx = idx; + idx = _ftoa(out, buffer, idx, maxlen, negative ? -value : value, prec, fwidth, flags & ~FLAGS_ADAPT_EXP); + + // output the exponent part + if (minwidth) { + // output the exponential symbol + out((flags & FLAGS_UPPERCASE) ? 'E' : 'e', buffer, idx++, maxlen); + // output the exponent value + idx = _ntoa_long(out, buffer, idx, maxlen, (expval < 0) ? -expval : expval, expval < 0, 10, 0, minwidth-1, FLAGS_ZEROPAD | FLAGS_PLUS); + // might need to right-pad spaces + if (flags & FLAGS_LEFT) { + while (idx - start_idx < width) out(' ', buffer, idx++, maxlen); + } + } + return idx; +} +#endif // PRINTF_SUPPORT_EXPONENTIAL +#endif // PRINTF_SUPPORT_FLOAT + + +// internal vsnprintf +static int _vsnprintf(out_fct_type out, char* buffer, const size_t maxlen, const char* format, va_list va) +{ + unsigned int flags, width, precision, n; + size_t idx = 0U; + + if (!buffer) { + // use null output function + out = _out_null; + } + + while (*format) + { + // format specifier? %[flags][width][.precision][length] + if (*format != '%') { + // no + out(*format, buffer, idx++, maxlen); + format++; + continue; + } + else { + // yes, evaluate it + format++; + } + + // evaluate flags + flags = 0U; + do { + switch (*format) { + case '0': flags |= FLAGS_ZEROPAD; format++; n = 1U; break; + case '-': flags |= FLAGS_LEFT; format++; n = 1U; break; + case '+': flags |= FLAGS_PLUS; format++; n = 1U; break; + case ' ': flags |= FLAGS_SPACE; format++; n = 1U; break; + case '#': flags |= FLAGS_HASH; format++; n = 1U; break; + default : n = 0U; break; + } + } while (n); + + // evaluate width field + width = 0U; + if (_is_digit(*format)) { + width = _atoi(&format); + } + else if (*format == '*') { + const int w = va_arg(va, int); + if (w < 0) { + flags |= FLAGS_LEFT; // reverse padding + width = (unsigned int)-w; + } + else { + width = (unsigned int)w; + } + format++; + } + + // evaluate precision field + precision = 0U; + if (*format == '.') { + flags |= FLAGS_PRECISION; + format++; + if (_is_digit(*format)) { + precision = _atoi(&format); + } + else if (*format == '*') { + const int prec = (int)va_arg(va, int); + precision = prec > 0 ? (unsigned int)prec : 0U; + format++; + } + } + + // evaluate length field + switch (*format) { + case 'l' : + flags |= FLAGS_LONG; + format++; + if (*format == 'l') { + flags |= FLAGS_LONG_LONG; + format++; + } + break; + case 'h' : + flags |= FLAGS_SHORT; + format++; + if (*format == 'h') { + flags |= FLAGS_CHAR; + format++; + } + break; +#if defined(PRINTF_SUPPORT_PTRDIFF_T) + case 't' : + flags |= (sizeof(ptrdiff_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; +#endif + case 'j' : + flags |= (sizeof(intmax_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + case 'z' : + flags |= (sizeof(size_t) == sizeof(long) ? FLAGS_LONG : FLAGS_LONG_LONG); + format++; + break; + default : + break; + } + + // evaluate specifier + switch (*format) { + case 'd' : + case 'i' : + case 'u' : + case 'x' : + case 'X' : + case 'o' : + case 'b' : { + // set the base + unsigned int base; + if (*format == 'x' || *format == 'X') { + base = 16U; + } + else if (*format == 'o') { + base = 8U; + } + else if (*format == 'b') { + base = 2U; + } + else { + base = 10U; + flags &= ~FLAGS_HASH; // no hash for dec format + } + // uppercase + if (*format == 'X') { + flags |= FLAGS_UPPERCASE; + } + + // no plus or space flag for u, x, X, o, b + if ((*format != 'i') && (*format != 'd')) { + flags &= ~(FLAGS_PLUS | FLAGS_SPACE); + } + + // ignore '0' flag when precision is given + if (flags & FLAGS_PRECISION) { + flags &= ~FLAGS_ZEROPAD; + } + + // convert the integer + if ((*format == 'i') || (*format == 'd')) { + // signed + if (flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + const long long value = va_arg(va, long long); + idx = _ntoa_long_long(out, buffer, idx, maxlen, (unsigned long long)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); +#endif + } + else if (flags & FLAGS_LONG) { + const long value = va_arg(va, long); + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); + } + else { + const int value = (flags & FLAGS_CHAR) ? (char)va_arg(va, int) : (flags & FLAGS_SHORT) ? (short int)va_arg(va, int) : va_arg(va, int); + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned int)(value > 0 ? value : 0 - value), value < 0, base, precision, width, flags); + } + } + else { + // unsigned + if (flags & FLAGS_LONG_LONG) { +#if defined(PRINTF_SUPPORT_LONG_LONG) + idx = _ntoa_long_long(out, buffer, idx, maxlen, va_arg(va, unsigned long long), false, base, precision, width, flags); +#endif + } + else if (flags & FLAGS_LONG) { + idx = _ntoa_long(out, buffer, idx, maxlen, va_arg(va, unsigned long), false, base, precision, width, flags); + } + else { + const unsigned int value = (flags & FLAGS_CHAR) ? (unsigned char)va_arg(va, unsigned int) : (flags & FLAGS_SHORT) ? (unsigned short int)va_arg(va, unsigned int) : va_arg(va, unsigned int); + idx = _ntoa_long(out, buffer, idx, maxlen, value, false, base, precision, width, flags); + } + } + format++; + break; + } +#if defined(PRINTF_SUPPORT_FLOAT) + case 'f' : + case 'F' : + if (*format == 'F') flags |= FLAGS_UPPERCASE; + idx = _ftoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); + format++; + break; +#if defined(PRINTF_SUPPORT_EXPONENTIAL) + case 'e': + case 'E': + case 'g': + case 'G': + if ((*format == 'g')||(*format == 'G')) flags |= FLAGS_ADAPT_EXP; + if ((*format == 'E')||(*format == 'G')) flags |= FLAGS_UPPERCASE; + idx = _etoa(out, buffer, idx, maxlen, va_arg(va, double), precision, width, flags); + format++; + break; +#endif // PRINTF_SUPPORT_EXPONENTIAL +#endif // PRINTF_SUPPORT_FLOAT + case 'c' : { + unsigned int l = 1U; + // pre padding + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // char output + out((char)va_arg(va, int), buffer, idx++, maxlen); + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case 's' : { + const char* p = va_arg(va, char*); + unsigned int l = _strnlen_s(p, precision ? precision : (size_t)-1); + // pre padding + if (flags & FLAGS_PRECISION) { + l = (l < precision ? l : precision); + } + if (!(flags & FLAGS_LEFT)) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + // string output + while ((*p != 0) && (!(flags & FLAGS_PRECISION) || precision--)) { + out(*(p++), buffer, idx++, maxlen); + } + // post padding + if (flags & FLAGS_LEFT) { + while (l++ < width) { + out(' ', buffer, idx++, maxlen); + } + } + format++; + break; + } + + case 'p' : { + width = sizeof(void*) * 2U; + flags |= FLAGS_ZEROPAD | FLAGS_UPPERCASE; +#if defined(PRINTF_SUPPORT_LONG_LONG) + const bool is_ll = sizeof(uintptr_t) == sizeof(long long); + if (is_ll) { + idx = _ntoa_long_long(out, buffer, idx, maxlen, (uintptr_t)va_arg(va, void*), false, 16U, precision, width, flags); + } + else { +#endif + idx = _ntoa_long(out, buffer, idx, maxlen, (unsigned long)((uintptr_t)va_arg(va, void*)), false, 16U, precision, width, flags); +#if defined(PRINTF_SUPPORT_LONG_LONG) + } +#endif + format++; + break; + } + + case '%' : + out('%', buffer, idx++, maxlen); + format++; + break; + + default : + out(*format, buffer, idx++, maxlen); + format++; + break; + } + } + + // termination + out((char)0, buffer, idx < maxlen ? idx : maxlen - 1U, maxlen); + + // return written chars without terminating \0 + return (int)idx; +} + + +/////////////////////////////////////////////////////////////////////////////// + +int lv_snprintf(char* buffer, size_t count, const char* format, ...) +{ + va_list va; + va_start(va, format); + const int ret = _vsnprintf(_out_buffer, buffer, count, format, va); + va_end(va); + return ret; +} + +int lv_vsnprintf(char* buffer, size_t count, const char* format, va_list va) +{ + return _vsnprintf(_out_buffer, buffer, count, format, va); +} + +#endif /*LV_SPRINTF_CUSTOM*/ + diff --git a/src/lv_misc/lv_printf.h b/src/lv_misc/lv_printf.h new file mode 100644 index 000000000..b3b8598dd --- /dev/null +++ b/src/lv_misc/lv_printf.h @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////////// +// \author (c) Marco Paland (info@paland.com) +// 2014-2019, PALANDesign Hannover, Germany +// +// \license The MIT License (MIT) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// \brief Tiny printf, sprintf and snprintf implementation, optimized for speed on +// embedded systems with a very limited resources. +// Use this instead of bloated standard/newlib printf. +// These routines are thread safe and reentrant. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef _LV_PRINTF_H_ +#define _LV_PRINTF_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef LV_CONF_INCLUDE_SIMPLE +#include "lv_conf.h" +#else +#include "../../../lv_conf.h" +#endif + +#if LV_SPRINTF_CUSTOM == 0 + +#include +#include + +/** + * Tiny snprintf/vsnprintf implementation + * \param buffer A pointer to the buffer where to store the formatted string + * \param count The maximum number of characters to store in the buffer, including a terminating null character + * \param format A string that specifies the format of the output + * \param va A value identifying a variable arguments list + * \return The number of characters that COULD have been written into the buffer, not counting the terminating + * null character. A value equal or larger than count indicates truncation. Only when the returned value + * is non-negative and less than count, the string has been completely written. + */ +int lv_snprintf(char* buffer, size_t count, const char* format, ...); +int lv_vsnprintf(char* buffer, size_t count, const char* format, va_list va); + +#else +#include LV_SPRINTF_INCLUDE +#endif + + +#ifdef __cplusplus +} +#endif + + +#endif // _PRINTF_H_ diff --git a/src/lv_misc/lv_task.c b/src/lv_misc/lv_task.c index 296fa8f91..8a7bffca8 100644 --- a/src/lv_misc/lv_task.c +++ b/src/lv_misc/lv_task.c @@ -9,6 +9,7 @@ *********************/ #include #include "lv_task.h" +#include "../lv_core/lv_debug.h" #include "../lv_hal/lv_hal_tick.h" #include "lv_gc.h" @@ -64,19 +65,21 @@ void lv_task_core_init(void) */ LV_ATTRIBUTE_TASK_HANDLER void lv_task_handler(void) { + + LV_LOG_TRACE("lv_task_handler started"); /*Avoid concurrent running of the task handler*/ - static bool task_handler_mutex = false; - if(task_handler_mutex) return; - task_handler_mutex = true; + static bool already_running = false; + if(already_running) return; + already_running = true; static uint32_t idle_period_start = 0; static uint32_t handler_start = 0; static uint32_t busy_time = 0; if(lv_task_run == false) { - task_handler_mutex = false; /*Release mutex*/ + already_running = false; /*Release mutex*/ return; } @@ -115,14 +118,16 @@ LV_ATTRIBUTE_TASK_HANDLER void lv_task_handler(void) if(((lv_task_t *)LV_GC_ROOT(_lv_task_act))->prio == LV_TASK_PRIO_HIGHEST) { lv_task_exec(LV_GC_ROOT(_lv_task_act)); } - /*Tasks with higher priority then the interrupted shall be run in every case*/ + /*Tasks with higher priority than the interrupted shall be run in every case*/ else if(task_interrupter) { if(((lv_task_t *)LV_GC_ROOT(_lv_task_act))->prio > task_interrupter->prio) { if(lv_task_exec(LV_GC_ROOT(_lv_task_act))) { - task_interrupter = - LV_GC_ROOT(_lv_task_act); /*Check all tasks again from the highest priority */ - end_flag = false; - break; + if(!task_created && !task_deleted) { + /*Check all tasks again from the highest priority */ + task_interrupter = LV_GC_ROOT(_lv_task_act); + end_flag = false; + break; + } } } } @@ -130,14 +135,19 @@ LV_ATTRIBUTE_TASK_HANDLER void lv_task_handler(void) * Just run the remaining tasks*/ else { if(lv_task_exec(LV_GC_ROOT(_lv_task_act))) { - task_interrupter = LV_GC_ROOT(_lv_task_act); /*Check all tasks again from the highest priority */ - end_flag = false; - break; + if(!task_created && !task_deleted) { + task_interrupter = LV_GC_ROOT(_lv_task_act); /*Check all tasks again from the highest priority */ + end_flag = false; + break; + } } } - if(task_deleted) break; /*If a task was deleted then this or the next item might be corrupted*/ - if(task_created) break; /*If a task was created then this or the next item might be corrupted*/ + /*If a task was created or deleted then this or the next item might be corrupted*/ + if(task_created || task_deleted) { + task_interrupter = NULL; + break; + } LV_GC_ROOT(_lv_task_act) = next; /*Load the next task*/ } @@ -153,7 +163,7 @@ LV_ATTRIBUTE_TASK_HANDLER void lv_task_handler(void) idle_period_start = lv_tick_get(); } - task_handler_mutex = false; /*Release the mutex*/ + already_running = false; /*Release the mutex*/ LV_LOG_TRACE("lv_task_handler ready"); } @@ -173,7 +183,7 @@ lv_task_t * lv_task_create_basic(void) /*It's the first task*/ if(NULL == tmp) { new_task = lv_ll_ins_head(&LV_GC_ROOT(_lv_task_ll)); - lv_mem_assert(new_task); + LV_ASSERT_MEM(new_task); if(new_task == NULL) return NULL; } /*Insert the new task to proper place according to its priority*/ @@ -181,7 +191,7 @@ lv_task_t * lv_task_create_basic(void) do { if(tmp->prio <= DEF_PRIO) { new_task = lv_ll_ins_prev(&LV_GC_ROOT(_lv_task_ll), tmp); - lv_mem_assert(new_task); + LV_ASSERT_MEM(new_task); if(new_task == NULL) return NULL; break; } @@ -191,7 +201,7 @@ lv_task_t * lv_task_create_basic(void) /*Only too high priority tasks were found. Add the task to the end*/ if(tmp == NULL) { new_task = lv_ll_ins_tail(&LV_GC_ROOT(_lv_task_ll)); - lv_mem_assert(new_task); + LV_ASSERT_MEM(new_task); if(new_task == NULL) return NULL; } } @@ -223,7 +233,7 @@ lv_task_t * lv_task_create_basic(void) lv_task_t * lv_task_create(lv_task_cb_t task_cb, uint32_t period, lv_task_prio_t prio, void * user_data) { lv_task_t * new_task = lv_task_create_basic(); - lv_mem_assert(new_task); + LV_ASSERT_MEM(new_task); if(new_task == NULL) return NULL; lv_task_set_cb(new_task, task_cb); @@ -250,7 +260,7 @@ void lv_task_set_cb(lv_task_t * task, lv_task_cb_t task_cb) */ void lv_task_del(lv_task_t * task) { - lv_ll_rem(&LV_GC_ROOT(_lv_task_ll), task); + lv_ll_remove(&LV_GC_ROOT(_lv_task_ll), task); lv_mem_free(task); diff --git a/src/lv_misc/lv_txt.c b/src/lv_misc/lv_txt.c index 8b35c7149..7251f3dbe 100644 --- a/src/lv_misc/lv_txt.c +++ b/src/lv_misc/lv_txt.c @@ -56,7 +56,7 @@ uint32_t (*lv_txt_encoded_conv_wc)(uint32_t) = lv_txt_utf8_con uint32_t (*lv_txt_encoded_next)(const char *, uint32_t *) = lv_txt_utf8_next; uint32_t (*lv_txt_encoded_prev)(const char *, uint32_t *) = lv_txt_utf8_prev; uint32_t (*lv_txt_encoded_get_byte_id)(const char *, uint32_t) = lv_txt_utf8_get_byte_id; -uint32_t (*lv_encoded_get_char_id)(const char *, uint32_t) = lv_txt_utf8_get_char_id; +uint32_t (*lv_txt_encoded_get_char_id)(const char *, uint32_t) = lv_txt_utf8_get_char_id; uint32_t (*lv_txt_get_encoded_length)(const char *) = lv_txt_utf8_get_length; #elif LV_TXT_ENC == LV_TXT_ENC_ASCII uint8_t (*lv_txt_encoded_size)(const char *) = lv_txt_iso8859_1_size; @@ -65,7 +65,7 @@ uint32_t (*lv_txt_encoded_conv_wc)(uint32_t) = lv_txt_iso8859_ uint32_t (*lv_txt_encoded_next)(const char *, uint32_t *) = lv_txt_iso8859_1_next; uint32_t (*lv_txt_encoded_prev)(const char *, uint32_t *) = lv_txt_iso8859_1_prev; uint32_t (*lv_txt_encoded_get_byte_id)(const char *, uint32_t) = lv_txt_iso8859_1_get_byte_id; -uint32_t (*lv_encoded_get_char_id)(const char *, uint32_t) = lv_txt_iso8859_1_get_char_id; +uint32_t (*lv_txt_encoded_get_char_id)(const char *, uint32_t) = lv_txt_iso8859_1_get_char_id; uint32_t (*lv_txt_get_encoded_length)(const char *) = lv_txt_iso8859_1_get_length; #endif @@ -103,7 +103,7 @@ void lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t * uint32_t line_start = 0; uint32_t new_line_start = 0; lv_coord_t act_line_length; - uint8_t letter_height = lv_font_get_line_height(font); + uint16_t letter_height = lv_font_get_line_height(font); /*Calc. the height and longest line*/ while(text[line_start] != '\0') { @@ -130,8 +130,150 @@ void lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t * size_res->y -= line_space; } +/** + * Get the next word of text. A word is delimited by break characters. + * + * If the word cannot fit in the max_width space, obey LV_TXT_LINE_BREAK_LONG_* rules. + * + * If the next word cannot fit anything, return 0. + * + * If the first character is a break character, returns the next index. + * + * Example calls from lv_txt_get_next_line() assuming sufficent max_width and + * txt = "Test text\n" + * 0123456789 + * + * Calls would be as follows: + * 1. Return i=4, pointing at breakchar ' ', for the string "Test" + * 2. Return i=5, since i=4 was a breakchar. + * 3. Return i=9, pointing at breakchar '\n' + * 4. Parenting lv_txt_get_next_line() would detect subsequent '\0' + * + * TODO: Returned word_w_ptr may overestimate the returned word's width when + * max_width is reached. In current usage, this has no impact. + * + * @param txt a '\0' terminated string + * @param font pointer to a font + * @param letter_space letter space + * @param max_width max with of the text (break the lines to fit this size) Set CORD_MAX to avoid line breaks + * @param flags settings for the text from 'txt_flag_type' enum + * @param[out] word_w_ptr width (in pixels) of the parsed word. May be NULL. + * @param force Force return the fraction of the word that can fit in the provided space. + * @return the index of the first char of the next word (in byte index not letter index. With UTF-8 they are different) + */ +static uint16_t lv_txt_get_next_word(const char * txt, const lv_font_t * font, + lv_coord_t letter_space, lv_coord_t max_width, + lv_txt_flag_t flag, uint32_t *word_w_ptr, lv_txt_cmd_state_t * cmd_state, bool force) +{ + if(txt == NULL || txt[0] == '\0') return 0; + if(font == NULL) return 0; + + if(flag & LV_TXT_FLAG_EXPAND) max_width = LV_COORD_MAX; + + uint32_t i = 0, i_next = 0, i_next_next = 0; /* Iterating index into txt */ + uint32_t letter = 0; /* Letter at i */ + uint32_t letter_next = 0; /* Letter at i_next */ + lv_coord_t letter_w; + lv_coord_t cur_w = 0; /* Pixel Width of transversed string */ + uint32_t word_len = 0; /* Number of characters in the transversed word */ + uint32_t break_index = NO_BREAK_FOUND; /* only used for "long" words */ + uint32_t break_letter_count = 0; /* Number of characters up to the long word break point */ + + letter = lv_txt_encoded_next(txt, &i_next); + i_next_next = i_next; + + /* Obtain the full word, regardless if it fits or not in max_width */ + while(txt[i] != '\0') { + letter_next = lv_txt_encoded_next(txt, &i_next_next); + word_len++; + + /*Handle the recolor command*/ + if((flag & LV_TXT_FLAG_RECOLOR) != 0) { + if(lv_txt_is_cmd(cmd_state, letter) != false) { + i = i_next; + i_next = i_next_next; + letter = letter_next; + continue; /*Skip the letter is it is part of a command*/ + } + } + + letter_w = lv_font_get_glyph_width(font, letter, letter_next); + cur_w += letter_w; + + /* Test if this character fits within max_width */ + if(break_index == NO_BREAK_FOUND && cur_w > max_width) { + break_index = i; + break_letter_count = word_len - 1; + /* break_index is now pointing at the character that doesn't fit */ + } + + /*Check for new line chars and breakchars*/ + if(letter == '\n' || letter == '\r' || is_break_char(letter)) { + /* Update the output width on the first character if it fits. + * Must do this here incase first letter is a break character. */ + if(i == 0 && break_index == NO_BREAK_FOUND && word_w_ptr != NULL) *word_w_ptr = cur_w; + word_len--; + break; + } + + /* Update the output width */ + if( word_w_ptr != NULL && break_index == NO_BREAK_FOUND ) *word_w_ptr = cur_w; + + if(letter_w > 0) { + cur_w += letter_space; + } + + i = i_next; + i_next = i_next_next; + letter = letter_next; + } + + /* Entire Word fits in the provided space */ + if( break_index == NO_BREAK_FOUND ) { + if( word_len == 0 || (letter == '\r' && letter_next == '\n') ) i = i_next; + return i; + } + +#if LV_TXT_LINE_BREAK_LONG_LEN > 0 + /* Word doesn't fit in provided space, but isn't "long" */ + if(word_len < LV_TXT_LINE_BREAK_LONG_LEN) { + if( force ) return break_index; + if(word_w_ptr != NULL) *word_w_ptr = 0; /* Return no word */ + return 0; + } + + /* Word is "long," but insufficient amounts can fit in provided space */ + if(break_letter_count < LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN) { + if( force ) return break_index; + if(word_w_ptr != NULL) *word_w_ptr = 0; + return 0; + } + + /* Word is a "long", but letters may need to be better distributed */ + { + i = break_index; + int32_t n_move = LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN - (word_len - break_letter_count); + /* Move pointer "i" backwards */ + for(;n_move>0; n_move--){ + lv_txt_encoded_prev(txt, &i); + // TODO: it would be appropriate to update the returned word width here + // However, in current usage, this doesn't impact anything. + } + } + return i; +#else + if( force ) return break_index; + if(word_w_ptr != NULL) *word_w_ptr = 0; /* Return no word */ + (void) break_letter_count; + return 0; +#endif +} + /** * Get the next line of text. Check line length and break chars too. + * + * A line of txt includes the \n character. + * * @param txt a '\0' terminated string * @param font pointer to a font * @param letter_space letter space @@ -139,75 +281,40 @@ void lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t * * @param flags settings for the text from 'txt_flag_type' enum * @return the index of the first char of the new line (in byte index not letter index. With UTF-8 they are different) */ -uint16_t lv_txt_get_next_line(const char * txt, const lv_font_t * font, lv_coord_t letter_space, lv_coord_t max_width, - lv_txt_flag_t flag) +uint16_t lv_txt_get_next_line(const char * txt, const lv_font_t * font, + lv_coord_t letter_space, lv_coord_t max_width, lv_txt_flag_t flag) { if(txt == NULL) return 0; if(font == NULL) return 0; if(flag & LV_TXT_FLAG_EXPAND) max_width = LV_COORD_MAX; - - uint32_t i = 0; - uint32_t i_next = 0; - lv_coord_t cur_w = 0; - uint32_t last_break = NO_BREAK_FOUND; lv_txt_cmd_state_t cmd_state = LV_TXT_CMD_STATE_WAIT; - uint32_t letter_w; - uint32_t letter = 0; - uint32_t letter_next = 0; + uint32_t i = 0; /* Iterating index into txt */ - letter_next = lv_txt_encoded_next(txt, &i_next); + while(txt[i] != '\0' && max_width > 0) { + uint32_t word_w = 0; + uint32_t advance = lv_txt_get_next_word(&txt[i], font, letter_space, max_width, flag, &word_w, &cmd_state, i==0); + max_width -= word_w; - while(txt[i] != '\0') { - letter = letter_next; - i = i_next; - letter_next = lv_txt_encoded_next(txt, &i_next); - - /*Handle the recolor command*/ - if((flag & LV_TXT_FLAG_RECOLOR) != 0) { - if(lv_txt_is_cmd(&cmd_state, letter) != false) { - continue; /*Skip the letter is it is part of a command*/ - } + if( advance == 0 ){ + if(i == 0) lv_txt_encoded_next(txt, &i); // prevent inf loops + break; } - /*Check for new line chars*/ - if(letter == '\n' || letter == '\r') { - /*Return with the first letter of the next line*/ - if(letter == '\r' && letter_next == '\n') - return i_next; - else - return i; - } else { /*Check the actual length*/ - letter_w = lv_font_get_glyph_width(font, letter, letter_next); - cur_w += letter_w; + i += advance; - /*If the txt is too long then finish, this is the line end*/ - if(cur_w > max_width) { - /*If a break character was already found break there*/ - if(last_break != NO_BREAK_FOUND) { - i = last_break; - } else { - /* Now this character is out of the area so it will be first character of the next line*/ - /* But 'i' already points to the next character (because of lv_txt_utf8_next) step beck one*/ - lv_txt_encoded_prev(txt, &i); - } + if(txt[0] == '\n') break; - /* Do not let to return without doing nothing. - * Find at least one character (Avoid infinite loop )*/ - if(i == 0) lv_txt_encoded_next(txt, &i); - - return i; - } - /*If this char still can fit to this line then check if - * txt can be broken here later */ - else if(is_break_char(letter)) { - last_break = i; /*Save the first char index after break*/ - } + if(txt[i] == '\n'){ + i++; /* Include the following newline in the current line */ + break; } - if(letter_w > 0) { - cur_w += letter_space; - } + } + + /* Always step at least one to avoid infinite loops */ + if(i == 0) { + lv_txt_encoded_next(txt, &i); } return i; @@ -309,8 +416,8 @@ bool lv_txt_is_cmd(lv_txt_cmd_state_t * state, uint32_t c) */ void lv_txt_ins(char * txt_buf, uint32_t pos, const char * ins_txt) { - uint32_t old_len = strlen(txt_buf); - uint32_t ins_len = strlen(ins_txt); + size_t old_len = strlen(txt_buf); + size_t ins_len = strlen(ins_txt); uint32_t new_len = ins_len + old_len; pos = lv_txt_encoded_get_byte_id(txt_buf, pos); /*Convert to byte index instead of letter index*/ @@ -334,7 +441,7 @@ void lv_txt_ins(char * txt_buf, uint32_t pos, const char * ins_txt) void lv_txt_cut(char * txt, uint32_t pos, uint32_t len) { - uint32_t old_len = strlen(txt); + size_t old_len = strlen(txt); pos = lv_txt_encoded_get_byte_id(txt, pos); /*Convert to byte index instead of letter index*/ len = lv_txt_encoded_get_byte_id(&txt[pos], len); @@ -366,7 +473,7 @@ static uint8_t lv_txt_utf8_size(const char * str) return 3; else if((str[0] & 0xF8) == 0xF0) return 4; - return 1; /*If the char was invalid step tell it's 1 byte long*/ + return 0; /*If the char was invalid tell it's 1 byte long*/ } /** @@ -543,7 +650,8 @@ static uint32_t lv_txt_utf8_get_byte_id(const char * txt, uint32_t utf8_id) uint32_t i; uint32_t byte_cnt = 0; for(i = 0; i < utf8_id; i++) { - byte_cnt += lv_txt_encoded_size(&txt[byte_cnt]); + uint8_t c_size = lv_txt_encoded_size(&txt[byte_cnt]); + byte_cnt += c_size > 0 ? c_size : 1; } return byte_cnt; diff --git a/src/lv_misc/lv_txt.h b/src/lv_misc/lv_txt.h index 6fc6e4a63..6dbce5d44 100644 --- a/src/lv_misc/lv_txt.h +++ b/src/lv_misc/lv_txt.h @@ -27,7 +27,9 @@ extern "C" { /********************* * DEFINES *********************/ +#ifndef LV_TXT_COLOR_CMD #define LV_TXT_COLOR_CMD "#" +#endif #define LV_TXT_ENC_UTF8 1 #define LV_TXT_ENC_ASCII 2 @@ -188,7 +190,7 @@ extern uint32_t (*lv_txt_encoded_get_byte_id)(const char *, uint32_t); * @param byte_id byte index * @return character index of the letter at 'byte_id'th position */ -extern uint32_t (*lv_encoded_get_char_id)(const char *, uint32_t); +extern uint32_t (*lv_txt_encoded_get_char_id)(const char *, uint32_t); /** * Get the number of characters (and NOT bytes) in a string. diff --git a/src/lv_misc/lv_types.h b/src/lv_misc/lv_types.h index 89f04aa40..c588e2451 100644 --- a/src/lv_misc/lv_types.h +++ b/src/lv_misc/lv_types.h @@ -17,6 +17,17 @@ extern "C" { /********************* * DEFINES *********************/ +// Check windows +#ifdef __WIN64 +#define LV_ARCH_64 +#endif + +// Check GCC +#ifdef __GNUC__ +#if defined(__x86_64__) || defined(__ppc64__) +#define LV_ARCH_64 +#endif +#endif /********************** * TYPEDEFS @@ -32,7 +43,11 @@ enum { }; typedef uint8_t lv_res_t; -typedef unsigned long int lv_uintptr_t; +#ifdef LV_ARCH_64 +typedef uint64_t lv_uintptr_t; +#else +typedef uint32_t lv_uintptr_t; +#endif /********************** * GLOBAL PROTOTYPES diff --git a/src/lv_objx/lv_arc.c b/src/lv_objx/lv_arc.c index 7db5fb5e4..5e6b1ab10 100644 --- a/src/lv_objx/lv_arc.c +++ b/src/lv_objx/lv_arc.c @@ -9,6 +9,7 @@ #include "lv_arc.h" #if LV_USE_ARC != 0 +#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_math.h" #include "../lv_draw/lv_draw_arc.h" #include "../lv_themes/lv_theme.h" @@ -16,6 +17,7 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_arc" /********************** * TYPEDEFS @@ -24,7 +26,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_arc_design(lv_obj_t * arc, const lv_area_t * mask, lv_design_mode_t mode); +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); /********************** @@ -54,13 +56,16 @@ lv_obj_t * lv_arc_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor of arc*/ lv_obj_t * new_arc = lv_obj_create(par, copy); - lv_mem_assert(new_arc); + LV_ASSERT_MEM(new_arc); if(new_arc == NULL) return NULL; /*Allocate the arc type specific extended data*/ lv_arc_ext_t * ext = lv_obj_allocate_ext_attr(new_arc, sizeof(lv_arc_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_arc); + return NULL; + } if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_arc); if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_arc); @@ -112,20 +117,39 @@ lv_obj_t * lv_arc_create(lv_obj_t * par, const lv_obj_t * copy) *====================*/ /** - * Set the start and end angles of an arc. 0 deg: bottom, 90 deg: right etc. + * Set the start angle of an arc. 0 deg: right, 90 bottom: right etc. * @param arc pointer to an arc object * @param start the start angle [0..360] - * @param end the end angle [0..360] */ -void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end) +void lv_arc_set_start_angle(lv_obj_t * arc, int16_t start) { + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); - if(start > 360) start = 360; - if(end > 360) end = 360; + if(start > 360) start -= 360; + if(start < 0) start += 360; ext->angle_start = start; - ext->angle_end = end; + + lv_obj_invalidate(arc); +} + +/** + * Set the start angle of an arc. 0 deg: right, 90 bottom: right etc. + * @param arc pointer to an arc object + * @param start the start angle [0..360] + */ +void lv_arc_set_end_angle(lv_obj_t * arc, int16_t end) +{ + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + + lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); + + if(end > 360) end -= 360; + if(end < 0) end += 360; + + ext->angle_end= end; lv_obj_invalidate(arc); } @@ -138,6 +162,8 @@ void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end) * */ void lv_arc_set_style(lv_obj_t * arc, lv_arc_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + switch(type) { case LV_ARC_STYLE_MAIN: lv_obj_set_style(arc, style); break; } @@ -154,6 +180,8 @@ void lv_arc_set_style(lv_obj_t * arc, lv_arc_style_t type, const lv_style_t * st */ uint16_t lv_arc_get_angle_start(lv_obj_t * arc) { + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); return ext->angle_start; @@ -166,6 +194,8 @@ uint16_t lv_arc_get_angle_start(lv_obj_t * arc) */ uint16_t lv_arc_get_angle_end(lv_obj_t * arc) { + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); return ext->angle_end; @@ -179,6 +209,8 @@ uint16_t lv_arc_get_angle_end(lv_obj_t * arc) * */ const lv_style_t * lv_arc_get_style(const lv_obj_t * arc, lv_arc_style_t type) { + LV_ASSERT_OBJ(arc, LV_OBJX_NAME); + const lv_style_t * style = NULL; switch(type) { @@ -204,18 +236,18 @@ const lv_style_t * lv_arc_get_style(const lv_obj_t * arc, lv_arc_style_t type) /** * Handle the drawing related tasks of the arcs * @param arc pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_arc_design(lv_obj_t * arc, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_arc_design(lv_obj_t * arc, const lv_area_t * clip_area, lv_design_mode_t mode) { /*Return false if the object is not covers the mask_p area*/ if(mode == LV_DESIGN_COVER_CHK) { - return false; + return LV_DESIGN_RES_NOT_COVER; } /*Draw the object*/ else if(mode == LV_DESIGN_DRAW_MAIN) { @@ -226,44 +258,13 @@ static bool lv_arc_design(lv_obj_t * arc, const lv_area_t * mask, lv_design_mode lv_coord_t x = arc->coords.x1 + lv_obj_get_width(arc) / 2; lv_coord_t y = arc->coords.y1 + lv_obj_get_height(arc) / 2; lv_opa_t opa_scale = lv_obj_get_opa_scale(arc); - lv_draw_arc(x, y, r, mask, ext->angle_start, ext->angle_end, style, opa_scale); - - /*Draw circle on the ends if enabled */ - if(style->line.rounded) { - lv_coord_t thick_half = style->line.width / 2; - lv_coord_t cir_x = ((r - thick_half) * lv_trigo_sin(ext->angle_start) >> LV_TRIGO_SHIFT); - lv_coord_t cir_y = ((r - thick_half) * lv_trigo_sin(ext->angle_start + 90) >> LV_TRIGO_SHIFT); - - lv_style_t cir_style; - lv_style_copy(&cir_style, &lv_style_plain); - cir_style.body.grad_color = style->line.color; - cir_style.body.main_color = cir_style.body.grad_color; - cir_style.body.radius = LV_RADIUS_CIRCLE; - lv_area_t cir_area; - cir_area.x1 = cir_x + x - thick_half; - cir_area.y1 = cir_y + y - thick_half; - cir_area.x2 = cir_x + x + thick_half; - cir_area.y2 = cir_y + y + thick_half; - - lv_draw_rect(&cir_area, mask, &cir_style, opa_scale); - - cir_x = ((r - thick_half) * lv_trigo_sin(ext->angle_end) >> LV_TRIGO_SHIFT); - cir_y = ((r - thick_half) * lv_trigo_sin(ext->angle_end + 90) >> LV_TRIGO_SHIFT); - - cir_area.x1 = cir_x + x - thick_half; - cir_area.y1 = cir_y + y - thick_half; - cir_area.x2 = cir_x + x + thick_half; - cir_area.y2 = cir_y + y + thick_half; - - lv_draw_rect(&cir_area, mask, &cir_style, opa_scale); - } - + lv_draw_arc(x, y, r, clip_area, ext->angle_start, ext->angle_end, style, opa_scale); } /*Post draw when the children are drawn*/ else if(mode == LV_DESIGN_DRAW_POST) { } - return true; + return LV_DESIGN_RES_OK; } /** @@ -281,15 +282,10 @@ static lv_res_t lv_arc_signal(lv_obj_t * arc, lv_signal_t sign, void * param) res = ancestor_signal(arc, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); + if(sign == LV_SIGNAL_CLEANUP) { /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_arc"; } return res; diff --git a/src/lv_objx/lv_arc.h b/src/lv_objx/lv_arc.h index 8cc34d5f7..89800958b 100644 --- a/src/lv_objx/lv_arc.h +++ b/src/lv_objx/lv_arc.h @@ -65,12 +65,18 @@ lv_obj_t * lv_arc_create(lv_obj_t * par, const lv_obj_t * copy); *====================*/ /** - * Set the start and end angles of an arc. 0 deg: bottom, 90 deg: right etc. + * Set the start angle of an arc. 0 deg: right, 90 bottom: right etc. * @param arc pointer to an arc object - * @param start the start angle [0..360] - * @param end the end angle [0..360] + * @param start the start angle */ -void lv_arc_set_angles(lv_obj_t * arc, uint16_t start, uint16_t end); +void lv_arc_set_start_angle(lv_obj_t * arc, int16_t start); + +/** + * Set the start angle of an arc. 0 deg: right, 90 bottom: right etc. + * @param arc pointer to an arc object + * @param end the end angle + */ +void lv_arc_set_end_angle(lv_obj_t * arc, int16_t end); /** * Set a style of a arc. diff --git a/src/lv_objx/lv_bar.c b/src/lv_objx/lv_bar.c index 6b6ebb349..1eab6e313 100644 --- a/src/lv_objx/lv_bar.c +++ b/src/lv_objx/lv_bar.c @@ -11,14 +11,19 @@ #include "lv_bar.h" #if LV_USE_BAR != 0 +#include "../lv_core/lv_debug.h" #include "../lv_draw/lv_draw.h" #include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_anim.h" +#include "../lv_misc/lv_math.h" #include /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_bar" + +#define LV_BAR_SIZE_MIN 4 /*hor. pad and ver. pad cannot make the indicator smaller then this [px]*/ /********************** * TYPEDEFS @@ -27,11 +32,16 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_bar_design(lv_obj_t * bar, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_bar_design(lv_obj_t * bar, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_bar_signal(lv_obj_t * bar, lv_signal_t sign, void * param); +static void lv_bar_set_value_with_anim(lv_obj_t * bar, int16_t new_value, int16_t *value_ptr, lv_bar_anim_t *anim_info, lv_anim_enable_t en); +static void lv_bar_init_anim(lv_obj_t * bar, lv_bar_anim_t * bar_anim); + +static void draw_bg(lv_obj_t * bar, const lv_area_t * clip_area, lv_design_mode_t mode, lv_opa_t opa); +static void draw_indic(lv_obj_t * bar, const lv_area_t * clip_area, lv_design_mode_t mode, lv_opa_t opa); #if LV_USE_ANIMATION -static void lv_bar_anim(void * bar, lv_anim_value_t value); +static void lv_bar_anim(lv_bar_anim_t * bar, lv_anim_value_t value); static void lv_bar_anim_ready(lv_anim_t * a); #endif @@ -61,7 +71,7 @@ lv_obj_t * lv_bar_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor basic object*/ lv_obj_t * new_bar = lv_obj_create(par, copy); - lv_mem_assert(new_bar); + LV_ASSERT_MEM(new_bar); if(new_bar == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_bar); @@ -69,19 +79,22 @@ lv_obj_t * lv_bar_create(lv_obj_t * par, const lv_obj_t * copy) /*Allocate the object type specific extended data*/ lv_bar_ext_t * ext = lv_obj_allocate_ext_attr(new_bar, sizeof(lv_bar_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_bar); + return NULL; + } ext->min_value = 0; + ext->start_value = 0; ext->max_value = 100; ext->cur_value = 0; #if LV_USE_ANIMATION ext->anim_time = 200; - ext->anim_start = 0; - ext->anim_end = 0; - ext->anim_state = LV_BAR_ANIM_STATE_INV; + lv_bar_init_anim(new_bar, &ext->cur_value_anim); + lv_bar_init_anim(new_bar, &ext->start_value_anim); #endif - ext->sym = 0; + ext->type = LV_BAR_TYPE_NORMAL; ext->style_indic = &lv_style_pretty_color; lv_obj_set_signal_cb(new_bar, lv_bar_signal); @@ -90,7 +103,7 @@ lv_obj_t * lv_bar_create(lv_obj_t * par, const lv_obj_t * copy) /*Init the new bar object*/ if(copy == NULL) { lv_obj_set_click(new_bar, false); - lv_obj_set_size(new_bar, LV_DPI * 2, LV_DPI / 3); + lv_obj_set_size(new_bar, LV_DPI * 2, LV_DPI / 4); lv_bar_set_value(new_bar, ext->cur_value, false); lv_theme_t * th = lv_theme_get_current(); @@ -103,10 +116,11 @@ lv_obj_t * lv_bar_create(lv_obj_t * par, const lv_obj_t * copy) } else { lv_bar_ext_t * ext_copy = lv_obj_get_ext_attr(copy); ext->min_value = ext_copy->min_value; + ext->start_value = ext_copy->start_value; ext->max_value = ext_copy->max_value; ext->cur_value = ext_copy->cur_value; ext->style_indic = ext_copy->style_indic; - ext->sym = ext_copy->sym; + ext->type = ext_copy->type; /*Refresh the style with new signal function*/ lv_obj_refresh_style(new_bar); @@ -130,6 +144,8 @@ lv_obj_t * lv_bar_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_bar_set_value(lv_obj_t * bar, int16_t value, lv_anim_enable_t anim) { + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + #if LV_USE_ANIMATION == 0 anim = false; #endif @@ -142,39 +158,33 @@ void lv_bar_set_value(lv_obj_t * bar, int16_t value, lv_anim_enable_t anim) if(ext->cur_value == new_value) return; - if(anim == LV_ANIM_OFF) { - ext->cur_value = new_value; - lv_obj_invalidate(bar); - } else { -#if LV_USE_ANIMATION - /*No animation in progress -> simply set the values*/ - if(ext->anim_state == LV_BAR_ANIM_STATE_INV) { - ext->anim_start = ext->cur_value; - ext->anim_end = new_value; - } - /*Animation in progress. Start from the animation end value*/ - else { - ext->anim_start = ext->anim_end; - ext->anim_end = new_value; - } + lv_bar_set_value_with_anim(bar, new_value, &ext->cur_value, &ext->cur_value_anim, anim); - lv_anim_t a; - a.var = bar; - a.start = LV_BAR_ANIM_STATE_START; - a.end = LV_BAR_ANIM_STATE_END; - a.exec_cb = (lv_anim_exec_xcb_t)lv_bar_anim; - a.path_cb = lv_anim_path_linear; - a.ready_cb = lv_bar_anim_ready; - a.act_time = 0; - a.time = ext->anim_time; - a.playback = 0; - a.playback_pause = 0; - a.repeat = 0; - a.repeat_pause = 0; +} - lv_anim_create(&a); +/** + * Set a new start value on the bar + * @param bar pointer to a bar object + * @param value new start value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediatelly + */ +void lv_bar_set_start_value(lv_obj_t * bar, int16_t start_value, lv_anim_enable_t anim) +{ + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + +#if LV_USE_ANIMATION == 0 + anim = false; #endif - } + lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); + if(ext->start_value == start_value) return; + + int16_t new_value; + new_value = start_value > ext->max_value ? ext->max_value : start_value; + new_value = new_value < ext->min_value ? ext->min_value : start_value; + + if(ext->start_value == new_value) return; + + lv_bar_set_value_with_anim(bar, start_value, &ext->start_value, &ext->start_value_anim, anim); } /** @@ -185,11 +195,17 @@ void lv_bar_set_value(lv_obj_t * bar, int16_t value, lv_anim_enable_t anim) */ void lv_bar_set_range(lv_obj_t * bar, int16_t min, int16_t max) { + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); if(ext->min_value == min && ext->max_value == max) return; ext->max_value = max; ext->min_value = min; + + if(lv_bar_get_type(bar) != LV_BAR_TYPE_CUSTOM) + ext->start_value = min; + if(ext->cur_value > max) { ext->cur_value = max; lv_bar_set_value(bar, ext->cur_value, false); @@ -202,15 +218,20 @@ void lv_bar_set_range(lv_obj_t * bar, int16_t min, int16_t max) } /** - * Make the bar symmetric to zero. The indicator will grow from zero instead of the minimum - * position. - * @param bar pointer to a bar object - * @param en true: enable disable symmetric behavior; false: disable + * Set the type of bar. + * @param bar pointer to bar object + * @param type bar type */ -void lv_bar_set_sym(lv_obj_t * bar, bool en) +void lv_bar_set_type(lv_obj_t * bar, lv_bar_type_t type) { + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); - ext->sym = en ? 1 : 0; + ext->type = type; + if(ext->type != LV_BAR_TYPE_CUSTOM) + ext->start_value = ext->min_value; + + lv_obj_invalidate(bar); } /** @@ -220,6 +241,8 @@ void lv_bar_set_sym(lv_obj_t * bar, bool en) */ void lv_bar_set_anim_time(lv_obj_t * bar, uint16_t anim_time) { + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); ext->anim_time = anim_time; @@ -237,6 +260,8 @@ void lv_bar_set_anim_time(lv_obj_t * bar, uint16_t anim_time) */ void lv_bar_set_style(lv_obj_t * bar, lv_bar_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); switch(type) { @@ -259,15 +284,38 @@ void lv_bar_set_style(lv_obj_t * bar, lv_bar_style_t type, const lv_style_t * st */ int16_t lv_bar_get_value(const lv_obj_t * bar) { + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); /*If animated tell that it's already at the end value*/ #if LV_USE_ANIMATION - if(ext->anim_state != LV_BAR_ANIM_STATE_INV) return ext->anim_end; + if(ext->cur_value_anim.is_animating) return ext->cur_value_anim.anim_end; #endif /*No animation, simple return the current value*/ return ext->cur_value; } +/** + * Get the start value of a bar + * @param bar pointer to a bar object + * @return the start value of the bar + */ +int16_t lv_bar_get_start_value(const lv_obj_t * bar) +{ + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + + lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); + + if(ext->type != LV_BAR_TYPE_CUSTOM) return ext->min_value; + + /*If animated tell that it's already at the end value*/ +#if LV_USE_ANIMATION + if(ext->start_value_anim.is_animating) return ext->start_value_anim.anim_end; +#endif + /*No animation, simple return the current value*/ + return ext->start_value; +} + /** * Get the minimum value of a bar * @param bar pointer to a bar object @@ -275,6 +323,8 @@ int16_t lv_bar_get_value(const lv_obj_t * bar) */ int16_t lv_bar_get_min_value(const lv_obj_t * bar) { + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); return ext->min_value; } @@ -286,19 +336,22 @@ int16_t lv_bar_get_min_value(const lv_obj_t * bar) */ int16_t lv_bar_get_max_value(const lv_obj_t * bar) { + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); return ext->max_value; } /** - * Get whether the bar is symmetric or not. - * @param bar pointer to a bar object - * @return true: symmetric is enabled; false: disable + * Get the type of bar. + * @param bar pointer to bar object + * @return bar type */ -bool lv_bar_get_sym(lv_obj_t * bar) -{ +lv_bar_type_t lv_bar_get_type(lv_obj_t * bar) { + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); - return ext->sym ? true : false; + return ext->type; } /** @@ -306,8 +359,10 @@ bool lv_bar_get_sym(lv_obj_t * bar) * @param bar pointer to a bar object * @return the animation time in milliseconds. */ -uint16_t lv_bar_get_anim_time(lv_obj_t * bar) +uint16_t lv_bar_get_anim_time(const lv_obj_t * bar) { + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); return ext->anim_time; @@ -325,6 +380,8 @@ uint16_t lv_bar_get_anim_time(lv_obj_t * bar) */ const lv_style_t * lv_bar_get_style(const lv_obj_t * bar, lv_bar_style_t type) { + LV_ASSERT_OBJ(bar, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); @@ -344,141 +401,217 @@ const lv_style_t * lv_bar_get_style(const lv_obj_t * bar, lv_bar_style_t type) /** * Handle the drawing related tasks of the bars * @param bar pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_bar_design(lv_obj_t * bar, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_bar_design(lv_obj_t * bar, const lv_area_t * clip_area, lv_design_mode_t mode) { if(mode == LV_DESIGN_COVER_CHK) { /*Return false if the object is not covers the mask area*/ - return ancestor_design_f(bar, mask, mode); + return ancestor_design_f(bar, clip_area, mode); } else if(mode == LV_DESIGN_DRAW_MAIN) { lv_opa_t opa_scale = lv_obj_get_opa_scale(bar); -#if LV_USE_GROUP == 0 - ancestor_design_f(bar, mask, mode); -#else - /* Draw the borders later if the bar is focused. - * At value = 100% the indicator can cover to whole background and the focused style won't - * be visible*/ - if(lv_obj_is_focused(bar)) { - const lv_style_t * style_bg = lv_bar_get_style(bar, LV_BAR_STYLE_BG); - lv_style_t style_tmp; - lv_style_copy(&style_tmp, style_bg); - style_tmp.body.border.width = 0; - lv_draw_rect(&bar->coords, mask, &style_tmp, opa_scale); - } else { - ancestor_design_f(bar, mask, mode); - } -#endif - lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); + draw_bg(bar, clip_area, mode, opa_scale); + draw_indic(bar, clip_area, mode, opa_scale); - if(ext->cur_value != ext->min_value || ext->sym -#if LV_USE_ANIMATION - || ext->anim_start != LV_BAR_ANIM_STATE_INV -#endif - ) { - const lv_style_t * style_indic = lv_bar_get_style(bar, LV_BAR_STYLE_INDIC); - lv_area_t indic_area; - lv_area_copy(&indic_area, &bar->coords); - indic_area.x1 += style_indic->body.padding.left; - indic_area.x2 -= style_indic->body.padding.right; - indic_area.y1 += style_indic->body.padding.top; - indic_area.y2 -= style_indic->body.padding.bottom; - - lv_coord_t w = lv_area_get_width(&indic_area); - lv_coord_t h = lv_area_get_height(&indic_area); - - if(w >= h) { - /*Horizontal*/ -#if LV_USE_ANIMATION - if(ext->anim_state != LV_BAR_ANIM_STATE_INV) { - /*Calculate the coordinates of anim. start and end*/ - lv_coord_t anim_start_x = - (int32_t)((int32_t)w * (ext->anim_start - ext->min_value)) / (ext->max_value - ext->min_value); - lv_coord_t anim_end_x = - (int32_t)((int32_t)w * (ext->anim_end - ext->min_value)) / (ext->max_value - ext->min_value); - - /*Calculate the real position based on `anim_state` (between `anim_start` and - * `anim_end`)*/ - indic_area.x2 = - anim_start_x + (((anim_end_x - anim_start_x) * ext->anim_state) >> LV_BAR_ANIM_STATE_NORM); - } else -#endif - { - indic_area.x2 = - (int32_t)((int32_t)w * (ext->cur_value - ext->min_value)) / (ext->max_value - ext->min_value); - } - - indic_area.x2 = indic_area.x1 + indic_area.x2 - 1; - if(ext->sym && ext->min_value < 0 && ext->max_value > 0) { - /*Calculate the coordinate of the zero point*/ - lv_coord_t zero; - zero = indic_area.x1 + (-ext->min_value * w) / (ext->max_value - ext->min_value); - if(indic_area.x2 > zero) - indic_area.x1 = zero; - else { - indic_area.x1 = indic_area.x2; - indic_area.x2 = zero; - } - } - } else { -#if LV_USE_ANIMATION - if(ext->anim_state != LV_BAR_ANIM_STATE_INV) { - /*Calculate the coordinates of anim. start and end*/ - lv_coord_t anim_start_y = - (int32_t)((int32_t)h * (ext->anim_start - ext->min_value)) / (ext->max_value - ext->min_value); - lv_coord_t anim_end_y = - (int32_t)((int32_t)h * (ext->anim_end - ext->min_value)) / (ext->max_value - ext->min_value); - - /*Calculate the real position based on `anim_state` (between `anim_start` and - * `anim_end`)*/ - indic_area.y1 = - anim_start_y + (((anim_end_y - anim_start_y) * ext->anim_state) >> LV_BAR_ANIM_STATE_NORM); - } else -#endif - { - indic_area.y1 = - (int32_t)((int32_t)h * (ext->cur_value - ext->min_value)) / (ext->max_value - ext->min_value); - } - - indic_area.y1 = indic_area.y2 - indic_area.y1 + 1; - - if(ext->sym && ext->min_value < 0 && ext->max_value > 0) { - /*Calculate the coordinate of the zero point*/ - lv_coord_t zero; - zero = indic_area.y2 - (-ext->min_value * h) / (ext->max_value - ext->min_value); - if(indic_area.y1 < zero) - indic_area.y2 = zero; - else { - indic_area.y2 = indic_area.y1; - indic_area.y1 = zero; - } - } - } - - /*Draw the indicator*/ - lv_draw_rect(&indic_area, mask, style_indic, opa_scale); - } - } else if(mode == LV_DESIGN_DRAW_POST) { #if LV_USE_GROUP /*Draw the border*/ if(lv_obj_is_focused(bar)) { - lv_opa_t opa_scale = lv_obj_get_opa_scale(bar); const lv_style_t * style_bg = lv_bar_get_style(bar, LV_BAR_STYLE_BG); lv_style_t style_tmp; lv_style_copy(&style_tmp, style_bg); style_tmp.body.opa = LV_OPA_TRANSP; style_tmp.body.shadow.width = 0; - lv_draw_rect(&bar->coords, mask, &style_tmp, opa_scale); + lv_draw_rect(&bar->coords, clip_area, &style_tmp, opa_scale); } #endif + + } else if(mode == LV_DESIGN_DRAW_POST) { + } - return true; + return LV_DESIGN_RES_OK; +} + +static void draw_bg(lv_obj_t * bar, const lv_area_t * clip_area, lv_design_mode_t mode, lv_opa_t opa) +{ + + const lv_style_t * style_bg = lv_bar_get_style(bar, LV_BAR_STYLE_BG); +#if LV_USE_GROUP == 0 + /*Simply draw the background*/ + lv_draw_rect(&bar->coords, clip_area, style_bg, opa); +#else + /* Draw the borders later if the bar is focused. + * At value = 100% the indicator can cover to whole background and the focused style won't + * be visible*/ + if(lv_obj_is_focused(bar)) { + lv_style_t style_tmp; + lv_style_copy(&style_tmp, style_bg); + style_tmp.body.border.width = 0; + lv_draw_rect(&bar->coords, clip_area, &style_tmp, opa); + } else { + lv_draw_rect(&bar->coords, clip_area, style_bg, opa); + } +#endif +} + +static void draw_indic(lv_obj_t * bar, const lv_area_t * clip_area, lv_design_mode_t mode, lv_opa_t opa) +{ + (void) mode; /*Unused*/ + + lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); + + lv_coord_t objw = lv_obj_get_width(bar); + lv_coord_t objh = lv_obj_get_height(bar); + int32_t range = ext->max_value - ext->min_value; + bool hor = objw >= objh ? true : false; + bool sym = false; + if(ext->type == LV_BAR_TYPE_SYM && ext->min_value < 0 && ext->max_value > 0) sym = true; + + bool cur_value_anim = false; +#if LV_USE_ANIMATION + if(ext->cur_value_anim.is_animating) cur_value_anim = true; +#endif + bool start_value_anim = false; +#if LV_USE_ANIMATION + if(ext->start_value_anim.is_animating) start_value_anim = true; +#endif + + /*Calculate the indicator area*/ + lv_area_copy(&ext->indic_area, &bar->coords); + const lv_style_t * style_indic = lv_bar_get_style(bar, LV_BAR_STYLE_INDIC); + const lv_style_t * style_bg = lv_bar_get_style(bar, LV_BAR_STYLE_BG); + + /*Respect padding and minimum width/height too*/ + ext->indic_area.x1 += style_indic->body.padding.left; + ext->indic_area.x2 -= style_indic->body.padding.right; + ext->indic_area.y1 += style_indic->body.padding.top; + ext->indic_area.y2 -= style_indic->body.padding.bottom; + + if(hor && lv_area_get_height(&ext->indic_area) < LV_BAR_SIZE_MIN) { + ext->indic_area.y1 = bar->coords.y1 + (objh / 2) - (LV_BAR_SIZE_MIN / 2); + ext->indic_area.y2 = ext->indic_area.y1 + LV_BAR_SIZE_MIN; + } else if(!hor && lv_area_get_width(&ext->indic_area) < LV_BAR_SIZE_MIN) { + ext->indic_area.x1 = bar->coords.x1 + (objw / 2) - (LV_BAR_SIZE_MIN / 2); + ext->indic_area.x2 = ext->indic_area.x1 + LV_BAR_SIZE_MIN; + } + + lv_coord_t indicw = lv_area_get_width(&ext->indic_area); + lv_coord_t indich = lv_area_get_height(&ext->indic_area); + + /*Calculate the indicator length*/ + lv_coord_t indic_length; + + lv_coord_t anim_cur_value, anim_start_value; + if(cur_value_anim) { +#if LV_USE_ANIMATION + anim_cur_value = ext->cur_value_anim.anim_val; +#endif + } else { + anim_cur_value = ext->cur_value; + } + + if(start_value_anim) { +#if LV_USE_ANIMATION + anim_start_value = ext->start_value_anim.anim_val; +#endif + } else { + anim_start_value = ext->start_value; + } + + indic_length = (int32_t)((int32_t)(hor ? indicw : indich) * ((anim_cur_value - ext->min_value) - (anim_start_value - ext->min_value))) / + (ext->max_value - ext->min_value); + + /*Horizontal bar*/ + if(hor) { + ext->indic_area.x2 = ext->indic_area.x1 + indic_length - 1; + if(sym) { + lv_coord_t zero; + zero = ext->indic_area.x1 + (-ext->min_value * indicw) / range; + if(ext->indic_area.x2 > zero) + ext->indic_area.x1 = zero; + else { + ext->indic_area.x1 = ext->indic_area.x2; + ext->indic_area.x2 = zero; + } + } else { + lv_coord_t increment = (anim_start_value * indicw) / range; + ext->indic_area.x1 += increment; + ext->indic_area.x2 += increment; + } + } + /*Vertical bar*/ + else { + ext->indic_area.y1 = ext->indic_area.y2 - indic_length + 1; + if(sym) { + lv_coord_t zero; + zero = ext->indic_area.y2 - (-ext->min_value * objh) / range; + if(ext->indic_area.y1 < zero) + ext->indic_area.y2 = zero; + else { + ext->indic_area.y2 = ext->indic_area.y1; + ext->indic_area.y1 = zero; + } + } else { + lv_coord_t increment = (anim_start_value * objh) / range; + ext->indic_area.y1 += increment; + ext->indic_area.y2 += increment; + } + } + + /*Draw the indicator*/ + + /*Do not draw a zero length indicator*/ + if(!sym && indic_length == 0) return; + + lv_style_t style_indic_tmp; + lv_style_copy(&style_indic_tmp, style_indic); + uint16_t bg_radius = style_bg->body.radius; + lv_coord_t short_side = LV_MATH_MIN(objw, objh); + if(bg_radius > short_side >> 1) bg_radius = short_side >> 1; + /*Draw only the shadow*/ + if((hor && lv_area_get_width(&ext->indic_area) > bg_radius * 2) || + (!hor && lv_area_get_height(&ext->indic_area) > bg_radius * 2)) { + style_indic_tmp.body.opa = LV_OPA_TRANSP; + style_indic_tmp.body.border.width = 0; + lv_draw_rect(&ext->indic_area, clip_area, &style_indic_tmp, opa); + } + + + lv_draw_mask_radius_param_t mask_bg_param; + lv_draw_mask_radius_init(&mask_bg_param, &bar->coords, style_bg->body.radius, false); + int16_t mask_bg_id = lv_draw_mask_add(&mask_bg_param, NULL); + + /*Draw_only the background*/ + style_indic_tmp.body.shadow.width = 0; + style_indic_tmp.body.opa = style_indic->body.opa; + + /*Get the max possible indicator area. The gradient should be applied on this*/ + lv_area_t mask_indic_max_area; + lv_area_copy(&mask_indic_max_area, &bar->coords); + mask_indic_max_area.x1 += style_indic->body.padding.left; + mask_indic_max_area.y1 += style_indic->body.padding.top; + mask_indic_max_area.x2 -= style_indic->body.padding.right; + mask_indic_max_area.y2 -= style_indic->body.padding.bottom; + + /*Create a mask to the current indicator area to see only this part from the whole gradient.*/ + lv_draw_mask_radius_param_t mask_indic_param; + lv_draw_mask_radius_init(&mask_indic_param, &ext->indic_area, style_indic->body.radius, false); + int16_t mask_indic_id = lv_draw_mask_add(&mask_indic_param, NULL); + lv_draw_rect(&mask_indic_max_area, clip_area, &style_indic_tmp, opa); + + /*Draw the border*/ + style_indic_tmp.body.border.width = style_indic->body.border.width; + style_indic_tmp.body.opa = LV_OPA_TRANSP; + lv_draw_rect(&ext->indic_area, clip_area, &style_indic_tmp, opa); + + lv_draw_mask_remove_id(mask_indic_id); + lv_draw_mask_remove_id(mask_bg_id); + } /** @@ -495,36 +628,99 @@ static lv_res_t lv_bar_signal(lv_obj_t * bar, lv_signal_t sign, void * param) /* Include the ancient signal function */ res = ancestor_signal(bar, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { const lv_style_t * style_indic = lv_bar_get_style(bar, LV_BAR_STYLE_INDIC); + const lv_style_t * style_bg = lv_bar_get_style(bar, LV_BAR_STYLE_BG); + + lv_coord_t bg_size = style_bg->body.shadow.width + style_bg->body.shadow.spread; + bg_size += LV_MATH_MAX(LV_MATH_ABS(style_bg->body.shadow.offset.x), LV_MATH_ABS(style_bg->body.shadow.offset.y)); + + lv_coord_t indic_size = style_indic->body.shadow.width + style_indic->body.shadow.spread; + indic_size += LV_MATH_MAX(LV_MATH_ABS(style_indic->body.shadow.offset.x), LV_MATH_ABS(style_indic->body.shadow.offset.y)); + + bar->ext_draw_pad = LV_MATH_MAX(bar->ext_draw_pad, bg_size); + bar->ext_draw_pad = LV_MATH_MAX(bar->ext_draw_pad, indic_size); + if(style_indic->body.shadow.width > bar->ext_draw_pad) bar->ext_draw_pad = style_indic->body.shadow.width; - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_bar"; } + if(sign == LV_SIGNAL_CLEANUP) { + lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); + lv_anim_del(&ext->cur_value_anim, NULL); + lv_anim_del(&ext->start_value_anim, NULL); + } + return res; } #if LV_USE_ANIMATION -static void lv_bar_anim(void * bar, lv_anim_value_t value) +static void lv_bar_anim(lv_bar_anim_t * var, lv_anim_value_t value) { - lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); - ext->anim_state = value; - lv_obj_invalidate(bar); + var->anim_val = value; + lv_obj_invalidate(var->bar); } static void lv_bar_anim_ready(lv_anim_t * a) { - lv_bar_ext_t * ext = lv_obj_get_ext_attr(a->var); - ext->anim_state = LV_BAR_ANIM_STATE_INV; - lv_bar_set_value(a->var, ext->anim_end, false); + lv_bar_anim_t * var = a->var; + lv_bar_ext_t * ext = lv_obj_get_ext_attr(var->bar); + var->is_animating = false; + if(var == &ext->cur_value_anim) + ext->cur_value = var->anim_end; + else if(var == &ext->start_value_anim) + ext->start_value = var->anim_end; + lv_obj_invalidate(var->bar); } #endif +static void lv_bar_set_value_with_anim(lv_obj_t * bar, int16_t new_value, int16_t *value_ptr, lv_bar_anim_t *anim_info, lv_anim_enable_t en) { + if(en == LV_ANIM_OFF) { + *value_ptr = new_value; + lv_obj_invalidate(bar); + } else { +#if LV_USE_ANIMATION + lv_bar_ext_t *ext = lv_obj_get_ext_attr(bar); + /*No animation in progress -> simply set the values*/ + if(!anim_info->is_animating) { + anim_info->anim_start = *value_ptr; + anim_info->anim_end = new_value; + } + /*Animation in progress. Start from the animation end value*/ + else { + anim_info->anim_start = anim_info->anim_end; + anim_info->anim_end = new_value; + } + /* Stop the previous animation if it exists */ + lv_anim_del(anim_info, NULL); + + lv_anim_t a; + a.var = anim_info; + a.start = anim_info->anim_start; + a.end = anim_info->anim_end; + a.exec_cb = (lv_anim_exec_xcb_t)lv_bar_anim; + a.path_cb = lv_anim_path_linear; + a.ready_cb = lv_bar_anim_ready; + a.act_time = 0; + a.time = ext->anim_time; + a.playback = 0; + a.playback_pause = 0; + a.repeat = 0; + a.repeat_pause = 0; + + lv_anim_create(&a); + anim_info->is_animating = true; +#endif + } +} + +static void lv_bar_init_anim(lv_obj_t * bar, lv_bar_anim_t * bar_anim) +{ + bar_anim->bar = bar; + bar_anim->anim_start = 0; + bar_anim->anim_end = 0; + bar_anim->is_animating = false; +} + #endif diff --git a/src/lv_objx/lv_bar.h b/src/lv_objx/lv_bar.h index 14c558e7a..86747c43c 100644 --- a/src/lv_objx/lv_bar.h +++ b/src/lv_objx/lv_bar.h @@ -31,22 +31,27 @@ extern "C" { * DEFINES *********************/ -/** Bar animation start value. (Not the real value of the Bar just indicates process animation)*/ -#define LV_BAR_ANIM_STATE_START 0 - -/** Bar animation end value. (Not the real value of the Bar just indicates process animation)*/ -#define LV_BAR_ANIM_STATE_END 256 - -/** Mark no animation is in progress */ -#define LV_BAR_ANIM_STATE_INV -1 - -/** log2(LV_BAR_ANIM_STATE_END) used to normalize data*/ -#define LV_BAR_ANIM_STATE_NORM 8 - /********************** * TYPEDEFS **********************/ +enum { + LV_BAR_TYPE_NORMAL, + LV_BAR_TYPE_SYM, + LV_BAR_TYPE_CUSTOM +}; +typedef uint8_t lv_bar_type_t; + +#if LV_USE_ANIMATION +typedef struct { + lv_obj_t * bar; + lv_anim_value_t anim_start; + lv_anim_value_t anim_end; + lv_anim_value_t anim_val; + uint8_t is_animating : 1; +} lv_bar_anim_t; +#endif + /** Data of bar*/ typedef struct { @@ -56,13 +61,14 @@ typedef struct int16_t cur_value; /*Current value of the bar*/ int16_t min_value; /*Minimum value of the bar*/ int16_t max_value; /*Maximum value of the bar*/ + int16_t start_value; /*Start value of the bar*/ + lv_area_t indic_area; /*Save the indicator area. MIght be used by derived types*/ #if LV_USE_ANIMATION - lv_anim_value_t anim_start; - lv_anim_value_t anim_end; - lv_anim_value_t anim_state; lv_anim_value_t anim_time; + lv_bar_anim_t cur_value_anim; + lv_bar_anim_t start_value_anim; #endif - uint8_t sym : 1; /*Symmetric: means the center is around zero value*/ + uint8_t type : 2; /*Type of bar*/ const lv_style_t * style_indic; /*Style of the indicator*/ } lv_bar_ext_t; @@ -97,6 +103,14 @@ lv_obj_t * lv_bar_create(lv_obj_t * par, const lv_obj_t * copy); */ void lv_bar_set_value(lv_obj_t * bar, int16_t value, lv_anim_enable_t anim); +/** + * Set a new start value on the bar + * @param bar pointer to a bar object + * @param value new start value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediatelly + */ +void lv_bar_set_start_value(lv_obj_t * bar, int16_t start_value, lv_anim_enable_t anim); + /** * Set minimum and the maximum values of a bar * @param bar pointer to the bar object @@ -106,12 +120,11 @@ void lv_bar_set_value(lv_obj_t * bar, int16_t value, lv_anim_enable_t anim); void lv_bar_set_range(lv_obj_t * bar, int16_t min, int16_t max); /** - * Make the bar symmetric to zero. The indicator will grow from zero instead of the minimum - * position. - * @param bar pointer to a bar object - * @param en true: enable disable symmetric behavior; false: disable + * Set the type of bar. + * @param bar pointer to bar object + * @param type bar type */ -void lv_bar_set_sym(lv_obj_t * bar, bool en); +void lv_bar_set_type(lv_obj_t * bar, lv_bar_type_t type); /** * Set the animation time of the bar @@ -139,6 +152,13 @@ void lv_bar_set_style(lv_obj_t * bar, lv_bar_style_t type, const lv_style_t * st */ int16_t lv_bar_get_value(const lv_obj_t * bar); +/** + * Get the start value of a bar + * @param bar pointer to a bar object + * @return the start value of the bar + */ +int16_t lv_bar_get_start_value(const lv_obj_t * bar); + /** * Get the minimum value of a bar * @param bar pointer to a bar object @@ -154,18 +174,18 @@ int16_t lv_bar_get_min_value(const lv_obj_t * bar); int16_t lv_bar_get_max_value(const lv_obj_t * bar); /** - * Get whether the bar is symmetric or not. - * @param bar pointer to a bar object - * @return true: symmetric is enabled; false: disable + * Get the type of bar. + * @param bar pointer to bar object + * @return bar type */ -bool lv_bar_get_sym(lv_obj_t * bar); +lv_bar_type_t lv_bar_get_type(lv_obj_t * bar); /** * Get the animation time of the bar * @param bar pointer to a bar object * @return the animation time in milliseconds. */ -uint16_t lv_bar_get_anim_time(lv_obj_t * bar); +uint16_t lv_bar_get_anim_time(const lv_obj_t * bar); /** * Get a style of a bar diff --git a/src/lv_objx/lv_btn.c b/src/lv_objx/lv_btn.c index 7ab3e5b25..f26628394 100644 --- a/src/lv_objx/lv_btn.c +++ b/src/lv_objx/lv_btn.c @@ -12,6 +12,7 @@ #include #include "../lv_core/lv_group.h" +#include "../lv_core/lv_debug.h" #include "../lv_draw/lv_draw.h" #include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_area.h" @@ -21,6 +22,7 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_btn" #define LV_BTN_INK_VALUE_MAX 256 #define LV_BTN_INK_VALUE_MAX_SHIFT 8 @@ -31,7 +33,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_btn_design(lv_obj_t * btn, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_btn_design(lv_obj_t * btn, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * param); #if LV_USE_ANIMATION && LV_BTN_INK_EFFECT @@ -76,7 +78,7 @@ lv_obj_t * lv_btn_create(lv_obj_t * par, const lv_obj_t * copy) lv_obj_t * new_btn; new_btn = lv_cont_create(par, copy); - lv_mem_assert(new_btn); + LV_ASSERT_MEM(new_btn); if(new_btn == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_btn); @@ -84,8 +86,11 @@ lv_obj_t * lv_btn_create(lv_obj_t * par, const lv_obj_t * copy) /*Allocate the extended data*/ lv_btn_ext_t * ext = lv_obj_allocate_ext_attr(new_btn, sizeof(lv_btn_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_btn); + return NULL; + } ext->state = LV_BTN_STATE_REL; @@ -136,7 +141,7 @@ lv_obj_t * lv_btn_create(lv_obj_t * par, const lv_obj_t * copy) ext->ink_wait_time = copy_ext->ink_wait_time; ext->ink_out_time = copy_ext->ink_out_time; #endif - memcpy(ext->styles, copy_ext->styles, sizeof(ext->styles)); + memcpy((void*) ext->styles, copy_ext->styles, sizeof(ext->styles)); /*Refresh the style with new signal function*/ lv_obj_refresh_style(new_btn); @@ -158,6 +163,8 @@ lv_obj_t * lv_btn_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_btn_set_toggle(lv_obj_t * btn, bool tgl) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); ext->toggle = tgl != false ? 1 : 0; @@ -170,6 +177,8 @@ void lv_btn_set_toggle(lv_obj_t * btn, bool tgl) */ void lv_btn_set_state(lv_obj_t * btn, lv_btn_state_t state) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); if(ext->state != state) { ext->state = state; @@ -183,6 +192,8 @@ void lv_btn_set_state(lv_obj_t * btn, lv_btn_state_t state) */ void lv_btn_toggle(lv_obj_t * btn) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); switch(ext->state) { case LV_BTN_STATE_REL: lv_btn_set_state(btn, LV_BTN_STATE_TGL_REL); break; @@ -200,6 +211,8 @@ void lv_btn_toggle(lv_obj_t * btn) */ void lv_btn_set_ink_in_time(lv_obj_t * btn, uint16_t time) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + #if LV_USE_ANIMATION && LV_BTN_INK_EFFECT lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); ext->ink_in_time = time; @@ -218,6 +231,8 @@ void lv_btn_set_ink_in_time(lv_obj_t * btn, uint16_t time) */ void lv_btn_set_ink_wait_time(lv_obj_t * btn, uint16_t time) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + #if LV_USE_ANIMATION && LV_BTN_INK_EFFECT lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); @@ -237,6 +252,8 @@ void lv_btn_set_ink_wait_time(lv_obj_t * btn, uint16_t time) */ void lv_btn_set_ink_out_time(lv_obj_t * btn, uint16_t time) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + #if LV_USE_ANIMATION && LV_BTN_INK_EFFECT lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); ext->ink_out_time = time; @@ -256,6 +273,8 @@ void lv_btn_set_ink_out_time(lv_obj_t * btn, uint16_t time) */ void lv_btn_set_style(lv_obj_t * btn, lv_btn_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); switch(type) { @@ -281,6 +300,8 @@ void lv_btn_set_style(lv_obj_t * btn, lv_btn_style_t type, const lv_style_t * st */ lv_btn_state_t lv_btn_get_state(const lv_obj_t * btn) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); return ext->state; } @@ -292,6 +313,8 @@ lv_btn_state_t lv_btn_get_state(const lv_obj_t * btn) */ bool lv_btn_get_toggle(const lv_obj_t * btn) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); return ext->toggle != 0 ? true : false; @@ -304,6 +327,8 @@ bool lv_btn_get_toggle(const lv_obj_t * btn) */ uint16_t lv_btn_get_ink_in_time(const lv_obj_t * btn) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + #if LV_USE_ANIMATION && LV_BTN_INK_EFFECT lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); return ext->ink_in_time; @@ -320,6 +345,8 @@ uint16_t lv_btn_get_ink_in_time(const lv_obj_t * btn) */ uint16_t lv_btn_get_ink_wait_time(const lv_obj_t * btn) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + #if LV_USE_ANIMATION && LV_BTN_INK_EFFECT lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); return ext->ink_wait_time; @@ -335,9 +362,11 @@ uint16_t lv_btn_get_ink_wait_time(const lv_obj_t * btn) */ uint16_t lv_btn_get_ink_out_time(const lv_obj_t * btn) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + #if LV_USE_ANIMATION && LV_BTN_INK_EFFECT lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); - return ext->ink_in_time; + return ext->ink_out_time; #else (void)btn; /*Unused*/ return 0; @@ -352,6 +381,8 @@ uint16_t lv_btn_get_ink_out_time(const lv_obj_t * btn) */ const lv_style_t * lv_btn_get_style(const lv_obj_t * btn, lv_btn_style_t type) { + LV_ASSERT_OBJ(btn, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); lv_btn_state_t state = lv_btn_get_state(btn); @@ -392,17 +423,17 @@ const lv_style_t * lv_btn_get_style(const lv_obj_t * btn, lv_btn_style_t type) * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_btn_design(lv_obj_t * btn, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_btn_design(lv_obj_t * btn, const lv_area_t * clip_area, lv_design_mode_t mode) { if(mode == LV_DESIGN_COVER_CHK) { - return false; + return ancestor_design(btn, clip_area, mode); } else if(mode == LV_DESIGN_DRAW_MAIN) { #if LV_USE_ANIMATION && LV_BTN_INK_EFFECT if(btn != ink_obj) { - ancestor_design(btn, mask, mode); + ancestor_design(btn, clip_area, mode); } else { lv_opa_t opa_scale = lv_obj_get_opa_scale(btn); lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); @@ -412,7 +443,7 @@ static bool lv_btn_design(lv_obj_t * btn, const lv_area_t * mask, lv_design_mode lv_style_t style_tmp; lv_style_copy(&style_tmp, ext->styles[ink_bg_state]); style_tmp.body.shadow.width = ext->styles[ink_top_state]->body.shadow.width; - lv_draw_rect(&btn->coords, mask, &style_tmp, opa_scale); + lv_draw_rect(&btn->coords, clip_area, &style_tmp, opa_scale); lv_coord_t w = lv_obj_get_width(btn); lv_coord_t h = lv_obj_get_height(btn); @@ -451,22 +482,22 @@ static bool lv_btn_design(lv_obj_t * btn, const lv_area_t * mask, lv_design_mode style_tmp.body.border.width = 0; /*Draw the circle*/ - lv_draw_rect(&cir_area, mask, &style_tmp, opa_scale); + lv_draw_rect(&cir_area, clip_area, &style_tmp, opa_scale); } else { lv_style_t res; lv_style_copy(&res, ext->styles[ink_bg_state]); lv_style_mix(ext->styles[ink_bg_state], ext->styles[ink_top_state], &res, ink_act_value); - lv_draw_rect(&btn->coords, mask, &res, opa_scale); + lv_draw_rect(&btn->coords, clip_area, &res, opa_scale); } } #else - ancestor_design(btn, mask, mode); + ancestor_design(btn, clip_area, mode); #endif } else if(mode == LV_DESIGN_DRAW_POST) { - ancestor_design(btn, mask, mode); + ancestor_design(btn, clip_area, mode); } - return true; + return LV_DESIGN_RES_OK; } /** @@ -483,6 +514,7 @@ static lv_res_t lv_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * param) /* Include the ancient signal function */ res = ancestor_signal(btn, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); bool tgl = lv_btn_get_toggle(btn); @@ -634,13 +666,6 @@ static lv_res_t lv_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * param) ink_obj = NULL; } #endif - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_btn"; } return res; diff --git a/src/lv_objx/lv_btnm.c b/src/lv_objx/lv_btnm.c index 3c517d1f3..9b38a70f3 100644 --- a/src/lv_objx/lv_btnm.c +++ b/src/lv_objx/lv_btnm.c @@ -9,6 +9,7 @@ #include "lv_btnm.h" #if LV_USE_BTNM != 0 +#include "../lv_core/lv_debug.h" #include "../lv_core/lv_group.h" #include "../lv_draw/lv_draw.h" #include "../lv_core/lv_refr.h" @@ -18,6 +19,7 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_btnm" /********************** * TYPEDEFS @@ -27,7 +29,7 @@ * STATIC PROTOTYPES **********************/ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param); -static bool lv_btnm_design(lv_obj_t * btnm, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_btnm_design(lv_obj_t * btnm, const lv_area_t * clip_area, lv_design_mode_t mode); static uint8_t get_button_width(lv_btnm_ctrl_t ctrl_bits); static bool button_is_hidden(lv_btnm_ctrl_t ctrl_bits); static bool button_is_repeat_disabled(lv_btnm_ctrl_t ctrl_bits); @@ -70,15 +72,18 @@ lv_obj_t * lv_btnm_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor object*/ lv_obj_t * new_btnm = lv_obj_create(par, copy); - lv_mem_assert(new_btnm); + LV_ASSERT_MEM(new_btnm); if(new_btnm == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_btnm); /*Allocate the object type specific extended data*/ lv_btnm_ext_t * ext = lv_obj_allocate_ext_attr(new_btnm, sizeof(lv_btnm_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_btnm); + return NULL; + } ext->btn_cnt = 0; ext->btn_id_pr = LV_BTNM_BTN_NONE; @@ -101,8 +106,8 @@ lv_obj_t * lv_btnm_create(lv_obj_t * par, const lv_obj_t * copy) /*Init the new button matrix object*/ if(copy == NULL) { - lv_obj_set_size(new_btnm, LV_DPI * 3, LV_DPI * 2); lv_btnm_set_map(new_btnm, lv_btnm_def_map); + lv_obj_set_size(new_btnm, LV_DPI * 3, LV_DPI * 2); /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); @@ -120,7 +125,7 @@ lv_obj_t * lv_btnm_create(lv_obj_t * par, const lv_obj_t * copy) /*Copy an existing object*/ else { lv_btnm_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - memcpy(ext->styles_btn, copy_ext->styles_btn, sizeof(ext->styles_btn)); + memcpy((void*)ext->styles_btn, copy_ext->styles_btn, sizeof(ext->styles_btn)); lv_btnm_set_map(new_btnm, lv_btnm_get_map_array(copy)); } @@ -142,7 +147,8 @@ lv_obj_t * lv_btnm_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_btnm_set_map(const lv_obj_t * btnm, const char * map[]) { - if(map == NULL) return; + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + LV_ASSERT_NULL(map); /* * lv_btnm_set_map is called on receipt of signals such as @@ -204,6 +210,8 @@ void lv_btnm_set_map(const lv_obj_t * btnm, const char * map[]) btn_h = lv_obj_get_height(btnm)- act_y - style_bg->body.padding.bottom - 1; } + lv_bidi_dir_t base_dir = lv_obj_get_base_dir(btnm); + /*Only deal with the non empty lines*/ if(btn_cnt != 0) { /*Calculate the width of all units*/ @@ -211,7 +219,8 @@ void lv_btnm_set_map(const lv_obj_t * btnm, const char * map[]) /*Set the button size and positions and set the texts*/ uint16_t i; - lv_coord_t act_x = style_bg->body.padding.left; + lv_coord_t act_x; + lv_coord_t act_unit_w; unit_act_cnt = 0; for(i = 0; i < btn_cnt; i++) { @@ -222,9 +231,13 @@ void lv_btnm_set_map(const lv_obj_t * btnm, const char * map[]) act_unit_w--; /*-1 because e.g. width = 100 means 101 pixels (0..100)*/ /*Always recalculate act_x because of rounding errors */ - act_x = (unit_act_cnt * all_unit_w) / unit_cnt + i * style_bg->body.padding.inner + - style_bg->body.padding.left; - + if(base_dir == LV_BIDI_DIR_RTL) { + act_x = (unit_act_cnt * all_unit_w) / unit_cnt + i * style_bg->body.padding.inner; + act_x = lv_obj_get_width(btnm) - style_bg->body.padding.right - act_x - act_unit_w - 1; + } else { + act_x = (unit_act_cnt * all_unit_w) / unit_cnt + i * style_bg->body.padding.inner + + style_bg->body.padding.left; + } /* Set the button's area. * If inner padding is zero then use the prev. button x2 as x1 to avoid rounding * errors*/ @@ -265,6 +278,8 @@ void lv_btnm_set_map(const lv_obj_t * btnm, const char * map[]) */ void lv_btnm_set_ctrl_map(const lv_obj_t * btnm, const lv_btnm_ctrl_t ctrl_map[]) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); memcpy(ext->ctrl_bits, ctrl_map, sizeof(lv_btnm_ctrl_t) * ext->btn_cnt); @@ -279,6 +294,8 @@ void lv_btnm_set_ctrl_map(const lv_obj_t * btnm, const lv_btnm_ctrl_t ctrl_map[] */ void lv_btnm_set_pressed(const lv_obj_t * btnm, uint16_t id) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); if(id >= ext->btn_cnt && id != LV_BTNM_BTN_NONE) return; @@ -297,6 +314,8 @@ void lv_btnm_set_pressed(const lv_obj_t * btnm, uint16_t id) */ void lv_btnm_set_style(lv_obj_t * btnm, lv_btnm_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); switch(type) { @@ -331,6 +350,8 @@ void lv_btnm_set_style(lv_obj_t * btnm, lv_btnm_style_t type, const lv_style_t * */ void lv_btnm_set_recolor(const lv_obj_t * btnm, bool en) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); ext->recolor = en; @@ -344,6 +365,8 @@ void lv_btnm_set_recolor(const lv_obj_t * btnm, bool en) */ void lv_btnm_set_btn_ctrl(const lv_obj_t * btnm, uint16_t btn_id, lv_btnm_ctrl_t ctrl) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); if(btn_id >= ext->btn_cnt) return; @@ -359,6 +382,8 @@ void lv_btnm_set_btn_ctrl(const lv_obj_t * btnm, uint16_t btn_id, lv_btnm_ctrl_t */ void lv_btnm_clear_btn_ctrl(const lv_obj_t * btnm, uint16_t btn_id, lv_btnm_ctrl_t ctrl) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); if(btn_id >= ext->btn_cnt) return; @@ -374,6 +399,8 @@ void lv_btnm_clear_btn_ctrl(const lv_obj_t * btnm, uint16_t btn_id, lv_btnm_ctrl */ void lv_btnm_set_btn_ctrl_all(lv_obj_t * btnm, lv_btnm_ctrl_t ctrl) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); uint16_t i; for(i = 0; i < ext->btn_cnt; i++) { @@ -389,6 +416,8 @@ void lv_btnm_set_btn_ctrl_all(lv_obj_t * btnm, lv_btnm_ctrl_t ctrl) */ void lv_btnm_clear_btn_ctrl_all(lv_obj_t * btnm, lv_btnm_ctrl_t ctrl) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); uint16_t i; for(i = 0; i < ext->btn_cnt; i++) { @@ -407,6 +436,8 @@ void lv_btnm_clear_btn_ctrl_all(lv_obj_t * btnm, lv_btnm_ctrl_t ctrl) */ void lv_btnm_set_btn_width(const lv_obj_t * btnm, uint16_t btn_id, uint8_t width) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); if(btn_id >= ext->btn_cnt) return; @@ -427,6 +458,8 @@ void lv_btnm_set_btn_width(const lv_obj_t * btnm, uint16_t btn_id, uint8_t width */ void lv_btnm_set_one_toggle(lv_obj_t * btnm, bool one_toggle) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); ext->one_toggle = one_toggle; @@ -445,6 +478,8 @@ void lv_btnm_set_one_toggle(lv_obj_t * btnm, bool one_toggle) */ const char ** lv_btnm_get_map_array(const lv_obj_t * btnm) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); return ext->map_p; } @@ -456,6 +491,8 @@ const char ** lv_btnm_get_map_array(const lv_obj_t * btnm) */ bool lv_btnm_get_recolor(const lv_obj_t * btnm) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); return ext->recolor; @@ -469,6 +506,8 @@ bool lv_btnm_get_recolor(const lv_obj_t * btnm) */ uint16_t lv_btnm_get_active_btn(const lv_obj_t * btnm) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); return ext->btn_id_act; } @@ -481,6 +520,8 @@ uint16_t lv_btnm_get_active_btn(const lv_obj_t * btnm) */ const char * lv_btnm_get_active_btn_text(const lv_obj_t * btnm) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); if(ext->btn_id_act != LV_BTNM_BTN_NONE) { return lv_btnm_get_btn_text(btnm, ext->btn_id_act); @@ -497,6 +538,8 @@ const char * lv_btnm_get_active_btn_text(const lv_obj_t * btnm) */ uint16_t lv_btnm_get_pressed_btn(const lv_obj_t * btnm) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); return ext->btn_id_pr; } @@ -510,6 +553,8 @@ uint16_t lv_btnm_get_pressed_btn(const lv_obj_t * btnm) */ const char * lv_btnm_get_btn_text(const lv_obj_t * btnm, uint16_t btn_id) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); if(btn_id > ext->btn_cnt) return NULL; @@ -539,6 +584,8 @@ const char * lv_btnm_get_btn_text(const lv_obj_t * btnm, uint16_t btn_id) */ bool lv_btnm_get_btn_ctrl(lv_obj_t * btnm, uint16_t btn_id, lv_btnm_ctrl_t ctrl) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); if(btn_id >= ext->btn_cnt) return false; @@ -553,6 +600,8 @@ bool lv_btnm_get_btn_ctrl(lv_obj_t * btnm, uint16_t btn_id, lv_btnm_ctrl_t ctrl) */ const lv_style_t * lv_btnm_get_style(const lv_obj_t * btnm, lv_btnm_style_t type) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); @@ -576,6 +625,8 @@ const lv_style_t * lv_btnm_get_style(const lv_obj_t * btnm, lv_btnm_style_t type */ bool lv_btnm_get_one_toggle(const lv_obj_t * btnm) { + LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); + lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); return ext->one_toggle; @@ -588,23 +639,21 @@ bool lv_btnm_get_one_toggle(const lv_obj_t * btnm) /** * Handle the drawing related tasks of the button matrixs * @param btnm pointer to a button matrix object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_btnm_design(lv_obj_t * btnm, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_btnm_design(lv_obj_t * btnm, const lv_area_t * clip_area, lv_design_mode_t mode) { if(mode == LV_DESIGN_COVER_CHK) { - return ancestor_design_f(btnm, mask, mode); - /*Return false if the object is not covers the mask_p area*/ + return ancestor_design_f(btnm, clip_area, mode); } /*Draw the object*/ else if(mode == LV_DESIGN_DRAW_MAIN) { - - ancestor_design_f(btnm, mask, mode); + ancestor_design_f(btnm, clip_area, mode); lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); const lv_style_t * bg_style = lv_obj_get_style(btnm); @@ -624,7 +673,6 @@ static bool lv_btnm_design(lv_obj_t * btnm, const lv_area_t * mask, lv_design_mo lv_txt_flag_t txt_flag = LV_TXT_FLAG_NONE; if(ext->recolor) txt_flag = LV_TXT_FLAG_RECOLOR; - for(btn_i = 0; btn_i < ext->btn_cnt; btn_i++, txt_i++) { /*Search the next valid text in the map*/ while(strcmp(ext->map_p[txt_i], "\n") == 0) { @@ -661,25 +709,25 @@ static bool lv_btnm_design(lv_obj_t * btnm, const lv_area_t * mask, lv_design_mo lv_style_copy(&style_tmp, btn_style); /*Remove borders on the edges if `LV_BORDER_INTERNAL`*/ - if(style_tmp.body.border.part & LV_BORDER_INTERNAL) { + if(style_tmp.body.border.part & LV_BORDER_PART_INTERNAL) { if(area_tmp.y1 == btnm->coords.y1 + bg_style->body.padding.top) { - style_tmp.body.border.part &= ~LV_BORDER_TOP; + style_tmp.body.border.part &= ~LV_BORDER_PART_TOP; } if(area_tmp.y2 == btnm->coords.y2 - bg_style->body.padding.bottom) { - style_tmp.body.border.part &= ~LV_BORDER_BOTTOM; + style_tmp.body.border.part &= ~LV_BORDER_PART_BOTTOM; } if(txt_i == 0) { - style_tmp.body.border.part &= ~LV_BORDER_LEFT; + style_tmp.body.border.part &= ~LV_BORDER_PART_LEFT; } else if(strcmp(ext->map_p[txt_i - 1], "\n") == 0) { - style_tmp.body.border.part &= ~LV_BORDER_LEFT; + style_tmp.body.border.part &= ~LV_BORDER_PART_LEFT; } if(ext->map_p[txt_i + 1][0] == '\0' || strcmp(ext->map_p[txt_i + 1], "\n") == 0) { - style_tmp.body.border.part &= ~LV_BORDER_RIGHT; + style_tmp.body.border.part &= ~LV_BORDER_PART_RIGHT; } } - lv_draw_rect(&area_tmp, mask, &style_tmp, opa_scale); + lv_draw_rect(&area_tmp, clip_area, &style_tmp, opa_scale); /*Calculate the size of the text*/ if(btn_style->glass) btn_style = bg_style; @@ -693,10 +741,10 @@ static bool lv_btnm_design(lv_obj_t * btnm, const lv_area_t * mask, lv_design_mo area_tmp.x2 = area_tmp.x1 + txt_size.x; area_tmp.y2 = area_tmp.y1 + txt_size.y; - lv_draw_label(&area_tmp, mask, btn_style, opa_scale, ext->map_p[txt_i], txt_flag, NULL, -1, -1, NULL); + lv_draw_label(&area_tmp, clip_area, btn_style, opa_scale, ext->map_p[txt_i], txt_flag, NULL, NULL, NULL, lv_obj_get_base_dir(btnm)); } } - return true; + return LV_DESIGN_RES_OK; } /** @@ -713,6 +761,7 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param) /* Include the ancient signal function */ res = ancestor_signal(btnm, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); lv_point_t p; @@ -813,6 +862,12 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param) #if LV_USE_GROUP lv_indev_t * indev = lv_indev_get_act(); lv_indev_type_t indev_type = lv_indev_get_type(indev); + + /*If not focused by an input device assume the last input device*/ + if(indev_type == LV_INDEV_TYPE_NONE) { + indev_type = lv_indev_get_type(lv_indev_get_next(NULL)); + } + if(indev_type == LV_INDEV_TYPE_POINTER) { /*Select the clicked button*/ lv_point_t p1; @@ -897,15 +952,7 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param) } else if(sign == LV_SIGNAL_GET_EDITABLE) { bool * editable = (bool *)param; *editable = true; - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_btnm"; } - return res; } @@ -938,9 +985,9 @@ static void allocate_btn_areas_and_controls(const lv_obj_t * btnm, const char ** } ext->button_areas = lv_mem_alloc(sizeof(lv_area_t) * btn_cnt); - lv_mem_assert(ext->button_areas); + LV_ASSERT_MEM(ext->button_areas); ext->ctrl_bits = lv_mem_alloc(sizeof(lv_btnm_ctrl_t) * btn_cnt); - lv_mem_assert(ext->ctrl_bits); + LV_ASSERT_MEM(ext->ctrl_bits); if(ext->button_areas == NULL || ext->ctrl_bits == NULL) btn_cnt = 0; memset(ext->ctrl_bits, 0, sizeof(lv_btnm_ctrl_t) * btn_cnt); diff --git a/src/lv_objx/lv_btnm.h b/src/lv_objx/lv_btnm.h index bedcdf436..44bc4efbb 100644 --- a/src/lv_objx/lv_btnm.h +++ b/src/lv_objx/lv_btnm.h @@ -31,6 +31,8 @@ extern "C" { #define LV_BTNM_WIDTH_MASK 0x0007 #define LV_BTNM_BTN_NONE 0xFFFF +LV_EXPORT_CONST_INT(LV_BTNM_BTN_NONE); + /********************** * TYPEDEFS **********************/ diff --git a/src/lv_objx/lv_calendar.c b/src/lv_objx/lv_calendar.c index 36baea3dc..1dd83464f 100644 --- a/src/lv_objx/lv_calendar.c +++ b/src/lv_objx/lv_calendar.c @@ -9,6 +9,7 @@ #include "lv_calendar.h" #if LV_USE_CALENDAR != 0 +#include "../lv_core/lv_debug.h" #include "../lv_draw/lv_draw.h" #include "../lv_hal/lv_hal_indev.h" #include "../lv_misc/lv_utils.h" @@ -19,6 +20,7 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_calendar" /********************** * TYPEDEFS @@ -33,7 +35,7 @@ typedef uint8_t day_draw_state_t; /********************** * STATIC PROTOTYPES **********************/ -static bool lv_calendar_design(lv_obj_t * calendar, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_calendar_design(lv_obj_t * calendar, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_calendar_signal(lv_obj_t * calendar, lv_signal_t sign, void * param); static bool calculate_touched_day(lv_obj_t * calendar, const lv_point_t * touched_point); static lv_coord_t get_header_height(lv_obj_t * calendar); @@ -77,13 +79,17 @@ lv_obj_t * lv_calendar_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor of calendar*/ lv_obj_t * new_calendar = lv_obj_create(par, copy); - lv_mem_assert(new_calendar); + LV_ASSERT_MEM(new_calendar); if(new_calendar == NULL) return NULL; /*Allocate the calendar type specific extended data*/ lv_calendar_ext_t * ext = lv_obj_allocate_ext_attr(new_calendar, sizeof(lv_calendar_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_calendar); + return NULL; + } + if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_calendar); if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_calendar); @@ -195,6 +201,9 @@ lv_obj_t * lv_calendar_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_calendar_set_today_date(lv_obj_t * calendar, lv_calendar_date_t * today) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + LV_ASSERT_NULL(today); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); ext->today.year = today->year; ext->today.month = today->month; @@ -211,6 +220,9 @@ void lv_calendar_set_today_date(lv_obj_t * calendar, lv_calendar_date_t * today) */ void lv_calendar_set_showed_date(lv_obj_t * calendar, lv_calendar_date_t * showed) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + LV_ASSERT_NULL(showed); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); ext->showed_date.year = showed->year; ext->showed_date.month = showed->month; @@ -226,8 +238,11 @@ void lv_calendar_set_showed_date(lv_obj_t * calendar, lv_calendar_date_t * showe * WILL BE SAVED! CAN'T BE LOCAL ARRAY. * @param date_num number of dates in the array */ -void lv_calendar_set_highlighted_dates(lv_obj_t * calendar, lv_calendar_date_t * highlighted, uint16_t date_num) +void lv_calendar_set_highlighted_dates(lv_obj_t * calendar, lv_calendar_date_t highlighted[], uint16_t date_num) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + LV_ASSERT_NULL(highlighted); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); ext->highlighted_dates = highlighted; ext->highlighted_dates_num = date_num; @@ -244,6 +259,9 @@ void lv_calendar_set_highlighted_dates(lv_obj_t * calendar, lv_calendar_date_t * */ void lv_calendar_set_day_names(lv_obj_t * calendar, const char ** day_names) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + LV_ASSERT_NULL(day_names); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); ext->day_names = day_names; lv_obj_invalidate(calendar); @@ -252,14 +270,17 @@ void lv_calendar_set_day_names(lv_obj_t * calendar, const char ** day_names) /** * Set the name of the month * @param calendar pointer to a calendar object - * @param day_names pointer to an array with the names. E.g. `const char * days[12] = {"Jan", "Feb", + * @param month_names pointer to an array with the names. E.g. `const char * days[12] = {"Jan", "Feb", * ...}` Only the pointer will be saved so this variable can't be local which will be destroyed * later. */ -void lv_calendar_set_month_names(lv_obj_t * calendar, const char ** day_names) +void lv_calendar_set_month_names(lv_obj_t * calendar, const char ** month_names) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + LV_ASSERT_NULL(month_names); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); - ext->month_names = day_names; + ext->month_names = month_names; lv_obj_invalidate(calendar); } @@ -271,6 +292,8 @@ void lv_calendar_set_month_names(lv_obj_t * calendar, const char ** day_names) * */ void lv_calendar_set_style(lv_obj_t * calendar, lv_calendar_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); switch(type) { @@ -298,6 +321,8 @@ void lv_calendar_set_style(lv_obj_t * calendar, lv_calendar_style_t type, const */ lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * calendar) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); return &ext->today; } @@ -309,6 +334,8 @@ lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * calendar) */ lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * calendar) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); return &ext->showed_date; } @@ -321,6 +348,8 @@ lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * calendar) */ lv_calendar_date_t * lv_calendar_get_pressed_date(const lv_obj_t * calendar) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); return ext->pressed_date.year != 0 ? &ext->pressed_date : NULL; } @@ -332,6 +361,8 @@ lv_calendar_date_t * lv_calendar_get_pressed_date(const lv_obj_t * calendar) */ lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * calendar) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); return ext->highlighted_dates; } @@ -343,6 +374,8 @@ lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * calendar */ uint16_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * calendar) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); return ext->highlighted_dates_num; } @@ -354,6 +387,8 @@ uint16_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * calendar) */ const char ** lv_calendar_get_day_names(const lv_obj_t * calendar) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); return ext->day_names; } @@ -365,6 +400,8 @@ const char ** lv_calendar_get_day_names(const lv_obj_t * calendar) */ const char ** lv_calendar_get_month_names(const lv_obj_t * calendar) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); return ext->month_names; } @@ -377,6 +414,8 @@ const char ** lv_calendar_get_month_names(const lv_obj_t * calendar) * */ const lv_style_t * lv_calendar_get_style(const lv_obj_t * calendar, lv_calendar_style_t type) { + LV_ASSERT_OBJ(calendar, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); @@ -410,34 +449,34 @@ const lv_style_t * lv_calendar_get_style(const lv_obj_t * calendar, lv_calendar_ /** * Handle the drawing related tasks of the calendars * @param calendar pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_calendar_design(lv_obj_t * calendar, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_calendar_design(lv_obj_t * calendar, const lv_area_t * clip_area, lv_design_mode_t mode) { /*Return false if the object is not covers the mask_p area*/ if(mode == LV_DESIGN_COVER_CHK) { - return ancestor_design(calendar, mask, mode); + return ancestor_design(calendar, clip_area, mode); } /*Draw the object*/ else if(mode == LV_DESIGN_DRAW_MAIN) { lv_opa_t opa_scale = lv_obj_get_opa_scale(calendar); - lv_draw_rect(&calendar->coords, mask, lv_calendar_get_style(calendar, LV_CALENDAR_STYLE_BG), opa_scale); + lv_draw_rect(&calendar->coords, clip_area, lv_calendar_get_style(calendar, LV_CALENDAR_STYLE_BG), opa_scale); - draw_header(calendar, mask); - draw_day_names(calendar, mask); - draw_days(calendar, mask); + draw_header(calendar, clip_area); + draw_day_names(calendar, clip_area); + draw_days(calendar, clip_area); } /*Post draw when the children are drawn*/ else if(mode == LV_DESIGN_DRAW_POST) { } - return true; + return LV_DESIGN_RES_OK; } /** @@ -454,6 +493,7 @@ static lv_res_t lv_calendar_signal(lv_obj_t * calendar, lv_signal_t sign, void * /* Include the ancient signal function */ res = ancestor_signal(calendar, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_CLEANUP) { /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ @@ -542,13 +582,6 @@ static lv_res_t lv_calendar_signal(lv_obj_t * calendar, lv_signal_t sign, void * } lv_obj_invalidate(calendar); } - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set date*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_calendar"; } return res; @@ -641,6 +674,9 @@ static lv_coord_t get_day_names_height(lv_obj_t * calendar) static void draw_header(lv_obj_t * calendar, const lv_area_t * mask) { lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); + + lv_bidi_dir_t bidi_dir = lv_obj_get_base_dir(calendar); + lv_opa_t opa_scale = lv_obj_get_opa_scale(calendar); lv_area_t header_area; @@ -658,19 +694,19 @@ static void draw_header(lv_obj_t * calendar, const lv_area_t * mask) txt_buf[5] = '\0'; strcpy(&txt_buf[5], get_month_name(calendar, ext->showed_date.month)); header_area.y1 += ext->style_header->body.padding.top; - lv_draw_label(&header_area, mask, ext->style_header, opa_scale, txt_buf, LV_TXT_FLAG_CENTER, NULL, -1, -1, NULL); + lv_draw_label(&header_area, mask, ext->style_header, opa_scale, txt_buf, LV_TXT_FLAG_CENTER, NULL, NULL, NULL, bidi_dir); /*Add the left arrow*/ const lv_style_t * arrow_style = ext->btn_pressing < 0 ? ext->style_header_pr : ext->style_header; header_area.x1 += ext->style_header->body.padding.left; - lv_draw_label(&header_area, mask, arrow_style, opa_scale, LV_SYMBOL_LEFT, LV_TXT_FLAG_NONE, NULL, -1, -1, NULL); + lv_draw_label(&header_area, mask, arrow_style, opa_scale, LV_SYMBOL_LEFT, LV_TXT_FLAG_NONE, NULL, NULL, NULL, bidi_dir); /*Add the right arrow*/ arrow_style = ext->btn_pressing > 0 ? ext->style_header_pr : ext->style_header; header_area.x1 = header_area.x2 - ext->style_header->body.padding.right - - lv_txt_get_width(LV_SYMBOL_RIGHT, strlen(LV_SYMBOL_RIGHT), arrow_style->text.font, + lv_txt_get_width(LV_SYMBOL_RIGHT, (uint16_t)strlen(LV_SYMBOL_RIGHT), arrow_style->text.font, arrow_style->text.line_space, LV_TXT_FLAG_NONE); - lv_draw_label(&header_area, mask, arrow_style, opa_scale, LV_SYMBOL_RIGHT, LV_TXT_FLAG_NONE, NULL, -1, -1, NULL); + lv_draw_label(&header_area, mask, arrow_style, opa_scale, LV_SYMBOL_RIGHT, LV_TXT_FLAG_NONE, NULL, NULL, NULL, bidi_dir); } /** @@ -681,6 +717,7 @@ static void draw_header(lv_obj_t * calendar, const lv_area_t * mask) static void draw_day_names(lv_obj_t * calendar, const lv_area_t * mask) { lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); + lv_bidi_dir_t bidi_dir = lv_obj_get_base_dir(calendar); lv_opa_t opa_scale = lv_obj_get_opa_scale(calendar); lv_coord_t l_pad = ext->style_day_names->body.padding.left; @@ -695,7 +732,7 @@ static void draw_day_names(lv_obj_t * calendar, const lv_area_t * mask) label_area.x1 = calendar->coords.x1 + (w * i) / 7 + l_pad; label_area.x2 = label_area.x1 + box_w - 1; lv_draw_label(&label_area, mask, ext->style_day_names, opa_scale, get_day_name(calendar, i), LV_TXT_FLAG_CENTER, - NULL, -1, -1, NULL); + NULL, NULL, NULL, bidi_dir); } } @@ -707,6 +744,7 @@ static void draw_day_names(lv_obj_t * calendar, const lv_area_t * mask) static void draw_days(lv_obj_t * calendar, const lv_area_t * mask) { lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); + lv_bidi_dir_t bidi_dir = lv_obj_get_base_dir(calendar); const lv_style_t * style_bg = lv_calendar_get_style(calendar, LV_CALENDAR_STYLE_BG); lv_area_t label_area; lv_opa_t opa_scale = lv_obj_get_opa_scale(calendar); @@ -824,7 +862,7 @@ static void draw_days(lv_obj_t * calendar, const lv_area_t * mask) /*Write the day's number*/ lv_utils_num_to_str(day_cnt, buf); - lv_draw_label(&label_area, mask, final_style, opa_scale, buf, LV_TXT_FLAG_CENTER, NULL, -1, -1, NULL); + lv_draw_label(&label_area, mask, final_style, opa_scale, buf, LV_TXT_FLAG_CENTER, NULL, NULL, NULL, bidi_dir); /*Go to the next day*/ day_cnt++; diff --git a/src/lv_objx/lv_calendar.h b/src/lv_objx/lv_calendar.h index 0ea914843..21317bbd7 100644 --- a/src/lv_objx/lv_calendar.h +++ b/src/lv_objx/lv_calendar.h @@ -50,8 +50,8 @@ typedef struct lv_calendar_date_t showed_date; /*Currently visible month (day is ignored)*/ lv_calendar_date_t * highlighted_dates; /*Apply different style on these days (pointer to an array defined by the user)*/ - uint8_t highlighted_dates_num; /*Number of elements in `highlighted_days`*/ int8_t btn_pressing; /*-1: prev month pressing, +1 next month pressing on the header*/ + uint16_t highlighted_dates_num; /*Number of elements in `highlighted_days`*/ lv_calendar_date_t pressed_date; const char ** day_names; /*Pointer to an array with the name of the days (NULL: use default names)*/ const char ** month_names; /*Pointer to an array with the name of the month (NULL. use default names)*/ @@ -122,7 +122,7 @@ void lv_calendar_set_showed_date(lv_obj_t * calendar, lv_calendar_date_t * showe * WILL BE SAVED! CAN'T BE LOCAL ARRAY. * @param date_num number of dates in the array */ -void lv_calendar_set_highlighted_dates(lv_obj_t * calendar, lv_calendar_date_t * highlighted, uint16_t date_num); +void lv_calendar_set_highlighted_dates(lv_obj_t * calendar, lv_calendar_date_t highlighted[], uint16_t date_num); /** * Set the name of the days @@ -136,11 +136,11 @@ void lv_calendar_set_day_names(lv_obj_t * calendar, const char ** day_names); /** * Set the name of the month * @param calendar pointer to a calendar object - * @param day_names pointer to an array with the names. E.g. `const char * days[12] = {"Jan", "Feb", + * @param month_names pointer to an array with the names. E.g. `const char * days[12] = {"Jan", "Feb", * ...}` Only the pointer will be saved so this variable can't be local which will be destroyed * later. */ -void lv_calendar_set_month_names(lv_obj_t * calendar, const char ** day_names); +void lv_calendar_set_month_names(lv_obj_t * calendar, const char ** month_names); /** * Set a style of a calendar. diff --git a/src/lv_objx/lv_canvas.c b/src/lv_objx/lv_canvas.c index da08521a8..4313c865a 100644 --- a/src/lv_objx/lv_canvas.c +++ b/src/lv_objx/lv_canvas.c @@ -8,6 +8,7 @@ *********************/ #include #include "lv_canvas.h" +#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_math.h" #include "../lv_draw/lv_draw.h" #include "../lv_core/lv_refr.h" @@ -17,6 +18,7 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_canvas" /********************** * TYPEDEFS @@ -26,6 +28,25 @@ * STATIC PROTOTYPES **********************/ static lv_res_t lv_canvas_signal(lv_obj_t * canvas, lv_signal_t sign, void * param); +static void set_set_px_cb(lv_disp_drv_t * disp_drv, lv_img_cf_t cf); + +static void set_px_true_color_alpha(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + +static void set_px_cb_alpha1(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + +static void set_px_cb_alpha2(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + +static void set_px_cb_alpha4(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + + +static void set_px_cb_alpha8(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa); + +static void set_px_alpha_generic(lv_img_dsc_t * d, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa); /********************** * STATIC VARIABLES @@ -53,13 +74,17 @@ lv_obj_t * lv_canvas_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor of canvas*/ lv_obj_t * new_canvas = lv_img_create(par, copy); - lv_mem_assert(new_canvas); + LV_ASSERT_MEM(new_canvas); if(new_canvas == NULL) return NULL; /*Allocate the canvas type specific extended data*/ lv_canvas_ext_t * ext = lv_obj_allocate_ext_attr(new_canvas, sizeof(lv_canvas_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_canvas); + return NULL; + } + if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_canvas); if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_canvas); @@ -111,13 +136,16 @@ lv_obj_t * lv_canvas_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_canvas_set_buffer(lv_obj_t * canvas, void * buf, lv_coord_t w, lv_coord_t h, lv_img_cf_t cf) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + LV_ASSERT_NULL(buf); + lv_canvas_ext_t * ext = lv_obj_get_ext_attr(canvas); ext->dsc.header.cf = cf; ext->dsc.header.w = w; ext->dsc.header.h = h; ext->dsc.data = buf; - ext->dsc.data_size = (lv_img_color_format_get_px_size(cf) * w * h) / 8; + ext->dsc.data_size = (lv_img_cf_get_px_size(cf) * w * h) / 8; lv_img_set_src(canvas, &ext->dsc); } @@ -131,6 +159,8 @@ void lv_canvas_set_buffer(lv_obj_t * canvas, void * buf, lv_coord_t w, lv_coord_ */ void lv_canvas_set_px(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_color_t c) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + lv_canvas_ext_t * ext = lv_obj_get_ext_attr(canvas); lv_img_buf_set_px_color(&ext->dsc, x, y, c); @@ -149,6 +179,8 @@ void lv_canvas_set_px(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_color_t */ void lv_canvas_set_palette(lv_obj_t * canvas, uint8_t id, lv_color_t c) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + lv_canvas_ext_t * ext = lv_obj_get_ext_attr(canvas); lv_img_buf_set_palette(&ext->dsc, id, c); @@ -163,6 +195,8 @@ void lv_canvas_set_palette(lv_obj_t * canvas, uint8_t id, lv_color_t c) */ void lv_canvas_set_style(lv_obj_t * canvas, lv_canvas_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + switch(type) { case LV_CANVAS_STYLE_MAIN: lv_img_set_style(canvas, LV_IMG_STYLE_MAIN, style); break; } @@ -181,10 +215,14 @@ void lv_canvas_set_style(lv_obj_t * canvas, lv_canvas_style_t type, const lv_sty */ lv_color_t lv_canvas_get_px(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + lv_canvas_ext_t * ext = lv_obj_get_ext_attr(canvas); const lv_style_t * style = lv_canvas_get_style(canvas, LV_CANVAS_STYLE_MAIN); - return lv_img_buf_get_px_color(&ext->dsc, x, y, style); + if(style == NULL) style = &lv_style_scr; + + return lv_img_buf_get_px_color(&ext->dsc, x, y, style->image.color); } /** @@ -194,6 +232,8 @@ lv_color_t lv_canvas_get_px(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y) */ lv_img_dsc_t * lv_canvas_get_img(lv_obj_t * canvas) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + lv_canvas_ext_t * ext = lv_obj_get_ext_attr(canvas); return &ext->dsc; @@ -207,6 +247,8 @@ lv_img_dsc_t * lv_canvas_get_img(lv_obj_t * canvas) */ const lv_style_t * lv_canvas_get_style(const lv_obj_t * canvas, lv_canvas_style_t type) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + const lv_style_t * style = NULL; switch(type) { @@ -233,13 +275,16 @@ const lv_style_t * lv_canvas_get_style(const lv_obj_t * canvas, lv_canvas_style_ */ void lv_canvas_copy_buf(lv_obj_t * canvas, const void * to_copy, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + LV_ASSERT_NULL(to_copy); + lv_canvas_ext_t * ext = lv_obj_get_ext_attr(canvas); - if(x + w >= ext->dsc.header.w || y + h >= ext->dsc.header.h) { + if(x + w >= (lv_coord_t)ext->dsc.header.w || y + h >= (lv_coord_t)ext->dsc.header.h) { LV_LOG_WARN("lv_canvas_copy_buf: x or y out of the canvas"); return; } - uint32_t px_size = lv_img_color_format_get_px_size(ext->dsc.header.cf) >> 3; + uint32_t px_size = lv_img_cf_get_px_size(ext->dsc.header.cf) >> 3; uint32_t px = ext->dsc.header.w * y * px_size + x * px_size; uint8_t * to_copy8 = (uint8_t *)to_copy; lv_coord_t i; @@ -251,138 +296,68 @@ void lv_canvas_copy_buf(lv_obj_t * canvas, const void * to_copy, lv_coord_t x, l } /** - * Rotate and image and store the result on a canvas. + * Transform and image and store the result on a canvas. * @param canvas pointer to a canvas object * @param img pointer to an image descriptor. * Can be the image descriptor of an other canvas too (`lv_canvas_get_img()`). * @param angle the angle of rotation (0..360); + * @param zoom zoom factor (256 no zoom); * @param offset_x offset X to tell where to put the result data on destination canvas * @param offset_y offset X to tell where to put the result data on destination canvas * @param pivot_x pivot X of rotation. Relative to the source canvas * Set to `source width / 2` to rotate around the center * @param pivot_y pivot Y of rotation. Relative to the source canvas * Set to `source height / 2` to rotate around the center + * @param antialias apply anti-aliasing during the transformation. Looks better but slower. */ -void lv_canvas_rotate(lv_obj_t * canvas, lv_img_dsc_t * img, int16_t angle, lv_coord_t offset_x, lv_coord_t offset_y, - int32_t pivot_x, int32_t pivot_y) +void lv_canvas_transform(lv_obj_t * canvas, lv_img_dsc_t * img, int16_t angle, uint16_t zoom, lv_coord_t offset_x, lv_coord_t offset_y, + int32_t pivot_x, int32_t pivot_y, bool antialias) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + LV_ASSERT_NULL(img); + lv_canvas_ext_t * ext_dst = lv_obj_get_ext_attr(canvas); const lv_style_t * style = lv_canvas_get_style(canvas, LV_CANVAS_STYLE_MAIN); - int32_t sinma = lv_trigo_sin(-angle); - int32_t cosma = lv_trigo_sin(-angle + 90); /* cos */ - int32_t img_width = img->header.w; - int32_t img_height = img->header.h; int32_t dest_width = ext_dst->dsc.header.w; int32_t dest_height = ext_dst->dsc.header.h; int32_t x; int32_t y; - for(x = -offset_x; x < dest_width - offset_x; x++) { - for(y = -offset_y; y < dest_height - offset_y; y++) { - /*Get the target point relative coordinates to the pivot*/ - int32_t xt = x - pivot_x; - int32_t yt = y - pivot_y; + bool ret; - /*Get the source pixel from the upscaled image*/ - int32_t xs = ((cosma * xt - sinma * yt) >> (LV_TRIGO_SHIFT - 8)) + pivot_x * 256; - int32_t ys = ((sinma * xt + cosma * yt) >> (LV_TRIGO_SHIFT - 8)) + pivot_y * 256; + lv_img_transform_dsc_t dsc; + dsc.cfg.angle = angle; + dsc.cfg.zoom = zoom; + dsc.cfg.src = img->data; + dsc.cfg.src_w = img->header.w; + dsc.cfg.src_h = img->header.h; + dsc.cfg.cf = img->header.cf; + dsc.cfg.pivot_x = pivot_x; + dsc.cfg.pivot_y = pivot_y; + dsc.cfg.color = style->image.color; + dsc.cfg.antialias = antialias; + lv_img_buf_transform_init(&dsc); - /*Get the integer part of the source pixel*/ - int xs_int = xs >> 8; - int ys_int = ys >> 8; + for(y = -offset_y; y < dest_height - offset_y; y++) { + for(x = -offset_x; x < dest_width - offset_x; x++) { - if(xs_int >= img_width) - continue; - else if(xs_int < 0) - continue; + ret = lv_img_buf_transform(&dsc, x, y); - if(ys_int >= img_height) - continue; - else if(ys_int < 0) - continue; - - /*Get the fractional part of the source pixel*/ - int xs_fract = xs & 0xff; - int ys_fract = ys & 0xff; - - /* If the fractional < 0x70 mix the source pixel with the left/top pixel - * If the fractional > 0x90 mix the source pixel with the right/bottom pixel - * In the 0x70..0x90 range use the unchanged source pixel */ - - int xn; /*x neightboor*/ - lv_opa_t xr; /*x mix ratio*/ - if(xs_fract < 0x70) { - xn = xs_int - 1; - xr = xs_fract * 2; - } else if(xs_fract > 0x90) { - xn = xs_int + 1; - xr = (0xFF - xs_fract) * 2; - } else { - xn = xs_int; - xr = 0xFF; - } - - /*Handle under/overflow*/ - if(xn >= img_width) - continue; - else if(xn < 0) - continue; - - int yn; /*y neightboor*/ - lv_opa_t yr; /*y mix ratio*/ - if(ys_fract < 0x70) { - yn = ys_int - 1; - yr = ys_fract * 2; - } else if(ys_fract > 0x90) { - yn = ys_int + 1; - yr = (0xFF - ys_fract) * 2; - } else { - yn = ys_int; - yr = 0xFF; - } - - /*Handle under/overflow*/ - if(yn >= img_height) - continue; - else if(yn < 0) - continue; - - /*Get the mixture of the original source and the neightboor pixels in both directions*/ - lv_color_t c_dest_int = lv_img_buf_get_px_color(img, xs_int, ys_int, style); - - if(lv_img_color_format_is_chroma_keyed(img->header.cf)) { - lv_color_t ct = LV_COLOR_TRANSP; - if(c_dest_int.full == ct.full) continue; - } - - lv_color_t c_dest_xn = lv_img_buf_get_px_color(img, xn, ys_int, style); - lv_color_t c_dest_yn = lv_img_buf_get_px_color(img, xs_int, yn, style); - lv_color_t x_dest = lv_color_mix(c_dest_int, c_dest_xn, xr); - lv_color_t y_dest = lv_color_mix(c_dest_int, c_dest_yn, yr); - lv_color_t color_res = lv_color_mix(x_dest, y_dest, LV_OPA_50); + if(ret == false) continue; if(x + offset_x >= 0 && x + offset_x < dest_width && y + offset_y >= 0 && y + offset_y < dest_height) { /*If the image has no alpha channel just simple set the result color on the canvas*/ - if(lv_img_color_format_has_alpha(img->header.cf) == false) { - lv_img_buf_set_px_color(&ext_dst->dsc, x + offset_x, y + offset_y, color_res); + if(lv_img_cf_has_alpha(img->header.cf) == false) { + lv_img_buf_set_px_color(&ext_dst->dsc, x + offset_x, y + offset_y, dsc.res.color); } else { - /*Get result pixel opacity*/ - lv_opa_t opa_int = lv_img_buf_get_px_alpha(img, xs_int, ys_int); - lv_opa_t opa_xn = lv_img_buf_get_px_alpha(img, xn, ys_int); - lv_opa_t opa_yn = lv_img_buf_get_px_alpha(img, xs_int, yn); - lv_opa_t opa_x = (opa_int * xr + (opa_xn * (255 - xr))) >> 8; - lv_opa_t opa_y = (opa_int * yr + (opa_yn * (255 - yr))) >> 8; - lv_opa_t opa_res = (opa_x + opa_y) / 2; - if(opa_res <= LV_OPA_MIN) continue; - - lv_color_t bg_color = lv_img_buf_get_px_color(&ext_dst->dsc, x + offset_x, y + offset_y, style); + lv_color_t bg_color = lv_img_buf_get_px_color(&ext_dst->dsc, x + offset_x, y + offset_y, style->image.color); /*If the canvas has no alpha but the image has mix the image's color with * canvas*/ - if(lv_img_color_format_has_alpha(ext_dst->dsc.header.cf) == false) { - if(opa_res < LV_OPA_MAX) color_res = lv_color_mix(color_res, bg_color, opa_res); - lv_img_buf_set_px_color(&ext_dst->dsc, x + offset_x, y + offset_y, color_res); + if(lv_img_cf_has_alpha(ext_dst->dsc.header.cf) == false) { + if(dsc.res.opa < LV_OPA_MAX) dsc.res.color = lv_color_mix(dsc.res.color, bg_color, dsc.res.opa); + lv_img_buf_set_px_color(&ext_dst->dsc, x + offset_x, y + offset_y, dsc.res.color); } /*Both the image and canvas has alpha channel. Some extra calculation is required*/ @@ -390,28 +365,28 @@ void lv_canvas_rotate(lv_obj_t * canvas, lv_img_dsc_t * img, int16_t angle, lv_c lv_opa_t bg_opa = lv_img_buf_get_px_alpha(&ext_dst->dsc, x + offset_x, y + offset_y); /* Pick the foreground if it's fully opaque or the Background is fully * transparent*/ - if(opa_res >= LV_OPA_MAX || bg_opa <= LV_OPA_MIN) { - lv_img_buf_set_px_color(&ext_dst->dsc, x + offset_x, y + offset_y, color_res); - lv_img_buf_set_px_alpha(&ext_dst->dsc, x + offset_x, y + offset_y, opa_res); + if(dsc.res.opa >= LV_OPA_MAX || bg_opa <= LV_OPA_MIN) { + lv_img_buf_set_px_color(&ext_dst->dsc, x + offset_x, y + offset_y, dsc.res.color); + lv_img_buf_set_px_alpha(&ext_dst->dsc, x + offset_x, y + offset_y, dsc.res.opa); } /*Opaque background: use simple mix*/ else if(bg_opa >= LV_OPA_MAX) { lv_img_buf_set_px_color(&ext_dst->dsc, x + offset_x, y + offset_y, - lv_color_mix(color_res, bg_color, opa_res)); + lv_color_mix(dsc.res.color, bg_color, dsc.res.opa)); } /*Both colors have alpha. Expensive calculation need to be applied*/ else { /*Info: * https://en.wikipedia.org/wiki/Alpha_compositing#Analytical_derivation_of_the_over_operator*/ - lv_opa_t opa_res_2 = 255 - ((uint16_t)((uint16_t)(255 - opa_res) * (255 - bg_opa)) >> 8); + lv_opa_t opa_res_2 = 255 - ((uint16_t)((uint16_t)(255 - dsc.res.opa) * (255 - bg_opa)) >> 8); if(opa_res_2 == 0) { opa_res_2 = 1; /*never happens, just to be sure*/ } - lv_opa_t ratio = (uint16_t)((uint16_t)opa_res * 255) / opa_res_2; + lv_opa_t ratio = (uint16_t)((uint16_t)dsc.res.opa * 255) / opa_res_2; lv_img_buf_set_px_color(&ext_dst->dsc, x + offset_x, y + offset_y, - lv_color_mix(color_res, bg_color, ratio)); + lv_color_mix(dsc.res.color, bg_color, ratio)); lv_img_buf_set_px_alpha(&ext_dst->dsc, x + offset_x, y + offset_y, opa_res_2); } } @@ -423,13 +398,289 @@ void lv_canvas_rotate(lv_obj_t * canvas, lv_img_dsc_t * img, int16_t angle, lv_c lv_obj_invalidate(canvas); } + +/** + * Apply horizontal blur on the canvas + * @param canvas pointer to a canvas object + * @param area the area to blur. If `NULL` the whole canvas will be blurred. + * @param r radius of the blur + */ +void lv_canvas_blur_hor(lv_obj_t * canvas, const lv_area_t * area, uint16_t r) +{ + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + + if(r == 0) return; + + lv_canvas_ext_t * ext = lv_obj_get_ext_attr(canvas); + + lv_area_t a; + if(area) { + lv_area_copy(&a, area); + if(a.x1 < 0) a.x1 = 0; + if(a.y1 < 0) a.y1 = 0; + if(a.x2 > ext->dsc.header.w - 1) a.x2 = ext->dsc.header.w - 1; + if(a.y2 > ext->dsc.header.h - 1) a.y2 = ext->dsc.header.h - 1; + } else { + a.x1 = 0; + a.y1 = 0; + a.x2 = ext->dsc.header.w - 1; + a.y2 = ext->dsc.header.h - 1; + } + + const lv_style_t * style = lv_canvas_get_style(canvas, LV_CANVAS_STYLE_MAIN); + + uint16_t r_back = r / 2; + uint16_t r_front = r / 2; + + if((r & 0x1) == 0) r_back--; + + bool has_alpha = lv_img_cf_has_alpha(ext->dsc.header.cf); + + lv_coord_t line_w = lv_img_buf_get_img_size(ext->dsc.header.w, 1, ext->dsc.header.cf); + uint8_t * line_buf = lv_mem_buf_get(line_w); + + lv_img_dsc_t line_img; + line_img.data = line_buf; + line_img.header.always_zero = 0; + line_img.header.w = ext->dsc.header.w; + line_img.header.h = 1; + line_img.header.cf = ext->dsc.header.cf; + + lv_coord_t x; + lv_coord_t y; + lv_coord_t x_safe; + + for(y = a.y1; y <= a.y2; y++) { + uint32_t asum = 0; + uint32_t rsum = 0; + uint32_t gsum = 0; + uint32_t bsum = 0; + + lv_color_t c; + lv_opa_t opa = LV_OPA_TRANSP; + memcpy(line_buf, &ext->dsc.data[y * line_w], line_w); + + + for(x = a.x1 -r_back; x <= a.x1 + r_front; x++) { + x_safe = x < 0 ? 0 : x; + x_safe = x_safe > ext->dsc.header.w - 1 ? ext->dsc.header.w - 1 : x_safe; + + c = lv_img_buf_get_px_color(&line_img, x_safe, 0, style->image.color); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&line_img, x_safe, 0); + + rsum += c.ch.red; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + gsum += (c.ch.green_h << 3) + c.ch.green_l; +#else + gsum += c.ch.green; +#endif + bsum += c.ch.blue; + if(has_alpha) asum += opa; + } + + /*Just to indicate that the px is visible*/ + if(has_alpha == false) asum = LV_OPA_COVER; + + for(x = a.x1; x <= a.x2; x++) { + + if(asum) { + c.ch.red = rsum / r; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + uint8_t gtmp = gsum / r; + c.ch.green_h = gtmp >> 3; + c.ch.green_l = gtmp & 0x7; +#else + c.ch.green = gsum / r; +#endif + c.ch.blue = bsum / r; + if(has_alpha) opa = asum / r; + + lv_img_buf_set_px_color(&ext->dsc, x, y, c); + } + if(has_alpha) lv_img_buf_set_px_alpha(&ext->dsc, x, y, opa); + + x_safe = x - r_back; + x_safe = x_safe < 0 ? 0 : x_safe; + c = lv_img_buf_get_px_color(&line_img, x_safe, 0, style->image.color); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&line_img, x_safe, 0); + + rsum -= c.ch.red; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + gsum -= (c.ch.green_h << 3) + c.ch.green_l; +#else + gsum -= c.ch.green; +#endif + bsum -= c.ch.blue; + if(has_alpha) asum -= opa; + + x_safe = x + 1 + r_front; + x_safe = x_safe > ext->dsc.header.w - 1 ? ext->dsc.header.w - 1 : x_safe; + c = lv_img_buf_get_px_color(&line_img, x_safe, 0, LV_COLOR_RED); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&line_img, x_safe, 0); + + rsum += c.ch.red; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + gsum += (c.ch.green_h << 3) + c.ch.green_l; +#else + gsum += c.ch.green; +#endif + bsum += c.ch.blue; + if(has_alpha) asum += opa; + } + } + lv_obj_invalidate(canvas); + + lv_mem_buf_release(line_buf); +} + + +/** + * Apply vertical blur on the canvas + * @param canvas pointer to a canvas object + * @param area the area to blur. If `NULL` the whole canvas will be blurred. + * @param r radius of the blur + */ +void lv_canvas_blur_ver(lv_obj_t * canvas, const lv_area_t * area, uint16_t r) +{ + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + + if(r == 0) return; + + lv_canvas_ext_t * ext = lv_obj_get_ext_attr(canvas); + + lv_area_t a; + if(area) { + lv_area_copy(&a, area); + if(a.x1 < 0) a.x1 = 0; + if(a.y1 < 0) a.y1 = 0; + if(a.x2 > ext->dsc.header.w - 1) a.x2 = ext->dsc.header.w - 1; + if(a.y2 > ext->dsc.header.h - 1) a.y2 = ext->dsc.header.h - 1; + } else { + a.x1 = 0; + a.y1 = 0; + a.x2 = ext->dsc.header.w - 1; + a.y2 = ext->dsc.header.h - 1; + } + + const lv_style_t * style = lv_canvas_get_style(canvas, LV_CANVAS_STYLE_MAIN); + + uint16_t r_back = r / 2; + uint16_t r_front = r / 2; + + if((r & 0x1) == 0) r_back--; + + bool has_alpha = lv_img_cf_has_alpha(ext->dsc.header.cf); + lv_coord_t col_w = lv_img_buf_get_img_size(1, ext->dsc.header.h, ext->dsc.header.cf); + uint8_t * col_buf = lv_mem_buf_get(col_w); + lv_img_dsc_t line_img; + + line_img.data = col_buf; + line_img.header.always_zero = 0; + line_img.header.w = 1; + line_img.header.h = ext->dsc.header.h; + line_img.header.cf = ext->dsc.header.cf; + + lv_coord_t x; + lv_coord_t y; + lv_coord_t y_safe; + + for(x = a.x1; x <= a.x2; x++) { + uint32_t asum = 0; + uint32_t rsum = 0; + uint32_t gsum = 0; + uint32_t bsum = 0; + + lv_color_t c; + lv_opa_t opa = LV_OPA_COVER; + + for(y = a.y1 -r_back; y <= a.y1 + r_front; y++) { + y_safe = y < 0 ? 0 : y; + y_safe = y_safe > ext->dsc.header.h - 1 ? ext->dsc.header.h - 1 : y_safe; + + c = lv_img_buf_get_px_color(&ext->dsc, x, y_safe, style->image.color); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&ext->dsc, x, y_safe); + + lv_img_buf_set_px_color(&line_img, 0, y_safe, c); + if(has_alpha) lv_img_buf_set_px_alpha(&line_img, 0, y_safe, opa); + + rsum += c.ch.red; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + gsum += (c.ch.green_h << 3) + c.ch.green_l; +#else + gsum += c.ch.green; +#endif + bsum += c.ch.blue; + if(has_alpha) asum += opa; + } + + /*Just to indicate that the px is visible*/ + if(has_alpha == false) asum = LV_OPA_COVER; + + for(y = a.y1; y <= a.y2; y++) { + if(asum) { + c.ch.red = rsum / r; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + uint8_t gtmp = gsum / r; + c.ch.green_h = gtmp >> 3; + c.ch.green_l = gtmp & 0x7; +#else + c.ch.green = gsum / r; +#endif + c.ch.blue = bsum / r; + if(has_alpha) opa = asum / r; + + lv_img_buf_set_px_color(&ext->dsc, x, y, c); + } + if(has_alpha) lv_img_buf_set_px_alpha(&ext->dsc, x, y, opa); + + y_safe = y - r_back; + y_safe = y_safe < 0 ? 0 : y_safe; + c = lv_img_buf_get_px_color(&line_img, 0, y_safe, style->image.color); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&line_img, 0, y_safe); + + rsum -= c.ch.red; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + gsum -= (c.ch.green_h << 3) + c.ch.green_l; +#else + gsum -= c.ch.green; +#endif + bsum -= c.ch.blue; + if(has_alpha) asum -= opa; + + y_safe = y + 1 + r_front; + y_safe = y_safe > ext->dsc.header.h - 1 ? ext->dsc.header.h - 1 : y_safe; + + c = lv_img_buf_get_px_color(&ext->dsc, x, y_safe, style->image.color); + if(has_alpha) opa = lv_img_buf_get_px_alpha(&ext->dsc, x, y_safe); + + lv_img_buf_set_px_color(&line_img, 0, y_safe, c); + if(has_alpha) lv_img_buf_set_px_alpha(&line_img, 0, y_safe, opa); + + rsum += c.ch.red; +#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP + gsum += (c.ch.green_h << 3) + c.ch.green_l; +#else + gsum += c.ch.green; +#endif + bsum += c.ch.blue; + if(has_alpha) asum += opa; + } + } + + lv_obj_invalidate(canvas); + + lv_mem_buf_release(col_buf); +} + /** * Fill the canvas with color * @param canvas pointer to a canvas * @param color the background color */ -void lv_canvas_fill_bg(lv_obj_t * canvas, lv_color_t color) +void lv_canvas_fill_bg(lv_obj_t * canvas, lv_color_t color, lv_opa_t opa) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); uint32_t x = dsc->header.w * dsc->header.h; @@ -437,6 +688,7 @@ void lv_canvas_fill_bg(lv_obj_t * canvas, lv_color_t color) for(y = 0; y < dsc->header.h; y++) { for(x = 0; x < dsc->header.w; x++) { lv_img_buf_set_px_color(dsc, x, y, color); + lv_img_buf_set_px_alpha(dsc, x, y, opa); } } } @@ -453,8 +705,16 @@ void lv_canvas_fill_bg(lv_obj_t * canvas, lv_color_t color) void lv_canvas_draw_rect(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord_t w, lv_coord_t h, const lv_style_t * style) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + LV_ASSERT_NULL(style); + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) { + LV_LOG_WARN("lv_canvas_draw_rect: can't raw to LV_IMG_CF_INDEXED canvas"); + return; + } + /* Create a dummy display to fool the lv_draw function. * It will think it draws to real screen. */ lv_area_t mask; @@ -482,7 +742,10 @@ void lv_canvas_draw_rect(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord disp.driver.hor_res = dsc->header.w; disp.driver.ver_res = dsc->header.h; + set_set_px_cb(&disp.driver, dsc->header.cf); + #if LV_ANTIALIAS + /*Disable anti-aliasing if drawing with transparent color to chroma keyed canvas*/ lv_color_t ctransp = LV_COLOR_TRANSP; if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED && @@ -514,8 +777,16 @@ void lv_canvas_draw_rect(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord void lv_canvas_draw_text(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord_t max_w, const lv_style_t * style, const char * txt, lv_label_align_t align) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + LV_ASSERT_NULL(style); + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) { + LV_LOG_WARN("lv_canvas_draw_text: can't raw to LV_IMG_CF_INDEXED canvas"); + return; + } + /* Create a dummy display to fool the lv_draw function. * It will think it draws to real screen. */ lv_area_t mask; @@ -543,6 +814,8 @@ void lv_canvas_draw_text(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord disp.driver.hor_res = dsc->header.w; disp.driver.ver_res = dsc->header.h; + set_set_px_cb(&disp.driver, dsc->header.cf); + lv_disp_t * refr_ori = lv_refr_get_disp_refreshing(); lv_refr_set_disp_refreshing(&disp); @@ -554,8 +827,7 @@ void lv_canvas_draw_text(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord default: flag = LV_TXT_FLAG_NONE; break; } - lv_draw_label(&coords, &mask, style, LV_OPA_COVER, txt, flag, NULL, LV_LABEL_TEXT_SEL_OFF, LV_LABEL_TEXT_SEL_OFF, - NULL); + lv_draw_label(&coords, &mask, style, LV_OPA_COVER, txt, flag, NULL, NULL, NULL, lv_obj_get_base_dir(canvas)); lv_refr_set_disp_refreshing(refr_ori); } @@ -568,8 +840,16 @@ void lv_canvas_draw_text(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord */ void lv_canvas_draw_img(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, const void * src, const lv_style_t * style) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + LV_ASSERT_NULL(style); + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) { + LV_LOG_WARN("lv_canvas_draw_img: can't raw to LV_IMG_CF_INDEXED canvas"); + return; + } + /* Create a dummy display to fool the lv_draw function. * It will think it draws to real screen. */ lv_area_t mask; @@ -604,10 +884,12 @@ void lv_canvas_draw_img(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, const voi disp.driver.hor_res = dsc->header.w; disp.driver.ver_res = dsc->header.h; + set_set_px_cb(&disp.driver, dsc->header.cf); + lv_disp_t * refr_ori = lv_refr_get_disp_refreshing(); lv_refr_set_disp_refreshing(&disp); - lv_draw_img(&coords, &mask, src, style, LV_OPA_COVER); + lv_draw_img(&coords, &mask, src, style, 0, NULL, LV_IMG_ZOOM_NONE, false, LV_OPA_COVER); lv_refr_set_disp_refreshing(refr_ori); } @@ -621,8 +903,15 @@ void lv_canvas_draw_img(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, const voi */ void lv_canvas_draw_line(lv_obj_t * canvas, const lv_point_t * points, uint32_t point_cnt, const lv_style_t * style) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + LV_ASSERT_NULL(style); + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) { + LV_LOG_WARN("lv_canvas_draw_line: can't raw to LV_IMG_CF_INDEXED canvas"); + return; + } /* Create a dummy display to fool the lv_draw function. * It will think it draws to real screen. */ lv_area_t mask; @@ -644,6 +933,8 @@ void lv_canvas_draw_line(lv_obj_t * canvas, const lv_point_t * points, uint32_t disp.driver.hor_res = dsc->header.w; disp.driver.ver_res = dsc->header.h; + set_set_px_cb(&disp.driver, dsc->header.cf); + #if LV_ANTIALIAS /*Disable anti-aliasing if drawing with transparent color to chroma keyed canvas*/ lv_color_t ctransp = LV_COLOR_TRANSP; @@ -658,11 +949,37 @@ void lv_canvas_draw_line(lv_obj_t * canvas, const lv_point_t * points, uint32_t lv_disp_t * refr_ori = lv_refr_get_disp_refreshing(); lv_refr_set_disp_refreshing(&disp); + lv_style_t circle_style_tmp; /*If rounded...*/ + if(style->line.rounded) { + lv_style_copy(&circle_style_tmp, style); + circle_style_tmp.body.radius = LV_RADIUS_CIRCLE; + circle_style_tmp.body.main_color = style->line.color; + circle_style_tmp.body.grad_color = style->line.color; + circle_style_tmp.body.opa = style->line.opa; + } + lv_area_t circle_area; uint32_t i; for(i = 0; i < point_cnt - 1; i++) { lv_draw_line(&points[i], &points[i + 1], &mask, style, LV_OPA_COVER); + + /*Draw circle on the joints if enabled*/ + if(style->line.rounded) { + circle_area.x1 = points[i].x - ((style->line.width - 1) >> 1) - ((style->line.width - 1) & 0x1); + circle_area.y1 = points[i].y - ((style->line.width - 1) >> 1) - ((style->line.width - 1) & 0x1); + circle_area.x2 = points[i].x + ((style->line.width - 1) >> 1); + circle_area.y2 = points[i].y + ((style->line.width - 1) >> 1); + lv_draw_rect(&circle_area, &mask, &circle_style_tmp, LV_OPA_COVER); + } } - + /*Draw circle on the last point too if enabled*/ + if(style->line.rounded) { + circle_area.x1 = points[i].x - ((style->line.width - 1) >> 1) - ((style->line.width - 1) & 0x1); + circle_area.y1 = points[i].y - ((style->line.width - 1) >> 1) - ((style->line.width - 1) & 0x1); + circle_area.x2 = points[i].x + ((style->line.width - 1) >> 1); + circle_area.y2 = points[i].y + ((style->line.width - 1) >> 1); + lv_draw_rect(&circle_area, &mask, &circle_style_tmp, LV_OPA_COVER); + } + lv_refr_set_disp_refreshing(refr_ori); } @@ -675,8 +992,16 @@ void lv_canvas_draw_line(lv_obj_t * canvas, const lv_point_t * points, uint32_t */ void lv_canvas_draw_polygon(lv_obj_t * canvas, const lv_point_t * points, uint32_t point_cnt, const lv_style_t * style) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + LV_ASSERT_NULL(style); + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) { + LV_LOG_WARN("lv_canvas_draw_polygon: can't raw to LV_IMG_CF_INDEXED canvas"); + return; + } + /* Create a dummy display to fool the lv_draw function. * It will think it draws to real screen. */ lv_area_t mask; @@ -698,6 +1023,8 @@ void lv_canvas_draw_polygon(lv_obj_t * canvas, const lv_point_t * points, uint32 disp.driver.hor_res = dsc->header.w; disp.driver.ver_res = dsc->header.h; + set_set_px_cb(&disp.driver, dsc->header.cf); + #if LV_ANTIALIAS /*Disable anti-aliasing if drawing with transparent color to chroma keyed canvas*/ lv_color_t ctransp = LV_COLOR_TRANSP; @@ -730,8 +1057,16 @@ void lv_canvas_draw_polygon(lv_obj_t * canvas, const lv_point_t * points, uint32 void lv_canvas_draw_arc(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord_t r, int32_t start_angle, int32_t end_angle, const lv_style_t * style) { + LV_ASSERT_OBJ(canvas, LV_OBJX_NAME); + LV_ASSERT_NULL(style); + lv_img_dsc_t * dsc = lv_canvas_get_img(canvas); + if(dsc->header.cf >= LV_IMG_CF_INDEXED_1BIT && dsc->header.cf <= LV_IMG_CF_INDEXED_8BIT) { + LV_LOG_WARN("lv_canvas_draw_arc: can't raw to LV_IMG_CF_INDEXED canvas"); + return; + } + /* Create a dummy display to fool the lv_draw function. * It will think it draws to real screen. */ lv_area_t mask; @@ -753,6 +1088,8 @@ void lv_canvas_draw_arc(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord_ disp.driver.hor_res = dsc->header.w; disp.driver.ver_res = dsc->header.h; + set_set_px_cb(&disp.driver, dsc->header.cf); + #if LV_ANTIALIAS /*Disable anti-aliasing if drawing with transparent color to chroma keyed canvas*/ lv_color_t ctransp = LV_COLOR_TRANSP; @@ -790,19 +1127,122 @@ static lv_res_t lv_canvas_signal(lv_obj_t * canvas, lv_signal_t sign, void * par /* Include the ancient signal function */ res = ancestor_signal(canvas, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_CLEANUP) { /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_canvas"; } return res; } +static void set_set_px_cb(lv_disp_drv_t * disp_drv, lv_img_cf_t cf) +{ + switch(cf) { + case LV_IMG_CF_TRUE_COLOR_ALPHA: disp_drv->set_px_cb = set_px_true_color_alpha; break; + case LV_IMG_CF_ALPHA_1BIT: disp_drv->set_px_cb = set_px_cb_alpha1; break; + case LV_IMG_CF_ALPHA_2BIT: disp_drv->set_px_cb = set_px_cb_alpha2; break; + case LV_IMG_CF_ALPHA_4BIT: disp_drv->set_px_cb = set_px_cb_alpha4; break; + case LV_IMG_CF_ALPHA_8BIT: disp_drv->set_px_cb = set_px_cb_alpha8; break; + default: disp_drv->set_px_cb = NULL; + } +} + +static void set_px_cb_alpha1(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa) +{ + (void) disp_drv; /*Unused*/ + + if(opa <= LV_OPA_MIN) return; + lv_img_dsc_t d; + d.data = buf; + d.header.w = buf_w; + d.header.cf = LV_IMG_CF_ALPHA_1BIT; + + set_px_alpha_generic(&d, x, y, color, opa); +} + +static void set_px_cb_alpha2(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa) +{ + (void) disp_drv; /*Unused*/ + + if(opa <= LV_OPA_MIN) return; + lv_img_dsc_t d; + d.data = buf; + d.header.w = buf_w; + d.header.cf = LV_IMG_CF_ALPHA_2BIT; + + set_px_alpha_generic(&d, x, y, color, opa); +} + +static void set_px_cb_alpha4(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa) +{ + (void) disp_drv; /*Unused*/ + + if(opa <= LV_OPA_MIN) return; + lv_img_dsc_t d; + d.data = buf; + d.header.w = buf_w; + d.header.cf = LV_IMG_CF_ALPHA_4BIT; + + set_px_alpha_generic(&d, x, y, color, opa); +} + +static void set_px_cb_alpha8(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa) +{ + (void) disp_drv; /*Unused*/ + + if(opa <= LV_OPA_MIN) return; + lv_img_dsc_t d; + d.data = buf; + d.header.w = buf_w; + d.header.cf = LV_IMG_CF_ALPHA_8BIT; + + set_px_alpha_generic(&d, x, y, color, opa); +} + +static void set_px_alpha_generic(lv_img_dsc_t * d, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa) +{ + d->header.always_zero = 0; + d->header.h = LV_VER_RES_MAX; + + uint8_t br = lv_color_brightness(color); + if(opa < LV_OPA_MAX) { + uint8_t bg = lv_img_buf_get_px_alpha(d, x, y); + br = (uint16_t)((uint16_t)br * opa + (bg * (255 - opa))) >> 8; + } + + lv_img_buf_set_px_alpha(d, x, y, br); +} + + +static void set_px_true_color_alpha(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, + lv_color_t color, lv_opa_t opa) +{ + (void) disp_drv; /*Unused*/ + + if(opa <= LV_OPA_MIN) return; + lv_img_dsc_t d; + d.data = buf; + d.header.always_zero = 0; + d.header.h = LV_VER_RES_MAX; + d.header.w = buf_w; + d.header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + + lv_color_t bg_color = lv_img_buf_get_px_color(&d, x, y, LV_COLOR_BLACK); + lv_opa_t bg_opa = lv_img_buf_get_px_alpha(&d, x, y); + + lv_opa_t res_opa; + lv_color_t res_color; + + lv_color_mix_with_alpha(bg_color, bg_opa, color, opa, &res_color, &res_opa); + + + lv_img_buf_set_px_alpha(&d, x, y, res_opa); + lv_img_buf_set_px_color(&d, x, y, res_color); +} + #endif diff --git a/src/lv_objx/lv_canvas.h b/src/lv_objx/lv_canvas.h index 1d59d44d6..9a648e5c1 100644 --- a/src/lv_objx/lv_canvas.h +++ b/src/lv_objx/lv_canvas.h @@ -23,6 +23,7 @@ extern "C" { #include "../lv_core/lv_obj.h" #include "../lv_objx/lv_img.h" +#include "../lv_draw/lv_draw_img.h" /********************* * DEFINES @@ -150,27 +151,46 @@ void lv_canvas_copy_buf(lv_obj_t * canvas, const void * to_copy, lv_coord_t x, l lv_coord_t h); /** - * Rotate and image and store the result on a canvas. + * Transform and image and store the result on a canvas. * @param canvas pointer to a canvas object * @param img pointer to an image descriptor. * Can be the image descriptor of an other canvas too (`lv_canvas_get_img()`). * @param angle the angle of rotation (0..360); + * @param zoom zoom factor (256 no zoom); * @param offset_x offset X to tell where to put the result data on destination canvas * @param offset_y offset X to tell where to put the result data on destination canvas * @param pivot_x pivot X of rotation. Relative to the source canvas * Set to `source width / 2` to rotate around the center * @param pivot_y pivot Y of rotation. Relative to the source canvas * Set to `source height / 2` to rotate around the center + * @param antialias apply anti-aliasing during the transformation. Looks better but slower. */ -void lv_canvas_rotate(lv_obj_t * canvas, lv_img_dsc_t * img, int16_t angle, lv_coord_t offset_x, lv_coord_t offset_y, - int32_t pivot_x, int32_t pivot_y); +void lv_canvas_transform(lv_obj_t * canvas, lv_img_dsc_t * img, int16_t angle, uint16_t zoom, lv_coord_t offset_x, lv_coord_t offset_y, + int32_t pivot_x, int32_t pivot_y, bool antialias); + + + +/** + * Apply horizontal blur on the canvas + * @param canvas pointer to a canvas object + * @param r radius of the blur + */ +void lv_canvas_blur_hor(lv_obj_t * canvas, const lv_area_t * area, uint16_t r); + +/** + * Apply vertical blur on the canvas + * @param canvas pointer to a canvas object + * @param area the area to blur. If `NULL` the whole canvas will be blurred. + * @param r radius of the blur + */ +void lv_canvas_blur_ver(lv_obj_t * canvas, const lv_area_t * area, uint16_t r); /** * Fill the canvas with color * @param canvas pointer to a canvas * @param color the background color */ -void lv_canvas_fill_bg(lv_obj_t * canvas, lv_color_t color); +void lv_canvas_fill_bg(lv_obj_t * canvas, lv_color_t color, lv_opa_t opa); /** * Draw a rectangle on the canvas @@ -239,21 +259,21 @@ void lv_canvas_draw_arc(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_coord_ /********************** * MACROS **********************/ -#define LV_CANVAS_BUF_SIZE_TRUE_COLOR(w, h) ((LV_COLOR_SIZE / 8) * w * h) -#define LV_CANVAS_BUF_SIZE_TRUE_COLOR_CHROMA_KEYED(w, h) ((LV_COLOR_SIZE / 8) * w * h) -#define LV_CANVAS_BUF_SIZE_TRUE_COLOR_ALPHA(w, h) (LV_IMG_PX_SIZE_ALPHA_BYTE * w * h) +#define LV_CANVAS_BUF_SIZE_TRUE_COLOR(w, h) LV_IMG_BUF_SIZE_TRUE_COLOR(w, h) +#define LV_CANVAS_BUF_SIZE_TRUE_COLOR_CHROMA_KEYED(w, h) LV_IMG_BUF_SIZE_TRUE_COLOR_CHROMA_KEYED(w, h) +#define LV_CANVAS_BUF_SIZE_TRUE_COLOR_ALPHA(w, h) LV_IMG_BUF_SIZE_TRUE_COLOR_ALPHA(w, h) /*+ 1: to be sure no fractional row*/ -#define LV_CANVAS_BUF_SIZE_ALPHA_1BIT(w, h) ((((w / 8) + 1) * h)) -#define LV_CANVAS_BUF_SIZE_ALPHA_2BIT(w, h) ((((w / 4) + 1) * h)) -#define LV_CANVAS_BUF_SIZE_ALPHA_4BIT(w, h) ((((w / 2) + 1) * h)) -#define LV_CANVAS_BUF_SIZE_ALPHA_8BIT(w, h) ((w * h)) +#define LV_CANVAS_BUF_SIZE_ALPHA_1BIT(w, h) LV_IMG_BUF_SIZE_ALPHA_1BIT(w, h) +#define LV_CANVAS_BUF_SIZE_ALPHA_2BIT(w, h) LV_IMG_BUF_SIZE_ALPHA_2BIT(w, h) +#define LV_CANVAS_BUF_SIZE_ALPHA_4BIT(w, h) LV_IMG_BUF_SIZE_ALPHA_4BIT(w, h) +#define LV_CANVAS_BUF_SIZE_ALPHA_8BIT(w, h) LV_IMG_BUF_SIZE_ALPHA_8BIT(w, h) /*4 * X: for palette*/ -#define LV_CANVAS_BUF_SIZE_INDEXED_1BIT(w, h) (LV_CANVAS_BUF_SIZE_ALPHA_1BIT(w, h) + 4 * 2) -#define LV_CANVAS_BUF_SIZE_INDEXED_2BIT(w, h) (LV_CANVAS_BUF_SIZE_ALPHA_2BIT(w, h) + 4 * 4) -#define LV_CANVAS_BUF_SIZE_INDEXED_4BIT(w, h) (LV_CANVAS_BUF_SIZE_ALPHA_4BIT(w, h) + 4 * 16) -#define LV_CANVAS_BUF_SIZE_INDEXED_8BIT(w, h) (LV_CANVAS_BUF_SIZE_ALPHA_8BIT(w, h) + 4 * 256) +#define LV_CANVAS_BUF_SIZE_INDEXED_1BIT(w, h) LV_IMG_BUF_SIZE_INDEXED_1BIT(w, h) +#define LV_CANVAS_BUF_SIZE_INDEXED_2BIT(w, h) LV_IMG_BUF_SIZE_INDEXED_2BIT(w, h) +#define LV_CANVAS_BUF_SIZE_INDEXED_4BIT(w, h) LV_IMG_BUF_SIZE_INDEXED_4BIT(w, h) +#define LV_CANVAS_BUF_SIZE_INDEXED_8BIT(w, h) LV_IMG_BUF_SIZE_INDEXED_8BIT(w, h) #endif /*LV_USE_CANVAS*/ diff --git a/src/lv_objx/lv_cb.c b/src/lv_objx/lv_cb.c index ef76f2242..383c9c8a5 100644 --- a/src/lv_objx/lv_cb.c +++ b/src/lv_objx/lv_cb.c @@ -9,12 +9,14 @@ #include "lv_cb.h" #if LV_USE_CB != 0 +#include "../lv_core/lv_debug.h" #include "../lv_core/lv_group.h" #include "../lv_themes/lv_theme.h" /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_cb" /********************** * TYPEDEFS @@ -23,8 +25,8 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_cb_design(lv_obj_t * cb, const lv_area_t * mask, lv_design_mode_t mode); -static bool lv_bullet_design(lv_obj_t * bullet, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_cb_design(lv_obj_t * cb, const lv_area_t * clip_area, lv_design_mode_t mode); +static lv_design_res_t lv_bullet_design(lv_obj_t * bullet, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_cb_signal(lv_obj_t * cb, lv_signal_t sign, void * param); /********************** @@ -55,15 +57,18 @@ lv_obj_t * lv_cb_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor basic object*/ lv_obj_t * new_cb = lv_btn_create(par, copy); - lv_mem_assert(new_cb); + LV_ASSERT_MEM(new_cb); if(new_cb == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_cb); if(ancestor_bg_design == NULL) ancestor_bg_design = lv_obj_get_design_cb(new_cb); lv_cb_ext_t * ext = lv_obj_allocate_ext_attr(new_cb, sizeof(lv_cb_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_cb); + return NULL; + } ext->bullet = NULL; ext->label = NULL; @@ -126,6 +131,8 @@ lv_obj_t * lv_cb_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_cb_set_text(lv_obj_t * cb, const char * txt) { + LV_ASSERT_OBJ(cb, LV_OBJX_NAME); + lv_cb_ext_t * ext = lv_obj_get_ext_attr(cb); lv_label_set_text(ext->label, txt); } @@ -138,6 +145,8 @@ void lv_cb_set_text(lv_obj_t * cb, const char * txt) */ void lv_cb_set_static_text(lv_obj_t * cb, const char * txt) { + LV_ASSERT_OBJ(cb, LV_OBJX_NAME); + lv_cb_ext_t * ext = lv_obj_get_ext_attr(cb); lv_label_set_static_text(ext->label, txt); } @@ -150,6 +159,8 @@ void lv_cb_set_static_text(lv_obj_t * cb, const char * txt) * */ void lv_cb_set_style(lv_obj_t * cb, lv_cb_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(cb, LV_OBJX_NAME); + lv_cb_ext_t * ext = lv_obj_get_ext_attr(cb); switch(type) { @@ -179,6 +190,8 @@ void lv_cb_set_style(lv_obj_t * cb, lv_cb_style_t type, const lv_style_t * style */ const char * lv_cb_get_text(const lv_obj_t * cb) { + LV_ASSERT_OBJ(cb, LV_OBJX_NAME); + lv_cb_ext_t * ext = lv_obj_get_ext_attr(cb); return lv_label_get_text(ext->label); } @@ -191,10 +204,13 @@ const char * lv_cb_get_text(const lv_obj_t * cb) * */ const lv_style_t * lv_cb_get_style(const lv_obj_t * cb, lv_cb_style_t type) { + LV_ASSERT_OBJ(cb, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_cb_ext_t * ext = lv_obj_get_ext_attr(cb); switch(type) { + case LV_CB_STYLE_BG: style = lv_btn_get_style(cb, LV_BTN_STYLE_REL); break; case LV_CB_STYLE_BOX_REL: style = lv_btn_get_style(ext->bullet, LV_BTN_STYLE_REL); break; case LV_CB_STYLE_BOX_PR: style = lv_btn_get_style(ext->bullet, LV_BTN_STYLE_PR); break; case LV_CB_STYLE_BOX_TGL_REL: style = lv_btn_get_style(ext->bullet, LV_BTN_STYLE_TGL_REL); break; @@ -213,20 +229,20 @@ const lv_style_t * lv_cb_get_style(const lv_obj_t * cb, lv_cb_style_t type) /** * Handle the drawing related tasks of the check boxes * @param cb pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_cb_design(lv_obj_t * cb, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_cb_design(lv_obj_t * cb, const lv_area_t * clip_area, lv_design_mode_t mode) { bool result = true; if(mode == LV_DESIGN_COVER_CHK) { /*Return false if the object is not covers the mask_p area*/ - result = ancestor_bg_design(cb, mask, mode); + result = ancestor_bg_design(cb, clip_area, mode); } else if(mode == LV_DESIGN_DRAW_MAIN || mode == LV_DESIGN_DRAW_POST) { lv_cb_ext_t * cb_ext = lv_obj_get_ext_attr(cb); lv_btn_ext_t * bullet_ext = lv_obj_get_ext_attr(cb_ext->bullet); @@ -234,10 +250,10 @@ static bool lv_cb_design(lv_obj_t * cb, const lv_area_t * mask, lv_design_mode_t /*Be sure the state of the bullet is the same as the parent button*/ bullet_ext->state = cb_ext->bg_btn.state; - result = ancestor_bg_design(cb, mask, mode); + result = ancestor_bg_design(cb, clip_area, mode); } else { - result = ancestor_bg_design(cb, mask, mode); + result = ancestor_bg_design(cb, clip_area, mode); } return result; @@ -246,17 +262,17 @@ static bool lv_cb_design(lv_obj_t * cb, const lv_area_t * mask, lv_design_mode_t /** * Handle the drawing related tasks of the check boxes * @param bullet pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return element of `lv_design_res_t` */ -static bool lv_bullet_design(lv_obj_t * bullet, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_bullet_design(lv_obj_t * bullet, const lv_area_t * clip_area, lv_design_mode_t mode) { if(mode == LV_DESIGN_COVER_CHK) { - return ancestor_bullet_design(bullet, mask, mode); + return ancestor_bullet_design(bullet, clip_area, mode); } else if(mode == LV_DESIGN_DRAW_MAIN) { #if LV_USE_GROUP /* If the check box is the active in a group and @@ -274,16 +290,16 @@ static bool lv_bullet_design(lv_obj_t * bullet, const lv_area_t * mask, lv_desig } } #endif - ancestor_bullet_design(bullet, mask, mode); + ancestor_bullet_design(bullet, clip_area, mode); #if LV_USE_GROUP bullet->style_p = style_ori; /*Revert the style*/ #endif } else if(mode == LV_DESIGN_DRAW_POST) { - ancestor_bullet_design(bullet, mask, mode); + ancestor_bullet_design(bullet, clip_area, mode); } - return true; + return LV_DESIGN_RES_OK; } /** @@ -300,6 +316,7 @@ static lv_res_t lv_cb_signal(lv_obj_t * cb, lv_signal_t sign, void * param) /* Include the ancient signal function */ res = ancestor_signal(cb, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_cb_ext_t * ext = lv_obj_get_ext_attr(cb); @@ -316,13 +333,6 @@ static lv_res_t lv_cb_signal(lv_obj_t * cb, lv_signal_t sign, void * param) /*Follow the backgrounds state with the bullet*/ lv_btn_set_state(ext->bullet, lv_btn_get_state(cb)); } - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_cb"; } return res; diff --git a/src/lv_objx/lv_cb.h b/src/lv_objx/lv_cb.h index 5fa598b7b..a6b1e74ad 100644 --- a/src/lv_objx/lv_cb.h +++ b/src/lv_objx/lv_cb.h @@ -149,7 +149,7 @@ static inline bool lv_cb_is_checked(const lv_obj_t * cb) */ static inline bool lv_cb_is_inactive(const lv_obj_t * cb) { - return lv_btn_get_state(cb) == LV_BTN_STATE_INA ? false : true; + return lv_btn_get_state(cb) == LV_BTN_STATE_INA ? true :false; } /** diff --git a/src/lv_objx/lv_chart.c b/src/lv_objx/lv_chart.c index 83ae1ab95..20ea4980e 100644 --- a/src/lv_objx/lv_chart.c +++ b/src/lv_objx/lv_chart.c @@ -9,13 +9,17 @@ #include "lv_chart.h" #if LV_USE_CHART != 0 +#include "../lv_core/lv_debug.h" #include "../lv_core/lv_refr.h" #include "../lv_draw/lv_draw.h" +#include "../lv_misc/lv_math.h" #include "../lv_themes/lv_theme.h" /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_chart" + #define LV_CHART_YMIN_DEF 0 #define LV_CHART_YMAX_DEF 100 #define LV_CHART_HDIV_DEF 3 @@ -24,15 +28,26 @@ #define LV_CHART_AXIS_TO_LABEL_DISTANCE 4 #define LV_CHART_AXIS_MAJOR_TICK_LEN_COE 1 / 15 #define LV_CHART_AXIS_MINOR_TICK_LEN_COE 2 / 3 +#define LV_CHART_AXIS_PRIMARY_Y 1 +#define LV_CHART_AXIS_SECONDARY_Y 0 +#define LV_CHART_LABEL_ITERATOR_FORWARD 1 +#define LV_CHART_LABEL_ITERATOR_REVERSE 0 /********************** * TYPEDEFS **********************/ +typedef struct { + const char * list_start; + const char * current_pos; + uint8_t items_left; + uint8_t is_reverse_iter; +} lv_chart_label_iterator_t; + /********************** * STATIC PROTOTYPES **********************/ -static bool lv_chart_design(lv_obj_t * chart, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_chart_design(lv_obj_t * chart, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_chart_signal(lv_obj_t * chart, lv_signal_t sign, void * param); static void lv_chart_draw_div(lv_obj_t * chart, const lv_area_t * mask); static void lv_chart_draw_lines(lv_obj_t * chart, const lv_area_t * mask); @@ -44,6 +59,9 @@ static void lv_chart_draw_axes(lv_obj_t * chart, const lv_area_t * mask); static void lv_chart_inv_lines(lv_obj_t * chart, uint16_t i); static void lv_chart_inv_points(lv_obj_t * chart, uint16_t i); static void lv_chart_inv_cols(lv_obj_t * chart, uint16_t i); +static void lv_chart_get_next_label(lv_chart_label_iterator_t * iterator, char * buf); +static inline bool lv_chart_is_tick_with_label(uint8_t tick_num, lv_chart_axis_cfg_t * axis); +static lv_chart_label_iterator_t lv_chart_create_label_iter(const char * list, uint8_t iterator_dir); /********************** * STATIC VARIABLES @@ -72,13 +90,16 @@ lv_obj_t * lv_chart_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor basic object*/ lv_obj_t * new_chart = lv_obj_create(par, copy); - lv_mem_assert(new_chart); + LV_ASSERT_MEM(new_chart); if(new_chart == NULL) return NULL; /*Allocate the object type specific extended data*/ lv_chart_ext_t * ext = lv_obj_allocate_ext_attr(new_chart, sizeof(lv_chart_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_chart); + return NULL; + } lv_ll_init(&ext->series_ll, sizeof(lv_chart_series_t)); @@ -96,10 +117,13 @@ lv_obj_t * lv_chart_create(lv_obj_t * par, const lv_obj_t * copy) ext->margin = 0; memset(&ext->x_axis, 0, sizeof(ext->x_axis)); memset(&ext->y_axis, 0, sizeof(ext->y_axis)); + memset(&ext->secondary_y_axis, 0, sizeof(ext->secondary_y_axis)); ext->x_axis.major_tick_len = LV_CHART_TICK_LENGTH_AUTO; ext->x_axis.minor_tick_len = LV_CHART_TICK_LENGTH_AUTO; ext->y_axis.major_tick_len = LV_CHART_TICK_LENGTH_AUTO; ext->y_axis.minor_tick_len = LV_CHART_TICK_LENGTH_AUTO; + ext->secondary_y_axis.major_tick_len = LV_CHART_TICK_LENGTH_AUTO; + ext->secondary_y_axis.minor_tick_len = LV_CHART_TICK_LENGTH_AUTO; if(ancestor_design_f == NULL) ancestor_design_f = lv_obj_get_design_cb(new_chart); if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_chart); @@ -132,6 +156,7 @@ lv_obj_t * lv_chart_create(lv_obj_t * par, const lv_obj_t * copy) ext->margin = ext_copy->margin; memcpy(&ext->x_axis, &ext_copy->x_axis, sizeof(lv_chart_axis_cfg_t)); memcpy(&ext->y_axis, &ext_copy->y_axis, sizeof(lv_chart_axis_cfg_t)); + 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(new_chart); @@ -154,9 +179,11 @@ lv_obj_t * lv_chart_create(lv_obj_t * par, const lv_obj_t * copy) */ lv_chart_series_t * lv_chart_add_series(lv_obj_t * chart, lv_color_t color) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); lv_chart_series_t * ser = lv_ll_ins_head(&ext->series_ll); - lv_mem_assert(ser); + LV_ASSERT_MEM(ser); if(ser == NULL) return NULL; lv_coord_t def = LV_CHART_POINT_DEF; @@ -165,9 +192,9 @@ lv_chart_series_t * lv_chart_add_series(lv_obj_t * chart, lv_color_t color) ser->color = color; ser->points = lv_mem_alloc(sizeof(lv_coord_t) * ext->point_cnt); - lv_mem_assert(ser->points); + LV_ASSERT_MEM(ser->points); if(ser->points == NULL) { - lv_ll_rem(&ext->series_ll, ser); + lv_ll_remove(&ext->series_ll, ser); lv_mem_free(ser); return NULL; } @@ -193,6 +220,9 @@ lv_chart_series_t * lv_chart_add_series(lv_obj_t * chart, lv_color_t color) */ void lv_chart_clear_serie(lv_obj_t * chart, lv_chart_series_t * serie) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + LV_ASSERT_NULL(serie); + if(chart == NULL || serie == NULL) return; lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); if(ext == NULL) return; @@ -217,6 +247,8 @@ void lv_chart_clear_serie(lv_obj_t * chart, lv_chart_series_t * serie) */ void lv_chart_set_div_line_count(lv_obj_t * chart, uint8_t hdiv, uint8_t vdiv) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); if(ext->hdiv_cnt == hdiv && ext->vdiv_cnt == vdiv) return; @@ -234,6 +266,8 @@ void lv_chart_set_div_line_count(lv_obj_t * chart, uint8_t hdiv, uint8_t vdiv) */ void lv_chart_set_range(lv_obj_t * chart, lv_coord_t ymin, lv_coord_t ymax) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); if(ext->ymin == ymin && ext->ymax == ymax) return; @@ -250,6 +284,8 @@ void lv_chart_set_range(lv_obj_t * chart, lv_coord_t ymin, lv_coord_t ymax) */ void lv_chart_set_type(lv_obj_t * chart, lv_chart_type_t type) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); if(ext->type == type) return; @@ -265,6 +301,8 @@ void lv_chart_set_type(lv_obj_t * chart, lv_chart_type_t type) */ void lv_chart_set_point_count(lv_obj_t * chart, uint16_t point_cnt) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); if(ext->point_cnt == point_cnt) return; @@ -279,7 +317,7 @@ void lv_chart_set_point_count(lv_obj_t * chart, uint16_t point_cnt) { if(ser->start_point != 0) { lv_coord_t * new_points = lv_mem_alloc(sizeof(lv_coord_t) * point_cnt); - lv_mem_assert(new_points); + LV_ASSERT_MEM(new_points); if(new_points == NULL) return; if(point_cnt >= point_cnt_old) { @@ -302,7 +340,7 @@ void lv_chart_set_point_count(lv_obj_t * chart, uint16_t point_cnt) ser->points = new_points; } else { ser->points = lv_mem_realloc(ser->points, sizeof(lv_coord_t) * point_cnt); - lv_mem_assert(ser->points); + LV_ASSERT_MEM(ser->points); if(ser->points == NULL) return; /*Initialize the new points*/ if(point_cnt > point_cnt_old) { @@ -327,6 +365,8 @@ void lv_chart_set_point_count(lv_obj_t * chart, uint16_t point_cnt) */ void lv_chart_set_series_opa(lv_obj_t * chart, lv_opa_t opa) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); if(ext->series.opa == opa) return; @@ -341,6 +381,8 @@ void lv_chart_set_series_opa(lv_obj_t * chart, lv_opa_t opa) */ void lv_chart_set_series_width(lv_obj_t * chart, lv_coord_t width) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); if(ext->series.width == width) return; @@ -354,6 +396,8 @@ void lv_chart_set_series_width(lv_obj_t * chart, lv_coord_t width) */ void lv_chart_set_series_darking(lv_obj_t * chart, lv_opa_t dark_eff) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); if(ext->series.dark == dark_eff) return; @@ -369,6 +413,9 @@ void lv_chart_set_series_darking(lv_obj_t * chart, lv_opa_t dark_eff) */ void lv_chart_init_points(lv_obj_t * chart, lv_chart_series_t * ser, lv_coord_t y) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + LV_ASSERT_NULL(ser); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); uint16_t i; for(i = 0; i < ext->point_cnt; i++) { @@ -386,6 +433,9 @@ void lv_chart_init_points(lv_obj_t * chart, lv_chart_series_t * ser, lv_coord_t */ void lv_chart_set_points(lv_obj_t * chart, lv_chart_series_t * ser, lv_coord_t y_array[]) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + LV_ASSERT_NULL(ser); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); memcpy(ser->points, y_array, ext->point_cnt * (sizeof(lv_coord_t))); ser->start_point = 0; @@ -400,6 +450,9 @@ void lv_chart_set_points(lv_obj_t * chart, lv_chart_series_t * ser, lv_coord_t y */ void lv_chart_set_next(lv_obj_t * chart, lv_chart_series_t * ser, lv_coord_t y) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + LV_ASSERT_NULL(ser); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); if(ext->update_mode == LV_CHART_UPDATE_MODE_SHIFT) { ser->points[ser->start_point] = @@ -414,6 +467,7 @@ void lv_chart_set_next(lv_obj_t * chart, lv_chart_series_t * ser, lv_coord_t y) if(ext->type & LV_CHART_TYPE_POINT) lv_chart_inv_points(chart, ser->start_point); if(ext->type & LV_CHART_TYPE_VERTICAL_LINE) lv_chart_inv_lines(chart, ser->start_point); if(ext->type & LV_CHART_TYPE_AREA) lv_chart_inv_lines(chart, ser->start_point); + if(ext->type & LV_CHART_TYPE_AREA_FADED) lv_chart_inv_lines(chart, ser->start_point); ser->start_point = (ser->start_point + 1) % ext->point_cnt; /*update the x for next incoming y*/ } @@ -426,6 +480,8 @@ void lv_chart_set_next(lv_obj_t * chart, lv_chart_series_t * ser, lv_coord_t y) */ void lv_chart_set_update_mode(lv_obj_t * chart, lv_chart_update_mode_t update_mode) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); if(ext->update_mode == update_mode) return; @@ -443,6 +499,8 @@ void lv_chart_set_update_mode(lv_obj_t * chart, lv_chart_update_mode_t update_mo */ void lv_chart_set_x_tick_length(lv_obj_t * chart, uint8_t major_tick_len, uint8_t minor_tick_len) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); ext->x_axis.major_tick_len = major_tick_len; ext->x_axis.minor_tick_len = minor_tick_len; @@ -458,11 +516,30 @@ void lv_chart_set_x_tick_length(lv_obj_t * chart, uint8_t major_tick_len, uint8_ */ void lv_chart_set_y_tick_length(lv_obj_t * chart, uint8_t major_tick_len, uint8_t minor_tick_len) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); ext->y_axis.major_tick_len = major_tick_len; ext->y_axis.minor_tick_len = minor_tick_len; } +/** + * Set the length of the tick marks on the secondary y axis + * @param chart pointer to the chart + * @param major_tick_len the length of the major tick or `LV_CHART_TICK_LENGTH_AUTO` to set automatically + * (where labels are added) + * @param minor_tick_len the length of the minor tick, `LV_CHART_TICK_LENGTH_AUTO` to set automatically + * (where no labels are added) + */ +void lv_chart_set_secondary_y_tick_length(lv_obj_t * chart, uint8_t major_tick_len, uint8_t minor_tick_len) +{ + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); + ext->secondary_y_axis.major_tick_len = major_tick_len; + ext->secondary_y_axis.minor_tick_len = minor_tick_len; +} + /** * Set the x-axis tick count and labels of a chart * @param chart pointer to a chart object @@ -474,6 +551,9 @@ void lv_chart_set_y_tick_length(lv_obj_t * chart, uint8_t major_tick_len, uint8_ void lv_chart_set_x_tick_texts(lv_obj_t * chart, const char * list_of_values, uint8_t num_tick_marks, lv_chart_axis_options_t options) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + LV_ASSERT_NULL(list_of_values); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); ext->x_axis.num_tick_marks = num_tick_marks; ext->x_axis.list_of_values = list_of_values; @@ -491,12 +571,35 @@ void lv_chart_set_x_tick_texts(lv_obj_t * chart, const char * list_of_values, ui void lv_chart_set_y_tick_texts(lv_obj_t * chart, const char * list_of_values, uint8_t num_tick_marks, lv_chart_axis_options_t options) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + LV_ASSERT_NULL(list_of_values); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); ext->y_axis.num_tick_marks = num_tick_marks; ext->y_axis.list_of_values = list_of_values; ext->y_axis.options = options; } +/** + * Set the secondary y-axis tick count and labels of a chart + * @param chart pointer to a chart object + * @param list_of_values list of string values, terminated with \n, except the last + * @param num_tick_marks if list_of_values is NULL: total number of ticks per axis + * else number of ticks between two value labels + * @param options extra options + */ +void lv_chart_set_secondary_y_tick_texts(lv_obj_t * chart, const char * list_of_values, uint8_t num_tick_marks, + lv_chart_axis_options_t options) +{ + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + LV_ASSERT_NULL(list_of_values); + + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); + ext->secondary_y_axis.num_tick_marks = num_tick_marks; + ext->secondary_y_axis.list_of_values = list_of_values; + ext->secondary_y_axis.options = options; +} + /** * Set the margin around the chart, used for axes value and ticks * @param chart pointer to an chart object @@ -504,6 +607,8 @@ void lv_chart_set_y_tick_texts(lv_obj_t * chart, const char * list_of_values, ui */ void lv_chart_set_margin(lv_obj_t * chart, uint16_t margin) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); ext->margin = margin; lv_obj_refresh_ext_draw_pad(chart); @@ -520,6 +625,8 @@ void lv_chart_set_margin(lv_obj_t * chart, uint16_t margin) */ lv_chart_type_t lv_chart_get_type(const lv_obj_t * chart) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); return ext->type; } @@ -529,8 +636,10 @@ lv_chart_type_t lv_chart_get_type(const lv_obj_t * chart) * @param chart pointer to chart object * @return point number on each data line */ -uint16_t lv_chart_get_point_cnt(const lv_obj_t * chart) +uint16_t lv_chart_get_point_count(const lv_obj_t * chart) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); return ext->point_cnt; } @@ -542,6 +651,8 @@ uint16_t lv_chart_get_point_cnt(const lv_obj_t * chart) */ lv_opa_t lv_chart_get_series_opa(const lv_obj_t * chart) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); return ext->series.opa; } @@ -553,6 +664,8 @@ lv_opa_t lv_chart_get_series_opa(const lv_obj_t * chart) */ lv_coord_t lv_chart_get_series_width(const lv_obj_t * chart) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); return ext->series.width; } @@ -564,6 +677,8 @@ lv_coord_t lv_chart_get_series_width(const lv_obj_t * chart) */ lv_opa_t lv_chart_get_series_darking(const lv_obj_t * chart) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); return ext->series.dark; } @@ -578,6 +693,8 @@ lv_opa_t lv_chart_get_series_darking(const lv_obj_t * chart) */ void lv_chart_refresh(lv_obj_t * chart) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_obj_invalidate(chart); } @@ -588,6 +705,8 @@ void lv_chart_refresh(lv_obj_t * chart) */ uint16_t lv_chart_get_margin(lv_obj_t * chart) { + LV_ASSERT_OBJ(chart, LV_OBJX_NAME); + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); return ext->margin; } @@ -599,44 +718,43 @@ uint16_t lv_chart_get_margin(lv_obj_t * chart) /** * Handle the drawing related tasks of the chart backgrounds * @param chart pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_chart_design(lv_obj_t * chart, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_chart_design(lv_obj_t * chart, const lv_area_t * clip_area, lv_design_mode_t mode) { if(mode == LV_DESIGN_COVER_CHK) { - /*Return false if the object is not covers the mask_p area*/ - return ancestor_design_f(chart, mask, mode); + return ancestor_design_f(chart, clip_area, mode); } else if(mode == LV_DESIGN_DRAW_MAIN) { /*Draw the background*/ - lv_draw_rect(&chart->coords, mask, lv_obj_get_style(chart), lv_obj_get_opa_scale(chart)); + lv_draw_rect(&chart->coords, clip_area, lv_obj_get_style(chart), lv_obj_get_opa_scale(chart)); lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - lv_chart_draw_div(chart, mask); + lv_chart_draw_div(chart, clip_area); /* Adjust the mask to remove the margin (clips chart contents to be within background) */ lv_area_t mask_tmp, adjusted_mask; lv_obj_get_coords(chart, &mask_tmp); - bool union_ok = lv_area_intersect(&adjusted_mask, mask, &mask_tmp); + bool union_ok = lv_area_intersect(&adjusted_mask, clip_area, &mask_tmp); if(union_ok) { - if(ext->type & LV_CHART_TYPE_LINE) lv_chart_draw_lines(chart, &adjusted_mask); - if(ext->type & LV_CHART_TYPE_COLUMN) lv_chart_draw_cols(chart, &adjusted_mask); - if(ext->type & LV_CHART_TYPE_POINT) lv_chart_draw_points(chart, &adjusted_mask); - if(ext->type & LV_CHART_TYPE_VERTICAL_LINE) lv_chart_draw_vertical_lines(chart, &adjusted_mask); - if(ext->type & LV_CHART_TYPE_AREA) lv_chart_draw_areas(chart, &adjusted_mask); + if(ext->type & LV_CHART_TYPE_LINE) lv_chart_draw_lines(chart, clip_area); + if(ext->type & LV_CHART_TYPE_COLUMN) lv_chart_draw_cols(chart, clip_area); + if(ext->type & LV_CHART_TYPE_POINT) lv_chart_draw_points(chart, clip_area); + if(ext->type & LV_CHART_TYPE_VERTICAL_LINE) lv_chart_draw_vertical_lines(chart, clip_area); + if((ext->type & LV_CHART_TYPE_AREA) || (ext->type & LV_CHART_TYPE_AREA_FADED)) lv_chart_draw_areas(chart, clip_area); } - lv_chart_draw_axes(chart, mask); + lv_chart_draw_axes(chart, clip_area); } - return true; + return LV_DESIGN_RES_OK; } /** @@ -647,12 +765,13 @@ static bool lv_chart_design(lv_obj_t * chart, const lv_area_t * mask, lv_design_ */ static lv_res_t lv_chart_signal(lv_obj_t * chart, lv_signal_t sign, void * param) { - lv_res_t res; - lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - /* Include the ancient signal function */ + lv_res_t res; res = ancestor_signal(chart, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); + + lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); if(sign == LV_SIGNAL_CLEANUP) { lv_coord_t ** datal; @@ -661,13 +780,6 @@ static lv_res_t lv_chart_signal(lv_obj_t * chart, lv_signal_t sign, void * param lv_mem_free(*datal); } lv_ll_clear(&ext->series_ll); - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_chart"; } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { /*Provide extra px draw area around the chart*/ chart->ext_draw_pad = ext->margin; @@ -811,8 +923,8 @@ static void lv_chart_draw_points(lv_obj_t * chart, const lv_area_t * mask) lv_area_t cir_a; lv_coord_t w = lv_obj_get_width(chart); lv_coord_t h = lv_obj_get_height(chart); - lv_coord_t x_ofs = chart->coords.x1; - lv_coord_t y_ofs = chart->coords.y1; + lv_coord_t x_ofs = chart->coords.x1 - (ext->series.width & 0x1); + lv_coord_t y_ofs = chart->coords.y1 - (ext->series.width & 0x1 ? 0 : 1); int32_t y_tmp; lv_coord_t p_act; lv_chart_series_t * ser; @@ -1005,11 +1117,19 @@ static void lv_chart_draw_areas(lv_obj_t * chart, const lv_area_t * mask) lv_style_t style; lv_style_copy(&style, &lv_style_plain); + int16_t mask_fade_id = LV_MASK_ID_INV; + lv_draw_mask_fade_param_t mask_fade_p; + if(ext->type & LV_CHART_TYPE_AREA_FADED) { + lv_draw_mask_fade_init(&mask_fade_p, &chart->coords, LV_OPA_90, chart->coords.y1 + (h >> 2), LV_OPA_10, chart->coords.y2 - (h >> 2)); + mask_fade_id = lv_draw_mask_add(&mask_fade_p, NULL); + } + /*Go through all data lines*/ LV_LL_READ_BACK(ext->series_ll, ser) { lv_coord_t start_point = ext->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; style.body.main_color = ser->color; + style.body.grad_color = ser->color; style.body.opa = ext->series.opa; p2.x = 0 + x_ofs; @@ -1030,81 +1150,209 @@ static void lv_chart_draw_areas(lv_obj_t * chart, const lv_area_t * mask) y_tmp = y_tmp / (ext->ymax - ext->ymin); p2.y = h - y_tmp + y_ofs; + if(ser->points[p_prev] != LV_CHART_POINT_DEF && ser->points[p_act] != LV_CHART_POINT_DEF) { - lv_point_t triangle_points[3]; - triangle_points[0] = p1; - triangle_points[1] = p2; - triangle_points[2].x = p1.x; - triangle_points[2].y = chart->coords.y2; - lv_draw_triangle(triangle_points, mask, &style, opa_scale); - triangle_points[2].x = p2.x; - triangle_points[0].y = chart->coords.y2; - lv_draw_triangle(triangle_points, mask, &style, opa_scale); + int16_t mask_line_id; + lv_draw_mask_line_param_t mask_line_p; + lv_draw_mask_line_points_init(&mask_line_p, p1.x, p1.y, p2.x, p2.y, LV_DRAW_MASK_LINE_SIDE_BOTTOM); + mask_line_id = lv_draw_mask_add(&mask_line_p, NULL); + + lv_area_t a; + a.x1 = p1.x; + a.x2 = p2.x - 1; + a.y1 = LV_MATH_MIN(p1.y, p2.y); + a.y2 = chart->coords.y2; + lv_draw_rect(&a, mask, &style, opa_scale); + + lv_draw_mask_remove_id(mask_line_id); } p_prev = p_act; } } + lv_draw_mask_remove_id(mask_fade_id); } -static void lv_chart_draw_y_ticks(lv_obj_t * chart, const lv_area_t * mask) +/** + * Create iterator for newline-separated list + * @param list pointer to newline-separated labels list + * @param iterator_dir LV_CHART_ITERATOR_FORWARD or LV_CHART_LABEL_ITERATOR_REVERSE + * @return lv_chart_label_iterator_t + */ +static lv_chart_label_iterator_t lv_chart_create_label_iter(const char * list, uint8_t iterator_dir) +{ + lv_chart_label_iterator_t iterator = {0}; + uint8_t j; + + iterator.list_start = list; + + /* count number of list items */ + for(j = 0; list[j] != '\0'; j++) { + if(list[j] == '\n') + iterator.items_left++; + } + + if(iterator_dir == LV_CHART_LABEL_ITERATOR_FORWARD) { + iterator.is_reverse_iter = 0; + iterator.current_pos = list; + } else { + iterator.is_reverse_iter = 1; + // -1 to skip '\0' at the end of the string + iterator.current_pos = list + j - 1; + } + iterator.items_left++; + return iterator; +} + +/** + * Get next label from iterator created by lv_chart_create_label_iter() + * @param iterator iterator to get label from + * @param[out] buf buffer to point next label to + */ +static void lv_chart_get_next_label(lv_chart_label_iterator_t * iterator, char * buf) +{ + uint8_t label_len = 0; + if (iterator->is_reverse_iter) { + const char * label_start; + /* count the length of the current label*/ + while ((*iterator->current_pos != '\n') && + (iterator->current_pos != iterator->list_start)) { + iterator->current_pos--; + label_len++; + } + + label_start = iterator->current_pos; + + if (*iterator->current_pos == '\n') { + /* do not copy \n symbol, +1 to skip it*/ + label_start++; + /* skip newline*/ + iterator->current_pos--; + } else { + /* it is last label in list (first one from the beginning )*/ + label_len++; + } + + /* do not allow output buffer overflow */ + if (label_len > LV_CHART_AXIS_TICK_LABEL_MAX_LEN) { + label_len = LV_CHART_AXIS_TICK_LABEL_MAX_LEN; + } + + strncpy(buf, label_start, label_len); + } else { + /* search for tick string */ + while(iterator->current_pos[label_len] != '\n' && + iterator->current_pos[label_len] != '\0') { + /* do not overflow the buffer, but move to the end of the current label */ + if(label_len < LV_CHART_AXIS_TICK_LABEL_MAX_LEN) { + buf[label_len] = iterator->current_pos[label_len]; + label_len++; + } else { + label_len++; + } + } + + iterator->current_pos += label_len; + + /* do not allow output buffer overflow */ + if (label_len > LV_CHART_AXIS_TICK_LABEL_MAX_LEN) { + label_len = LV_CHART_AXIS_TICK_LABEL_MAX_LEN; + } + + if(*iterator->current_pos == '\n') iterator->current_pos++; + } + + /* terminate the string */ + buf[label_len] = '\0'; +} + +/** + * Check whether there should be a label next to tick with given + * number + * @param tick_num number of the tick to check + * @param axis pointer to struct containing info on the axis + * @return true if label should be located next to current tick + */ +static inline bool lv_chart_is_tick_with_label(uint8_t tick_num, lv_chart_axis_cfg_t * axis) +{ + return ((tick_num == 0) || ((tick_num % axis->num_tick_marks) == 0)); +} + +static void lv_chart_draw_y_ticks(lv_obj_t * chart, const lv_area_t * mask, uint8_t which_axis) { lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); + lv_chart_axis_cfg_t * y_axis = (which_axis == LV_CHART_AXIS_PRIMARY_Y) ? + &ext->y_axis : &ext->secondary_y_axis; - if(ext->y_axis.list_of_values != NULL || ext->y_axis.num_tick_marks != 0) { + if(y_axis->list_of_values != NULL || y_axis->num_tick_marks != 0) { const lv_style_t * style = lv_obj_get_style(chart); lv_opa_t opa_scale = lv_obj_get_opa_scale(chart); - uint8_t i, j; - uint8_t list_index; + uint8_t i; uint8_t num_of_labels; uint8_t num_scale_ticks; - uint8_t major_tick_len, minor_tick_len; + int8_t major_tick_len, minor_tick_len; + uint8_t iter_dir; + lv_point_t p1; lv_point_t p2; - lv_coord_t x_ofs = chart->coords.x1; + lv_coord_t x_ofs; + lv_chart_label_iterator_t iter; lv_coord_t y_ofs = chart->coords.y1; lv_coord_t h = lv_obj_get_height(chart); lv_coord_t w = lv_obj_get_width(chart); char buf[LV_CHART_AXIS_TICK_LABEL_MAX_LEN + 1]; /* up to N symbols per label + null terminator */ + /* chose correct side of the chart */ + if(which_axis == LV_CHART_AXIS_PRIMARY_Y) + x_ofs = chart->coords.x1; + else + x_ofs = chart->coords.x2; + /* calculate the size of tick marks */ - if(ext->y_axis.major_tick_len == LV_CHART_TICK_LENGTH_AUTO) + if(y_axis->major_tick_len == LV_CHART_TICK_LENGTH_AUTO) major_tick_len = (int32_t)w * LV_CHART_AXIS_MAJOR_TICK_LEN_COE; else - major_tick_len = ext->y_axis.major_tick_len; + major_tick_len = y_axis->major_tick_len; - if(ext->y_axis.minor_tick_len == LV_CHART_TICK_LENGTH_AUTO) + if(y_axis->minor_tick_len == LV_CHART_TICK_LENGTH_AUTO) minor_tick_len = major_tick_len * LV_CHART_AXIS_MINOR_TICK_LEN_COE; else - minor_tick_len = ext->y_axis.minor_tick_len; + minor_tick_len = y_axis->minor_tick_len; - /* count the '\n'-s to determine the number of options */ - list_index = 0; - num_of_labels = 0; - if(ext->y_axis.list_of_values != NULL) { - for(j = 0; ext->y_axis.list_of_values[j] != '\0'; j++) { - if(ext->y_axis.list_of_values[j] == '\n') num_of_labels++; - } - - num_of_labels++; /* last option in the at row*/ + /* tick lines on secondary y axis are drawn in other direction*/ + if(which_axis == LV_CHART_AXIS_SECONDARY_Y) { + major_tick_len *= -1; + minor_tick_len *= -1; } + iter_dir = (y_axis->options & LV_CHART_AXIS_INVERSE_LABELS_ORDER) ? LV_CHART_LABEL_ITERATOR_REVERSE : LV_CHART_LABEL_ITERATOR_FORWARD; + iter = lv_chart_create_label_iter(y_axis->list_of_values, iter_dir); + + /*determine the number of options */ + num_of_labels = iter.items_left; + /* we can't have string labels without ticks step, set to 1 if not specified */ - if(ext->y_axis.num_tick_marks == 0) ext->y_axis.num_tick_marks = 1; + if(y_axis->num_tick_marks == 0) y_axis->num_tick_marks = 1; /* calculate total number of ticks */ if(num_of_labels < 2) - num_scale_ticks = ext->y_axis.num_tick_marks; + num_scale_ticks = y_axis->num_tick_marks; else - num_scale_ticks = (ext->y_axis.num_tick_marks * (num_of_labels - 1)); + num_scale_ticks = (y_axis->num_tick_marks * (num_of_labels - 1)); for(i = 0; i < (num_scale_ticks + 1); i++) { /* one extra loop - it may not exist in the list, empty label */ /* first point of the tick */ - p1.x = x_ofs - 1; + p1.x = x_ofs; + + /* move extra pixel out of chart boundary */ + if (which_axis == LV_CHART_AXIS_PRIMARY_Y) + p1.x--; + else + p1.x++; /* second point of the tick */ - if((num_of_labels != 0) && (i == 0 || i % ext->y_axis.num_tick_marks == 0)) + if((num_of_labels != 0) && (i == 0 || i % y_axis->num_tick_marks == 0)) p2.x = p1.x - major_tick_len; /* major tick */ else p2.x = p1.x - minor_tick_len; /* minor tick */ @@ -1113,31 +1361,25 @@ static void lv_chart_draw_y_ticks(lv_obj_t * chart, const lv_area_t * mask) p2.y = p1.y = y_ofs + (int32_t)((int32_t)(h - style->line.width) * i) / num_scale_ticks; - if(i != num_scale_ticks) - lv_draw_line(&p1, &p2, mask, style, opa_scale); - else if((ext->y_axis.options & LV_CHART_AXIS_DRAW_LAST_TICK) != 0) - lv_draw_line(&p1, &p2, mask, style, opa_scale); + if(y_axis->options & LV_CHART_AXIS_INVERSE_LABELS_ORDER) { + /*if label order is inversed last tick have number 0*/ + if(i != 0) + lv_draw_line(&p1, &p2, mask, style, opa_scale); + else if((y_axis->options & LV_CHART_AXIS_DRAW_LAST_TICK) != 0) + lv_draw_line(&p1, &p2, mask, style, opa_scale); + } else { + if(i != num_scale_ticks) + lv_draw_line(&p1, &p2, mask, style, opa_scale); + else if((y_axis->options & LV_CHART_AXIS_DRAW_LAST_TICK) != 0) + lv_draw_line(&p1, &p2, mask, style, opa_scale); + } /* draw values if available */ if(num_of_labels != 0) { /* add text only to major tick */ - if(i == 0 || i % ext->y_axis.num_tick_marks == 0) { - /* search for tick string */ - j = 0; - while(ext->y_axis.list_of_values[list_index] != '\n' && - ext->y_axis.list_of_values[list_index] != '\0') { - /* do not overflow the buffer, but move to the end of the current label */ - if(j < LV_CHART_AXIS_TICK_LABEL_MAX_LEN) - buf[j++] = ext->y_axis.list_of_values[list_index++]; - else - list_index++; - } + if(lv_chart_is_tick_with_label(i, y_axis)) { - /* this was a string, but not end of the list, so jump to the next string */ - if(ext->y_axis.list_of_values[list_index] == '\n') list_index++; - - /* terminate the string */ - buf[j] = '\0'; + lv_chart_get_next_label(&iter, buf); /* reserve appropriate area */ lv_point_t size; @@ -1145,9 +1387,17 @@ static void lv_chart_draw_y_ticks(lv_obj_t * chart, const lv_area_t * mask) LV_COORD_MAX, LV_TXT_FLAG_CENTER); /* set the area at some distance of the major tick len left of the tick */ - lv_area_t a = {(p2.x - size.x - LV_CHART_AXIS_TO_LABEL_DISTANCE), (p2.y - size.y / 2), - (p2.x - LV_CHART_AXIS_TO_LABEL_DISTANCE), (p2.y + size.y / 2)}; - lv_draw_label(&a, mask, style, opa_scale, buf, LV_TXT_FLAG_CENTER, NULL, -1, -1, NULL); + lv_area_t a = {.y1 = p2.y - size.y / 2, .y2 = p2.y + size.y / 2}; + + if(which_axis == LV_CHART_AXIS_PRIMARY_Y) { + a.x1 = p2.x - size.x - LV_CHART_AXIS_TO_LABEL_DISTANCE; + a.x2 = p2.x - LV_CHART_AXIS_TO_LABEL_DISTANCE; + } else { + a.x1 = p2.x + LV_CHART_AXIS_TO_LABEL_DISTANCE; + a.x2 = p2.x + size.x + LV_CHART_AXIS_TO_LABEL_DISTANCE; + } + + lv_draw_label(&a, mask, style, opa_scale, buf, LV_TXT_FLAG_CENTER, NULL, NULL, NULL, lv_obj_get_base_dir(chart)); } } @@ -1164,11 +1414,11 @@ static void lv_chart_draw_x_ticks(lv_obj_t * chart, const lv_area_t * mask) const lv_style_t * style = lv_obj_get_style(chart); lv_opa_t opa_scale = lv_obj_get_opa_scale(chart); - uint8_t i, j; - uint8_t list_index; + uint8_t i; uint8_t num_of_labels; uint8_t num_scale_ticks; uint8_t major_tick_len, minor_tick_len; + lv_chart_label_iterator_t iter; lv_point_t p1; lv_point_t p2; lv_coord_t x_ofs = chart->coords.x1; @@ -1188,16 +1438,9 @@ static void lv_chart_draw_x_ticks(lv_obj_t * chart, const lv_area_t * mask) else minor_tick_len = ext->x_axis.minor_tick_len; - /* count the '\n'-s to determine the number of options */ - list_index = 0; - num_of_labels = 0; - if(ext->x_axis.list_of_values != NULL) { - for(j = 0; ext->x_axis.list_of_values[j] != '\0'; j++) { - if(ext->x_axis.list_of_values[j] == '\n') num_of_labels++; - } - - num_of_labels++; /* last option in the at row*/ - } + /*determine the number of options */ + iter = lv_chart_create_label_iter(ext->x_axis.list_of_values, LV_CHART_LABEL_ITERATOR_FORWARD); + num_of_labels = iter.items_left; /* we can't have string labels without ticks step, set to 1 if not specified */ if(ext->x_axis.num_tick_marks == 0) ext->x_axis.num_tick_marks = 1; @@ -1229,23 +1472,8 @@ static void lv_chart_draw_x_ticks(lv_obj_t * chart, const lv_area_t * mask) /* draw values if available */ if(num_of_labels != 0) { /* add text only to major tick */ - if(i == 0 || i % ext->x_axis.num_tick_marks == 0) { - /* search for tick string */ - j = 0; - while(ext->x_axis.list_of_values[list_index] != '\n' && - ext->x_axis.list_of_values[list_index] != '\0') { - /* do not overflow the buffer, but move to the end of the current label */ - if(j < LV_CHART_AXIS_TICK_LABEL_MAX_LEN) - buf[j++] = ext->x_axis.list_of_values[list_index++]; - else - list_index++; - } - - /* this was a string, but not end of the list, so jump to the next string */ - if(ext->x_axis.list_of_values[list_index] == '\n') list_index++; - - /* terminate the string */ - buf[j] = '\0'; + if(lv_chart_is_tick_with_label(i, &(ext->x_axis))) { + lv_chart_get_next_label(&iter, buf); /* reserve appropriate area */ lv_point_t size; @@ -1255,7 +1483,7 @@ static void lv_chart_draw_x_ticks(lv_obj_t * chart, const lv_area_t * mask) /* set the area at some distance of the major tick len under of the tick */ lv_area_t a = {(p2.x - size.x / 2), (p2.y + LV_CHART_AXIS_TO_LABEL_DISTANCE), (p2.x + size.x / 2), (p2.y + size.y + LV_CHART_AXIS_TO_LABEL_DISTANCE)}; - lv_draw_label(&a, mask, style, opa_scale, buf, LV_TXT_FLAG_CENTER, NULL, -1, -1, NULL); + lv_draw_label(&a, mask, style, opa_scale, buf, LV_TXT_FLAG_CENTER, NULL, NULL, NULL, lv_obj_get_base_dir(chart)); } } } @@ -1264,7 +1492,8 @@ static void lv_chart_draw_x_ticks(lv_obj_t * chart, const lv_area_t * mask) static void lv_chart_draw_axes(lv_obj_t * chart, const lv_area_t * mask) { - lv_chart_draw_y_ticks(chart, mask); + lv_chart_draw_y_ticks(chart, mask, LV_CHART_AXIS_PRIMARY_Y); + lv_chart_draw_y_ticks(chart, mask, LV_CHART_AXIS_SECONDARY_Y); lv_chart_draw_x_ticks(chart, mask); } diff --git a/src/lv_objx/lv_chart.h b/src/lv_objx/lv_chart.h index 5580a1061..e775970f9 100644 --- a/src/lv_objx/lv_chart.h +++ b/src/lv_objx/lv_chart.h @@ -34,6 +34,9 @@ extern "C" { /**Automatically calculate the tick length*/ #define LV_CHART_TICK_LENGTH_AUTO 255 +LV_EXPORT_CONST_INT(LV_CHART_POINT_DEF); +LV_EXPORT_CONST_INT(LV_CHART_TICK_LENGTH_AUTO); + /********************** * TYPEDEFS **********************/ @@ -46,6 +49,7 @@ enum { LV_CHART_TYPE_POINT = 0x04, /**< Draw circles on the points*/ LV_CHART_TYPE_VERTICAL_LINE = 0x08, /**< Draw vertical lines on points (useful when chart width == point count)*/ LV_CHART_TYPE_AREA = 0x10, /**< Draw area chart*/ + LV_CHART_TYPE_AREA_FADED = 0x20, /**< Draw area chart by fading out the bottom of the area*/ }; typedef uint8_t lv_chart_type_t; @@ -65,8 +69,9 @@ typedef struct /** Data of axis */ enum { - LV_CHART_AXIS_SKIP_LAST_TICK = 0x00, /**< don't draw the last tick */ - LV_CHART_AXIS_DRAW_LAST_TICK = 0x01 /**< draw the last tick */ + LV_CHART_AXIS_SKIP_LAST_TICK = 0x00, /**< don't draw the last tick */ + LV_CHART_AXIS_DRAW_LAST_TICK = 0x01, /**< draw the last tick */ + LV_CHART_AXIS_INVERSE_LABELS_ORDER = 0x02 /**< draw tick labels in an inversed order*/ }; typedef uint8_t lv_chart_axis_options_t; @@ -93,6 +98,7 @@ typedef struct lv_chart_type_t type; /*Line, column or point chart (from 'lv_chart_type_t')*/ lv_chart_axis_cfg_t y_axis; lv_chart_axis_cfg_t x_axis; + lv_chart_axis_cfg_t secondary_y_axis; uint16_t margin; uint8_t update_mode : 1; struct @@ -259,6 +265,16 @@ void lv_chart_set_x_tick_length(lv_obj_t * chart, uint8_t major_tick_len, uint8_ */ void lv_chart_set_y_tick_length(lv_obj_t * chart, uint8_t major_tick_len, uint8_t minor_tick_len); +/** + * Set the length of the tick marks on the secondary y axis + * @param chart pointer to the chart + * @param major_tick_len the length of the major tick or `LV_CHART_TICK_LENGTH_AUTO` to set automatically + * (where labels are added) + * @param minor_tick_len the length of the minor tick, `LV_CHART_TICK_LENGTH_AUTO` to set automatically + * (where no labels are added) + */ +void lv_chart_set_secondary_y_tick_length(lv_obj_t * chart, uint8_t major_tick_len, uint8_t minor_tick_len); + /** * Set the x-axis tick count and labels of a chart * @param chart pointer to a chart object @@ -270,6 +286,17 @@ void lv_chart_set_y_tick_length(lv_obj_t * chart, uint8_t major_tick_len, uint8_ void lv_chart_set_x_tick_texts(lv_obj_t * chart, const char * list_of_values, uint8_t num_tick_marks, lv_chart_axis_options_t options); +/** + * Set the secondary y-axis tick count and labels of a chart + * @param chart pointer to a chart object + * @param list_of_values list of string values, terminated with \n, except the last + * @param num_tick_marks if list_of_values is NULL: total number of ticks per axis + * else number of ticks between two value labels + * @param options extra options + */ +void lv_chart_set_secondary_y_tick_texts(lv_obj_t * chart, const char * list_of_values, uint8_t num_tick_marks, + lv_chart_axis_options_t options); + /** * Set the y-axis tick count and labels of a chart * @param chart pointer to a chart object @@ -304,7 +331,7 @@ lv_chart_type_t lv_chart_get_type(const lv_obj_t * chart); * @param chart pointer to chart object * @return point number on each data line */ -uint16_t lv_chart_get_point_cnt(const lv_obj_t * chart); +uint16_t lv_chart_get_point_count(const lv_obj_t * chart); /** * Get the opacity of the data series diff --git a/src/lv_objx/lv_cont.c b/src/lv_objx/lv_cont.c index 2ff4059f0..bf4db61d4 100644 --- a/src/lv_objx/lv_cont.c +++ b/src/lv_objx/lv_cont.c @@ -14,16 +14,19 @@ #include #include +#include "../lv_core/lv_debug.h" #include "../lv_draw/lv_draw.h" -#include "../lv_draw/lv_draw_basic.h" +#include "../lv_draw/lv_draw_mask.h" #include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_area.h" #include "../lv_misc/lv_color.h" #include "../lv_misc/lv_math.h" +#include "../lv_misc/lv_bidi.h" /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_cont" /********************** * TYPEDEFS @@ -44,6 +47,7 @@ static void lv_cont_refr_autofit(lv_obj_t * cont); /********************** * STATIC VARIABLES **********************/ +static lv_design_cb_t ancestor_design; static lv_signal_cb_t ancestor_signal; /********************** @@ -67,16 +71,20 @@ lv_obj_t * lv_cont_create(lv_obj_t * par, const lv_obj_t * copy) /*Create a basic object*/ lv_obj_t * new_cont = lv_obj_create(par, copy); - lv_mem_assert(new_cont); + LV_ASSERT_MEM(new_cont); if(new_cont == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_cont); + if(ancestor_design == NULL) ancestor_design= lv_obj_get_design_cb(new_cont); lv_obj_allocate_ext_attr(new_cont, sizeof(lv_cont_ext_t)); lv_cont_ext_t * ext = lv_obj_get_ext_attr(new_cont); - if(ext == NULL) return NULL; + if(ext == NULL) { + lv_obj_del(new_cont); + return NULL; + } - lv_mem_assert(ext); + LV_ASSERT_MEM(ext); ext->fit_left = LV_FIT_NONE; ext->fit_right = LV_FIT_NONE; ext->fit_top = LV_FIT_NONE; @@ -126,6 +134,8 @@ lv_obj_t * lv_cont_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_cont_set_layout(lv_obj_t * cont, lv_layout_t layout) { + LV_ASSERT_OBJ(cont, LV_OBJX_NAME); + lv_cont_ext_t * ext = lv_obj_get_ext_attr(cont); if(ext->layout == layout) return; @@ -146,6 +156,8 @@ void lv_cont_set_layout(lv_obj_t * cont, lv_layout_t layout) */ void lv_cont_set_fit4(lv_obj_t * cont, lv_fit_t left, lv_fit_t right, lv_fit_t top, lv_fit_t bottom) { + LV_ASSERT_OBJ(cont, LV_OBJX_NAME); + lv_obj_invalidate(cont); lv_cont_ext_t * ext = lv_obj_get_ext_attr(cont); if(ext->fit_left == left && ext->fit_right == right && ext->fit_top == top && ext->fit_bottom == bottom) { @@ -172,6 +184,8 @@ void lv_cont_set_fit4(lv_obj_t * cont, lv_fit_t left, lv_fit_t right, lv_fit_t t */ lv_layout_t lv_cont_get_layout(const lv_obj_t * cont) { + LV_ASSERT_OBJ(cont, LV_OBJX_NAME); + lv_cont_ext_t * ext = lv_obj_get_ext_attr(cont); return ext->layout; } @@ -183,6 +197,8 @@ lv_layout_t lv_cont_get_layout(const lv_obj_t * cont) */ lv_fit_t lv_cont_get_fit_left(const lv_obj_t * cont) { + LV_ASSERT_OBJ(cont, LV_OBJX_NAME); + lv_cont_ext_t * ext = lv_obj_get_ext_attr(cont); return ext->fit_left; } @@ -194,6 +210,8 @@ lv_fit_t lv_cont_get_fit_left(const lv_obj_t * cont) */ lv_fit_t lv_cont_get_fit_right(const lv_obj_t * cont) { + LV_ASSERT_OBJ(cont, LV_OBJX_NAME); + lv_cont_ext_t * ext = lv_obj_get_ext_attr(cont); return ext->fit_right; } @@ -205,6 +223,8 @@ lv_fit_t lv_cont_get_fit_right(const lv_obj_t * cont) */ lv_fit_t lv_cont_get_fit_top(const lv_obj_t * cont) { + LV_ASSERT_OBJ(cont, LV_OBJX_NAME); + lv_cont_ext_t * ext = lv_obj_get_ext_attr(cont); return ext->fit_top; } @@ -216,6 +236,8 @@ lv_fit_t lv_cont_get_fit_top(const lv_obj_t * cont) */ lv_fit_t lv_cont_get_fit_bottom(const lv_obj_t * cont) { + LV_ASSERT_OBJ(cont, LV_OBJX_NAME); + lv_cont_ext_t * ext = lv_obj_get_ext_attr(cont); return ext->fit_bottom; } @@ -238,6 +260,7 @@ static lv_res_t lv_cont_signal(lv_obj_t * cont, lv_signal_t sign, void * param) /* Include the ancient signal function */ res = ancestor_signal(cont, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_STYLE_CHG) { /*Recalculate the padding if the style changed*/ lv_cont_refr_layout(cont); @@ -254,13 +277,6 @@ static lv_res_t lv_cont_signal(lv_obj_t * cont, lv_signal_t sign, void * param) /*FLOOD and FILL fit needs to be refreshed if the parent size has changed*/ lv_cont_refr_autofit(cont); - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_cont"; } return res; @@ -354,23 +370,23 @@ static void lv_cont_layout_row(lv_obj_t * cont) lv_align_t align; const lv_style_t * style = lv_obj_get_style(cont); lv_coord_t vpad_corr; - + lv_bidi_dir_t base_dir = lv_obj_get_base_dir(cont); switch(type) { case LV_LAYOUT_ROW_T: vpad_corr = style->body.padding.top; - align = LV_ALIGN_IN_TOP_LEFT; + align = base_dir == LV_BIDI_DIR_RTL ? LV_ALIGN_IN_TOP_RIGHT : LV_ALIGN_IN_TOP_LEFT; break; case LV_LAYOUT_ROW_M: vpad_corr = 0; - align = LV_ALIGN_IN_LEFT_MID; + align = base_dir == LV_BIDI_DIR_RTL ? LV_ALIGN_IN_RIGHT_MID: LV_ALIGN_IN_LEFT_MID; break; case LV_LAYOUT_ROW_B: vpad_corr = -style->body.padding.bottom; - align = LV_ALIGN_IN_BOTTOM_LEFT; + align = base_dir == LV_BIDI_DIR_RTL ? LV_ALIGN_IN_BOTTOM_RIGHT: LV_ALIGN_IN_BOTTOM_LEFT; break; default: vpad_corr = 0; - align = LV_ALIGN_IN_TOP_LEFT; + align = base_dir == LV_BIDI_DIR_RTL ? LV_ALIGN_IN_TOP_RIGHT : LV_ALIGN_IN_TOP_LEFT; break; } @@ -379,12 +395,19 @@ static void lv_cont_layout_row(lv_obj_t * cont) lv_obj_set_protect(cont, LV_PROTECT_CHILD_CHG); /* Align the children */ - lv_coord_t last_cord = style->body.padding.left; + lv_coord_t last_cord; + if(base_dir == LV_BIDI_DIR_RTL) last_cord = style->body.padding.right; + else last_cord = style->body.padding.left; + LV_LL_READ_BACK(cont->child_ll, child) { if(lv_obj_get_hidden(child) != false || lv_obj_is_protected(child, LV_PROTECT_POS) != false) continue; - lv_obj_align(child, cont, align, last_cord, vpad_corr); +// last_cord -= lv_obj_get_width(child); + + if(base_dir == LV_BIDI_DIR_RTL) lv_obj_align(child, cont, align, -last_cord, vpad_corr); + else lv_obj_align(child, cont, align, last_cord, vpad_corr); + last_cord += lv_obj_get_width(child) + style->body.padding.inner; } diff --git a/src/lv_objx/lv_cont.h b/src/lv_objx/lv_cont.h index d4ed19fe9..a2346c6ff 100644 --- a/src/lv_objx/lv_cont.h +++ b/src/lv_objx/lv_cont.h @@ -64,11 +64,11 @@ typedef struct { /*Inherited from 'base_obj' so no inherited ext. */ /*Ext. of ancestor*/ /*New data for this type */ - uint8_t layout : 4; /*A layout from 'lv_layout_t' enum*/ - uint8_t fit_left : 2; /*A fit type from `lv_fit_t` enum */ - uint8_t fit_right : 2; /*A fit type from `lv_fit_t` enum */ - uint8_t fit_top : 2; /*A fit type from `lv_fit_t` enum */ - uint8_t fit_bottom : 2; /*A fit type from `lv_fit_t` enum */ + lv_layout_t layout : 4; /*A layout from 'lv_layout_t' enum*/ + lv_fit_t fit_left : 2; /*A fit type from `lv_fit_t` enum */ + lv_fit_t fit_right : 2; /*A fit type from `lv_fit_t` enum */ + lv_fit_t fit_top : 2; /*A fit type from `lv_fit_t` enum */ + lv_fit_t fit_bottom : 2; /*A fit type from `lv_fit_t` enum */ } lv_cont_ext_t; /*Styles*/ diff --git a/src/lv_objx/lv_cpicker.c b/src/lv_objx/lv_cpicker.c new file mode 100644 index 000000000..aca670083 --- /dev/null +++ b/src/lv_objx/lv_cpicker.c @@ -0,0 +1,1015 @@ +/** + * @file lv_cpicker.c + * + * From @AloyseTech and @paulpv. + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_cpicker.h" +#if LV_USE_CPICKER != 0 + +#include "../lv_core/lv_debug.h" +#include "../lv_draw/lv_draw_arc.h" +#include "../lv_themes/lv_theme.h" +#include "../lv_core/lv_indev.h" +#include "../lv_core/lv_refr.h" +#include "../lv_misc/lv_math.h" + +/********************* + * DEFINES + *********************/ +#define LV_OBJX_NAME "lv_cpicker" + +#ifndef LV_CPICKER_DEF_TYPE +#define LV_CPICKER_DEF_TYPE LV_CPICKER_TYPE_DISC +#endif + +#ifndef LV_CPICKER_DEF_HUE +#define LV_CPICKER_DEF_HUE 0 +#endif + +#ifndef LV_CPICKER_DEF_SATURATION +#define LV_CPICKER_DEF_SATURATION 100 +#endif + +#ifndef LV_CPICKER_DEF_VALUE +#define LV_CPICKER_DEF_VALUE 100 +#endif + +#ifndef LV_CPICKER_DEF_HSV +#define LV_CPICKER_DEF_HSV ((lv_color_hsv_t){LV_CPICKER_DEF_HUE, LV_CPICKER_DEF_SATURATION, LV_CPICKER_DEF_VALUE}) +#endif + +#ifndef LV_CPICKER_DEF_QF /*quantization factor*/ +#define LV_CPICKER_DEF_QF 3 +#endif + +#define TRI_OFFSET 2 + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_design_res_t lv_cpicker_design(lv_obj_t * cpicker, const lv_area_t * clip_area, lv_design_mode_t mode); +static lv_res_t lv_cpicker_signal(lv_obj_t * cpicker, lv_signal_t sign, void * param); + +static void draw_rect_grad(lv_obj_t * cpicker, const lv_area_t * mask, lv_opa_t opa_scale); +static void draw_disc_grad(lv_obj_t * cpicker, const lv_area_t * mask, lv_opa_t opa_scale); +static void draw_indic(lv_obj_t * cpicker, const lv_area_t * mask, lv_opa_t opa_scale); +static void invalidate_indic(lv_obj_t * cpicker); +static lv_area_t get_indic_area(lv_obj_t * cpicker); + +static void next_color_mode(lv_obj_t * cpicker); +static lv_res_t double_click_reset(lv_obj_t * cpicker); +static void refr_indic_pos(lv_obj_t * cpicker); +static lv_color_t angle_to_mode_color(lv_obj_t * cpicker, uint16_t angle); +static uint16_t get_angle(lv_obj_t * cpicker); + +/********************** + * STATIC VARIABLES + **********************/ +static lv_signal_cb_t ancestor_signal; +static lv_design_cb_t ancestor_design; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create a color_picker object + * @param par pointer to an object, it will be the parent of the new color_picker + * @param copy pointer to a color_picker object, if not NULL then the new object will be copied from it + * @return pointer to the created color_picker + */ +lv_obj_t * lv_cpicker_create(lv_obj_t * par, const lv_obj_t * copy) +{ + LV_LOG_TRACE("color_picker create started"); + + lv_obj_t * new_cpicker = lv_obj_create(par, copy); + LV_ASSERT_MEM(new_cpicker); + if(new_cpicker == NULL) return NULL; + + if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_cpicker); + if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_cpicker); + + /*Allocate the extended data*/ + lv_cpicker_ext_t * ext = lv_obj_allocate_ext_attr(new_cpicker, sizeof(lv_cpicker_ext_t)); + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_cpicker); + return NULL; + } + + /*Initialize the allocated 'ext' */ + ext->type = LV_CPICKER_DEF_TYPE; + ext->hsv = LV_CPICKER_DEF_HSV; + ext->indic.style = &lv_style_plain; + ext->indic.colored = 0; + ext->color_mode = LV_CPICKER_COLOR_MODE_HUE; + ext->color_mode_fixed = 0; + ext->preview = 0; + ext->last_click_time = 0; + ext->last_change_time = 0; + + /*The signal and design functions are not copied so set them here*/ + lv_obj_set_signal_cb(new_cpicker, lv_cpicker_signal); + lv_obj_set_design_cb(new_cpicker, lv_cpicker_design); + + /*If no copy do the basic initialization*/ + if(copy == NULL) { + lv_obj_set_size(new_cpicker, LV_DPI * 2, LV_DPI * 2); + lv_obj_set_protect(new_cpicker, LV_PROTECT_PRESS_LOST); + lv_theme_t * th = lv_theme_get_current(); + if(th) { + lv_cpicker_set_style(new_cpicker, LV_CPICKER_STYLE_MAIN, th->style.bg); + } else { + lv_cpicker_set_style(new_cpicker, LV_CPICKER_STYLE_MAIN, &lv_style_plain); + } + } + /*Copy 'copy'*/ + else { + lv_cpicker_ext_t * copy_ext = lv_obj_get_ext_attr(copy); + ext->type = copy_ext->type; + ext->color_mode = copy_ext->color_mode; + ext->color_mode_fixed = copy_ext->color_mode_fixed; + ext->preview = copy_ext->preview; + ext->hsv = copy_ext->hsv; + ext->indic.colored = copy_ext->indic.colored; + ext->indic.style = copy_ext->indic.style; + + /*Refresh the style with new signal function*/ + lv_obj_refresh_style(new_cpicker); + } + refr_indic_pos(new_cpicker); + + LV_LOG_INFO("color_picker created"); + + return new_cpicker; +} + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new type for a cpicker + * @param cpicker pointer to a cpicker object + * @param type new type of the cpicker (from 'lv_cpicker_type_t' enum) + */ +void lv_cpicker_set_type(lv_obj_t * cpicker, lv_cpicker_type_t type) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + if(ext->type == type) return; + + ext->type = type; + lv_obj_refresh_ext_draw_pad(cpicker); + refr_indic_pos(cpicker); + + lv_obj_invalidate(cpicker); +} + +/** + * Set a style of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param type which style should be set + * @param style pointer to a style + */ +void lv_cpicker_set_style(lv_obj_t * cpicker, lv_cpicker_style_t type, lv_style_t * style) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + switch(type) { + case LV_CPICKER_STYLE_MAIN: + lv_obj_set_style(cpicker, style); + break; + case LV_CPICKER_STYLE_INDICATOR: + ext->indic.style = style; + lv_obj_invalidate(cpicker); + break; + } +} + +/** + * Set the current hue of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param hue current selected hue [0..360] + * @return true if changed, otherwise false + */ +bool lv_cpicker_set_hue(lv_obj_t * cpicker, uint16_t hue) +{ + lv_color_hsv_t hsv = lv_cpicker_get_hsv(cpicker); + hsv.h = hue; + return lv_cpicker_set_hsv(cpicker, hsv); +} + +/** + * Set the current saturation of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param saturation current selected saturation [0..100] + * @return true if changed, otherwise false + */ +bool lv_cpicker_set_saturation(lv_obj_t * cpicker, uint8_t saturation) +{ + lv_color_hsv_t hsv = lv_cpicker_get_hsv(cpicker); + hsv.s = saturation; + return lv_cpicker_set_hsv(cpicker, hsv); +} + +/** + * Set the current value of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param val current selected value [0..100] + * @return true if changed, otherwise false + */ +bool lv_cpicker_set_value(lv_obj_t * cpicker, uint8_t val) +{ + lv_color_hsv_t hsv = lv_cpicker_get_hsv(cpicker); + hsv.v = val; + return lv_cpicker_set_hsv(cpicker, hsv); +} + +/** + * Set the current hsv of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param color current selected hsv + * @return true if changed, otherwise false + */ +bool lv_cpicker_set_hsv(lv_obj_t * cpicker, lv_color_hsv_t hsv) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + if (hsv.h > 360) hsv.h %= 360; + if (hsv.s > 100) hsv.s = 100; + if (hsv.v > 100) hsv.v = 100; + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + if (ext->hsv.h == hsv.h && ext->hsv.s == hsv.s && ext->hsv.v == hsv.v) return false; + + ext->hsv = hsv; + + refr_indic_pos(cpicker); + + if (ext->preview && ext->type == LV_CPICKER_TYPE_DISC) { + lv_obj_invalidate(cpicker); + } + + return true; +} + +/** + * Set the current color of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param color current selected color + * @return true if changed, otherwise false + */ +bool lv_cpicker_set_color(lv_obj_t * cpicker, lv_color_t color) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_color32_t c32; + c32.full = lv_color_to32(color); + + return lv_cpicker_set_hsv(cpicker, + lv_color_rgb_to_hsv(c32.ch.red, c32.ch.green, c32.ch.blue)); +} + +/** + * Set the current color mode. + * @param cpicker pointer to colorpicker object + * @param mode color mode (hue/sat/val) + */ +void lv_cpicker_set_color_mode(lv_obj_t * cpicker, lv_cpicker_color_mode_t mode) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + ext->color_mode = mode; + refr_indic_pos(cpicker); + lv_obj_invalidate(cpicker); +} + +/** + * Set if the color mode is changed on long press on center + * @param cpicker pointer to colorpicker object + * @param fixed color mode cannot be changed on long press + */ +void lv_cpicker_set_color_mode_fixed(lv_obj_t * cpicker, bool fixed) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + ext->color_mode_fixed = fixed; +} + +/** + * Make the indicator to be colored to the current color + * @param cpicker pointer to colorpicker object + * @param en true: color the indicator; false: not color the indicator + */ +void lv_cpicker_set_indic_colored(lv_obj_t * cpicker, bool en) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + ext->indic.colored = en ? 1 : 0; + invalidate_indic(cpicker); +} + +/** + * Add a color preview in the middle of the DISC type color picker + * @param cpicker pointer to colorpicker object + * @param en true: enable preview; false: disable preview + */ +void lv_cpicker_set_preview(lv_obj_t * cpicker, bool en) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + ext->preview = en ? 1 : 0; + lv_obj_invalidate(cpicker); +} +/*===================== + * Getter functions + *====================*/ + +/** + * Get the current color mode. + * @param cpicker pointer to colorpicker object + * @return color mode (hue/sat/val) + */ +lv_cpicker_color_mode_t lv_cpicker_get_color_mode(lv_obj_t * cpicker) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + return ext->color_mode; +} + +/** + * Get if the color mode is changed on long press on center + * @param cpicker pointer to colorpicker object + * @return mode cannot be changed on long press + */ +bool lv_cpicker_get_color_mode_fixed(lv_obj_t * cpicker) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + return ext->color_mode_fixed; +} + +/** + * Get style of a color_picker. + * @param cpicker pointer to color_picker object + * @param type which style should be get + * @return style pointer to the style + */ +const lv_style_t * lv_cpicker_get_style(const lv_obj_t * cpicker, lv_cpicker_style_t type) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + const lv_style_t * style; + + switch(type) { + case LV_CPICKER_STYLE_MAIN: + style = lv_obj_get_style(cpicker); + break; + case LV_CPICKER_STYLE_INDICATOR: + style = ext->indic.style; + break; + default: + style = NULL; + } + + return style; +} + +/** + * Get the current selected hue of a colorpicker. + * @param cpicker pointer to colorpicker object + * @return hue current selected hue + */ +uint16_t lv_cpicker_get_hue(lv_obj_t * cpicker) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + return ext->hsv.h; +} + +/** + * Get the current selected saturation of a colorpicker. + * @param cpicker pointer to colorpicker object + * @return current selected saturation + */ +uint8_t lv_cpicker_get_saturation(lv_obj_t * cpicker) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + return ext->hsv.s; +} + +/** + * Get the current selected hue of a colorpicker. + * @param cpicker pointer to colorpicker object + * @return current selected value + */ +uint8_t lv_cpicker_get_value(lv_obj_t * cpicker) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + return ext->hsv.v; +} + +/** + * Get the current selected hsv of a colorpicker. + * @param cpicker pointer to colorpicker object + * @return current selected hsv + */ +lv_color_hsv_t lv_cpicker_get_hsv(lv_obj_t * cpicker) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + return ext->hsv; +} + +/** + * Get the current selected color of a colorpicker. + * @param cpicker pointer to colorpicker object + * @return color current selected color + */ +lv_color_t lv_cpicker_get_color(lv_obj_t * cpicker) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + return lv_color_hsv_to_rgb(ext->hsv.h, ext->hsv.s, ext->hsv.v); +} + +/** + * Whether the indicator is colored to the current color or not + * @param cpicker pointer to colorpicker object + * @return true: color the indicator; false: not color the indicator + */ +bool lv_cpicker_get_indic_colored(lv_obj_t * cpicker) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + return ext->indic.colored ? true : false; +} + +/** + * Whether the preview is enabled or not + * @param cpicker pointer to colorpicker object + * @return en true: preview is enabled; false: preview is disabled + */ +bool lv_cpicker_get_preview(lv_obj_t * cpicker) +{ + LV_ASSERT_OBJ(cpicker, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + return ext->preview ? true : false; +} + + +/*===================== + * Other functions + *====================*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + + +/** + * Handle the drawing related tasks of the color_picker + * @param cpicker pointer to an object + * @param mask the object will be drawn only in this area + * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area + * (return 'true' if yes) + * LV_DESIGN_DRAW: draw the object (always return 'true') + * LV_DESIGN_DRAW_POST: drawing after every children are drawn + * @return return an element of `lv_design_res_t` + */ +static lv_design_res_t lv_cpicker_design(lv_obj_t * cpicker, const lv_area_t * clip_area, lv_design_mode_t mode) +{ + /*Return false if the object is not covers the mask_p area*/ + if(mode == LV_DESIGN_COVER_CHK) { + return LV_DESIGN_RES_NOT_COVER; + } + /*Draw the object*/ + else if(mode == LV_DESIGN_DRAW_MAIN) { + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + lv_opa_t opa_scale = lv_obj_get_opa_scale(cpicker); + + if(ext->type == LV_CPICKER_TYPE_DISC) { + draw_disc_grad(cpicker, clip_area, opa_scale); + } else if(ext->type == LV_CPICKER_TYPE_RECT) { + draw_rect_grad(cpicker, clip_area, opa_scale); + } + + draw_indic(cpicker, clip_area, opa_scale); + } + /*Post draw when the children are drawn*/ + else if(mode == LV_DESIGN_DRAW_POST) { + } + + return LV_DESIGN_RES_OK; +} + +static void draw_disc_grad(lv_obj_t * cpicker, const lv_area_t * mask, lv_opa_t opa_scale) +{ + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + lv_coord_t w = lv_obj_get_width(cpicker); + lv_coord_t h = lv_obj_get_height(cpicker); + lv_coord_t cx = cpicker->coords.x1 + w / 2; + lv_coord_t cy = cpicker->coords.y1 + h / 2; + lv_coord_t r = w / 2; + + const lv_style_t * style_main = lv_cpicker_get_style(cpicker, LV_CPICKER_STYLE_MAIN); + lv_style_t style; + lv_style_copy(&style, style_main); + style.line.width = (r * 628 / (360 / LV_CPICKER_DEF_QF)) / 100; + style.line.width += 2; + uint16_t i; + lv_coord_t cir_w = style_main->line.width; + + for(i = 0; i <= 360; i+= LV_CPICKER_DEF_QF) { + + style.line.color = angle_to_mode_color(cpicker, i); + + lv_point_t p[2]; + p[0].x = cx + (r * lv_trigo_sin(i) >> LV_TRIGO_SHIFT); + p[0].y = cy + (r * lv_trigo_sin(i+ 90) >> LV_TRIGO_SHIFT); + p[1].x = cx + ((r-cir_w) * lv_trigo_sin(i) >> LV_TRIGO_SHIFT); + p[1].y = cy + ((r-cir_w) * lv_trigo_sin(i+ 90) >> LV_TRIGO_SHIFT); + + lv_draw_line(&p[0], &p[1], mask, &style, opa_scale); + } + + + if(ext->preview) { + /*Mask out the center area*/ + lv_style_copy(&style, style_main); + style.body.radius = LV_RADIUS_CIRCLE; + lv_area_t area_mid; + lv_area_copy(&area_mid, &cpicker->coords); + area_mid.x1 += style_main->line.width; + area_mid.y1 += style_main->line.width; + area_mid.x2 -= style_main->line.width; + area_mid.y2 -= style_main->line.width; + + lv_draw_rect(&area_mid, mask, &style, opa_scale); + lv_color_t color = lv_cpicker_get_color(cpicker); + style.body.main_color = color; + style.body.grad_color = color; + area_mid.x1 += style_main->line.width; + area_mid.y1 += style_main->line.width; + area_mid.x2 -= style_main->line.width; + area_mid.y2 -= style_main->line.width; + + lv_draw_rect(&area_mid, mask, &style, opa_scale); + } +} + +static void draw_rect_grad(lv_obj_t * cpicker, const lv_area_t * mask, lv_opa_t opa_scale) +{ + lv_style_t style; + lv_style_copy(&style, lv_cpicker_get_style(cpicker, LV_CPICKER_STYLE_MAIN)); + + lv_area_t grad_area; + lv_obj_get_coords(cpicker, &grad_area); + + if(style.body.radius) { + lv_coord_t h = lv_obj_get_height(cpicker); + lv_coord_t r = style.body.radius; + if(r > h / 2) r = h / 2; + /*Make the gradient area smaller with a half circle on both ends*/ + grad_area.x1 += r; + grad_area.x2 -= r; + + /*Draw the left rounded end*/ + lv_area_t rounded_edge_area; + lv_obj_get_coords(cpicker, &rounded_edge_area); + rounded_edge_area.x2 = rounded_edge_area.x1 + 2 * r; + + style.body.main_color = angle_to_mode_color(cpicker, 0); + style.body.grad_color = style.body.main_color; + + lv_draw_rect(&rounded_edge_area, mask, &style, opa_scale); + + /*Draw the right rounded end*/ + lv_obj_get_coords(cpicker, &rounded_edge_area); + rounded_edge_area.x1 = rounded_edge_area.x2 - 2 * r; + + style.body.main_color = angle_to_mode_color(cpicker, 359); + style.body.grad_color = style.body.main_color; + + lv_draw_rect(&rounded_edge_area, mask, &style, opa_scale); + } + + lv_coord_t grad_w = lv_area_get_width(&grad_area); + uint16_t i_step = LV_MATH_MAX(LV_CPICKER_DEF_QF, 360 / grad_w); + style.body.radius = 0; + style.body.border.width = 0; + style.body.shadow.width = 0; + style.body.opa = LV_OPA_COVER; + + uint16_t i; + for(i = 0; i < 360; i += i_step) { + style.body.main_color = angle_to_mode_color(cpicker, i); + style.body.grad_color = style.body.main_color; + + /*the following attribute might need changing between index to add border, shadow, radius etc*/ + lv_area_t rect_area; + + /*scale angle (hue/sat/val) to linear coordinate*/ + lv_coord_t xi = (i * grad_w) / 360; + + rect_area.x1 = LV_MATH_MIN(grad_area.x1 + xi, grad_area.x1 + grad_w - i_step); + rect_area.y1 = grad_area.y1; + rect_area.x2 = rect_area.x1 + i_step; + rect_area.y2 = grad_area.y2; + + lv_draw_rect(&rect_area, mask, &style, opa_scale); + } +} + +static void draw_indic(lv_obj_t * cpicker, const lv_area_t * mask, lv_opa_t opa_scale) +{ + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + lv_style_t style_cir; + lv_style_copy(&style_cir, ext->indic.style); + style_cir.body.radius = LV_RADIUS_CIRCLE; + + if(ext->indic.colored) { + style_cir.body.main_color = lv_cpicker_get_color(cpicker); + style_cir.body.grad_color = style_cir.body.main_color; + } + + lv_area_t indic_area = get_indic_area(cpicker); + + lv_draw_rect(&indic_area, mask, &style_cir, opa_scale); +} + +static void invalidate_indic(lv_obj_t * cpicker) +{ + lv_area_t indic_area = get_indic_area(cpicker); + + lv_inv_area(lv_obj_get_disp(cpicker), &indic_area); +} + +static lv_area_t get_indic_area(lv_obj_t * cpicker) +{ + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + const lv_style_t * style_main = lv_cpicker_get_style(cpicker, LV_CPICKER_STYLE_MAIN); + const lv_style_t * style_indic = lv_cpicker_get_style(cpicker, LV_CPICKER_STYLE_INDICATOR); + + uint16_t r = 0; + if(ext->type == LV_CPICKER_TYPE_DISC) r = style_main->line.width / 2; + else if(ext->type == LV_CPICKER_TYPE_RECT) { + lv_coord_t h = lv_obj_get_height(cpicker); + r = h / 2; + } + + lv_area_t indic_area; + indic_area.x1 = cpicker->coords.x1 + ext->indic.pos.x - r - style_indic->body.padding.left; + indic_area.y1 = cpicker->coords.y1 + ext->indic.pos.y - r - style_indic->body.padding.right; + indic_area.x2 = cpicker->coords.x1 + ext->indic.pos.x + r + style_indic->body.padding.top; + indic_area.y2 = cpicker->coords.y1 + ext->indic.pos.y + r + style_indic->body.padding.bottom; + + return indic_area; +} + +/** + * Signal function of the color_picker + * @param cpicker pointer to a color_picker object + * @param sign a signal type from lv_signal_t enum + * @param param pointer to a signal specific variable + * @return LV_RES_OK: the object is not deleted in the function; LV_RES_INV: the object is deleted + */ +static lv_res_t lv_cpicker_signal(lv_obj_t * cpicker, lv_signal_t sign, void * param) +{ + /* Include the ancient signal function */ + lv_res_t res = ancestor_signal(cpicker, sign, param); + if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + + if(sign == LV_SIGNAL_CLEANUP) { + /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ + } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { + const lv_style_t * style_indic = lv_cpicker_get_style(cpicker, LV_CPICKER_STYLE_INDICATOR); + lv_coord_t indic_pad = LV_MATH_MAX(style_indic->body.padding.left, style_indic->body.padding.right); + indic_pad = LV_MATH_MAX(indic_pad, style_indic->body.padding.top); + indic_pad = LV_MATH_MAX(indic_pad, style_indic->body.padding.bottom); + + if(ext->type == LV_CPICKER_TYPE_RECT) indic_pad += LV_MATH_MAX(indic_pad, lv_obj_get_height(cpicker) / 2); + + cpicker->ext_draw_pad = LV_MATH_MAX(cpicker->ext_draw_pad, indic_pad); + } else if(sign == LV_SIGNAL_CORD_CHG) { + /*Refresh extended draw area to make knob visible*/ + if(lv_obj_get_width(cpicker) != lv_area_get_width(param) || + lv_obj_get_height(cpicker) != lv_area_get_height(param)) { + lv_obj_refresh_ext_draw_pad(cpicker); + refr_indic_pos(cpicker); + } + } else if(sign == LV_SIGNAL_STYLE_CHG) { + /*Refresh extended draw area to make knob visible*/ + lv_obj_refresh_ext_draw_pad(cpicker); + refr_indic_pos(cpicker); + } + else if(sign == LV_SIGNAL_CONTROL) { + uint32_t c = *((uint32_t *)param); /*uint32_t because can be UTF-8*/ + if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { + lv_color_hsv_t hsv_cur; + hsv_cur = ext->hsv; + + switch(ext->color_mode) { + case LV_CPICKER_COLOR_MODE_HUE: + hsv_cur.h = (ext->hsv.h + 1) % 360; + break; + case LV_CPICKER_COLOR_MODE_SATURATION: + hsv_cur.s = (ext->hsv.s + 1) % 100; + break; + case LV_CPICKER_COLOR_MODE_VALUE: + hsv_cur.v = (ext->hsv.v + 1) % 100; + break; + } + + if (lv_cpicker_set_hsv(cpicker, hsv_cur)) { + res = lv_event_send(cpicker, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return res; + } + } + else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { + lv_color_hsv_t hsv_cur; + hsv_cur = ext->hsv; + + switch(ext->color_mode) { + case LV_CPICKER_COLOR_MODE_HUE: + hsv_cur.h = ext->hsv.h > 0?(ext->hsv.h - 1) : 360; + break; + case LV_CPICKER_COLOR_MODE_SATURATION: + hsv_cur.s = ext->hsv.s > 0?(ext->hsv.s - 1) : 100; + break; + case LV_CPICKER_COLOR_MODE_VALUE: + hsv_cur.v = ext->hsv.v > 0?(ext->hsv.v - 1) : 100; + break; + } + + if (lv_cpicker_set_hsv(cpicker, hsv_cur)) { + res = lv_event_send(cpicker, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return res; + } + } + } + else if(sign == LV_SIGNAL_PRESSED) { + ext->last_change_time = lv_tick_get(); + lv_indev_get_point(lv_indev_get_act(), &ext->last_press_point); + res = double_click_reset(cpicker); + if(res != LV_RES_OK) return res; + } else if(sign == LV_SIGNAL_PRESSING) { + lv_indev_t * indev = lv_indev_get_act(); + if(indev == NULL) return res; + + lv_point_t p; + lv_indev_get_point(indev, &p); + + if((LV_MATH_ABS(p.x - ext->last_press_point.x) > indev->driver.drag_limit / 2) || + (LV_MATH_ABS(p.y - ext->last_press_point.y) > indev->driver.drag_limit / 2)) { + ext->last_change_time = lv_tick_get(); + ext->last_press_point.x = p.x; + ext->last_press_point.y = p.y; + } + + p.x -= cpicker->coords.x1; + p.y -= cpicker->coords.y1; + + /*Ignore pressing in the inner area*/ + uint16_t w = lv_obj_get_width(cpicker); + + int16_t angle = 0; + + if(ext->type == LV_CPICKER_TYPE_RECT) { + /*If pressed long enough without change go to next color mode*/ + uint32_t diff = lv_tick_elaps(ext->last_change_time); + if(diff > (uint32_t)indev->driver.long_press_time * 2 && !ext->color_mode_fixed) { + next_color_mode(cpicker); + lv_indev_wait_release(lv_indev_get_act()); + return res; + } + + angle = (p.x * 360) / w; + if(angle < 0) angle = 0; + if(angle >= 360) angle = 359; + + } else if(ext->type == LV_CPICKER_TYPE_DISC) { + const lv_style_t * style_main = lv_cpicker_get_style(cpicker, LV_CPICKER_STYLE_MAIN); + + lv_coord_t r_in = w / 2; + p.x -= r_in; + p.y -= r_in; + bool on_ring = true; + r_in -= style_main->line.width; + if(r_in > LV_DPI / 2) { + r_in -= style_main->line.width; /* to let some sensitive space inside*/ + + if(r_in < LV_DPI / 2) r_in = LV_DPI / 2; + } + + if(p.x * p.x + p.y * p.y < r_in * r_in) { + on_ring = false; + } + + /*If the inner area is being pressed, go to the next color mode on long press*/ + uint32_t diff = lv_tick_elaps(ext->last_change_time); + if(((!ext->preview && on_ring) || (ext->preview)) + && diff > indev->driver.long_press_time && !ext->color_mode_fixed) { + next_color_mode(cpicker); + lv_indev_wait_release(lv_indev_get_act()); + return res; + } + + /*Set the angle only if pressed on the ring*/ + if(!on_ring) return res; + + angle = lv_atan2(p.x, p.y) % 360; + } + + lv_color_hsv_t hsv_cur; + hsv_cur = ext->hsv; + + switch(ext->color_mode) { + case LV_CPICKER_COLOR_MODE_HUE: + hsv_cur.h = angle; + break; + case LV_CPICKER_COLOR_MODE_SATURATION: + hsv_cur.s = (angle * 100) / 360; + break; + case LV_CPICKER_COLOR_MODE_VALUE: + hsv_cur.v = (angle * 100) / 360; + break; + } + + if (lv_cpicker_set_hsv(cpicker, hsv_cur)) { + res = lv_event_send(cpicker, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return res; + } + } + + return res; +} + +static void next_color_mode(lv_obj_t * cpicker) +{ + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + ext->color_mode = (ext->color_mode + 1) % 3; + refr_indic_pos(cpicker); + lv_obj_invalidate(cpicker); +} + +static void refr_indic_pos(lv_obj_t * cpicker) +{ + invalidate_indic(cpicker); + + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + lv_coord_t w = lv_obj_get_width(cpicker); + lv_coord_t h = lv_obj_get_height(cpicker); + + if(ext->type == LV_CPICKER_TYPE_RECT) { + lv_coord_t ind_pos = 0; + switch(ext->color_mode) { + case LV_CPICKER_COLOR_MODE_HUE: + ind_pos += (ext->hsv.h * w) / 360; + break; + case LV_CPICKER_COLOR_MODE_SATURATION: + ind_pos += (ext->hsv.s * w) / 100; + break; + case LV_CPICKER_COLOR_MODE_VALUE: + ind_pos += (ext->hsv.v * w) / 100; + break; + } + + ext->indic.pos.x = ind_pos; + ext->indic.pos.y = h / 2; + } else if(ext->type == LV_CPICKER_TYPE_DISC) { + const lv_style_t * style_main = lv_cpicker_get_style(cpicker, LV_CPICKER_STYLE_MAIN); + lv_coord_t r = w / 2 - style_main->line.width / 2; + uint16_t angle = get_angle(cpicker); + ext->indic.pos.x = (((int32_t)r * lv_trigo_sin(angle)) >> LV_TRIGO_SHIFT); + ext->indic.pos.y = (((int32_t)r * lv_trigo_sin(angle + 90)) >> LV_TRIGO_SHIFT); + ext->indic.pos.x = ext->indic.pos.x + w / 2; + ext->indic.pos.y = ext->indic.pos.y + h / 2; + } + + invalidate_indic(cpicker); +} + +static lv_res_t double_click_reset(lv_obj_t * cpicker) +{ + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + lv_indev_t * indev = lv_indev_get_act(); + /*Double clicked? Use long press time as double click time out*/ + if(lv_tick_elaps(ext->last_click_time) < indev->driver.long_press_time) { + lv_color_hsv_t hsv_cur; + hsv_cur = ext->hsv; + + switch(ext->color_mode) { + case LV_CPICKER_COLOR_MODE_HUE: + hsv_cur.h = LV_CPICKER_DEF_HUE; + break; + case LV_CPICKER_COLOR_MODE_SATURATION: + hsv_cur.s = LV_CPICKER_DEF_SATURATION; + break; + case LV_CPICKER_COLOR_MODE_VALUE: + hsv_cur.v = LV_CPICKER_DEF_VALUE; + break; + } + + lv_indev_wait_release(indev); + + if (lv_cpicker_set_hsv(cpicker, hsv_cur)) { + lv_res_t res = lv_event_send(cpicker, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return res; + } + } + ext->last_click_time = lv_tick_get(); + + return LV_RES_OK; +} + +static lv_color_t angle_to_mode_color(lv_obj_t * cpicker, uint16_t angle) +{ + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + lv_color_t color; + switch(ext->color_mode) + { + default: + case LV_CPICKER_COLOR_MODE_HUE: + color = lv_color_hsv_to_rgb(angle % 360, ext->hsv.s, ext->hsv.v); + break; + case LV_CPICKER_COLOR_MODE_SATURATION: + color = lv_color_hsv_to_rgb(ext->hsv.h, ((angle % 360) * 100) / 360, ext->hsv.v); + break; + case LV_CPICKER_COLOR_MODE_VALUE: + color = lv_color_hsv_to_rgb(ext->hsv.h, ext->hsv.s, ((angle % 360) * 100) / 360); + break; + } + return color; +} + +static uint16_t get_angle(lv_obj_t * cpicker) +{ + lv_cpicker_ext_t * ext = lv_obj_get_ext_attr(cpicker); + uint16_t angle; + switch(ext->color_mode) + { + default: + case LV_CPICKER_COLOR_MODE_HUE: + angle = ext->hsv.h; + break; + case LV_CPICKER_COLOR_MODE_SATURATION: + angle = (ext->hsv.s * 360) / 100; + break; + case LV_CPICKER_COLOR_MODE_VALUE: + angle = (ext->hsv.v * 360) / 100 ; + break; + } + return angle; +} + +#endif /* LV_USE_CPICKER != 0 */ diff --git a/src/lv_objx/lv_cpicker.h b/src/lv_objx/lv_cpicker.h new file mode 100644 index 000000000..a9feee5ae --- /dev/null +++ b/src/lv_objx/lv_cpicker.h @@ -0,0 +1,263 @@ +/** + * @file lv_cpicker.h + * + */ + +#ifndef LV_CPICKER_H +#define LV_CPICKER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#ifdef LV_CONF_INCLUDE_SIMPLE +#include "lv_conf.h" +#else +#include "../../../lv_conf.h" +#endif + +#if LV_USE_CPICKER != 0 + +#include "../lv_core/lv_obj.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +enum { + LV_CPICKER_TYPE_RECT, + LV_CPICKER_TYPE_DISC, +}; +typedef uint8_t lv_cpicker_type_t; + +enum { + LV_CPICKER_COLOR_MODE_HUE, + LV_CPICKER_COLOR_MODE_SATURATION, + LV_CPICKER_COLOR_MODE_VALUE +}; +typedef uint8_t lv_cpicker_color_mode_t; + + + +/*Data of colorpicker*/ +typedef struct { + lv_color_hsv_t hsv; + struct { + lv_style_t * style; + lv_point_t pos; + uint8_t colored :1; + + } indic; + uint32_t last_click_time; + uint32_t last_change_time; + lv_point_t last_press_point; + lv_cpicker_color_mode_t color_mode :2; + uint8_t color_mode_fixed :1; + lv_cpicker_type_t type :1; + uint8_t preview :1; +} lv_cpicker_ext_t; + +/*Styles*/ +enum { + LV_CPICKER_STYLE_MAIN, + LV_CPICKER_STYLE_INDICATOR, +}; +typedef uint8_t lv_cpicker_style_t; + + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a colorpicker objects + * @param par pointer to an object, it will be the parent of the new colorpicker + * @param copy pointer to a colorpicker object, if not NULL then the new object will be copied from it + * @return pointer to the created colorpicker + */ +lv_obj_t * lv_cpicker_create(lv_obj_t * par, const lv_obj_t * copy); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set a new type for a colorpicker + * @param cpicker pointer to a colorpicker object + * @param type new type of the colorpicker (from 'lv_cpicker_type_t' enum) + */ +void lv_cpicker_set_type(lv_obj_t * cpicker, lv_cpicker_type_t type); + +/** + * Set a style of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param type which style should be set + * @param style pointer to a style + */ +void lv_cpicker_set_style(lv_obj_t * cpicker, lv_cpicker_style_t type, lv_style_t *style); + +/** + * Set the current hue of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param hue current selected hue [0..360] + * @return true if changed, otherwise false + */ +bool lv_cpicker_set_hue(lv_obj_t * cpicker, uint16_t hue); + +/** + * Set the current saturation of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param saturation current selected saturation [0..100] + * @return true if changed, otherwise false + */ +bool lv_cpicker_set_saturation(lv_obj_t * cpicker, uint8_t saturation); + +/** + * Set the current value of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param val current selected value [0..100] + * @return true if changed, otherwise false + */ +bool lv_cpicker_set_value(lv_obj_t * cpicker, uint8_t val); + +/** + * Set the current hsv of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param hsv current selected hsv + * @return true if changed, otherwise false + */ +bool lv_cpicker_set_hsv(lv_obj_t * cpicker, lv_color_hsv_t hsv); + +/** + * Set the current color of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param color current selected color + * @return true if changed, otherwise false + */ +bool lv_cpicker_set_color(lv_obj_t * cpicker, lv_color_t color); + +/** + * Set the current color mode. + * @param cpicker pointer to colorpicker object + * @param mode color mode (hue/sat/val) + */ +void lv_cpicker_set_color_mode(lv_obj_t * cpicker, lv_cpicker_color_mode_t mode); + +/** + * Set if the color mode is changed on long press on center + * @param cpicker pointer to colorpicker object + * @param fixed color mode cannot be changed on long press + */ +void lv_cpicker_set_color_mode_fixed(lv_obj_t * cpicker, bool fixed); + +/** + * Make the indicator to be colored to the current color + * @param cpicker pointer to colorpicker object + * @param en true: color the indicator; false: not color the indicator + */ +void lv_cpicker_set_indic_colored(lv_obj_t * cpicker, bool en); + +/** + * Add a color preview in the middle of the DISC type color picker + * @param cpicker pointer to colorpicker object + * @param en true: enable preview; false: disable preview + */ +void lv_cpicker_set_preview(lv_obj_t * cpicker, bool en); + +/*===================== + * Getter functions + *====================*/ + +/** + * Get the current color mode. + * @param cpicker pointer to colorpicker object + * @return color mode (hue/sat/val) + */ +lv_cpicker_color_mode_t lv_cpicker_get_color_mode(lv_obj_t * cpicker); + +/** + * Get if the color mode is changed on long press on center + * @param cpicker pointer to colorpicker object + * @return mode cannot be changed on long press + */ +bool lv_cpicker_get_color_mode_fixed(lv_obj_t * cpicker); + +/** + * Get style of a colorpicker. + * @param cpicker pointer to colorpicker object + * @param type which style should be get + * @return pointer to the style + */ +const lv_style_t * lv_cpicker_get_style(const lv_obj_t * cpicker, lv_cpicker_style_t type); + +/** + * Get the current hue of a colorpicker. + * @param cpicker pointer to colorpicker object + * @return current selected hue + */ +uint16_t lv_cpicker_get_hue(lv_obj_t * cpicker); + +/** + * Get the current saturation of a colorpicker. + * @param cpicker pointer to colorpicker object + * @return current selected saturation + */ +uint8_t lv_cpicker_get_saturation(lv_obj_t * cpicker); + +/** + * Get the current hue of a colorpicker. + * @param cpicker pointer to colorpicker object + * @return current selected value + */ +uint8_t lv_cpicker_get_value(lv_obj_t * cpicker); + +/** + * Get the current selected hsv of a colorpicker. + * @param cpicker pointer to colorpicker object + * @return current selected hsv + */ +lv_color_hsv_t lv_cpicker_get_hsv(lv_obj_t * cpicker); + +/** + * Get the current selected color of a colorpicker. + * @param cpicker pointer to colorpicker object + * @return current selected color + */ +lv_color_t lv_cpicker_get_color(lv_obj_t * cpicker); + +/** + * Whether the indicator is colored to the current color or not + * @param cpicker pointer to colorpicker object + * @return true: color the indicator; false: not color the indicator + */ +bool lv_cpicker_get_indic_colored(lv_obj_t * cpicker); + +/** + * Whether the preview is enabled or not + * @param cpicker pointer to colorpicker object + * @return en true: preview is enabled; false: preview is disabled + */ +bool lv_cpicker_get_preview(lv_obj_t * cpicker); + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_CPICKER*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_CPICKER_H*/ diff --git a/src/lv_objx/lv_ddlist.c b/src/lv_objx/lv_ddlist.c index 3deeed174..3209ad6bc 100644 --- a/src/lv_objx/lv_ddlist.c +++ b/src/lv_objx/lv_ddlist.c @@ -9,6 +9,7 @@ #include "lv_ddlist.h" #if LV_USE_DDLIST != 0 +#include "../lv_core/lv_debug.h" #include "../lv_draw/lv_draw.h" #include "../lv_core/lv_group.h" #include "../lv_core/lv_indev.h" @@ -21,6 +22,8 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_ddlist" + #if LV_USE_ANIMATION == 0 #undef LV_DDLIST_DEF_ANIM_TIME #define LV_DDLIST_DEF_ANIM_TIME 0 /*No animation*/ @@ -33,7 +36,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_ddlist_design(lv_obj_t * ddlist, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_ddlist_design(lv_obj_t * ddlist, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_ddlist_signal(lv_obj_t * ddlist, lv_signal_t sign, void * param); static lv_res_t lv_ddlist_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void * param); static lv_res_t release_handler(lv_obj_t * ddlist); @@ -74,7 +77,7 @@ lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor drop down list*/ lv_obj_t * new_ddlist = lv_page_create(par, copy); - lv_mem_assert(new_ddlist); + LV_ASSERT_MEM(new_ddlist); if(new_ddlist == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_ddlist); @@ -83,18 +86,21 @@ lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy) /*Allocate the drop down list type specific extended data*/ lv_ddlist_ext_t * ext = lv_obj_allocate_ext_attr(new_ddlist, sizeof(lv_ddlist_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_ddlist); + return NULL; + } /*Initialize the allocated 'ext' */ ext->label = NULL; + ext->symbol = NULL; ext->opened = 0; ext->fix_height = 0; ext->sel_opt_id = 0; ext->sel_opt_id_ori = 0; ext->option_cnt = 0; ext->sel_style = &lv_style_plain_color; - ext->draw_arrow = 0; /*Do not draw arrow by default*/ ext->stay_open = 0; /*The signal and design functions are not copied so set them here*/ @@ -110,6 +116,11 @@ lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy) lv_obj_set_drag(scrl, false); lv_page_set_scrl_fit2(new_ddlist, LV_FIT_FILL, LV_FIT_TIGHT); + /*Save (a later restore) the original X coordinate because it changes as the FITs applies*/ + lv_coord_t x; + if(lv_obj_get_base_dir(new_ddlist) == LV_BIDI_DIR_RTL) x = lv_obj_get_x(new_ddlist) + lv_obj_get_width(new_ddlist); + else x = lv_obj_get_x(new_ddlist); + ext->label = lv_label_create(new_ddlist, NULL); lv_cont_set_fit2(new_ddlist, LV_FIT_TIGHT, LV_FIT_NONE); lv_page_set_sb_mode(new_ddlist, LV_SB_MODE_HIDE); @@ -117,6 +128,10 @@ lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy) lv_ddlist_set_options(new_ddlist, "Option 1\nOption 2\nOption 3"); + /*Restore the original X coordinate*/ + if(lv_obj_get_base_dir(new_ddlist) == LV_BIDI_DIR_RTL) lv_obj_set_x(new_ddlist, x - lv_obj_get_width(new_ddlist)); + else lv_obj_set_x(new_ddlist, x); + /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); if(th) { @@ -128,6 +143,8 @@ lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy) lv_ddlist_set_style(new_ddlist, LV_DDLIST_STYLE_SEL, &lv_style_plain_color); lv_ddlist_set_style(new_ddlist, LV_DDLIST_STYLE_SB, &lv_style_pretty_color); } + + } /*Copy an existing drop down list*/ else { @@ -139,7 +156,7 @@ lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy) ext->fix_height = copy_ext->fix_height; ext->option_cnt = copy_ext->option_cnt; ext->sel_style = copy_ext->sel_style; - ext->draw_arrow = copy_ext->draw_arrow; + ext->symbol = copy_ext->symbol; ext->stay_open = copy_ext->stay_open; lv_ddlist_set_style(new_ddlist, LV_DDLIST_STYLE_BG, lv_ddlist_get_style(copy, LV_DDLIST_STYLE_BG)); @@ -164,6 +181,9 @@ lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_ddlist_set_options(lv_obj_t * ddlist, const char * options) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + LV_ASSERT_STR(options); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); /*Count the '\n'-s to determine the number of options*/ @@ -180,7 +200,8 @@ void lv_ddlist_set_options(lv_obj_t * ddlist, const char * options) lv_ddlist_refr_width(ddlist); - switch(lv_label_get_align(ext->label)) { + lv_label_align_t align = lv_label_get_align(ext->label); + switch(align) { case LV_LABEL_ALIGN_LEFT: lv_obj_align(ext->label, NULL, LV_ALIGN_IN_LEFT_MID, 0, 0); break; case LV_LABEL_ALIGN_CENTER: lv_obj_align(ext->label, NULL, LV_ALIGN_CENTER, 0, 0); break; case LV_LABEL_ALIGN_RIGHT: lv_obj_align(ext->label, NULL, LV_ALIGN_IN_RIGHT_MID, 0, 0); break; @@ -196,6 +217,8 @@ void lv_ddlist_set_options(lv_obj_t * ddlist, const char * options) */ void lv_ddlist_set_selected(lv_obj_t * ddlist, uint16_t sel_opt) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); if(ext->sel_opt_id == sel_opt) return; @@ -217,6 +240,8 @@ void lv_ddlist_set_selected(lv_obj_t * ddlist, uint16_t sel_opt) */ void lv_ddlist_set_fix_height(lv_obj_t * ddlist, lv_coord_t h) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); if(ext->fix_height == h) return; @@ -232,6 +257,8 @@ void lv_ddlist_set_fix_height(lv_obj_t * ddlist, lv_coord_t h) */ void lv_ddlist_set_fix_width(lv_obj_t * ddlist, lv_coord_t w) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); if(w == 0) { lv_cont_set_fit2(ddlist, LV_FIT_TIGHT, lv_cont_get_fit_bottom(ddlist)); @@ -250,16 +277,17 @@ void lv_ddlist_set_fix_width(lv_obj_t * ddlist, lv_coord_t w) } /** - * Set arrow draw in a drop down list + * Set an arrow or other symbol to display when the drop-down list is closed. * @param ddlist pointer to drop down list object - * @param en enable/disable a arrow draw. E.g. "true" for draw. + * @param symbol a text like `LV_SYMBOL_DOWN` or NULL to not draw icon */ -void lv_ddlist_set_draw_arrow(lv_obj_t * ddlist, bool en) +void lv_ddlist_set_symbol(lv_obj_t * ddlist, const char * symbol) { - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); - /*Set the flag*/ - ext->draw_arrow = en ? 1 : 0; + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); + ext->symbol = symbol; + lv_obj_invalidate(ddlist); } /** @@ -269,6 +297,8 @@ void lv_ddlist_set_draw_arrow(lv_obj_t * ddlist, bool en) */ void lv_ddlist_set_stay_open(lv_obj_t * ddlist, bool en) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); /*Set the flag*/ @@ -283,6 +313,8 @@ void lv_ddlist_set_stay_open(lv_obj_t * ddlist, bool en) */ void lv_ddlist_set_style(lv_obj_t * ddlist, lv_ddlist_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); switch(type) { @@ -301,6 +333,8 @@ void lv_ddlist_set_style(lv_obj_t * ddlist, lv_ddlist_style_t type, const lv_sty void lv_ddlist_set_align(lv_obj_t * ddlist, lv_label_align_t align) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); lv_label_set_align(ext->label, align); @@ -321,6 +355,8 @@ void lv_ddlist_set_align(lv_obj_t * ddlist, lv_label_align_t align) */ const char * lv_ddlist_get_options(const lv_obj_t * ddlist) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); return lv_label_get_text(ext->label); } @@ -332,6 +368,8 @@ const char * lv_ddlist_get_options(const lv_obj_t * ddlist) */ uint16_t lv_ddlist_get_selected(const lv_obj_t * ddlist) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); return ext->sel_opt_id; @@ -345,12 +383,14 @@ uint16_t lv_ddlist_get_selected(const lv_obj_t * ddlist) */ void lv_ddlist_get_selected_str(const lv_obj_t * ddlist, char * buf, uint16_t buf_size) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); uint16_t i; uint16_t line = 0; const char * opt_txt = lv_label_get_text(ext->label); - uint16_t txt_len = strlen(opt_txt); + size_t txt_len = strlen(opt_txt); for(i = 0; i < txt_len && line != ext->sel_opt_id; i++) { if(opt_txt[i] == '\n') line++; @@ -375,19 +415,24 @@ void lv_ddlist_get_selected_str(const lv_obj_t * ddlist, char * buf, uint16_t bu */ lv_coord_t lv_ddlist_get_fix_height(const lv_obj_t * ddlist) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); return ext->fix_height; } /** - * Get arrow draw in a drop down list + * Get the symbol to draw when the drop-down list is closed * @param ddlist pointer to drop down list object + * @return the symbol or NULL if not enabled */ -bool lv_ddlist_get_draw_arrow(lv_obj_t * ddlist) +const char * lv_ddlist_get_symbol(lv_obj_t * ddlist) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - return ext->draw_arrow ? true : false; + return ext->symbol; } /** @@ -396,6 +441,8 @@ bool lv_ddlist_get_draw_arrow(lv_obj_t * ddlist) */ bool lv_ddlist_get_stay_open(lv_obj_t * ddlist) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); return ext->stay_open ? true : false; @@ -409,17 +456,26 @@ bool lv_ddlist_get_stay_open(lv_obj_t * ddlist) */ const lv_style_t * lv_ddlist_get_style(const lv_obj_t * ddlist, lv_ddlist_style_t type) { + LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); + const lv_style_t * style; switch(type) { - case LV_DDLIST_STYLE_BG: return lv_page_get_style(ddlist, LV_PAGE_STYLE_BG); - case LV_DDLIST_STYLE_SB: return lv_page_get_style(ddlist, LV_PAGE_STYLE_SB); - case LV_DDLIST_STYLE_SEL: return ext->sel_style; - default: return NULL; + case LV_DDLIST_STYLE_BG: + style = lv_page_get_style(ddlist, LV_PAGE_STYLE_BG); + break; + case LV_DDLIST_STYLE_SB: + style = lv_page_get_style(ddlist, LV_PAGE_STYLE_SB); + break; + case LV_DDLIST_STYLE_SEL: + style = ext->sel_style; + break; + default: + style = NULL; } - /*To avoid warning*/ - return NULL; + return style; } lv_label_align_t lv_ddlist_get_align(const lv_obj_t * ddlist) @@ -494,22 +550,22 @@ static lv_txt_flag_t lv_ddlist_get_txt_flag(const lv_obj_t * ddlist) /** * Handle the drawing related tasks of the drop down lists * @param ddlist pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_ddlist_design(lv_obj_t * ddlist, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_ddlist_design(lv_obj_t * ddlist, const lv_area_t * clip_area, lv_design_mode_t mode) { /*Return false if the object is not covers the mask_p area*/ if(mode == LV_DESIGN_COVER_CHK) { - return ancestor_design(ddlist, mask, mode); + return ancestor_design(ddlist, clip_area, mode); } /*Draw the object*/ else if(mode == LV_DESIGN_DRAW_MAIN) { - ancestor_design(ddlist, mask, mode); + ancestor_design(ddlist, clip_area, mode); lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); lv_opa_t opa_scale = lv_obj_get_opa_scale(ddlist); @@ -529,7 +585,7 @@ static bool lv_ddlist_design(lv_obj_t * ddlist, const lv_area_t * mask, lv_desig rect_area.x1 = ddlist->coords.x1; rect_area.x2 = ddlist->coords.x2; - lv_draw_rect(&rect_area, mask, ext->sel_style, opa_scale); + lv_draw_rect(&rect_area, clip_area, ext->sel_style, opa_scale); } } /*Post draw when the children are drawn*/ @@ -554,7 +610,7 @@ static bool lv_ddlist_design(lv_obj_t * ddlist, const lv_area_t * mask, lv_desig area_sel.x2 = ddlist->coords.x2; lv_area_t mask_sel; bool area_ok; - area_ok = lv_area_intersect(&mask_sel, mask, &area_sel); + area_ok = lv_area_intersect(&mask_sel, clip_area, &area_sel); if(area_ok) { const lv_style_t * sel_style = lv_ddlist_get_style(ddlist, LV_DDLIST_STYLE_SEL); lv_style_t new_style; @@ -563,14 +619,14 @@ static bool lv_ddlist_design(lv_obj_t * ddlist, const lv_area_t * mask, lv_desig new_style.text.opa = sel_style->text.opa; lv_txt_flag_t flag = lv_ddlist_get_txt_flag(ddlist); lv_draw_label(&ext->label->coords, &mask_sel, &new_style, opa_scale, lv_label_get_text(ext->label), - flag, NULL, -1, -1, NULL); + flag, NULL, NULL, NULL, lv_obj_get_base_dir(ddlist)); } } - /*Add a down symbol in ddlist when closed*/ + /*Closed...*/ else { - /*Draw a arrow in ddlist if enabled*/ - if(ext->draw_arrow) { + /*Draw the symbol if enabled*/ + if(ext->symbol) { const lv_style_t * style = lv_ddlist_get_style(ddlist, LV_DDLIST_STYLE_BG); const lv_font_t * font = style->text.font; const lv_style_t * sel_style = lv_ddlist_get_style(ddlist, LV_DDLIST_STYLE_BG); @@ -579,29 +635,34 @@ static bool lv_ddlist_design(lv_obj_t * ddlist, const lv_area_t * mask, lv_desig lv_style_copy(&new_style, style); new_style.text.color = sel_style->text.color; new_style.text.opa = sel_style->text.opa; - lv_area_t area_arrow; - area_arrow.x2 = ddlist->coords.x2 - style->body.padding.right; - area_arrow.x1 = area_arrow.x2 - - lv_txt_get_width(LV_SYMBOL_DOWN, strlen(LV_SYMBOL_DOWN), sel_style->text.font, 0, 0); + lv_area_t area_icon; + lv_coord_t icon_width = lv_txt_get_width(ext->symbol, (uint16_t)strlen(ext->symbol), sel_style->text.font, 0, 0); - area_arrow.y1 = ddlist->coords.y1 + style->text.line_space; - area_arrow.y2 = area_arrow.y1 + font_h; + if(lv_label_get_align(ext->label) != LV_LABEL_ALIGN_RIGHT) { + area_icon.x2 = ddlist->coords.x2 - style->body.padding.right; + area_icon.x1 = area_icon.x2 - icon_width; + } else { + area_icon.x1 = ddlist->coords.x1 + style->body.padding.left; + area_icon.x2 = area_icon.x1 + icon_width; + } - lv_area_t mask_arrow; + area_icon.y1 = ddlist->coords.y1 + style->text.line_space; + area_icon.y2 = area_icon.y1 + font_h; + + lv_area_t mask_icon; bool area_ok; - area_ok = lv_area_intersect(&mask_arrow, mask, &area_arrow); + area_ok = lv_area_intersect(&mask_icon, clip_area, &area_icon); if(area_ok) { - lv_draw_label(&area_arrow, &mask_arrow, &new_style, opa_scale, LV_SYMBOL_DOWN, LV_TXT_FLAG_NONE, - NULL, -1, -1, NULL); /*Use a down arrow in ddlist, you can replace it with your - custom symbol*/ + lv_draw_label(&area_icon, &mask_icon, &new_style, opa_scale, ext->symbol, LV_TXT_FLAG_NONE, + NULL, NULL, NULL, lv_obj_get_base_dir(ddlist)); } } } /*Draw the scrollbar in the ancestor page design function*/ - ancestor_design(ddlist, mask, mode); + ancestor_design(ddlist, clip_area, mode); } - return true; + return LV_DESIGN_RES_OK; } /** @@ -617,10 +678,20 @@ static lv_res_t lv_ddlist_signal(lv_obj_t * ddlist, lv_signal_t sign, void * par /* Include the ancient signal function */ res = ancestor_signal(ddlist, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); if(sign == LV_SIGNAL_STYLE_CHG) { + lv_ddlist_refr_size(ddlist, 0); + } else if(sign == LV_SIGNAL_BASE_DIR_CHG) { + lv_label_align_t align = lv_label_get_align(ext->label); + switch(align) { + case LV_LABEL_ALIGN_LEFT: lv_obj_align(ext->label, NULL, LV_ALIGN_IN_LEFT_MID, 0, 0); break; + case LV_LABEL_ALIGN_CENTER: lv_obj_align(ext->label, NULL, LV_ALIGN_CENTER, 0, 0); break; + case LV_LABEL_ALIGN_RIGHT: lv_obj_align(ext->label, NULL, LV_ALIGN_IN_RIGHT_MID, 0, 0); break; + } + lv_ddlist_refr_size(ddlist, 0); } else if(sign == LV_SIGNAL_CLEANUP) { ext->label = NULL; @@ -695,13 +766,6 @@ static lv_res_t lv_ddlist_signal(lv_obj_t * ddlist, lv_signal_t sign, void * par } else if(sign == LV_SIGNAL_GET_EDITABLE) { bool * editable = (bool *)param; *editable = true; - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_ddlist"; } return res; @@ -947,11 +1011,27 @@ static void lv_ddlist_pos_current_option(lv_obj_t * ddlist) */ static void lv_ddlist_refr_width(lv_obj_t * ddlist) { + /*Save the current x coordinate because it should be kept after the refrsh*/ + lv_coord_t x; + if(lv_obj_get_base_dir(ddlist) == LV_BIDI_DIR_RTL) x = lv_obj_get_x(ddlist) + lv_obj_get_width(ddlist); + else x = lv_obj_get_x(ddlist); + + lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); + /*Set the TIGHT fit horizontally the set the width to the content*/ lv_page_set_scrl_fit2(ddlist, LV_FIT_TIGHT, lv_page_get_scrl_fit_bottom(ddlist)); /*Revert FILL fit to fill the parent with the options area. It allows to RIGHT/CENTER align the text*/ lv_page_set_scrl_fit2(ddlist, LV_FIT_FILL, lv_page_get_scrl_fit_bottom(ddlist)); + + if(lv_obj_get_base_dir(ddlist) == LV_BIDI_DIR_RTL) lv_obj_set_x(ddlist, x - lv_obj_get_width(ddlist)); + else lv_obj_set_x(ddlist, x); + + switch(lv_label_get_align(ext->label)) { + case LV_LABEL_ALIGN_LEFT: lv_obj_align(ext->label, NULL, LV_ALIGN_IN_LEFT_MID, 0, 0); break; + case LV_LABEL_ALIGN_CENTER: lv_obj_align(ext->label, NULL, LV_ALIGN_CENTER, 0, 0); break; + case LV_LABEL_ALIGN_RIGHT: lv_obj_align(ext->label, NULL, LV_ALIGN_IN_RIGHT_MID, 0, 0); break; + } } #endif diff --git a/src/lv_objx/lv_ddlist.h b/src/lv_objx/lv_ddlist.h index ee6c1f70d..774b52cef 100644 --- a/src/lv_objx/lv_ddlist.h +++ b/src/lv_objx/lv_ddlist.h @@ -48,12 +48,12 @@ typedef struct /*New data for this type */ lv_obj_t * label; /*Label for the options*/ const lv_style_t * sel_style; /*Style of the selected option*/ + const char * symbol; /*Arrow or other icon when the drop-down list is closed*/ uint16_t option_cnt; /*Number of options*/ uint16_t sel_opt_id; /*Index of the current option*/ uint16_t sel_opt_id_ori; /*Store the original index on focus*/ uint8_t opened : 1; /*1: The list is opened (handled by the library)*/ uint8_t force_sel : 1; /*1: Keep the selection highlight even if the list is closed*/ - uint8_t draw_arrow : 1; /*1: Draw arrow*/ uint8_t stay_open : 1; /*1: Don't close the list when a new item is selected*/ lv_coord_t fix_height; /*Height of the ddlist when opened. (0: auto-size)*/ } lv_ddlist_ext_t; @@ -110,13 +110,13 @@ void lv_ddlist_set_fix_height(lv_obj_t * ddlist, lv_coord_t h); */ void lv_ddlist_set_fix_width(lv_obj_t * ddlist, lv_coord_t w); -/** - * Set arrow draw in a drop down list - * @param ddlist pointer to drop down list object - * @param en enable/disable a arrow draw. E.g. "true" for draw. - */ -void lv_ddlist_set_draw_arrow(lv_obj_t * ddlist, bool en); +/** + * Set an arrow or other symbol to display when the drop-down list is closed. + * @param ddlist pointer to drop down list object + * @param symbol a text like `LV_SYMBOL_DOWN` or NULL to not draw icon + */ +void lv_ddlist_set_symbol(lv_obj_t * ddlist, const char * symbol); /** * Leave the list opened when a new value is selected * @param ddlist pointer to drop down list object @@ -192,10 +192,11 @@ void lv_ddlist_get_selected_str(const lv_obj_t * ddlist, char * buf, uint16_t bu lv_coord_t lv_ddlist_get_fix_height(const lv_obj_t * ddlist); /** - * Get arrow draw in a drop down list + * Get the symbol to draw when the drop-down list is closed * @param ddlist pointer to drop down list object + * @return the symbol or NULL if not enabled */ -bool lv_ddlist_get_draw_arrow(lv_obj_t * ddlist); +const char * lv_ddlist_get_symbol(lv_obj_t * ddlist); /** * Get whether the drop down list stay open after selecting a value or not diff --git a/src/lv_objx/lv_gauge.c b/src/lv_objx/lv_gauge.c index 5703b910f..2308f76f1 100644 --- a/src/lv_objx/lv_gauge.c +++ b/src/lv_objx/lv_gauge.c @@ -9,23 +9,25 @@ #include "lv_gauge.h" #if LV_USE_GAUGE != 0 +#include "../lv_core/lv_debug.h" #include "../lv_draw/lv_draw.h" #include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_txt.h" #include "../lv_misc/lv_math.h" #include "../lv_misc/lv_utils.h" +#include "lv_img.h" #include #include /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_gauge" + #define LV_GAUGE_DEF_NEEDLE_COLOR LV_COLOR_RED #define LV_GAUGE_DEF_LABEL_COUNT 6 #define LV_GAUGE_DEF_LINE_COUNT 21 /*Should be: ((label_cnt - 1) * internal_lines) + 1*/ #define LV_GAUGE_DEF_ANGLE 220 -#define LV_GAUGE_INTERPOLATE_SHIFT 5 /*Interpolate the needle drawing between to degrees*/ -#define LV_GAUGE_INTERPOLATE_MASK 0x1F /********************** * TYPEDEFS @@ -34,10 +36,10 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_gauge_design(lv_obj_t * gauge, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_gauge_design(lv_obj_t * gauge, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_gauge_signal(lv_obj_t * gauge, lv_signal_t sign, void * param); static void lv_gauge_draw_scale(lv_obj_t * gauge, const lv_area_t * mask); -static void lv_gauge_draw_needle(lv_obj_t * gauge, const lv_area_t * mask); +static void lv_gauge_draw_needle(lv_obj_t * gauge, const lv_area_t * clip_area); /********************** * STATIC VARIABLES @@ -65,19 +67,26 @@ lv_obj_t * lv_gauge_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor gauge*/ lv_obj_t * new_gauge = lv_lmeter_create(par, copy); - lv_mem_assert(new_gauge); + LV_ASSERT_MEM(new_gauge); if(new_gauge == NULL) return NULL; /*Allocate the gauge type specific extended data*/ lv_gauge_ext_t * ext = lv_obj_allocate_ext_attr(new_gauge, sizeof(lv_gauge_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_gauge); + return NULL; + } /*Initialize the allocated 'ext' */ ext->needle_count = 0; ext->values = NULL; ext->needle_colors = NULL; ext->label_count = LV_GAUGE_DEF_LABEL_COUNT; + + ext->needle_img = 0; + ext->needle_img_pivot.x = 0; + ext->needle_img_pivot.y = 0; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_gauge); if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_gauge); @@ -131,6 +140,8 @@ lv_obj_t * lv_gauge_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_gauge_set_needle_count(lv_obj_t * gauge, uint8_t needle_cnt, const lv_color_t colors[]) { + LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); + lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); if(ext->needle_count != needle_cnt) { @@ -140,7 +151,7 @@ void lv_gauge_set_needle_count(lv_obj_t * gauge, uint8_t needle_cnt, const lv_co } ext->values = lv_mem_realloc(ext->values, needle_cnt * sizeof(int16_t)); - lv_mem_assert(ext->values); + LV_ASSERT_MEM(ext->values); if(ext->values == NULL) return; int16_t min = lv_gauge_get_min_value(gauge); @@ -164,6 +175,8 @@ void lv_gauge_set_needle_count(lv_obj_t * gauge, uint8_t needle_cnt, const lv_co */ void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, int16_t value) { + LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); + lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); if(needle_id >= ext->needle_count) return; @@ -187,12 +200,14 @@ void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, int16_t value) * @param gauge pointer to a gauge object * @param angle angle of the scale (0..360) * @param line_cnt count of scale lines. - * The get a given "subdivision" lines between label, `line_cnt` = (sub_div + 1) * (label_cnt - 1) + - * 1 + * To get a given "subdivision" lines between labels: + * `line_cnt = (sub_div + 1) * (label_cnt - 1) + 1 ` * @param label_cnt count of scale labels. */ void lv_gauge_set_scale(lv_obj_t * gauge, uint16_t angle, uint8_t line_cnt, uint8_t label_cnt) { + LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); + lv_lmeter_set_scale(gauge, angle, line_cnt); lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); @@ -200,6 +215,28 @@ void lv_gauge_set_scale(lv_obj_t * gauge, uint16_t angle, uint8_t line_cnt, uint lv_obj_invalidate(gauge); } +/** + * Set an image to display as needle(s). + * The needle image should be horizontal and pointing to the right (`--->`). + * @param gauge pointer to a gauge object + * @param img_src pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object) + * @param pivot_x the X coordinate of rotation center of the image + * @param pivot_y the Y coordinate of rotation center of the image + */ +void lv_gauge_set_needle_img(lv_obj_t * gauge, const void * img, lv_coord_t pivot_x, lv_coord_t pivot_y) +{ + LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); + + lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); + + ext->needle_img = img; + ext->needle_img_pivot.x = pivot_x; + ext->needle_img_pivot.y = pivot_y; + + lv_obj_invalidate(gauge); +} + /*===================== * Getter functions *====================*/ @@ -212,6 +249,8 @@ void lv_gauge_set_scale(lv_obj_t * gauge, uint16_t angle, uint8_t line_cnt, uint */ int16_t lv_gauge_get_value(const lv_obj_t * gauge, uint8_t needle) { + LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); + lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); int16_t min = lv_gauge_get_min_value(gauge); @@ -227,6 +266,8 @@ int16_t lv_gauge_get_value(const lv_obj_t * gauge, uint8_t needle) */ uint8_t lv_gauge_get_needle_count(const lv_obj_t * gauge) { + LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); + lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); return ext->needle_count; } @@ -238,10 +279,56 @@ uint8_t lv_gauge_get_needle_count(const lv_obj_t * gauge) */ uint8_t lv_gauge_get_label_count(const lv_obj_t * gauge) { + LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); + lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); return ext->label_count; } +/** + * Get an image to display as needle(s). + * @param gauge pointer to a gauge object + * @return pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object). `NULL` if not used. + */ +const void * lv_gauge_get_needle_img(lv_obj_t * gauge, const void * img, lv_coord_t pivot_x, lv_coord_t pivot_y) +{ + LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); + + lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); + + return ext->needle_img; +} + +/** + * Get the X coordinate of the rotation center of the needle image + * @param gauge pointer to a gauge object + * @return the X coordinate of rotation center of the image + */ +lv_coord_t lv_gauge_get_needle_img_pivot_x(lv_obj_t * gauge) +{ + LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); + + lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); + + return ext->needle_img_pivot.x; +} + +/** + * Get the Y coordinate of the rotation center of the needle image + * @param gauge pointer to a gauge object + * @return the X coordinate of rotation center of the image + */ +lv_coord_t lv_gauge_get_needle_img_pivot_y(lv_obj_t * gauge) +{ + LV_ASSERT_OBJ(gauge, LV_OBJX_NAME); + + lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); + + return ext->needle_img_pivot.y; +} + + /********************** * STATIC FUNCTIONS **********************/ @@ -249,19 +336,18 @@ uint8_t lv_gauge_get_label_count(const lv_obj_t * gauge) /** * Handle the drawing related tasks of the gauges * @param gauge pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_gauge_design(lv_obj_t * gauge, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_gauge_design(lv_obj_t * gauge, const lv_area_t * clip_area, lv_design_mode_t mode) { - /*Return false if the object is not covers the mask_p area*/ if(mode == LV_DESIGN_COVER_CHK) { - return false; + return LV_DESIGN_RES_NOT_COVER; } /*Draw the object*/ else if(mode == LV_DESIGN_DRAW_MAIN) { @@ -273,11 +359,11 @@ static bool lv_gauge_design(lv_obj_t * gauge, const lv_area_t * mask, lv_design_ const lv_style_t * style = lv_obj_get_style(gauge); lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); - lv_gauge_draw_scale(gauge, mask); + lv_gauge_draw_scale(gauge, clip_area); /*Draw the ancestor line meter with max value to show the rainbow like line colors*/ uint16_t line_cnt_tmp = ext->lmeter.line_cnt; - ancestor_design(gauge, mask, mode); /*To draw lines*/ + ancestor_design(gauge, clip_area, mode); /*To draw lines*/ /*Temporally modify the line meter to draw longer lines where labels are*/ lv_style_t style_tmp; @@ -287,20 +373,20 @@ static bool lv_gauge_design(lv_obj_t * gauge, const lv_area_t * mask, lv_design_ style_tmp.body.padding.right = style_tmp.body.padding.right * 2; /*Longer lines*/ gauge->style_p = &style_tmp; - ancestor_design(gauge, mask, mode); /*To draw lines*/ + ancestor_design(gauge, clip_area, mode); /*To draw lines*/ ext->lmeter.line_cnt = line_cnt_tmp; /*Restore the parameters*/ gauge->style_p = style_ori_p; /*Restore the ORIGINAL style pointer*/ - lv_gauge_draw_needle(gauge, mask); + lv_gauge_draw_needle(gauge, clip_area); } /*Post draw when the children are drawn*/ else if(mode == LV_DESIGN_DRAW_POST) { - ancestor_design(gauge, mask, mode); + ancestor_design(gauge, clip_area, mode); } - return true; + return LV_DESIGN_RES_OK; } /** @@ -317,18 +403,12 @@ static lv_res_t lv_gauge_signal(lv_obj_t * gauge, lv_signal_t sign, void * param /* Include the ancient signal function */ res = ancestor_signal(gauge, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); if(sign == LV_SIGNAL_CLEANUP) { lv_mem_free(ext->values); ext->values = NULL; - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_gauge"; } return res; @@ -381,7 +461,7 @@ static void lv_gauge_draw_scale(lv_obj_t * gauge, const lv_area_t * mask) label_cord.x2 = label_cord.x1 + label_size.x; label_cord.y2 = label_cord.y1 + label_size.y; - lv_draw_label(&label_cord, mask, style, opa_scale, scale_txt, LV_TXT_FLAG_NONE, NULL, -1, -1, NULL); + lv_draw_label(&label_cord, mask, style, opa_scale, scale_txt, LV_TXT_FLAG_NONE, NULL, NULL, NULL, lv_obj_get_base_dir(gauge)); } } /** @@ -389,7 +469,7 @@ static void lv_gauge_draw_scale(lv_obj_t * gauge, const lv_area_t * mask) * @param gauge pointer to gauge object * @param mask mask of drawing */ -static void lv_gauge_draw_needle(lv_obj_t * gauge, const lv_area_t * mask) +static void lv_gauge_draw_needle(lv_obj_t * gauge, const lv_area_t * clip_area) { lv_style_t style_needle; lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); @@ -405,45 +485,48 @@ static void lv_gauge_draw_needle(lv_obj_t * gauge, const lv_area_t * mask) int16_t max = lv_gauge_get_max_value(gauge); lv_point_t p_mid; lv_point_t p_end; - lv_point_t p_end_low; - lv_point_t p_end_high; uint8_t i; lv_style_copy(&style_needle, style); + if(ext->needle_colors != NULL) { + style_needle.image.intense = LV_OPA_COVER; + } p_mid.x = x_ofs; p_mid.y = y_ofs; for(i = 0; i < ext->needle_count; i++) { /*Calculate the end point of a needle*/ + int16_t needle_angle = - (ext->values[i] - min) * angle * (1 << LV_GAUGE_INTERPOLATE_SHIFT) / (max - min); + (ext->values[i] - min) * angle / (max - min) + angle_ofs; - int16_t needle_angle_low = (needle_angle >> LV_GAUGE_INTERPOLATE_SHIFT) + angle_ofs; - int16_t needle_angle_high = needle_angle_low + 1; + /*Draw line*/ + if(ext->needle_img == NULL) { + p_end.y = (lv_trigo_sin(needle_angle) * r) / LV_TRIGO_SIN_MAX + y_ofs; + p_end.x = (lv_trigo_sin(needle_angle + 90) * r) / LV_TRIGO_SIN_MAX + x_ofs; - p_end_low.y = (lv_trigo_sin(needle_angle_low) * r) / LV_TRIGO_SIN_MAX + y_ofs; - p_end_low.x = (lv_trigo_sin(needle_angle_low + 90) * r) / LV_TRIGO_SIN_MAX + x_ofs; + /*Draw the needle with the corresponding color*/ + if(ext->needle_colors != NULL) + style_needle.line.color = ext->needle_colors[i]; - p_end_high.y = (lv_trigo_sin(needle_angle_high) * r) / LV_TRIGO_SIN_MAX + y_ofs; - p_end_high.x = (lv_trigo_sin(needle_angle_high + 90) * r) / LV_TRIGO_SIN_MAX + x_ofs; + lv_draw_line(&p_mid, &p_end, clip_area, &style_needle, opa_scale); + } + /*Draw image*/ + else { + lv_img_header_t info; + lv_img_decoder_get_info(ext->needle_img, &info); - uint16_t rem = needle_angle & ((1 << LV_GAUGE_INTERPOLATE_SHIFT) - 1); - int16_t x_mod = ((LV_MATH_ABS(p_end_high.x - p_end_low.x)) * rem) >> LV_GAUGE_INTERPOLATE_SHIFT; - int16_t y_mod = ((LV_MATH_ABS(p_end_high.y - p_end_low.y)) * rem) >> LV_GAUGE_INTERPOLATE_SHIFT; + lv_area_t a; + a.x1 = gauge->coords.x1 + lv_area_get_width(&gauge->coords) / 2 - ext->needle_img_pivot.x; + a.y1 = gauge->coords.y1 + lv_area_get_height(&gauge->coords) / 2 - ext->needle_img_pivot.y; + a.x2 = a.x1 + info.w - 1; + a.y2 = a.y1 + info.h - 1; - if(p_end_high.x < p_end_low.x) x_mod = -x_mod; - if(p_end_high.y < p_end_low.y) y_mod = -y_mod; + if(ext->needle_colors != NULL) + style_needle.image.color = ext->needle_colors[i]; - p_end.x = p_end_low.x + x_mod; - p_end.y = p_end_low.y + y_mod; - - /*Draw the needle with the corresponding color*/ - if(ext->needle_colors == NULL) - style_needle.line.color = LV_GAUGE_DEF_NEEDLE_COLOR; - else - style_needle.line.color = ext->needle_colors[i]; - - lv_draw_line(&p_mid, &p_end, mask, &style_needle, opa_scale); + lv_draw_img(&a, clip_area, ext->needle_img, &style_needle, needle_angle, &ext->needle_img_pivot, LV_IMG_ZOOM_NONE, true, opa_scale); + } } /*Draw the needle middle area*/ @@ -459,7 +542,7 @@ static void lv_gauge_draw_needle(lv_obj_t * gauge, const lv_area_t * mask) nm_cord.x2 = x_ofs + style->body.radius; nm_cord.y2 = y_ofs + style->body.radius; - lv_draw_rect(&nm_cord, mask, &style_neddle_mid, lv_obj_get_opa_scale(gauge)); + lv_draw_rect(&nm_cord, clip_area, &style_neddle_mid, lv_obj_get_opa_scale(gauge)); } #endif diff --git a/src/lv_objx/lv_gauge.h b/src/lv_objx/lv_gauge.h index fb7cf366a..6b03a8404 100644 --- a/src/lv_objx/lv_gauge.h +++ b/src/lv_objx/lv_gauge.h @@ -46,6 +46,8 @@ typedef struct /*New data for this type */ int16_t * values; /*Array of the set values (for needles) */ const lv_color_t * needle_colors; /*Color of the needles (lv_color_t my_colors[needle_num])*/ + const void * needle_img; + lv_point_t needle_img_pivot; uint8_t needle_count; /*Number of needles*/ uint8_t label_count; /*Number of labels on the scale*/ } lv_gauge_ext_t; @@ -114,12 +116,23 @@ static inline void lv_gauge_set_critical_value(lv_obj_t * gauge, int16_t value) * @param gauge pointer to a gauge object * @param angle angle of the scale (0..360) * @param line_cnt count of scale lines. - * The get a given "subdivision" lines between label, `line_cnt` = (sub_div + 1) * (label_cnt - 1) + - * 1 + * To get a given "subdivision" lines between labels: + * `line_cnt = (sub_div + 1) * (label_cnt - 1) + 1 ` * @param label_cnt count of scale labels. */ void lv_gauge_set_scale(lv_obj_t * gauge, uint16_t angle, uint8_t line_cnt, uint8_t label_cnt); +/** + * Set an image to display as needle(s). + * The needle image should be horizontal and pointing to the right (`--->`). + * @param gauge pointer to a gauge object + * @param img_src pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object) + * @param pivot_x the X coordinate of rotation center of the image + * @param pivot_y the Y coordinate of rotation center of the image + */ +void lv_gauge_set_needle_img(lv_obj_t * gauge, const void * img, lv_coord_t pivot_x, lv_coord_t pivot_y); + /** * Set the styles of a gauge * @param gauge pointer to a gauge object @@ -208,6 +221,28 @@ static inline uint16_t lv_gauge_get_scale_angle(const lv_obj_t * gauge) return lv_lmeter_get_scale_angle(gauge); } +/** + * Get an image to display as needle(s). + * @param gauge pointer to a gauge object + * @return pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object). `NULL` if not used. + */ +const void * lv_gauge_get_needle_img(lv_obj_t * gauge, const void * img, lv_coord_t pivot_x, lv_coord_t pivot_y); + +/** + * Get the X coordinate of the rotation center of the needle image + * @param gauge pointer to a gauge object + * @return the X coordinate of rotation center of the image + */ +lv_coord_t lv_gauge_get_needle_img_pivot_x(lv_obj_t * gauge); + +/** + * Get the Y coordinate of the rotation center of the needle image + * @param gauge pointer to a gauge object + * @return the X coordinate of rotation center of the image + */ +lv_coord_t lv_gauge_get_needle_img_pivot_y(lv_obj_t * gauge); + /** * Get the style of a gauge * @param gauge pointer to a gauge object diff --git a/src/lv_objx/lv_img.c b/src/lv_objx/lv_img.c index 3b034d392..c78e1d93f 100644 --- a/src/lv_objx/lv_img.c +++ b/src/lv_objx/lv_img.c @@ -14,15 +14,18 @@ #error "lv_img: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " #endif +#include "../lv_core/lv_debug.h" #include "../lv_themes/lv_theme.h" #include "../lv_draw/lv_img_decoder.h" #include "../lv_misc/lv_fs.h" #include "../lv_misc/lv_txt.h" +#include "../lv_misc/lv_math.h" #include "../lv_misc/lv_log.h" /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_img" /********************** * TYPEDEFS @@ -31,7 +34,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_img_design(lv_obj_t * img, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_img_design(lv_obj_t * img, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_img_signal(lv_obj_t * img, lv_signal_t sign, void * param); /********************** @@ -61,24 +64,32 @@ lv_obj_t * lv_img_create(lv_obj_t * par, const lv_obj_t * copy) /*Create a basic object*/ new_img = lv_obj_create(par, copy); - lv_mem_assert(new_img); + LV_ASSERT_MEM(new_img); if(new_img == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_img); /*Extend the basic object to image object*/ lv_img_ext_t * ext = lv_obj_allocate_ext_attr(new_img, sizeof(lv_img_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_img); + return NULL; + } ext->src = NULL; ext->src_type = LV_IMG_SRC_UNKNOWN; ext->cf = LV_IMG_CF_UNKNOWN; ext->w = lv_obj_get_width(new_img); ext->h = lv_obj_get_height(new_img); + ext->angle = 0; + ext->zoom = LV_IMG_ZOOM_NONE; + ext->antialias = LV_ANTIALIAS ? 1 : 0; ext->auto_size = 1; ext->offset.x = 0; ext->offset.y = 0; + ext->pivot.x = 0; + ext->pivot.y = 0; /*Init the new object*/ lv_obj_set_signal_cb(new_img, lv_img_signal); @@ -121,6 +132,8 @@ lv_obj_t * lv_img_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_img_set_src(lv_obj_t * img, const void * src_img) { + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + lv_img_src_t src_type = lv_img_src_get_type(src_img); lv_img_ext_t * ext = lv_obj_get_ext_attr(img); @@ -159,15 +172,20 @@ void lv_img_set_src(lv_obj_t * img, const void * src_img) } else if(src_type == LV_IMG_SRC_FILE || src_type == LV_IMG_SRC_SYMBOL) { /* If the new and the old src are the same then it was only a refresh.*/ if(ext->src != src_img) { - /*If memory was allocated because of the previous `src_type` then free it*/ + const void * old_src = NULL; + /* If memory was allocated because of the previous `src_type` then save its pointer and free after allocation. + * It's important to allocate first to be sure the new data will be on a new address. + * Else `img_cache` wouldn't see the change in source.*/ if(ext->src_type == LV_IMG_SRC_FILE || ext->src_type == LV_IMG_SRC_SYMBOL) { - lv_mem_free(ext->src); + old_src = ext->src; } char * new_str = lv_mem_alloc(strlen(src_img) + 1); - lv_mem_assert(new_str); + LV_ASSERT_MEM(new_str); if(new_str == NULL) return; strcpy(new_str, src_img); ext->src = new_str; + + if(old_src) lv_mem_free(old_src); } } @@ -185,11 +203,16 @@ void lv_img_set_src(lv_obj_t * img, const void * src_img) ext->w = header.w; ext->h = header.h; ext->cf = header.cf; + ext->pivot.x = header.w / 2; + ext->pivot.y = header.h / 2; if(lv_img_get_auto_size(img) != false) { lv_obj_set_size(img, ext->w, ext->h); } + /*Provide enough room for the rotated corners*/ + if(ext->angle) lv_obj_refresh_ext_draw_pad(img); + lv_obj_invalidate(img); } @@ -201,6 +224,8 @@ void lv_img_set_src(lv_obj_t * img, const void * src_img) */ void lv_img_set_auto_size(lv_obj_t * img, bool en) { + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); ext->auto_size = (en == false ? 0 : 1); @@ -214,12 +239,14 @@ void lv_img_set_auto_size(lv_obj_t * img, bool en) */ void lv_img_set_offset_x(lv_obj_t * img, lv_coord_t x) { + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); - if(x < ext->w - 1) { - ext->offset.x = x; - lv_obj_invalidate(img); - } + x = x % ext->w; + + ext->offset.x = x; + lv_obj_invalidate(img); } /** @@ -230,12 +257,89 @@ void lv_img_set_offset_x(lv_obj_t * img, lv_coord_t x) */ void lv_img_set_offset_y(lv_obj_t * img, lv_coord_t y) { + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); - if(y < ext->h - 1) { - ext->offset.y = y; - lv_obj_invalidate(img); - } + y = y % ext->h; + + ext->offset.y = y; + lv_obj_invalidate(img); +} + +/** + * Set the rotation center of the image. + * The image will be rotated around this point + * @param img pointer to an image object + * @param pivot_x rotation center x of the image + * @param pivot_y rotation center y of the image + */ +void lv_img_set_pivot(lv_obj_t * img, lv_coord_t pivot_x, lv_coord_t pivot_y) +{ + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); + if (ext->pivot.x == pivot_x && ext->pivot.y == pivot_y) return; + + lv_obj_invalidate(img); + ext->pivot.x = pivot_x; + ext->pivot.y = pivot_y; + lv_obj_refresh_ext_draw_pad(img); + lv_obj_invalidate(img); +} + +/** + * Set the rotation angle of the image. + * The image will be rotated around its middle point + * @param img pointer to an image object + * @param angle rotation angle in degree (> 0: clock wise) + */ +void lv_img_set_angle(lv_obj_t * img, int16_t angle) +{ + if(angle < 0 || angle >= 360) angle = angle % 360; + + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); + if(angle == ext->angle) return; + + lv_obj_invalidate(img); + ext->angle = angle; + lv_obj_refresh_ext_draw_pad(img); + lv_obj_invalidate(img); +} + +/** + * Set the zoom factor of the image. + * @param img pointer to an image object + * @param zoom the zoom factor. + * - 256 or LV_ZOOM_IMG_NONE for no zoom + * - <256: scale down + * - >256 scale up + * - 128 half size + * - 512 double size + */ +void lv_img_set_zoom(lv_obj_t * img, uint16_t zoom) +{ + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); + if(zoom == ext->zoom) return; + + if(zoom == 0) zoom = 1; + + lv_obj_invalidate(img); + ext->zoom = zoom; + lv_obj_refresh_ext_draw_pad(img); + lv_obj_invalidate(img); +} + +/** + * Enable/disable anti-aliasing for the transformations (rotate, zoom) or not + * @param img pointer to an image object + * @param antialias true: anti-aliased; false: not anti-aliased + */ +void lv_img_set_antialias(lv_obj_t * img, bool antialias) +{ + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); + if(antialias == ext->antialias) return; + + ext->antialias = antialias; + lv_obj_invalidate(img); } /*===================== @@ -249,6 +353,8 @@ void lv_img_set_offset_y(lv_obj_t * img, lv_coord_t y) */ const void * lv_img_get_src(lv_obj_t * img) { + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); return ext->src; @@ -261,6 +367,8 @@ const void * lv_img_get_src(lv_obj_t * img) */ const char * lv_img_get_file_name(const lv_obj_t * img) { + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); if(ext->src_type == LV_IMG_SRC_FILE) @@ -276,6 +384,8 @@ const char * lv_img_get_file_name(const lv_obj_t * img) */ bool lv_img_get_auto_size(const lv_obj_t * img) { + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); return ext->auto_size == 0 ? false : true; @@ -288,6 +398,8 @@ bool lv_img_get_auto_size(const lv_obj_t * img) */ lv_coord_t lv_img_get_offset_x(lv_obj_t * img) { + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); return ext->offset.x; @@ -300,11 +412,69 @@ lv_coord_t lv_img_get_offset_x(lv_obj_t * img) */ lv_coord_t lv_img_get_offset_y(lv_obj_t * img) { + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); return ext->offset.y; } +/** + * Get the rotation center of the image. + * @param img pointer to an image object + * @param center rotation center of the image + */ +void lv_img_get_pivot(lv_obj_t * img, lv_point_t *pivot) +{ + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); + + *pivot = ext->pivot; +} + +/** + * Get the rotation angle of the image. + * @param img pointer to an image object + * @return rotation angle in degree (0..359) + */ +uint16_t lv_img_get_angle(lv_obj_t * img) +{ + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); + + return ext->angle; +} + +/** + * Get the zoom factor of the image. + * @param img pointer to an image object + * @return zoom factor (256: no zoom) + */ +uint16_t lv_img_get_zoom(lv_obj_t * img) +{ + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); + + return ext->zoom; +} + +/** + * Get whether the transformations (rotate, zoom) are anti-aliased or not + * @param img pointer to an image object + * @return true: anti-aliased; false: not anti-aliased + */ +bool lv_img_get_antialias(lv_obj_t * img) +{ + LV_ASSERT_OBJ(img, LV_OBJX_NAME); + + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); + + return ext->antialias ? true : false; +} + /********************** * STATIC FUNCTIONS **********************/ @@ -312,23 +482,25 @@ lv_coord_t lv_img_get_offset_y(lv_obj_t * img) /** * Handle the drawing related tasks of the images * @param img pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_img_design(lv_obj_t * img, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_img_design(lv_obj_t * img, const lv_area_t * clip_area, lv_design_mode_t mode) { const lv_style_t * style = lv_obj_get_style(img); lv_img_ext_t * ext = lv_obj_get_ext_attr(img); if(mode == LV_DESIGN_COVER_CHK) { - bool cover = false; - if(ext->src_type == LV_IMG_SRC_UNKNOWN || ext->src_type == LV_IMG_SRC_SYMBOL) return false; + lv_design_res_t cover = LV_DESIGN_RES_NOT_COVER; + if(ext->src_type == LV_IMG_SRC_UNKNOWN || ext->src_type == LV_IMG_SRC_SYMBOL || ext->angle != 0) return LV_DESIGN_RES_NOT_COVER; - if(ext->cf == LV_IMG_CF_TRUE_COLOR || ext->cf == LV_IMG_CF_RAW) cover = lv_area_is_in(mask, &img->coords); + if(ext->cf == LV_IMG_CF_TRUE_COLOR || ext->cf == LV_IMG_CF_RAW) { + cover = lv_area_is_in(clip_area, &img->coords) ? LV_DESIGN_RES_COVER : LV_DESIGN_RES_NOT_COVER; + } return cover; } else if(mode == LV_DESIGN_DRAW_MAIN) { @@ -339,19 +511,22 @@ static bool lv_img_design(lv_obj_t * img, const lv_area_t * mask, lv_design_mode lv_obj_get_coords(img, &coords); if(ext->src_type == LV_IMG_SRC_FILE || ext->src_type == LV_IMG_SRC_VARIABLE) { - coords.x1 -= ext->offset.x; - coords.y1 -= ext->offset.y; + coords.x1 += ext->offset.x; + coords.y1 += ext->offset.y; + + if(coords.x1 > img->coords.x1) coords.x1 -= ext->w; + if(coords.y1 > img->coords.y1) coords.y1 -= ext->h; LV_LOG_TRACE("lv_img_design: start to draw image"); lv_area_t cords_tmp; cords_tmp.y1 = coords.y1; cords_tmp.y2 = coords.y1 + ext->h - 1; - for(; cords_tmp.y1 < coords.y2; cords_tmp.y1 += ext->h, cords_tmp.y2 += ext->h) { + for(; cords_tmp.y1 <= coords.y2; cords_tmp.y1 += ext->h, cords_tmp.y2 += ext->h) { cords_tmp.x1 = coords.x1; cords_tmp.x2 = coords.x1 + ext->w - 1; - for(; cords_tmp.x1 < coords.x2; cords_tmp.x1 += ext->w, cords_tmp.x2 += ext->w) { - lv_draw_img(&cords_tmp, mask, ext->src, style, opa_scale); + for(; cords_tmp.x1 <= coords.x2; cords_tmp.x1 += ext->w, cords_tmp.x2 += ext->w) { + lv_draw_img(&cords_tmp, clip_area, ext->src, style, ext->angle, &ext->pivot, ext->zoom, ext->antialias, opa_scale); } } } else if(ext->src_type == LV_IMG_SRC_SYMBOL) { @@ -359,11 +534,11 @@ static bool lv_img_design(lv_obj_t * img, const lv_area_t * mask, lv_design_mode lv_style_t style_mod; lv_style_copy(&style_mod, style); style_mod.text.color = style->image.color; - lv_draw_label(&coords, mask, &style_mod, opa_scale, ext->src, LV_TXT_FLAG_NONE, NULL, -1, -1, NULL); + lv_draw_label(&coords, clip_area, &style_mod, opa_scale, ext->src, LV_TXT_FLAG_NONE, NULL, NULL, NULL, lv_obj_get_base_dir(img)); } else { /*Trigger the error handler of image drawer*/ LV_LOG_WARN("lv_img_design: image source type is unknown"); - lv_draw_img(&img->coords, mask, NULL, style, opa_scale); + lv_draw_img(&img->coords, clip_area, NULL, style, 0, NULL, LV_IMG_ZOOM_NONE, false, opa_scale); } } @@ -385,6 +560,8 @@ static lv_res_t lv_img_signal(lv_obj_t * img, lv_signal_t sign, void * param) res = ancestor_signal(img, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); + lv_img_ext_t * ext = lv_obj_get_ext_attr(img); if(sign == LV_SIGNAL_CLEANUP) { if(ext->src_type == LV_IMG_SRC_FILE || ext->src_type == LV_IMG_SRC_SYMBOL) { @@ -397,13 +574,19 @@ static lv_res_t lv_img_signal(lv_obj_t * img, lv_signal_t sign, void * param) if(ext->src_type == LV_IMG_SRC_SYMBOL) { lv_img_set_src(img, ext->src); } - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; + } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { + /*If the image has angle provide enough room for the rotated corners */ + if(ext->angle || ext->zoom != LV_IMG_ZOOM_NONE) { + lv_sqrt_res_t ds; + lv_coord_t max_w = ext->w + LV_MATH_ABS(ext->pivot.x + ext->w / 2); + lv_coord_t max_h = ext->h + LV_MATH_ABS(ext->pivot.y + ext->h / 2); + lv_sqrt(max_w * max_w + max_h * max_h, &ds);/*Maximum diagonal length*/ + lv_sqrt(ds.i * ds.i + ds.i * ds.i, &ds); /*Maximum side length of external rectangle*/ + ds.i = (ds.i * ext->zoom ) >> 8; /*+10 to be sure anything won't be clipped*/ + + lv_coord_t d = ds.i / 2; + img->ext_draw_pad = LV_MATH_MAX(img->ext_draw_pad, d); } - buf->type[i] = "lv_img"; } return res; diff --git a/src/lv_objx/lv_img.h b/src/lv_objx/lv_img.h index d1e14d209..a784e8711 100644 --- a/src/lv_objx/lv_img.h +++ b/src/lv_objx/lv_img.h @@ -42,9 +42,13 @@ typedef struct lv_point_t offset; lv_coord_t w; /*Width of the image (Handled by the library)*/ lv_coord_t h; /*Height of the image (Handled by the library)*/ + uint16_t angle; /*rotation angle of the image*/ + lv_point_t pivot; /*rotation center of the image*/ + uint16_t zoom; /*256 means no zoom, 512 double size, 128 hasl size*/ uint8_t src_type : 2; /*See: lv_img_src_t*/ uint8_t auto_size : 1; /*1: automatically set the object size to the image size*/ uint8_t cf : 5; /*Color format from `lv_img_color_format_t`*/ + uint8_t antialias :1; /*Apply anti-aliasing in transformations (rotate, zoom)*/ } lv_img_ext_t; /*Styles*/ @@ -100,6 +104,42 @@ void lv_img_set_offset_x(lv_obj_t * img, lv_coord_t x); */ void lv_img_set_offset_y(lv_obj_t * img, lv_coord_t y); +/** + * Set the rotation center of the image. + * The image will be rotated around this point + * @param img pointer to an image object + * @param pivot_x rotation center x of the image + * @param pivot_y rotation center y of the image + */ +void lv_img_set_pivot(lv_obj_t * img, lv_coord_t pivot_x, lv_coord_t pivot_y); + +/** + * Set the rotation angle of the image. + * The image will be rotated around its middle point + * @param img pointer to an image object + * @param angle rotate angle in degree (> 0: clock wise) + */ +void lv_img_set_angle(lv_obj_t * img, int16_t angle); + +/** + * Set the zoom factor of the image. + * @param img pointer to an image object + * @param zoom the zoom factor. + * - 256 or LV_ZOOM_IMG_NONE for no zoom + * - <256: scale down + * - >256 scale up + * - 128 half size + * - 512 double size + */ +void lv_img_set_zoom(lv_obj_t * img, uint16_t zoom); + +/** + * Enable/disable anti-aliasing for the transformations (rotate, zoom) or not + * @param img pointer to an image object + * @param antialias true: anti-aliased; false: not anti-aliased + */ +void lv_img_set_antialias(lv_obj_t * img, bool antialias); + /** * Set the style of an image * @param img pointer to an image object @@ -151,6 +191,34 @@ lv_coord_t lv_img_get_offset_x(lv_obj_t * img); */ lv_coord_t lv_img_get_offset_y(lv_obj_t * img); +/** + * Get the rotation angle of the image. + * @param img pointer to an image object + * @return rotation angle in degree (0..359) + */ +uint16_t lv_img_get_angle(lv_obj_t * img); + +/** + * Get the rotation center of the image. + * @param img pointer to an image object + * @param center rotation center of the image + */ +void lv_img_get_pivot(lv_obj_t * img, lv_point_t *center); + +/** + * Get the zoom factor of the image. + * @param img pointer to an image object + * @return zoom factor (256: no zoom) + */ +uint16_t lv_img_get_zoom(lv_obj_t * img); + +/** + * Get whether the transformations (rotate, zoom) are anti-aliased or not + * @param img pointer to an image object + * @return true: anti-aliased; false: not anti-aliased + */ +bool lv_img_get_antialias(lv_obj_t * img); + /** * Get the style of an image object * @param img pointer to an image object diff --git a/src/lv_objx/lv_imgbtn.c b/src/lv_objx/lv_imgbtn.c index b2e5cf6d8..103c6d801 100644 --- a/src/lv_objx/lv_imgbtn.c +++ b/src/lv_objx/lv_imgbtn.c @@ -6,12 +6,17 @@ /********************* * INCLUDES *********************/ + +#include "../lv_core/lv_debug.h" #include "lv_imgbtn.h" +#include "lv_label.h" + #if LV_USE_IMGBTN != 0 /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_imgbtn" /********************** * TYPEDEFS @@ -20,7 +25,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_imgbtn_signal(lv_obj_t * imgbtn, lv_signal_t sign, void * param); static void refr_img(lv_obj_t * imgbtn); @@ -51,19 +56,23 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor of image button*/ lv_obj_t * new_imgbtn = lv_btn_create(par, copy); - lv_mem_assert(new_imgbtn); + LV_ASSERT_MEM(new_imgbtn); if(new_imgbtn == NULL) return NULL; /*Allocate the image button type specific extended data*/ lv_imgbtn_ext_t * ext = lv_obj_allocate_ext_attr(new_imgbtn, sizeof(lv_imgbtn_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_imgbtn); + return NULL; + } + if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_imgbtn); if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_imgbtn); /*Initialize the allocated 'ext' */ #if LV_IMGBTN_TILED == 0 - memset(ext->img_src, 0, sizeof(ext->img_src)); + memset((void*)ext->img_src, 0, sizeof(ext->img_src)); #else memset(ext->img_src_left, 0, sizeof(ext->img_src_left)); memset(ext->img_src_mid, 0, sizeof(ext->img_src_mid)); @@ -84,11 +93,11 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy) else { lv_imgbtn_ext_t * copy_ext = lv_obj_get_ext_attr(copy); #if LV_IMGBTN_TILED == 0 - memcpy(ext->img_src, copy_ext->img_src, sizeof(ext->img_src)); + memcpy(ext->img_src, (void*)copy_ext->img_src, sizeof(ext->img_src)); #else - memcpy(ext->img_src_left, copy_ext->img_src_left, sizeof(ext->img_src_left)); - memcpy(ext->img_src_mid, copy_ext->img_src_mid, sizeof(ext->img_src_mid)); - memcpy(ext->img_src_right, copy_ext->img_src_right, sizeof(ext->img_src_right)); + memcpy(ext->img_src_left, (void*)copy_ext->img_src_left, sizeof(ext->img_src_left)); + memcpy(ext->img_src_mid, (void*)copy_ext->img_src_mid, sizeof(ext->img_src_mid)); + memcpy(ext->img_src_right, (void*)copy_ext->img_src_right, sizeof(ext->img_src_right)); #endif /*Refresh the style with new signal function*/ lv_obj_refresh_style(new_imgbtn); @@ -112,6 +121,8 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src) { + LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); + lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); ext->img_src[state] = src; @@ -134,6 +145,17 @@ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src_left, const void * src_mid, const void * src_right) { + LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); + + + if(lv_img_src_get_type(src_left) == LV_IMG_SRC_SYMBOL || + lv_img_src_get_type(src_mid) == LV_IMG_SRC_SYMBOL || + lv_img_src_get_type(src_right) == LV_IMG_SRC_SYMBOL ) + { + LV_LOG_WARN("lv_imgbtn_set_src: symbols are not supported in tiled mode"); + return; + } + lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); ext->img_src_left[state] = src_left; @@ -153,6 +175,8 @@ void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src */ void lv_imgbtn_set_style(lv_obj_t * imgbtn, lv_imgbtn_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); + lv_btn_set_style(imgbtn, type, style); } @@ -169,6 +193,8 @@ void lv_imgbtn_set_style(lv_obj_t * imgbtn, lv_imgbtn_style_t type, const lv_sty */ const void * lv_imgbtn_get_src(lv_obj_t * imgbtn, lv_btn_state_t state) { + LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); + lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); return ext->img_src[state]; @@ -183,6 +209,8 @@ const void * lv_imgbtn_get_src(lv_obj_t * imgbtn, lv_btn_state_t state) */ const void * lv_imgbtn_get_src_left(lv_obj_t * imgbtn, lv_btn_state_t state) { + LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); + lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); return ext->img_src_left[state]; @@ -196,6 +224,8 @@ const void * lv_imgbtn_get_src_left(lv_obj_t * imgbtn, lv_btn_state_t state) */ const void * lv_imgbtn_get_src_middle(lv_obj_t * imgbtn, lv_btn_state_t state) { + LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); + lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); return ext->img_src_mid[state]; @@ -209,6 +239,8 @@ const void * lv_imgbtn_get_src_middle(lv_obj_t * imgbtn, lv_btn_state_t state) */ const void * lv_imgbtn_get_src_right(lv_obj_t * imgbtn, lv_btn_state_t state) { + LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); + lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); return ext->img_src_right[state]; @@ -224,6 +256,8 @@ const void * lv_imgbtn_get_src_right(lv_obj_t * imgbtn, lv_btn_state_t state) */ const lv_style_t * lv_imgbtn_get_style(const lv_obj_t * imgbtn, lv_imgbtn_style_t type) { + LV_ASSERT_OBJ(imgbtn, LV_OBJX_NAME); + return lv_btn_get_style(imgbtn, type); } @@ -242,21 +276,21 @@ const lv_style_t * lv_imgbtn_get_style(const lv_obj_t * imgbtn, lv_imgbtn_style_ /** * Handle the drawing related tasks of the image buttons * @param imgbtn pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * clip_area, lv_design_mode_t mode) { /*Return false if the object is not covers the mask_p area*/ if(mode == LV_DESIGN_COVER_CHK) { lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); - bool cover = false; + lv_design_res_t cover = LV_DESIGN_RES_NOT_COVER; if(ext->act_cf == LV_IMG_CF_TRUE_COLOR || ext->act_cf == LV_IMG_CF_RAW) { - cover = lv_area_is_in(mask, &imgbtn->coords); + cover = lv_area_is_in(clip_area, &imgbtn->coords) ? LV_DESIGN_RES_COVER : LV_DESIGN_RES_NOT_COVER; } return cover; @@ -268,18 +302,25 @@ static bool lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * mask, lv_desig lv_btn_state_t state = lv_imgbtn_get_state(imgbtn); const lv_style_t * style = lv_imgbtn_get_style(imgbtn, state); lv_opa_t opa_scale = lv_obj_get_opa_scale(imgbtn); - #if LV_IMGBTN_TILED == 0 const void * src = ext->img_src[state]; - lv_draw_img(&imgbtn->coords, mask, src, style, opa_scale); + if(lv_img_src_get_type(src) == LV_IMG_SRC_SYMBOL) { + lv_draw_label(&imgbtn->coords, clip_area, style, opa_scale, src, LV_TXT_FLAG_NONE, NULL, NULL, NULL, lv_obj_get_base_dir(imgbtn)); + } else { + lv_draw_img(&imgbtn->coords, clip_area, src, style, 0, NULL, LV_IMG_ZOOM_NONE, false, opa_scale); + } #else - const void * src; + const void * src = ext->img_src_left[state]; + if(lv_img_src_get_type(src) == LV_IMG_SRC_SYMBOL) { + LV_LOG_WARN("lv_imgbtn_design: SYMBOLS are not supported in tiled mode") + return LV_DESIGN_RES_OK; + } + lv_img_header_t header; lv_area_t coords; lv_coord_t left_w = 0; lv_coord_t right_w = 0; - src = ext->img_src_left[state]; if(src) { lv_img_decoder_get_info(src, &header); left_w = header.w; @@ -287,7 +328,7 @@ static bool lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * mask, lv_desig coords.y1 = imgbtn->coords.y1; coords.x2 = coords.x1 + header.w - 1; coords.y2 = coords.y1 + header.h - 1; - lv_draw_img(&coords, mask, src, style, opa_scale); + lv_draw_img(&coords, clip_area, src, style, 0, LV_IMG_ZOOM_NONE, false, opa_scale); } src = ext->img_src_right[state]; @@ -298,25 +339,36 @@ static bool lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * mask, lv_desig coords.y1 = imgbtn->coords.y1; coords.x2 = imgbtn->coords.x2; coords.y2 = imgbtn->coords.y1 + header.h - 1; - lv_draw_img(&coords, mask, src, style, opa_scale); + lv_draw_img(&coords, clip_area, src, style, 0, LV_IMG_ZOOM_NONE, false, opa_scale); } src = ext->img_src_mid[state]; if(src) { - lv_coord_t obj_w = lv_obj_get_width(imgbtn); - lv_coord_t i; - lv_img_decoder_get_info(src, &header); + lv_area_t clip_center_area; + clip_center_area.x1 = imgbtn->coords.x1 + left_w; + clip_center_area.x2 = imgbtn->coords.x2 - right_w; + clip_center_area.y1 = imgbtn->coords.y1; + clip_center_area.y2 = imgbtn->coords.y2; - coords.x1 = imgbtn->coords.x1 + left_w; - coords.y1 = imgbtn->coords.y1; - coords.x2 = coords.x1 + header.w - 1; - coords.y2 = imgbtn->coords.y1 + header.h - 1; + bool comm_res; + comm_res = lv_area_intersect(&clip_center_area, &clip_center_area, clip_area); + if(comm_res) { - for(i = 0; i < obj_w - right_w - left_w; i += header.w) { - lv_draw_img(&coords, mask, src, style, opa_scale); - coords.x1 = coords.x2 + 1; - coords.x2 += header.w; - } + lv_coord_t obj_w = lv_obj_get_width(imgbtn); + lv_coord_t i; + lv_img_decoder_get_info(src, &header); + + coords.x1 = imgbtn->coords.x1 + left_w; + coords.y1 = imgbtn->coords.y1; + coords.x2 = coords.x1 + header.w - 1; + coords.y2 = imgbtn->coords.y1 + header.h - 1; + + for(i = 0; i < obj_w - right_w - left_w; i += header.w) { + lv_draw_img(&coords, &clip_center_area, src, style, 0, LV_IMG_ZOOM_NONE, false, opa_scale); + coords.x1 = coords.x2 + 1; + coords.x2 += header.w; + } + } } #endif @@ -326,7 +378,7 @@ static bool lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * mask, lv_desig else if(mode == LV_DESIGN_DRAW_POST) { } - return true; + return LV_DESIGN_RES_OK; } /** @@ -343,6 +395,7 @@ static lv_res_t lv_imgbtn_signal(lv_obj_t * imgbtn, lv_signal_t sign, void * par /* Include the ancient signal function */ res = ancestor_signal(imgbtn, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_STYLE_CHG) { /* If the style changed then the button was clicked, released etc. so probably the state was @@ -350,13 +403,6 @@ static lv_res_t lv_imgbtn_signal(lv_obj_t * imgbtn, lv_signal_t sign, void * par refr_img(imgbtn); } else if(sign == LV_SIGNAL_CLEANUP) { /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_imgbtn"; } return res; @@ -374,8 +420,17 @@ static void refr_img(lv_obj_t * imgbtn) const void * src = ext->img_src_mid[state]; #endif - lv_res_t info_res; - info_res = lv_img_decoder_get_info(src, &header); + lv_res_t info_res = LV_RES_OK; + if(lv_img_src_get_type(src) == LV_IMG_SRC_SYMBOL) { + const lv_style_t * style = ext->btn.styles[state]; + header.h = lv_font_get_line_height(style->text.font); + header.w = lv_txt_get_width(src, (uint16_t)strlen(src), style->text.font, style->text.letter_space, LV_TXT_FLAG_NONE); + header.always_zero = 0; + header.cf = LV_IMG_CF_ALPHA_1BIT; + } else { + info_res = lv_img_decoder_get_info(src, &header); + } + if(info_res == LV_RES_OK) { ext->act_cf = header.cf; #if LV_IMGBTN_TILED == 0 diff --git a/src/lv_objx/lv_kb.c b/src/lv_objx/lv_kb.c index 5577bb925..19a99a7db 100644 --- a/src/lv_objx/lv_kb.c +++ b/src/lv_objx/lv_kb.c @@ -10,12 +10,15 @@ #include "lv_kb.h" #if LV_USE_KB != 0 -#include "lv_ta.h" +#include "../lv_core/lv_debug.h" #include "../lv_themes/lv_theme.h" +#include "lv_ta.h" /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_kb" + #define LV_KB_CTRL_BTN_FLAGS (LV_BTNM_CTRL_NO_REPEAT | LV_BTNM_CTRL_CLICK_TRIG) /********************** @@ -33,8 +36,8 @@ static void lv_kb_updatemap(lv_obj_t * kb); **********************/ static lv_signal_cb_t ancestor_signal; /* clang-format off */ -static const char * const default_kb_map_lc[] = {"1#", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "Bksp", "\n", - "ABC", "a", "s", "d", "f", "g", "h", "j", "k", "l", "Enter", "\n", +static const char * default_kb_map_lc[] = {"1#", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", LV_SYMBOL_BACKSPACE, "\n", + "ABC", "a", "s", "d", "f", "g", "h", "j", "k", "l", LV_SYMBOL_NEW_LINE, "\n", "_", "-", "z", "x", "c", "v", "b", "n", "m", ".", ",", ":", "\n", LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; @@ -44,8 +47,8 @@ static const lv_btnm_ctrl_t default_kb_ctrl_lc_map[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; -static const char * const default_kb_map_uc[] = {"1#", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "Bksp", "\n", - "abc", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Enter", "\n", +static const char * default_kb_map_uc[] = {"1#", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", LV_SYMBOL_BACKSPACE, "\n", + "abc", "A", "S", "D", "F", "G", "H", "J", "K", "L", LV_SYMBOL_NEW_LINE, "\n", "_", "-", "Z", "X", "C", "V", "B", "N", "M", ".", ",", ":", "\n", LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; @@ -55,7 +58,7 @@ static const lv_btnm_ctrl_t default_kb_ctrl_uc_map[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, 2, 6, 2, LV_KB_CTRL_BTN_FLAGS | 2}; -static const char * const default_kb_map_spec[] = {"0", "1", "2", "3", "4" ,"5", "6", "7", "8", "9", "Bksp", "\n", +static const char * default_kb_map_spec[] = {"0", "1", "2", "3", "4" ,"5", "6", "7", "8", "9", "Bksp", "\n", "abc", "+", "-", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; @@ -68,7 +71,7 @@ static const lv_btnm_ctrl_t default_kb_ctrl_spec_map[] = { static const char * const default_kb_map_num[] = {"1", "2", "3", LV_SYMBOL_CLOSE, "\n", "4", "5", "6", LV_SYMBOL_OK, "\n", - "7", "8", "9", "Bksp", "\n", + "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n", "+/-", "0", ".", LV_SYMBOL_LEFT, LV_SYMBOL_RIGHT, ""}; static const lv_btnm_ctrl_t default_kb_ctrl_num_map[] = { @@ -111,15 +114,18 @@ lv_obj_t * lv_kb_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor of keyboard*/ lv_obj_t * new_kb = lv_btnm_create(par, copy); - lv_mem_assert(new_kb); + LV_ASSERT_MEM(new_kb); if(new_kb == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_kb); /*Allocate the keyboard type specific extended data*/ lv_kb_ext_t * ext = lv_obj_allocate_ext_attr(new_kb, sizeof(lv_kb_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_kb); + return NULL; + } /*Initialize the allocated 'ext' */ @@ -139,8 +145,7 @@ lv_obj_t * lv_kb_create(lv_obj_t * par, const lv_obj_t * copy) lv_obj_get_height_fit(lv_obj_get_parent(new_kb)) / 2); lv_obj_align(new_kb, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0); lv_obj_set_event_cb(new_kb, lv_kb_def_event_cb); - lv_btnm_set_map(new_kb, kb_map[LV_KB_MODE_TEXT_LOWER]); - lv_btnm_set_ctrl_map(new_kb, kb_ctrl[LV_KB_MODE_TEXT_LOWER]); + lv_obj_set_base_dir(new_kb, LV_BIDI_DIR_LTR); /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); @@ -183,6 +188,9 @@ lv_obj_t * lv_kb_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_kb_set_ta(lv_obj_t * kb, lv_obj_t * ta) { + LV_ASSERT_OBJ(kb, LV_OBJX_NAME); + if(ta) LV_ASSERT_OBJ(ta, "lv_ta"); + lv_kb_ext_t * ext = lv_obj_get_ext_attr(kb); lv_cursor_type_t cur_type; @@ -208,6 +216,8 @@ void lv_kb_set_ta(lv_obj_t * kb, lv_obj_t * ta) */ void lv_kb_set_mode(lv_obj_t * kb, lv_kb_mode_t mode) { + LV_ASSERT_OBJ(kb, LV_OBJX_NAME); + lv_kb_ext_t * ext = lv_obj_get_ext_attr(kb); if(ext->mode == mode) return; @@ -223,6 +233,8 @@ void lv_kb_set_mode(lv_obj_t * kb, lv_kb_mode_t mode) */ void lv_kb_set_cursor_manage(lv_obj_t * kb, bool en) { + LV_ASSERT_OBJ(kb, LV_OBJX_NAME); + lv_kb_ext_t * ext = lv_obj_get_ext_attr(kb); if(ext->cursor_mng == en) return; @@ -248,6 +260,8 @@ void lv_kb_set_cursor_manage(lv_obj_t * kb, bool en) */ void lv_kb_set_style(lv_obj_t * kb, lv_kb_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(kb, LV_OBJX_NAME); + switch(type) { case LV_KB_STYLE_BG: lv_btnm_set_style(kb, LV_BTNM_STYLE_BG, style); break; case LV_KB_STYLE_BTN_REL: lv_btnm_set_style(kb, LV_BTNM_STYLE_BTN_REL, style); break; @@ -297,6 +311,8 @@ void lv_kb_set_ctrl_map(lv_obj_t * kb, lv_kb_mode_t mode, const lv_btnm_ctrl_t c */ lv_obj_t * lv_kb_get_ta(const lv_obj_t * kb) { + LV_ASSERT_OBJ(kb, LV_OBJX_NAME); + lv_kb_ext_t * ext = lv_obj_get_ext_attr(kb); return ext->ta; } @@ -308,6 +324,8 @@ lv_obj_t * lv_kb_get_ta(const lv_obj_t * kb) */ lv_kb_mode_t lv_kb_get_mode(const lv_obj_t * kb) { + LV_ASSERT_OBJ(kb, LV_OBJX_NAME); + lv_kb_ext_t * ext = lv_obj_get_ext_attr(kb); return ext->mode; } @@ -319,6 +337,8 @@ lv_kb_mode_t lv_kb_get_mode(const lv_obj_t * kb) */ bool lv_kb_get_cursor_manage(const lv_obj_t * kb) { + LV_ASSERT_OBJ(kb, LV_OBJX_NAME); + lv_kb_ext_t * ext = lv_obj_get_ext_attr(kb); return ext->cursor_mng == 0 ? false : true; } @@ -331,6 +351,8 @@ bool lv_kb_get_cursor_manage(const lv_obj_t * kb) */ const lv_style_t * lv_kb_get_style(const lv_obj_t * kb, lv_kb_style_t type) { + LV_ASSERT_OBJ(kb, LV_OBJX_NAME); + const lv_style_t * style = NULL; switch(type) { @@ -359,6 +381,8 @@ const lv_style_t * lv_kb_get_style(const lv_obj_t * kb, lv_kb_style_t type) */ void lv_kb_def_event_cb(lv_obj_t * kb, lv_event_t event) { + LV_ASSERT_OBJ(kb, LV_OBJX_NAME); + if(event != LV_EVENT_VALUE_CHANGED) return; lv_kb_ext_t * ext = lv_obj_get_ext_attr(kb); @@ -409,13 +433,13 @@ void lv_kb_def_event_cb(lv_obj_t * kb, lv_event_t event) /*Add the characters to the text area if set*/ if(ext->ta == NULL) return; - if(strcmp(txt, "Enter") == 0) + if(strcmp(txt, "Enter") == 0 || strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) lv_ta_add_char(ext->ta, '\n'); else if(strcmp(txt, LV_SYMBOL_LEFT) == 0) lv_ta_cursor_left(ext->ta); else if(strcmp(txt, LV_SYMBOL_RIGHT) == 0) lv_ta_cursor_right(ext->ta); - else if(strcmp(txt, "Bksp") == 0) + else if(strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) lv_ta_del_char(ext->ta); else if(strcmp(txt, "+/-") == 0) { uint16_t cur = lv_ta_get_cursor_pos(ext->ta); @@ -458,6 +482,7 @@ static lv_res_t lv_kb_signal(lv_obj_t * kb, lv_signal_t sign, void * param) /* Include the ancient signal function */ res = ancestor_signal(kb, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_CLEANUP) { /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ @@ -475,13 +500,6 @@ static lv_res_t lv_kb_signal(lv_obj_t * kb, lv_signal_t sign, void * param) lv_cursor_type_t cur_type = lv_ta_get_cursor_type(ext->ta); lv_ta_set_cursor_type(ext->ta, cur_type | LV_CURSOR_HIDDEN); } - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_kb"; } return res; diff --git a/src/lv_objx/lv_kb.h b/src/lv_objx/lv_kb.h index 8e25eab7a..9af54065d 100644 --- a/src/lv_objx/lv_kb.h +++ b/src/lv_objx/lv_kb.h @@ -47,6 +47,7 @@ enum { LV_KB_MODE_TEXT_UPPER, LV_KB_MODE_SPECIAL, LV_KB_MODE_NUM, + LV_KB_MODE_TEXT_UPPER, }; typedef uint8_t lv_kb_mode_t; diff --git a/src/lv_objx/lv_label.c b/src/lv_objx/lv_label.c index 0b6046c76..a581fead7 100644 --- a/src/lv_objx/lv_label.c +++ b/src/lv_objx/lv_label.c @@ -10,13 +10,19 @@ #if LV_USE_LABEL != 0 #include "../lv_core/lv_obj.h" +#include "../lv_core/lv_debug.h" #include "../lv_core/lv_group.h" +#include "../lv_draw/lv_draw.h" #include "../lv_misc/lv_color.h" #include "../lv_misc/lv_math.h" +#include "../lv_misc/lv_bidi.h" +#include "../lv_misc/lv_printf.h" /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_label" + /*Test configurations*/ #ifndef LV_LABEL_DEF_SCROLL_SPEED #define LV_LABEL_DEF_SCROLL_SPEED (25) @@ -34,7 +40,7 @@ * STATIC PROTOTYPES **********************/ static lv_res_t lv_label_signal(lv_obj_t * label, lv_signal_t sign, void * param); -static bool lv_label_design(lv_obj_t * label, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_label_design(lv_obj_t * label, const lv_area_t * clip_area, lv_design_mode_t mode); static void lv_label_refr_text(lv_obj_t * label); static void lv_label_revert_dots(lv_obj_t * label); @@ -72,7 +78,7 @@ lv_obj_t * lv_label_create(lv_obj_t * par, const lv_obj_t * copy) /*Create a basic object*/ lv_obj_t * new_label = lv_obj_create(par, copy); - lv_mem_assert(new_label); + LV_ASSERT_MEM(new_label); if(new_label == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_label); @@ -81,14 +87,17 @@ lv_obj_t * lv_label_create(lv_obj_t * par, const lv_obj_t * copy) lv_obj_allocate_ext_attr(new_label, sizeof(lv_label_ext_t)); lv_label_ext_t * ext = lv_obj_get_ext_attr(new_label); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_label); + return NULL; + } ext->text = NULL; ext->static_txt = 0; ext->recolor = 0; ext->body_draw = 0; - ext->align = LV_LABEL_ALIGN_LEFT; + ext->align = LV_LABEL_ALIGN_AUTO; ext->dot_end = LV_LABEL_DOT_END_INV; ext->long_mode = LV_LABEL_LONG_EXPAND; #if LV_USE_ANIMATION @@ -104,8 +113,8 @@ lv_obj_t * lv_label_create(lv_obj_t * par, const lv_obj_t * copy) #endif #if LV_LABEL_TEXT_SEL - ext->txt_sel_start = LV_LABEL_TEXT_SEL_OFF; - ext->txt_sel_end = LV_LABEL_TEXT_SEL_OFF; + ext->txt_sel.start = LV_DRAW_LABEL_NO_TXT_SEL; + ext->txt_sel.end = LV_DRAW_LABEL_NO_TXT_SEL; #endif ext->dot.tmp_ptr = NULL; ext->dot_tmp_alloc = 0; @@ -135,13 +144,13 @@ lv_obj_t * lv_label_create(lv_obj_t * par, const lv_obj_t * copy) /*In DOT mode save the text byte-to-byte because a '\0' can be in the middle*/ if(copy_ext->long_mode == LV_LABEL_LONG_DOT) { ext->text = lv_mem_realloc(ext->text, lv_mem_get_size(copy_ext->text)); - lv_mem_assert(ext->text); + LV_ASSERT_MEM(ext->text); if(ext->text == NULL) return NULL; memcpy(ext->text, copy_ext->text, lv_mem_get_size(copy_ext->text)); } if(copy_ext->dot_tmp_alloc && copy_ext->dot.tmp_ptr) { - int len = strlen(copy_ext->dot.tmp_ptr); + uint16_t len = (uint16_t )strlen(copy_ext->dot.tmp_ptr); lv_label_set_dot_tmp(new_label, ext->dot.tmp_ptr, len); } else { memcpy(ext->dot.tmp, copy_ext->dot.tmp, sizeof(ext->dot.tmp)); @@ -169,6 +178,8 @@ lv_obj_t * lv_label_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_label_set_text(lv_obj_t * label, const char * text) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + lv_obj_invalidate(label); lv_label_ext_t * ext = lv_obj_get_ext_attr(label); @@ -179,30 +190,82 @@ void lv_label_set_text(lv_obj_t * label, const char * text) return; } + LV_ASSERT_STR(text); + if(ext->text == text) { /*If set its own text then reallocate it (maybe its size changed)*/ ext->text = lv_mem_realloc(ext->text, strlen(ext->text) + 1); - lv_mem_assert(ext->text); + LV_ASSERT_MEM(ext->text); if(ext->text == NULL) return; } else { /*Allocate space for the new text*/ - uint32_t len = strlen(text) + 1; + size_t len = strlen(text) + 1; if(ext->text != NULL && ext->static_txt == 0) { lv_mem_free(ext->text); ext->text = NULL; } ext->text = lv_mem_alloc(len); - lv_mem_assert(ext->text); + LV_ASSERT_MEM(ext->text); if(ext->text == NULL) return; strcpy(ext->text, text); - ext->static_txt = 0; /*Now the text is dynamically allocated*/ + + /*Now the text is dynamically allocated*/ + ext->static_txt = 0; } lv_label_refr_text(label); } +/** + * Set a new formatted text for a label. Memory will be allocated to store the text by the label. + * @param label pointer to a label object + * @param fmt `printf`-like format + */ +void lv_label_set_text_fmt(lv_obj_t * label, const char * fmt, ...) +{ + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_STR(fmt); + + lv_obj_invalidate(label); + + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); + + /*If text is NULL then refresh */ + if(fmt == NULL) { + lv_label_refr_text(label); + return; + } + + if(ext->text != NULL && ext->static_txt == 0) { + lv_mem_free(ext->text); + ext->text = NULL; + } + + va_list ap, ap2; + va_start(ap, fmt); + va_copy(ap2, ap); + + /*Allocate space for the new text by using trick from C99 standard section 7.19.6.12 */ + uint32_t len = lv_vsnprintf(NULL, 0, fmt, ap); + + va_end(ap); + + + ext->text = lv_mem_alloc(len+1); + LV_ASSERT_MEM(ext->text); + if(ext->text == NULL) return; + ext->text[len-1] = 0; /* Ensure NULL termination */ + + lv_vsnprintf(ext->text, len+1, fmt, ap2); + + va_end(ap2); + ext->static_txt = 0; /*Now the text is dynamically allocated*/ + + lv_label_refr_text(label); +} + /** * Set a new text for a label from a character array. The array don't has to be '\0' terminated. * Memory will be allocated to store the array by the label. @@ -212,6 +275,8 @@ void lv_label_set_text(lv_obj_t * label, const char * text) */ void lv_label_set_array_text(lv_obj_t * label, const char * array, uint16_t size) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + lv_obj_invalidate(label); lv_label_ext_t * ext = lv_obj_get_ext_attr(label); @@ -228,7 +293,7 @@ void lv_label_set_array_text(lv_obj_t * label, const char * array, uint16_t size ext->text = NULL; } ext->text = lv_mem_alloc(size + 1); - lv_mem_assert(ext->text); + LV_ASSERT_MEM(ext->text); if(ext->text == NULL) return; memcpy(ext->text, array, size); @@ -246,6 +311,9 @@ void lv_label_set_array_text(lv_obj_t * label, const char * array, uint16_t size */ void lv_label_set_static_text(lv_obj_t * label, const char * text) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_STR(text); + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); if(ext->static_txt == 0 && ext->text != NULL) { lv_mem_free(ext->text); @@ -269,6 +337,8 @@ void lv_label_set_static_text(lv_obj_t * label, const char * text) */ void lv_label_set_long_mode(lv_obj_t * label, lv_label_long_mode_t long_mode) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); #if LV_USE_ANIMATION @@ -302,6 +372,8 @@ void lv_label_set_long_mode(lv_obj_t * label, lv_label_long_mode_t long_mode) */ void lv_label_set_align(lv_obj_t * label, lv_label_align_t align) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); if(ext->align == align) return; @@ -318,6 +390,8 @@ void lv_label_set_align(lv_obj_t * label, lv_label_align_t align) */ void lv_label_set_recolor(lv_obj_t * label, bool en) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); if(ext->recolor == en) return; @@ -334,6 +408,8 @@ void lv_label_set_recolor(lv_obj_t * label, bool en) */ void lv_label_set_body_draw(lv_obj_t * label, bool en) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); if(ext->body_draw == en) return; @@ -351,6 +427,8 @@ void lv_label_set_body_draw(lv_obj_t * label, bool en) */ void lv_label_set_anim_speed(lv_obj_t * label, uint16_t anim_speed) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_label_ext_t * ext = lv_obj_get_ext_attr(label); if(ext->anim_speed == anim_speed) return; @@ -368,9 +446,11 @@ void lv_label_set_anim_speed(lv_obj_t * label, uint16_t anim_speed) void lv_label_set_text_sel_start(lv_obj_t * label, uint16_t index) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + #if LV_LABEL_TEXT_SEL lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - ext->txt_sel_start = index; + ext->txt_sel.start = index; lv_obj_invalidate(label); #else (void)label; /*Unused*/ @@ -380,9 +460,11 @@ void lv_label_set_text_sel_start(lv_obj_t * label, uint16_t index) void lv_label_set_text_sel_end(lv_obj_t * label, uint16_t index) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + #if LV_LABEL_TEXT_SEL lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - ext->txt_sel_end = index; + ext->txt_sel.end = index; lv_obj_invalidate(label); #else (void)label; /*Unused*/ @@ -401,6 +483,8 @@ void lv_label_set_text_sel_end(lv_obj_t * label, uint16_t index) */ char * lv_label_get_text(const lv_obj_t * label) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); return ext->text; @@ -413,6 +497,8 @@ char * lv_label_get_text(const lv_obj_t * label) */ lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * label) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); return ext->long_mode; } @@ -424,8 +510,25 @@ lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * label) */ lv_label_align_t lv_label_get_align(const lv_obj_t * label) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - return ext->align; + + lv_label_align_t align = ext->align; + + if(align == LV_LABEL_ALIGN_AUTO) { +#if LV_USE_BIDI + lv_bidi_dir_t base_dir = lv_obj_get_base_dir(label); + if(base_dir == LV_BIDI_DIR_AUTO) base_dir = lv_bidi_detect_base_dir(ext->text); + + if(base_dir == LV_BIDI_DIR_LTR) align = LV_LABEL_ALIGN_LEFT; + else if (base_dir == LV_BIDI_DIR_RTL) align = LV_LABEL_ALIGN_RIGHT; +#else + align = LV_LABEL_ALIGN_LEFT; +#endif + } + + return align; } /** @@ -435,6 +538,8 @@ lv_label_align_t lv_label_get_align(const lv_obj_t * label) */ bool lv_label_get_recolor(const lv_obj_t * label) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); return ext->recolor == 0 ? false : true; } @@ -446,6 +551,8 @@ bool lv_label_get_recolor(const lv_obj_t * label) */ bool lv_label_get_body_draw(const lv_obj_t * label) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); return ext->body_draw == 0 ? false : true; } @@ -457,6 +564,8 @@ bool lv_label_get_body_draw(const lv_obj_t * label) */ uint16_t lv_label_get_anim_speed(const lv_obj_t * label) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_label_ext_t * ext = lv_obj_get_ext_attr(label); return ext->anim_speed; @@ -473,8 +582,11 @@ uint16_t lv_label_get_anim_speed(const lv_obj_t * label) * index (different in UTF-8) * @param pos store the result here (E.g. index = 0 gives 0;0 coordinates) */ -void lv_label_get_letter_pos(const lv_obj_t * label, uint16_t index, lv_point_t * pos) +void lv_label_get_letter_pos(const lv_obj_t * label, uint16_t char_id, lv_point_t * pos) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_NULL(pos); + const char * txt = lv_label_get_text(label); lv_label_ext_t * ext = lv_obj_get_ext_attr(label); uint32_t line_start = 0; @@ -482,25 +594,28 @@ void lv_label_get_letter_pos(const lv_obj_t * label, uint16_t index, lv_point_t lv_coord_t max_w = lv_obj_get_width(label); const lv_style_t * style = lv_obj_get_style(label); const lv_font_t * font = style->text.font; - uint8_t letter_height = lv_font_get_line_height(font); + lv_coord_t letter_height = lv_font_get_line_height(font); lv_coord_t y = 0; lv_txt_flag_t flag = LV_TXT_FLAG_NONE; if(ext->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; if(ext->expand != 0) flag |= LV_TXT_FLAG_EXPAND; - if(ext->align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; + + lv_label_align_t align = lv_label_get_align(label); + if(align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; + if(align == LV_LABEL_ALIGN_RIGHT) flag |= LV_TXT_FLAG_RIGHT; /*If the width will be expanded the set the max length to very big */ if(ext->long_mode == LV_LABEL_LONG_EXPAND) { max_w = LV_COORD_MAX; } - index = lv_txt_encoded_get_byte_id(txt, index); + uint16_t byte_id = lv_txt_encoded_get_byte_id(txt, char_id); /*Search the line of the index letter */; while(txt[new_line_start] != '\0') { new_line_start += lv_txt_get_next_line(&txt[line_start], font, style->text.letter_space, max_w, flag); - if(index < new_line_start || txt[new_line_start] == '\0') + if(byte_id < new_line_start || txt[new_line_start] == '\0') break; /*The line of 'index' letter begins at 'line_start'*/ y += letter_height + style->text.line_space; @@ -508,31 +623,59 @@ void lv_label_get_letter_pos(const lv_obj_t * label, uint16_t index, lv_point_t } /*If the last character is line break then go to the next line*/ - if(index > 0) { - if((txt[index - 1] == '\n' || txt[index - 1] == '\r') && txt[index] == '\0') { + if(byte_id > 0) { + if((txt[byte_id - 1] == '\n' || txt[byte_id - 1] == '\r') && txt[byte_id] == '\0') { y += letter_height + style->text.line_space; - line_start = index; + line_start = byte_id; } } + const char *bidi_txt; + uint16_t visual_byte_pos; +#if LV_USE_BIDI + char *mutable_bidi_txt = NULL; + /*Handle Bidi*/ + if(new_line_start == byte_id) { + visual_byte_pos = byte_id - line_start; + bidi_txt = &txt[line_start]; + } + else { + uint16_t line_char_id = lv_txt_encoded_get_char_id(&txt[line_start], byte_id - line_start); + + bool is_rtl; + uint16_t visual_char_pos = lv_bidi_get_visual_pos(&txt[line_start], &mutable_bidi_txt, new_line_start - line_start, lv_obj_get_base_dir(label), line_char_id, &is_rtl); + bidi_txt = mutable_bidi_txt; + if (is_rtl) visual_char_pos++; + visual_byte_pos = lv_txt_encoded_get_byte_id(bidi_txt, visual_char_pos); + } +#else + bidi_txt = &txt[line_start]; + visual_byte_pos = byte_id - line_start; +#endif + + /*Calculate the x coordinate*/ - lv_coord_t x = lv_txt_get_width(&txt[line_start], index - line_start, font, style->text.letter_space, flag); + lv_coord_t x = lv_txt_get_width(bidi_txt, visual_byte_pos, font, style->text.letter_space, flag); - if(index != line_start) x += style->text.letter_space; + if(char_id != line_start) x += style->text.letter_space; - if(ext->align == LV_LABEL_ALIGN_CENTER) { + if(align == LV_LABEL_ALIGN_CENTER) { lv_coord_t line_w; - line_w = lv_txt_get_width(&txt[line_start], new_line_start - line_start, font, style->text.letter_space, flag); + line_w = lv_txt_get_width(bidi_txt, new_line_start - line_start, font, style->text.letter_space, flag); x += lv_obj_get_width(label) / 2 - line_w / 2; - } else if(ext->align == LV_LABEL_ALIGN_RIGHT) { + } else if(align == LV_LABEL_ALIGN_RIGHT) { lv_coord_t line_w; - line_w = lv_txt_get_width(&txt[line_start], new_line_start - line_start, font, style->text.letter_space, flag); + line_w = lv_txt_get_width(bidi_txt, new_line_start - line_start, font, style->text.letter_space, flag); x += lv_obj_get_width(label) - line_w; } pos->x = x; pos->y = y; + +#if LV_USE_BIDI + if(mutable_bidi_txt) lv_mem_free(mutable_bidi_txt); +#endif } /** @@ -544,6 +687,9 @@ void lv_label_get_letter_pos(const lv_obj_t * label, uint16_t index, lv_point_t */ uint16_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_NULL(pos); + const char * txt = lv_label_get_text(label); lv_label_ext_t * ext = lv_obj_get_ext_attr(label); uint32_t line_start = 0; @@ -551,13 +697,18 @@ uint16_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos) lv_coord_t max_w = lv_obj_get_width(label); const lv_style_t * style = lv_obj_get_style(label); const lv_font_t * font = style->text.font; - uint8_t letter_height = lv_font_get_line_height(font); + lv_coord_t letter_height = lv_font_get_line_height(font); lv_coord_t y = 0; lv_txt_flag_t flag = LV_TXT_FLAG_NONE; + uint16_t logical_pos; + char *bidi_txt; if(ext->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; if(ext->expand != 0) flag |= LV_TXT_FLAG_EXPAND; - if(ext->align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; + + lv_label_align_t align = lv_label_get_align(label); + if(align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; + if(align == LV_LABEL_ALIGN_RIGHT) flag |= LV_TXT_FLAG_RIGHT; /*If the width will be expanded set the max length to very big */ if(ext->long_mode == LV_LABEL_LONG_EXPAND) { @@ -568,38 +719,60 @@ uint16_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos) while(txt[line_start] != '\0') { new_line_start += lv_txt_get_next_line(&txt[line_start], font, style->text.letter_space, max_w, flag); - if(pos->y <= y + letter_height) break; /*The line is found (stored in 'line_start')*/ + if(pos->y <= y + letter_height) { + /*The line is found (stored in 'line_start')*/ + /* Include the NULL terminator in the last line */ + uint32_t tmp = new_line_start; + uint32_t letter; + letter = lv_txt_encoded_prev(txt, &tmp); + if(letter != '\n' && txt[new_line_start] == '\0' ) new_line_start++; + break; + } y += letter_height + style->text.line_space; line_start = new_line_start; } +#if LV_USE_BIDI + bidi_txt = lv_mem_buf_get(new_line_start - line_start + 1); + uint16_t txt_len = new_line_start - line_start; + if(bidi_txt[new_line_start] == '\0') txt_len--; + lv_bidi_process_paragraph(txt + line_start, bidi_txt, txt_len, lv_obj_get_base_dir(label), NULL, 0); +#else + bidi_txt = (char*)txt + line_start; +#endif + /*Calculate the x coordinate*/ lv_coord_t x = 0; - if(ext->align == LV_LABEL_ALIGN_CENTER) { + if(align == LV_LABEL_ALIGN_CENTER) { lv_coord_t line_w; - line_w = lv_txt_get_width(&txt[line_start], new_line_start - line_start, font, style->text.letter_space, flag); + line_w = lv_txt_get_width(bidi_txt, new_line_start - line_start, font, style->text.letter_space, flag); x += lv_obj_get_width(label) / 2 - line_w / 2; } + else if(align == LV_LABEL_ALIGN_RIGHT) { + lv_coord_t line_w; + line_w = lv_txt_get_width(bidi_txt, new_line_start - line_start, font, style->text.letter_space, flag); + x += lv_obj_get_width(label) - line_w; + } lv_txt_cmd_state_t cmd_state = LV_TXT_CMD_STATE_WAIT; - uint32_t i = line_start; + uint32_t i = 0; uint32_t i_act = i; uint32_t letter; uint32_t letter_next; if(new_line_start > 0) { - while(i < new_line_start) { + while(i + line_start < new_line_start) { /* Get the current letter.*/ - letter = lv_txt_encoded_next(txt, &i); + letter = lv_txt_encoded_next(bidi_txt, &i); /*Get the next letter too for kerning*/ - letter_next = lv_txt_encoded_next(&txt[i], NULL); + letter_next = lv_txt_encoded_next(&bidi_txt[i], NULL); /*Handle the recolor command*/ if((flag & LV_TXT_FLAG_RECOLOR) != 0) { - if(lv_txt_is_cmd(&cmd_state, txt[i]) != false) { + if(lv_txt_is_cmd(&cmd_state, bidi_txt[i]) != false) { continue; /*Skip the letter is it is part of a command*/ } } @@ -607,7 +780,7 @@ uint16_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos) x += lv_font_get_glyph_width(font, letter, letter_next); /*Finish if the x position or the last char of the line is reached*/ - if(pos->x < x || i == new_line_start) { + if(pos->x < x || i + line_start == new_line_start) { i = i_act; break; } @@ -616,7 +789,17 @@ uint16_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos) } } - return lv_encoded_get_char_id(txt, i); +#if LV_USE_BIDI + lv_mem_buf_release(bidi_txt); + /*Handle Bidi*/ + bool is_rtl; + logical_pos = lv_bidi_get_logical_pos(&txt[line_start], NULL, txt_len, lv_obj_get_base_dir(label), lv_txt_encoded_get_char_id(bidi_txt, i), &is_rtl); + if (is_rtl) logical_pos++; +#else + logical_pos = lv_txt_encoded_get_char_id(bidi_txt, i); +#endif + + return logical_pos + lv_txt_encoded_get_char_id(txt, line_start); } /** @@ -626,9 +809,11 @@ uint16_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos) */ uint16_t lv_label_get_text_sel_start(const lv_obj_t * label) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + #if LV_LABEL_TEXT_SEL lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - return ext->txt_sel_start; + return ext->txt_sel.start; #else (void)label; /*Unused*/ @@ -643,9 +828,11 @@ uint16_t lv_label_get_text_sel_start(const lv_obj_t * label) */ uint16_t lv_label_get_text_sel_end(const lv_obj_t * label) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + #if LV_LABEL_TEXT_SEL lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - return ext->txt_sel_end; + return ext->txt_sel.end; #else (void)label; /*Unused*/ return LV_LABEL_TEXT_SEL_OFF; @@ -660,6 +847,9 @@ uint16_t lv_label_get_text_sel_end(const lv_obj_t * label) */ bool lv_label_is_char_under_pos(const lv_obj_t * label, lv_point_t * pos) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_NULL(pos); + const char * txt = lv_label_get_text(label); lv_label_ext_t * ext = lv_obj_get_ext_attr(label); uint32_t line_start = 0; @@ -667,13 +857,14 @@ bool lv_label_is_char_under_pos(const lv_obj_t * label, lv_point_t * pos) lv_coord_t max_w = lv_obj_get_width(label); const lv_style_t * style = lv_obj_get_style(label); const lv_font_t * font = style->text.font; - uint8_t letter_height = lv_font_get_line_height(font); + lv_coord_t letter_height = lv_font_get_line_height(font); lv_coord_t y = 0; lv_txt_flag_t flag = LV_TXT_FLAG_NONE; + lv_label_align_t align = lv_label_get_align(label); if(ext->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; if(ext->expand != 0) flag |= LV_TXT_FLAG_EXPAND; - if(ext->align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; + if(align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; /*If the width will be expanded set the max length to very big */ if(ext->long_mode == LV_LABEL_LONG_EXPAND) { @@ -693,11 +884,16 @@ bool lv_label_is_char_under_pos(const lv_obj_t * label, lv_point_t * pos) /*Calculate the x coordinate*/ lv_coord_t x = 0; lv_coord_t last_x = 0; - if(ext->align == LV_LABEL_ALIGN_CENTER) { + if(align == LV_LABEL_ALIGN_CENTER) { lv_coord_t line_w; line_w = lv_txt_get_width(&txt[line_start], new_line_start - line_start, font, style->text.letter_space, flag); x += lv_obj_get_width(label) / 2 - line_w / 2; } + else if(align == LV_LABEL_ALIGN_RIGHT) { + lv_coord_t line_w; + line_w = lv_txt_get_width(&txt[line_start], new_line_start - line_start, font, style->text.letter_space, flag); + x += lv_obj_get_width(label) - line_w; + } lv_txt_cmd_state_t cmd_state = LV_TXT_CMD_STATE_WAIT; @@ -749,6 +945,9 @@ bool lv_label_is_char_under_pos(const lv_obj_t * label, lv_point_t * pos) */ void lv_label_ins_text(lv_obj_t * label, uint32_t pos, const char * txt) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + LV_ASSERT_STR(txt); + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); /*Can not append to static text*/ @@ -757,20 +956,30 @@ void lv_label_ins_text(lv_obj_t * label, uint32_t pos, const char * txt) lv_obj_invalidate(label); /*Allocate space for the new text*/ - uint32_t old_len = strlen(ext->text); - uint32_t ins_len = strlen(txt); - uint32_t new_len = ins_len + old_len; + size_t old_len = strlen(ext->text); + size_t ins_len = strlen(txt); + size_t new_len = ins_len + old_len; ext->text = lv_mem_realloc(ext->text, new_len + 1); - lv_mem_assert(ext->text); + LV_ASSERT_MEM(ext->text); if(ext->text == NULL) return; if(pos == LV_LABEL_POS_LAST) { pos = lv_txt_get_encoded_length(ext->text); } - lv_txt_ins(ext->text, pos, txt); +#if LV_USE_BIDI + char * bidi_buf = lv_mem_buf_get(ins_len + 1); + LV_ASSERT_MEM(bidi_buf); + if(bidi_buf == NULL) return; + lv_bidi_process(txt, bidi_buf, lv_obj_get_base_dir(label)); + lv_txt_ins(ext->text, pos, bidi_buf); + + lv_mem_buf_release(bidi_buf); +#else + lv_txt_ins(ext->text, pos, txt); lv_label_refr_text(label); +#endif } /** @@ -782,6 +991,8 @@ void lv_label_ins_text(lv_obj_t * label, uint32_t pos, const char * txt) */ void lv_label_cut_text(lv_obj_t * label, uint32_t pos, uint32_t cnt) { + LV_ASSERT_OBJ(label, LV_OBJX_NAME); + lv_label_ext_t * ext = lv_obj_get_ext_attr(label); /*Can not append to static text*/ @@ -804,18 +1015,18 @@ void lv_label_cut_text(lv_obj_t * label, uint32_t pos, uint32_t cnt) /** * Handle the drawing related tasks of the labels * @param label pointer to a label object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_label_design(lv_obj_t * label, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_label_design(lv_obj_t * label, const lv_area_t * clip_area, lv_design_mode_t mode) { /* A label never covers an area */ if(mode == LV_DESIGN_COVER_CHK) - return false; + return LV_DESIGN_RES_NOT_COVER; else if(mode == LV_DESIGN_DRAW_MAIN) { lv_area_t coords; const lv_style_t * style = lv_obj_get_style(label); @@ -825,7 +1036,7 @@ static bool lv_label_design(lv_obj_t * label, const lv_area_t * mask, lv_design_ #if LV_USE_GROUP lv_group_t * g = lv_obj_get_group(label); if(lv_group_get_focused(g) == label) { - lv_draw_rect(&coords, mask, style, opa_scale); + lv_draw_rect(&coords, clip_area, style, opa_scale); } #endif @@ -839,17 +1050,16 @@ static bool lv_label_design(lv_obj_t * label, const lv_area_t * mask, lv_design_ bg.y1 -= style->body.padding.top; bg.y2 += style->body.padding.bottom; - lv_draw_rect(&bg, mask, style, lv_obj_get_opa_scale(label)); + lv_draw_rect(&bg, clip_area, style, lv_obj_get_opa_scale(label)); } - /*TEST: draw a background for the label*/ - // lv_draw_rect(&label->coords, mask, &lv_style_plain_color, LV_OPA_COVER); + lv_label_align_t align = lv_label_get_align(label); lv_txt_flag_t flag = LV_TXT_FLAG_NONE; if(ext->recolor != 0) flag |= LV_TXT_FLAG_RECOLOR; if(ext->expand != 0) flag |= LV_TXT_FLAG_EXPAND; - if(ext->align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; - if(ext->align == LV_LABEL_ALIGN_RIGHT) flag |= LV_TXT_FLAG_RIGHT; + if(align == LV_LABEL_ALIGN_CENTER) flag |= LV_TXT_FLAG_CENTER; + if(align == LV_LABEL_ALIGN_RIGHT) flag |= LV_TXT_FLAG_RIGHT; /* In ROLL mode the CENTER and RIGHT are pointless so remove them. * (In addition they will result mis-alignment is this case)*/ @@ -872,9 +1082,11 @@ static bool lv_label_design(lv_obj_t * label, const lv_area_t * mask, lv_design_ /*Just for compatibility*/ lv_draw_label_hint_t * hint = NULL; #endif - lv_draw_label(&coords, mask, style, opa_scale, ext->text, flag, &ext->offset, - lv_label_get_text_sel_start(label), lv_label_get_text_sel_end(label), hint); + lv_draw_label_txt_sel_t sel; + sel.start = lv_label_get_text_sel_start(label); + sel.end = lv_label_get_text_sel_end(label); + lv_draw_label(&coords, clip_area, style, opa_scale, ext->text, flag, &ext->offset, &sel, hint, lv_obj_get_base_dir(label)); if(ext->long_mode == LV_LABEL_LONG_SROLL_CIRC) { lv_point_t size; @@ -889,20 +1101,19 @@ static bool lv_label_design(lv_obj_t * label, const lv_area_t * mask, lv_design_ lv_font_get_glyph_width(style->text.font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; ofs.y = ext->offset.y; - lv_draw_label(&coords, mask, style, opa_scale, ext->text, flag, &ofs, - lv_label_get_text_sel_start(label), lv_label_get_text_sel_end(label), NULL); + lv_draw_label(&coords, clip_area, style, opa_scale, ext->text, flag, &ofs, &sel, NULL, lv_obj_get_base_dir(label)); } /*Draw the text again below the original to make an circular effect */ if(size.y > lv_obj_get_height(label)) { ofs.x = ext->offset.x; ofs.y = ext->offset.y + size.y + lv_font_get_line_height(style->text.font); - lv_draw_label(&coords, mask, style, opa_scale, ext->text, flag, &ofs, - lv_label_get_text_sel_start(label), lv_label_get_text_sel_end(label), NULL); + lv_draw_label(&coords, clip_area, style, opa_scale, ext->text, flag, &ofs, &sel, NULL, lv_obj_get_base_dir(label)); } } } - return true; + + return LV_DESIGN_RES_OK; } /** @@ -919,6 +1130,7 @@ static lv_res_t lv_label_signal(lv_obj_t * label, lv_signal_t sign, void * param /* Include the ancient signal function */ res = ancestor_signal(label, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_label_ext_t * ext = lv_obj_get_ext_attr(label); if(sign == LV_SIGNAL_CLEANUP) { @@ -947,6 +1159,11 @@ static lv_res_t lv_label_signal(lv_obj_t * label, lv_signal_t sign, void * param label->ext_draw_pad = LV_MATH_MAX(label->ext_draw_pad, style->body.padding.top); label->ext_draw_pad = LV_MATH_MAX(label->ext_draw_pad, style->body.padding.bottom); } + } + else if(sign == LV_SIGNAL_BASE_DIR_CHG) { +#if LV_USE_BIDI + if(ext->static_txt == 0) lv_label_set_text(label, NULL); +#endif } else if(sign == LV_SIGNAL_GET_TYPE) { lv_obj_type_t * buf = param; uint8_t i; @@ -1038,11 +1255,12 @@ static void lv_label_refr_text(lv_obj_t * label) /*In roll inf. mode keep the size but start offset animations*/ else if(ext->long_mode == LV_LABEL_LONG_SROLL_CIRC) { #if LV_USE_ANIMATION + lv_label_align_t align = lv_label_get_align(label); + lv_anim_t anim; anim.var = label; anim.repeat = 1; anim.playback = 0; - anim.start = 0; anim.act_time = -(((lv_font_get_glyph_width(style->text.font, ' ', ' ') + style->text.letter_space) * 1000) / ext->anim_speed) * LV_LABEL_WAIT_CHAR_COUNT; @@ -1053,7 +1271,14 @@ static void lv_label_refr_text(lv_obj_t * label) bool hor_anim = false; if(size.x > lv_obj_get_width(label)) { - anim.end = -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; + if(align == LV_LABEL_ALIGN_RIGHT) { + anim.end = 0; + anim.start = -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; + } else { + anim.start = 0; + anim.end = -size.x - lv_font_get_glyph_width(font, ' ', ' ') * LV_LABEL_WAIT_CHAR_COUNT; + } + anim.exec_cb = (lv_anim_exec_xcb_t)lv_label_set_offset_x; anim.time = lv_anim_speed_to_time(ext->anim_speed, anim.start, anim.end); lv_anim_create(&anim); @@ -1065,7 +1290,14 @@ static void lv_label_refr_text(lv_obj_t * label) } if(size.y > lv_obj_get_height(label) && hor_anim == false) { - anim.end = -size.y - (lv_font_get_line_height(font)); + if(align == LV_LABEL_ALIGN_RIGHT) { + anim.end = 0; + anim.start = -size.y - (lv_font_get_line_height(font)); + } else { + anim.start = 0; + anim.end = -size.y - (lv_font_get_line_height(font)); + } + anim.exec_cb = (lv_anim_exec_xcb_t)lv_label_set_offset_y; anim.time = lv_anim_speed_to_time(ext->anim_speed, anim.start, anim.end); lv_anim_create(&anim); diff --git a/src/lv_objx/lv_label.h b/src/lv_objx/lv_label.h index 16b1a6e8f..976854235 100644 --- a/src/lv_objx/lv_label.h +++ b/src/lv_objx/lv_label.h @@ -21,6 +21,7 @@ extern "C" { #if LV_USE_LABEL != 0 +#include #include "../lv_core/lv_obj.h" #include "../lv_font/lv_font.h" #include "../lv_font/lv_symbol_def.h" @@ -32,7 +33,11 @@ extern "C" { *********************/ #define LV_LABEL_DOT_NUM 3 #define LV_LABEL_POS_LAST 0xFFFF -#define LV_LABEL_TEXT_SEL_OFF 0xFFFF +#define LV_LABEL_TEXT_SEL_OFF LV_DRAW_LABEL_NO_TXT_SEL + +LV_EXPORT_CONST_INT(LV_LABEL_DOT_NUM); +LV_EXPORT_CONST_INT(LV_LABEL_POS_LAST); +LV_EXPORT_CONST_INT(LV_LABEL_TEXT_SEL_OFF); /********************** * TYPEDEFS @@ -55,6 +60,7 @@ enum { LV_LABEL_ALIGN_LEFT, /**< Align text to left */ LV_LABEL_ALIGN_CENTER, /**< Align text to center */ LV_LABEL_ALIGN_RIGHT, /**< Align text to right */ + LV_LABEL_ALIGN_AUTO, /**< Use LEFT or RIGHT depending on the direction of the text (LTR/RTL)*/ }; typedef uint8_t lv_label_align_t; @@ -63,26 +69,29 @@ typedef struct { /*Inherited from 'base_obj' so no inherited ext.*/ /*Ext. of ancestor*/ /*New data for this type */ - char * text; /*Text of the label*/ + char * text; /*Text of the label*/ + union { char * tmp_ptr; /* Pointer to the allocated memory containing the character which are replaced by dots (Handled by the library)*/ - char tmp[sizeof(char *)]; /* Directly store the characters if <=4 characters */ + char tmp[LV_LABEL_DOT_NUM + 1]; /* Directly store the characters if <=4 characters */ } dot; + uint16_t dot_end; /*The text end position in dot mode (Handled by the library)*/ - lv_point_t offset; /*Text draw position offset*/ -#if LV_LABEL_LONG_TXT_HINT - lv_draw_label_hint_t hint; /*Used to buffer info about large text*/ -#endif #if LV_USE_ANIMATION uint16_t anim_speed; /*Speed of scroll and roll animation in px/sec unit*/ #endif + lv_point_t offset; /*Text draw position offset*/ + +#if LV_LABEL_LONG_TXT_HINT + lv_draw_label_hint_t hint; /*Used to buffer info about large text*/ +#endif + #if LV_LABEL_TEXT_SEL - uint16_t txt_sel_start; /*Left-most selection character*/ - uint16_t txt_sel_end; /*Right-most selection character*/ + lv_draw_label_txt_sel_t txt_sel; #endif lv_label_long_mode_t long_mode : 3; /*Determinate what to do with the long texts*/ @@ -124,6 +133,13 @@ lv_obj_t * lv_label_create(lv_obj_t * par, const lv_obj_t * copy); */ void lv_label_set_text(lv_obj_t * label, const char * text); +/** + * Set a new formatted text for a label. Memory will be allocated to store the text by the label. + * @param label pointer to a label object + * @param fmt `printf`-like format + */ +void lv_label_set_text_fmt(lv_obj_t * label, const char * fmt, ...); + /** * Set a new text for a label from a character array. The array don't has to be '\0' terminated. * Memory will be allocated to store the array by the label. diff --git a/src/lv_objx/lv_led.c b/src/lv_objx/lv_led.c index c991b518b..b51bc490b 100644 --- a/src/lv_objx/lv_led.c +++ b/src/lv_objx/lv_led.c @@ -9,12 +9,15 @@ #include "lv_led.h" #if LV_USE_LED != 0 +#include "../lv_core/lv_debug.h" #include "../lv_themes/lv_theme.h" #include "../lv_draw/lv_draw.h" /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_led" + #define LV_LED_WIDTH_DEF (LV_DPI / 3) #define LV_LED_HEIGHT_DEF (LV_DPI / 3) #define LV_LED_BRIGHT_OFF 100 @@ -27,13 +30,13 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_led_design(lv_obj_t * led, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_led_design(lv_obj_t * led, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_led_signal(lv_obj_t * led, lv_signal_t sign, void * param); /********************** * STATIC VARIABLES **********************/ -static lv_design_cb_t ancestor_design_f; +static lv_design_cb_t ancestor_design; static lv_signal_cb_t ancestor_signal; /********************** @@ -56,16 +59,19 @@ lv_obj_t * lv_led_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor basic object*/ lv_obj_t * new_led = lv_obj_create(par, copy); - lv_mem_assert(new_led); + LV_ASSERT_MEM(new_led); if(new_led == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_led); - if(ancestor_design_f == NULL) ancestor_design_f = lv_obj_get_design_cb(new_led); + if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_led); /*Allocate the object type specific extended data*/ lv_led_ext_t * ext = lv_obj_allocate_ext_attr(new_led, sizeof(lv_led_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_led); + return NULL; + } ext->bright = LV_LED_BRIGHT_ON; @@ -109,6 +115,8 @@ lv_obj_t * lv_led_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_led_set_bright(lv_obj_t * led, uint8_t bright) { + LV_ASSERT_OBJ(led, LV_OBJX_NAME); + /*Set the brightness*/ lv_led_ext_t * ext = lv_obj_get_ext_attr(led); if(ext->bright == bright) return; @@ -125,6 +133,8 @@ void lv_led_set_bright(lv_obj_t * led, uint8_t bright) */ void lv_led_on(lv_obj_t * led) { + LV_ASSERT_OBJ(led, LV_OBJX_NAME); + lv_led_set_bright(led, LV_LED_BRIGHT_ON); } @@ -134,6 +144,8 @@ void lv_led_on(lv_obj_t * led) */ void lv_led_off(lv_obj_t * led) { + LV_ASSERT_OBJ(led, LV_OBJX_NAME); + lv_led_set_bright(led, LV_LED_BRIGHT_OFF); } @@ -143,6 +155,8 @@ void lv_led_off(lv_obj_t * led) */ void lv_led_toggle(lv_obj_t * led) { + LV_ASSERT_OBJ(led, LV_OBJX_NAME); + uint8_t bright = lv_led_get_bright(led); if(bright > (LV_LED_BRIGHT_OFF + LV_LED_BRIGHT_ON) >> 1) lv_led_off(led); @@ -161,6 +175,8 @@ void lv_led_toggle(lv_obj_t * led) */ uint8_t lv_led_get_bright(const lv_obj_t * led) { + LV_ASSERT_OBJ(led, LV_OBJX_NAME); + lv_led_ext_t * ext = lv_obj_get_ext_attr(led); return ext->bright; } @@ -172,18 +188,18 @@ uint8_t lv_led_get_bright(const lv_obj_t * led) /** * Handle the drawing related tasks of the leds * @param led pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_led_design(lv_obj_t * led, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_led_design(lv_obj_t * led, const lv_area_t * clip_area, lv_design_mode_t mode) { if(mode == LV_DESIGN_COVER_CHK) { - /*Return false if the object is not covers the mask area*/ - return ancestor_design_f(led, mask, mode); + /*Return false if the object is not covers the clip_area area*/ + return ancestor_design(led, clip_area, mode); } else if(mode == LV_DESIGN_DRAW_MAIN) { /*Make darker colors in a temporary style according to the brightness*/ lv_led_ext_t * ext = lv_obj_get_ext_attr(led); @@ -210,10 +226,10 @@ static bool lv_led_design(lv_obj_t * led, const lv_area_t * mask, lv_design_mode ((bright_tmp - LV_LED_BRIGHT_OFF) * style->body.shadow.width) / (LV_LED_BRIGHT_ON - LV_LED_BRIGHT_OFF); led->style_p = &leds_tmp; - ancestor_design_f(led, mask, mode); + ancestor_design(led, clip_area, mode); led->style_p = style_ori_p; /*Restore the ORIGINAL style pointer*/ } - return true; + return LV_DESIGN_RES_OK; } /** diff --git a/src/lv_objx/lv_line.c b/src/lv_objx/lv_line.c index 3831449a0..d9b25e46b 100644 --- a/src/lv_objx/lv_line.c +++ b/src/lv_objx/lv_line.c @@ -9,6 +9,7 @@ #include "lv_line.h" #if LV_USE_LINE != 0 +#include "../lv_core/lv_debug.h" #include "../lv_draw/lv_draw.h" #include "../lv_misc/lv_math.h" #include @@ -18,6 +19,7 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_line" /********************** * TYPEDEFS @@ -26,7 +28,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_line_design(lv_obj_t * line, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_line_design(lv_obj_t * line, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_line_signal(lv_obj_t * line, lv_signal_t sign, void * param); /********************** @@ -53,15 +55,18 @@ lv_obj_t * lv_line_create(lv_obj_t * par, const lv_obj_t * copy) /*Create a basic object*/ lv_obj_t * new_line = lv_obj_create(par, copy); - lv_mem_assert(new_line); + LV_ASSERT_MEM(new_line); if(new_line == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_line); /*Extend the basic object to line object*/ lv_line_ext_t * ext = lv_obj_allocate_ext_attr(new_line, sizeof(lv_line_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_line); + return NULL; + } ext->point_num = 0; ext->point_array = NULL; @@ -107,6 +112,8 @@ lv_obj_t * lv_line_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_line_set_points(lv_obj_t * line, const lv_point_t point_a[], uint16_t point_num) { + LV_ASSERT_OBJ(line, LV_OBJX_NAME); + lv_line_ext_t * ext = lv_obj_get_ext_attr(line); ext->point_array = point_a; ext->point_num = point_num; @@ -135,6 +142,8 @@ void lv_line_set_points(lv_obj_t * line, const lv_point_t point_a[], uint16_t po */ void lv_line_set_auto_size(lv_obj_t * line, bool en) { + LV_ASSERT_OBJ(line, LV_OBJX_NAME); + lv_line_ext_t * ext = lv_obj_get_ext_attr(line); if(ext->auto_size == en) return; @@ -153,6 +162,8 @@ void lv_line_set_auto_size(lv_obj_t * line, bool en) */ void lv_line_set_y_invert(lv_obj_t * line, bool en) { + LV_ASSERT_OBJ(line, LV_OBJX_NAME); + lv_line_ext_t * ext = lv_obj_get_ext_attr(line); if(ext->y_inv == en) return; @@ -172,6 +183,8 @@ void lv_line_set_y_invert(lv_obj_t * line, bool en) */ bool lv_line_get_auto_size(const lv_obj_t * line) { + LV_ASSERT_OBJ(line, LV_OBJX_NAME); + lv_line_ext_t * ext = lv_obj_get_ext_attr(line); return ext->auto_size == 0 ? false : true; @@ -184,6 +197,8 @@ bool lv_line_get_auto_size(const lv_obj_t * line) */ bool lv_line_get_y_invert(const lv_obj_t * line) { + LV_ASSERT_OBJ(line, LV_OBJX_NAME); + lv_line_ext_t * ext = lv_obj_get_ext_attr(line); return ext->y_inv == 0 ? false : true; @@ -196,18 +211,18 @@ bool lv_line_get_y_invert(const lv_obj_t * line) /** * Handle the drawing related tasks of the lines * @param line pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_line_design(lv_obj_t * line, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_line_design(lv_obj_t * line, const lv_area_t * clip_area, lv_design_mode_t mode) { /*A line never covers an area*/ if(mode == LV_DESIGN_COVER_CHK) - return false; + return LV_DESIGN_RES_NOT_COVER; else if(mode == LV_DESIGN_DRAW_MAIN) { lv_line_ext_t * ext = lv_obj_get_ext_attr(line); @@ -225,12 +240,16 @@ static bool lv_line_design(lv_obj_t * line, const lv_area_t * mask, lv_design_mo uint16_t i; lv_style_t circle_style_tmp; /*If rounded...*/ - lv_style_copy(&circle_style_tmp, style); - circle_style_tmp.body.radius = LV_RADIUS_CIRCLE; - circle_style_tmp.body.main_color = style->line.color; - circle_style_tmp.body.grad_color = style->line.color; - circle_style_tmp.body.opa = style->line.opa; + if(style->line.rounded) { + lv_style_copy(&circle_style_tmp, style); + circle_style_tmp.body.radius = LV_RADIUS_CIRCLE; + circle_style_tmp.body.main_color = style->line.color; + circle_style_tmp.body.grad_color = style->line.color; + circle_style_tmp.body.opa = style->line.opa; + } lv_area_t circle_area; + lv_coord_t r = (style->line.width >> 1); + lv_coord_t r_corr = (style->line.width & 1) ? 0 : 1; /*Read all points and draw the lines*/ for(i = 0; i < ext->point_num - 1; i++) { @@ -245,28 +264,28 @@ static bool lv_line_design(lv_obj_t * line, const lv_area_t * mask, lv_design_mo p1.y = h - ext->point_array[i].y + y_ofs; p2.y = h - ext->point_array[i + 1].y + y_ofs; } - lv_draw_line(&p1, &p2, mask, style, opa_scale); + lv_draw_line(&p1, &p2, clip_area, style, opa_scale); /*Draw circle on the joints if enabled*/ if(style->line.rounded) { - circle_area.x1 = p1.x - ((style->line.width - 1) >> 1) - ((style->line.width - 1) & 0x1); - circle_area.y1 = p1.y - ((style->line.width - 1) >> 1) - ((style->line.width - 1) & 0x1); - circle_area.x2 = p1.x + ((style->line.width - 1) >> 1); - circle_area.y2 = p1.y + ((style->line.width - 1) >> 1); - lv_draw_rect(&circle_area, mask, &circle_style_tmp, opa_scale); + circle_area.x1 = p1.x - r; + circle_area.y1 = p1.y - r; + circle_area.x2 = p1.x + r - r_corr; + circle_area.y2 = p1.y + r - r_corr ; + lv_draw_rect(&circle_area, clip_area, &circle_style_tmp, opa_scale); } } /*Draw circle on the last point too if enabled*/ if(style->line.rounded) { - circle_area.x1 = p2.x - ((style->line.width - 1) >> 1) - ((style->line.width - 1) & 0x1); - circle_area.y1 = p2.y - ((style->line.width - 1) >> 1) - ((style->line.width - 1) & 0x1); - circle_area.x2 = p2.x + ((style->line.width - 1) >> 1); - circle_area.y2 = p2.y + ((style->line.width - 1) >> 1); - lv_draw_rect(&circle_area, mask, &circle_style_tmp, opa_scale); + circle_area.x1 = p2.x - r; + circle_area.y1 = p2.y - r; + circle_area.x2 = p2.x + r - r_corr; + circle_area.y2 = p2.y + r - r_corr; + lv_draw_rect(&circle_area, clip_area, &circle_style_tmp, opa_scale); } } - return true; + return LV_DESIGN_RES_OK; } /** @@ -282,15 +301,9 @@ static lv_res_t lv_line_signal(lv_obj_t * line, lv_signal_t sign, void * param) /* Include the ancient signal function */ res = ancestor_signal(line, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); - if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_line"; - } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { + if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { const lv_style_t * style = lv_line_get_style(line, LV_LINE_STYLE_MAIN); if(line->ext_draw_pad < style->line.width) line->ext_draw_pad = style->line.width; } diff --git a/src/lv_objx/lv_list.c b/src/lv_objx/lv_list.c index ef50c4afe..f29f555dc 100644 --- a/src/lv_objx/lv_list.c +++ b/src/lv_objx/lv_list.c @@ -9,6 +9,7 @@ #include "lv_list.h" #if LV_USE_LIST != 0 +#include "../lv_core/lv_debug.h" #include "../lv_core/lv_group.h" #include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_anim.h" @@ -17,6 +18,8 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_list" + #define LV_LIST_LAYOUT_DEF LV_LAYOUT_COL_M #if LV_USE_ANIMATION == 0 @@ -69,14 +72,17 @@ lv_obj_t * lv_list_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor basic object*/ lv_obj_t * new_list = lv_page_create(par, copy); - lv_mem_assert(new_list); + LV_ASSERT_MEM(new_list); if(new_list == NULL) return NULL; if(ancestor_page_signal == NULL) ancestor_page_signal = lv_obj_get_signal_cb(new_list); lv_list_ext_t * ext = lv_obj_allocate_ext_attr(new_list, sizeof(lv_list_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_list); + return NULL; + } ext->style_img = NULL; ext->styles_btn[LV_BTN_STATE_REL] = &lv_style_btn_rel; @@ -149,13 +155,15 @@ lv_obj_t * lv_list_create(lv_obj_t * par, const lv_obj_t * copy) /** * Delete all children of the scrl object, without deleting scrl child. - * @param obj pointer to an object + * @param list pointer to an object */ -void lv_list_clean(lv_obj_t * obj) +void lv_list_clean(lv_obj_t * list) { - lv_obj_t * scrl = lv_page_get_scrl(obj); + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + + lv_obj_t * scrl = lv_page_get_scrl(list); lv_obj_clean(scrl); - lv_list_ext_t * ext = lv_obj_get_ext_attr(obj); + lv_list_ext_t * ext = lv_obj_get_ext_attr(list); ext->size = 0; } @@ -172,6 +180,8 @@ void lv_list_clean(lv_obj_t * obj) */ lv_obj_t * lv_list_add_btn(lv_obj_t * list, const void * img_src, const char * txt) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + lv_list_ext_t * ext = lv_obj_get_ext_attr(list); ext->size++; /*Create a list element with the image an the text*/ @@ -211,7 +221,8 @@ lv_obj_t * lv_list_add_btn(lv_obj_t * list, const void * img_src, const char * t lv_label_set_text(label, txt); lv_obj_set_click(label, false); lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL_CIRC); - lv_obj_set_width(label, liste->coords.x2 - label->coords.x1 - btn_hor_pad); + if(lv_obj_get_base_dir(liste) == LV_BIDI_DIR_RTL) lv_obj_set_width(label, label->coords.x2 - liste->coords.x1 - btn_hor_pad); + else lv_obj_set_width(label, liste->coords.x2 - label->coords.x1 - btn_hor_pad); if(label_signal == NULL) label_signal = lv_obj_get_signal_cb(label); } #if LV_USE_GROUP @@ -237,6 +248,8 @@ lv_obj_t * lv_list_add_btn(lv_obj_t * list, const void * img_src, const char * t */ bool lv_list_remove(const lv_obj_t * list, uint16_t index) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + lv_list_ext_t * ext = lv_obj_get_ext_attr(list); if(index >= ext->size) return false; uint16_t count = 0; @@ -264,6 +277,8 @@ bool lv_list_remove(const lv_obj_t * list, uint16_t index) */ void lv_list_set_single_mode(lv_obj_t * list, bool mode) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + lv_list_ext_t * ext = lv_obj_get_ext_attr(list); ext->single_mode = mode; @@ -279,6 +294,9 @@ void lv_list_set_single_mode(lv_obj_t * list, bool mode) */ void lv_list_set_btn_selected(lv_obj_t * list, lv_obj_t * btn) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + if(btn) LV_ASSERT_OBJ(list, "lv_btn"); + lv_list_ext_t * ext = lv_obj_get_ext_attr(list); if(ext->selected_btn) { @@ -304,7 +322,7 @@ void lv_list_set_btn_selected(lv_obj_t * list, lv_obj_t * btn) else if(s == LV_BTN_STATE_TGL_REL) lv_btn_set_state(ext->selected_btn, LV_BTN_STATE_TGL_PR); - lv_page_focus(list, ext->selected_btn, lv_list_get_anim_time(list)); + lv_page_focus(list, ext->selected_btn, LV_ANIM_ON); } } @@ -318,6 +336,8 @@ void lv_list_set_btn_selected(lv_obj_t * list, lv_obj_t * btn) */ void lv_list_set_style(lv_obj_t * list, lv_list_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + lv_list_ext_t * ext = lv_obj_get_ext_attr(list); lv_btn_style_t btn_style_refr = LV_BTN_STYLE_REL; lv_obj_t * btn; @@ -363,6 +383,38 @@ void lv_list_set_style(lv_obj_t * list, lv_list_style_t type, const lv_style_t * } } +/** + * Set layout of a list + * @param list pointer to a list object + * @param layout which layout should be used + */ + void lv_list_set_layout(lv_obj_t * list, lv_layout_t layout) + { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + + /* Update list layout if necessary */ + if (layout == lv_list_get_layout(list)) return; + + /* Get the first button on the list */ + lv_obj_t * btn = lv_list_get_prev_btn(list, NULL); + + /* Visit all buttons on the list and update their layout */ + while(btn != NULL) { + /*If a column layout set the buttons' width to list width*/ + if(layout == LV_LAYOUT_COL_M || layout == LV_LAYOUT_COL_L || layout == LV_LAYOUT_COL_R) { + lv_btn_set_fit2(list, LV_FIT_FLOOD, LV_FIT_TIGHT); + } + /*If a row layout set the buttons' width according to the content*/ + else if (layout == LV_LAYOUT_ROW_M || layout == LV_LAYOUT_ROW_T || layout == LV_LAYOUT_ROW_B) { + lv_btn_set_fit(list, LV_FIT_TIGHT); + } + + btn = lv_list_get_prev_btn(list, btn); + } + + lv_page_set_scrl_layout(list, layout); + } + /*===================== * Getter functions *====================*/ @@ -373,6 +425,8 @@ void lv_list_set_style(lv_obj_t * list, lv_list_style_t type, const lv_style_t * */ bool lv_list_get_single_mode(lv_obj_t * list) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + lv_list_ext_t * ext = lv_obj_get_ext_attr(list); return (ext->single_mode); @@ -385,6 +439,8 @@ bool lv_list_get_single_mode(lv_obj_t * list) */ const char * lv_list_get_btn_text(const lv_obj_t * btn) { + LV_ASSERT_OBJ(btn, "lv_btn"); + lv_obj_t * label = lv_list_get_btn_label(btn); if(label == NULL) return ""; return lv_label_get_text(label); @@ -397,6 +453,8 @@ const char * lv_list_get_btn_text(const lv_obj_t * btn) */ lv_obj_t * lv_list_get_btn_label(const lv_obj_t * btn) { + LV_ASSERT_OBJ(btn, "lv_btn"); + lv_obj_t * label = lv_obj_get_child(btn, NULL); if(label == NULL) return NULL; @@ -415,6 +473,8 @@ lv_obj_t * lv_list_get_btn_label(const lv_obj_t * btn) */ lv_obj_t * lv_list_get_btn_img(const lv_obj_t * btn) { + LV_ASSERT_OBJ(btn, "lv_btn"); + #if LV_USE_IMG != 0 lv_obj_t * img = lv_obj_get_child(btn, NULL); if(img == NULL) return NULL; @@ -438,6 +498,8 @@ lv_obj_t * lv_list_get_btn_img(const lv_obj_t * btn) */ lv_obj_t * lv_list_get_prev_btn(const lv_obj_t * list, lv_obj_t * prev_btn) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + /* Not a good practice but user can add/create objects to the lists manually. * When getting the next button try to be sure that it is at least a button */ @@ -463,6 +525,8 @@ lv_obj_t * lv_list_get_prev_btn(const lv_obj_t * list, lv_obj_t * prev_btn) */ lv_obj_t * lv_list_get_next_btn(const lv_obj_t * list, lv_obj_t * prev_btn) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + /* Not a good practice but user can add/create objects to the lists manually. * When getting the next button try to be sure that it is at least a button */ @@ -488,6 +552,9 @@ lv_obj_t * lv_list_get_next_btn(const lv_obj_t * list, lv_obj_t * prev_btn) */ int32_t lv_list_get_btn_index(const lv_obj_t * list, const lv_obj_t * btn) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + LV_ASSERT_OBJ(btn, "lv_btn"); + int index = 0; if(list == NULL) { /* no list provided, assuming btn is part of a list */ @@ -511,6 +578,8 @@ int32_t lv_list_get_btn_index(const lv_obj_t * list, const lv_obj_t * btn) */ uint16_t lv_list_get_size(const lv_obj_t * list) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + lv_list_ext_t * ext = lv_obj_get_ext_attr(list); return ext->size; } @@ -523,20 +592,35 @@ uint16_t lv_list_get_size(const lv_obj_t * list) */ lv_obj_t * lv_list_get_btn_selected(const lv_obj_t * list) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + lv_list_ext_t * ext = lv_obj_get_ext_attr(list); return ext->selected_btn; } - #endif +/** + * Get layout of a list + * @param list pointer to a list object + * @return layout of the list object + */ +lv_layout_t lv_list_get_layout(lv_obj_t * list) +{ + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + + return lv_page_get_scrl_layout(list); +} + /** * Get a style of a list * @param list pointer to a list object * @param type which style should be get * @return style pointer to a style - * */ + */ const lv_style_t * lv_list_get_style(const lv_obj_t * list, lv_list_style_t type) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_list_ext_t * ext = lv_obj_get_ext_attr(list); @@ -555,6 +639,7 @@ const lv_style_t * lv_list_get_style(const lv_obj_t * list, lv_list_style_t type return style; } + /*===================== * Other functions *====================*/ @@ -565,6 +650,8 @@ const lv_style_t * lv_list_get_style(const lv_obj_t * list, lv_list_style_t type */ void lv_list_up(const lv_obj_t * list) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + /*Search the first list element which 'y' coordinate is below the parent * and position the list to show this element on the bottom*/ lv_obj_t * scrl = lv_page_get_scrl(list); @@ -610,6 +697,8 @@ void lv_list_up(const lv_obj_t * list) */ void lv_list_down(const lv_obj_t * list) { + LV_ASSERT_OBJ(list, LV_OBJX_NAME); + /*Search the first list element which 'y' coordinate is above the parent * and position the list to show this element on the top*/ lv_obj_t * scrl = lv_page_get_scrl(list); @@ -651,6 +740,7 @@ void lv_list_down(const lv_obj_t * list) */ void lv_list_focus(const lv_obj_t * btn, lv_anim_enable_t anim) { + LV_ASSERT_OBJ(btn, ""); #if LV_USE_ANIMATION == 0 anim = false; @@ -679,6 +769,7 @@ static lv_res_t lv_list_signal(lv_obj_t * list, lv_signal_t sign, void * param) /* Include the ancient signal function */ res = ancestor_page_signal(list, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_RELEASED || sign == LV_SIGNAL_PRESSED || sign == LV_SIGNAL_PRESSING || sign == LV_SIGNAL_LONG_PRESS || sign == LV_SIGNAL_LONG_PRESS_REP) { @@ -808,13 +899,6 @@ static lv_res_t lv_list_signal(lv_obj_t * list, lv_signal_t sign, void * param) } } #endif - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_list"; } return res; } @@ -833,11 +917,11 @@ static lv_res_t lv_list_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * para /* Include the ancient signal function */ res = ancestor_btn_signal(btn, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, ""); if(sign == LV_SIGNAL_RELEASED) { lv_obj_t * list = lv_obj_get_parent(lv_obj_get_parent(btn)); lv_list_ext_t * ext = lv_obj_get_ext_attr(list); - ext->page.scroll_prop_ip = 0; #if LV_USE_GROUP lv_group_t * g = lv_obj_get_group(list); @@ -865,10 +949,6 @@ static lv_res_t lv_list_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * para if(lv_indev_is_dragging(lv_indev_get_act()) == false && ext->single_mode) { lv_list_btn_single_select(btn); } - } else if(sign == LV_SIGNAL_PRESS_LOST) { - lv_obj_t * list = lv_obj_get_parent(lv_obj_get_parent(btn)); - lv_list_ext_t * ext = lv_obj_get_ext_attr(list); - ext->page.scroll_prop_ip = 0; } else if(sign == LV_SIGNAL_CLEANUP) { #if LV_USE_GROUP diff --git a/src/lv_objx/lv_list.h b/src/lv_objx/lv_list.h index 5a8c6ee4c..e17bc87d5 100644 --- a/src/lv_objx/lv_list.h +++ b/src/lv_objx/lv_list.h @@ -95,9 +95,9 @@ lv_obj_t * lv_list_create(lv_obj_t * par, const lv_obj_t * copy); /** * Delete all children of the scrl object, without deleting scrl child. - * @param obj pointer to an object + * @param list pointer to an object */ -void lv_list_clean(lv_obj_t * obj); +void lv_list_clean(lv_obj_t * list); /*====================== * Add/remove functions @@ -192,6 +192,13 @@ static inline void lv_list_set_anim_time(lv_obj_t * list, uint16_t anim_time) */ void lv_list_set_style(lv_obj_t * list, lv_list_style_t type, const lv_style_t * style); +/** + * Set layout of a list + * @param list pointer to a list object + * @param layout which layout should be used + */ +void lv_list_set_layout(lv_obj_t * list, lv_layout_t layout); + /*===================== * Getter functions *====================*/ @@ -262,6 +269,13 @@ uint16_t lv_list_get_size(const lv_obj_t * list); lv_obj_t * lv_list_get_btn_selected(const lv_obj_t * list); #endif +/** + * Get layout of a list + * @param list pointer to a list object + * @return layout of the list object + */ +lv_layout_t lv_list_get_layout(lv_obj_t * list); + /** * Get the scroll bar mode of a list * @param list pointer to a list object diff --git a/src/lv_objx/lv_lmeter.c b/src/lv_objx/lv_lmeter.c index 78f7a8e61..e451ff677 100644 --- a/src/lv_objx/lv_lmeter.c +++ b/src/lv_objx/lv_lmeter.c @@ -9,6 +9,7 @@ #include "lv_lmeter.h" #if LV_USE_LMETER != 0 +#include "../lv_core/lv_debug.h" #include "../lv_draw/lv_draw.h" #include "../lv_themes/lv_theme.h" #include "../lv_core/lv_group.h" @@ -17,8 +18,7 @@ /********************* * DEFINES *********************/ -#define LV_LMETER_LINE_UPSCALE 5 /*2^x upscale of line to make rounding*/ -#define LV_LMETER_LINE_UPSCALE_MASK ((1 << LV_LMETER_LINE_UPSCALE) - 1) +#define LV_OBJX_NAME "lv_lmeter" /********************** * TYPEDEFS @@ -27,9 +27,8 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_lmeter_design(lv_obj_t * lmeter, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_lmeter_design(lv_obj_t * lmeter, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_lmeter_signal(lv_obj_t * lmeter, lv_signal_t sign, void * param); -static lv_coord_t lv_lmeter_coord_round(int32_t x); /********************** * STATIC VARIABLES @@ -57,15 +56,18 @@ lv_obj_t * lv_lmeter_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor of line meter*/ lv_obj_t * new_lmeter = lv_obj_create(par, copy); - lv_mem_assert(new_lmeter); + LV_ASSERT_MEM(new_lmeter); if(new_lmeter == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_lmeter); /*Allocate the line meter type specific extended data*/ lv_lmeter_ext_t * ext = lv_obj_allocate_ext_attr(new_lmeter, sizeof(lv_lmeter_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_lmeter); + return NULL; + } /*Initialize the allocated 'ext' */ ext->min_value = 0; @@ -73,6 +75,7 @@ lv_obj_t * lv_lmeter_create(lv_obj_t * par, const lv_obj_t * copy) ext->cur_value = 0; ext->line_cnt = 21; /*Odd scale number looks better*/ ext->scale_angle = 240; /*(scale_num - 1) * N looks better */ + ext->angle_ofs = 0; /*The signal and design functions are not copied so set them here*/ lv_obj_set_signal_cb(new_lmeter, lv_lmeter_signal); @@ -119,6 +122,8 @@ lv_obj_t * lv_lmeter_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_lmeter_set_value(lv_obj_t * lmeter, int16_t value) { + LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); + lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); if(ext->cur_value == value) return; @@ -135,6 +140,8 @@ void lv_lmeter_set_value(lv_obj_t * lmeter, int16_t value) */ void lv_lmeter_set_range(lv_obj_t * lmeter, int16_t min, int16_t max) { + LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); + lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); if(ext->min_value == min && ext->max_value == max) return; @@ -157,8 +164,10 @@ void lv_lmeter_set_range(lv_obj_t * lmeter, int16_t min, int16_t max) * @param angle angle of the scale (0..360) * @param line_cnt number of lines */ -void lv_lmeter_set_scale(lv_obj_t * lmeter, uint16_t angle, uint8_t line_cnt) +void lv_lmeter_set_scale(lv_obj_t * lmeter, uint16_t angle, uint16_t line_cnt) { + LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); + lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); if(ext->scale_angle == angle && ext->line_cnt == line_cnt) return; @@ -168,6 +177,21 @@ void lv_lmeter_set_scale(lv_obj_t * lmeter, uint16_t angle, uint8_t line_cnt) lv_obj_invalidate(lmeter); } +/** + * Set the set an offset for the line meter's angles to rotate it. + * @param lmeter pointer to a line meter object + * @param angle angle where the meter will be facing (with its center) + */ +void lv_lmeter_set_angle_offset(lv_obj_t * lmeter, uint16_t angle) +{ + lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); + if(ext->angle_ofs == angle) return; + + ext->angle_ofs = angle; + + lv_obj_invalidate(lmeter); +} + /*===================== * Getter functions *====================*/ @@ -179,6 +203,8 @@ void lv_lmeter_set_scale(lv_obj_t * lmeter, uint16_t angle, uint8_t line_cnt) */ int16_t lv_lmeter_get_value(const lv_obj_t * lmeter) { + LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); + lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); return ext->cur_value; } @@ -190,6 +216,8 @@ int16_t lv_lmeter_get_value(const lv_obj_t * lmeter) */ int16_t lv_lmeter_get_min_value(const lv_obj_t * lmeter) { + LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); + lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); return ext->min_value; } @@ -201,6 +229,8 @@ int16_t lv_lmeter_get_min_value(const lv_obj_t * lmeter) */ int16_t lv_lmeter_get_max_value(const lv_obj_t * lmeter) { + LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); + lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); return ext->max_value; } @@ -212,6 +242,8 @@ int16_t lv_lmeter_get_max_value(const lv_obj_t * lmeter) */ uint8_t lv_lmeter_get_line_count(const lv_obj_t * lmeter) { + LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); + lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); return ext->line_cnt; } @@ -219,14 +251,28 @@ uint8_t lv_lmeter_get_line_count(const lv_obj_t * lmeter) /** * Get the scale angle of a line meter * @param lmeter pointer to a line meter object - * @return angle of the scale + * @return angle_ofs of the scale */ uint16_t lv_lmeter_get_scale_angle(const lv_obj_t * lmeter) { + LV_ASSERT_OBJ(lmeter, LV_OBJX_NAME); + lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); return ext->scale_angle; } +/** + * get the set an offset for the line meter. + * @param lmeter pointer to a line meter object + * @return angle offset (0..360) + */ +uint16_t lv_lmeter_get_angle_offset(lv_obj_t * lmeter) +{ + lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); + + return ext->angle_ofs; +} + /********************** * STATIC FUNCTIONS **********************/ @@ -234,18 +280,18 @@ uint16_t lv_lmeter_get_scale_angle(const lv_obj_t * lmeter) /** * Handle the drawing related tasks of the line meters * @param lmeter pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_lmeter_design(lv_obj_t * lmeter, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_lmeter_design(lv_obj_t * lmeter, const lv_area_t * clip_area, lv_design_mode_t mode) { /*Return false if the object is not covers the mask_p area*/ if(mode == LV_DESIGN_COVER_CHK) { - return false; + return LV_DESIGN_RES_NOT_COVER; } /*Draw the object*/ else if(mode == LV_DESIGN_DRAW_MAIN) { @@ -268,31 +314,34 @@ static bool lv_lmeter_design(lv_obj_t * lmeter, const lv_area_t * mask, lv_desig lv_coord_t x_ofs = lv_obj_get_width(lmeter) / 2 + lmeter->coords.x1; lv_coord_t y_ofs = lv_obj_get_height(lmeter) / 2 + lmeter->coords.y1; - int16_t angle_ofs = 90 + (360 - ext->scale_angle) / 2; + int16_t angle_ofs = ext->angle_ofs + 90 + (360 - ext->scale_angle) / 2; int16_t level = (int32_t)((int32_t)(ext->cur_value - ext->min_value) * ext->line_cnt) / (ext->max_value - ext->min_value); uint8_t i; style_tmp.line.color = style->body.main_color; - /*Calculate every coordinate in a bigger size to make rounding later*/ - r_out = r_out << LV_LMETER_LINE_UPSCALE; - r_in = r_in << LV_LMETER_LINE_UPSCALE; - for(i = 0; i < ext->line_cnt; i++) { /*Calculate the position a scale label*/ int16_t angle = (i * ext->scale_angle) / (ext->line_cnt - 1) + angle_ofs; - lv_coord_t y_out = (int32_t)((int32_t)lv_trigo_sin(angle) * r_out) >> LV_TRIGO_SHIFT; - lv_coord_t x_out = (int32_t)((int32_t)lv_trigo_sin(angle + 90) * r_out) >> LV_TRIGO_SHIFT; - lv_coord_t y_in = (int32_t)((int32_t)lv_trigo_sin(angle) * r_in) >> LV_TRIGO_SHIFT; - lv_coord_t x_in = (int32_t)((int32_t)lv_trigo_sin(angle + 90) * r_in) >> LV_TRIGO_SHIFT; + lv_coord_t y_out = (int32_t)((int32_t)lv_trigo_sin(angle) * r_out) >> (LV_TRIGO_SHIFT - 8); + lv_coord_t x_out = (int32_t)((int32_t)lv_trigo_sin(angle + 90) * r_out) >> (LV_TRIGO_SHIFT - 8); + lv_coord_t y_in = (int32_t)((int32_t)lv_trigo_sin(angle) * r_in) >> (LV_TRIGO_SHIFT - 8); + lv_coord_t x_in = (int32_t)((int32_t)lv_trigo_sin(angle + 90) * r_in) >> (LV_TRIGO_SHIFT - 8); /*Rounding*/ - x_out = lv_lmeter_coord_round(x_out); - x_in = lv_lmeter_coord_round(x_in); - y_out = lv_lmeter_coord_round(y_out); - y_in = lv_lmeter_coord_round(y_in); + if(x_out <= 0) x_out = (x_out + 127) >> 8; + else x_out = (x_out - 127) >> 8; + + if(x_in <= 0) x_in = (x_in + 127) >> 8; + else x_in = (x_in - 127) >> 8; + + if(y_out <= 0) y_out = (y_out + 127) >> 8; + else y_out = (y_out - 127) >> 8; + + if(y_in <= 0) y_in = (y_in + 127) >> 8; + else y_in = (y_in - 127) >> 8; lv_point_t p1; lv_point_t p2; @@ -310,7 +359,7 @@ static bool lv_lmeter_design(lv_obj_t * lmeter, const lv_area_t * mask, lv_desig lv_color_mix(style->body.grad_color, style->body.main_color, (255 * i) / ext->line_cnt); } - lv_draw_line(&p1, &p2, mask, &style_tmp, opa_scale); + lv_draw_line(&p1, &p2, clip_area, &style_tmp, opa_scale); } } @@ -318,7 +367,7 @@ static bool lv_lmeter_design(lv_obj_t * lmeter, const lv_area_t * mask, lv_desig else if(mode == LV_DESIGN_DRAW_POST) { } - return true; + return LV_DESIGN_RES_OK; } /** @@ -335,6 +384,7 @@ static lv_res_t lv_lmeter_signal(lv_obj_t * lmeter, lv_signal_t sign, void * par /* Include the ancient signal function */ res = ancestor_signal(lmeter, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_CLEANUP) { /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ @@ -343,40 +393,8 @@ static lv_res_t lv_lmeter_signal(lv_obj_t * lmeter, lv_signal_t sign, void * par } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { const lv_style_t * style = lv_lmeter_get_style(lmeter, LV_LMETER_STYLE_MAIN); lmeter->ext_draw_pad = LV_MATH_MAX(lmeter->ext_draw_pad, style->line.width); - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_lmeter"; } return res; } - -/** - * Round a coordinate which is upscaled (>=x.5 -> x + 1; x) - * @param x a coordinate which is greater then it should be - * @return the downscaled and rounded coordinate (+-1) - */ -static lv_coord_t lv_lmeter_coord_round(int32_t x) -{ -#if LV_LMETER_LINE_UPSCALE > 0 - bool was_negative = false; - if(x < 0) { - was_negative = true; - x = -x; - } - - x = (x >> LV_LMETER_LINE_UPSCALE) + ((x & LV_LMETER_LINE_UPSCALE_MASK) >> (LV_LMETER_LINE_UPSCALE - 1)); - - if(was_negative) x = -x; - - return x; -#else - return x; -#endif -} - #endif diff --git a/src/lv_objx/lv_lmeter.h b/src/lv_objx/lv_lmeter.h index e1a70a64f..b90b6ba40 100644 --- a/src/lv_objx/lv_lmeter.h +++ b/src/lv_objx/lv_lmeter.h @@ -36,7 +36,8 @@ typedef struct /*No inherited ext.*/ /*Ext. of ancestor*/ /*New data for this type */ uint16_t scale_angle; /*Angle of the scale in deg. (0..360)*/ - uint8_t line_cnt; /*Count of lines */ + uint16_t angle_ofs; + uint16_t line_cnt; /*Count of lines */ int16_t cur_value; int16_t min_value; int16_t max_value; @@ -86,7 +87,14 @@ void lv_lmeter_set_range(lv_obj_t * lmeter, int16_t min, int16_t max); * @param angle angle of the scale (0..360) * @param line_cnt number of lines */ -void lv_lmeter_set_scale(lv_obj_t * lmeter, uint16_t angle, uint8_t line_cnt); +void lv_lmeter_set_scale(lv_obj_t * lmeter, uint16_t angle, uint16_t line_cnt); + +/** + * Set the set an offset for the line meter's angles to rotate it. + * @param lmeter pointer to a line meter object + * @param angle angle offset (0..360), rotates clockwise + */ +void lv_lmeter_set_angle_offset(lv_obj_t * lmeter, uint16_t angle); /** * Set the styles of a line meter @@ -139,6 +147,13 @@ uint8_t lv_lmeter_get_line_count(const lv_obj_t * lmeter); */ uint16_t lv_lmeter_get_scale_angle(const lv_obj_t * lmeter); +/** + * get the set an offset for the line meter. + * @param lmeter pointer to a line meter object + * @return angle offset (0..360) + */ +uint16_t lv_lmeter_get_angle_offset(lv_obj_t * lmeter); + /** * Get the style of a line meter * @param lmeter pointer to a line meter object diff --git a/src/lv_objx/lv_mbox.c b/src/lv_objx/lv_mbox.c index 9a5fa1dd7..604e798e8 100644 --- a/src/lv_objx/lv_mbox.c +++ b/src/lv_objx/lv_mbox.c @@ -9,6 +9,7 @@ #include "lv_mbox.h" #if LV_USE_MBOX != 0 +#include "../lv_core/lv_debug.h" #include "../lv_core/lv_group.h" #include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_anim.h" @@ -17,6 +18,7 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_mbos" #if LV_USE_ANIMATION #ifndef LV_MBOX_CLOSE_ANIM_TIME @@ -68,15 +70,18 @@ lv_obj_t * lv_mbox_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor message box*/ lv_obj_t * new_mbox = lv_cont_create(par, copy); - lv_mem_assert(new_mbox); + LV_ASSERT_MEM(new_mbox); if(new_mbox == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_mbox); /*Allocate the message box type specific extended data*/ lv_mbox_ext_t * ext = lv_obj_allocate_ext_attr(new_mbox, sizeof(lv_mbox_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_mbox); + return NULL; + } ext->text = NULL; ext->btnm = NULL; @@ -137,8 +142,11 @@ lv_obj_t * lv_mbox_create(lv_obj_t * par, const lv_obj_t * copy) * @param btn_map button descriptor (button matrix map). * E.g. a const char *txt[] = {"ok", "close", ""} (Can not be local variable) */ -void lv_mbox_add_btns(lv_obj_t * mbox, const char ** btn_map) +void lv_mbox_add_btns(lv_obj_t * mbox, const char * btn_map[]) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + LV_ASSERT_NULL(btn_map); + lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); /*Create a button matrix if not exists yet*/ @@ -174,6 +182,9 @@ void lv_mbox_add_btns(lv_obj_t * mbox, const char ** btn_map) */ void lv_mbox_set_text(lv_obj_t * mbox, const char * txt) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + LV_ASSERT_STR(txt); + lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); lv_label_set_text(ext->text, txt); @@ -187,6 +198,8 @@ void lv_mbox_set_text(lv_obj_t * mbox, const char * txt) */ void lv_mbox_set_anim_time(lv_obj_t * mbox, uint16_t anim_time) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); anim_time = 0; @@ -204,6 +217,8 @@ void lv_mbox_set_anim_time(lv_obj_t * mbox, uint16_t anim_time) */ void lv_mbox_start_auto_close(lv_obj_t * mbox, uint16_t delay) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + #if LV_USE_ANIMATION if(lv_mbox_get_anim_time(mbox) != 0) { /*Add shrinking animations*/ @@ -258,6 +273,8 @@ void lv_mbox_start_auto_close(lv_obj_t * mbox, uint16_t delay) */ void lv_mbox_stop_auto_close(lv_obj_t * mbox) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_anim_del(mbox, NULL); #else @@ -273,6 +290,8 @@ void lv_mbox_stop_auto_close(lv_obj_t * mbox) */ void lv_mbox_set_style(lv_obj_t * mbox, lv_mbox_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); switch(type) { @@ -295,6 +314,8 @@ void lv_mbox_set_style(lv_obj_t * mbox, lv_mbox_style_t type, const lv_style_t * */ void lv_mbox_set_recolor(lv_obj_t * mbox, bool en) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); if(ext->btnm) lv_btnm_set_recolor(ext->btnm, en); @@ -311,6 +332,8 @@ void lv_mbox_set_recolor(lv_obj_t * mbox, bool en) */ const char * lv_mbox_get_text(const lv_obj_t * mbox) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); return lv_label_get_text(ext->text); @@ -324,6 +347,8 @@ const char * lv_mbox_get_text(const lv_obj_t * mbox) */ uint16_t lv_mbox_get_active_btn(lv_obj_t * mbox) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); if(ext->btnm) return lv_btnm_get_active_btn(ext->btnm); @@ -339,6 +364,8 @@ uint16_t lv_mbox_get_active_btn(lv_obj_t * mbox) */ const char * lv_mbox_get_active_btn_text(lv_obj_t * mbox) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); if(ext->btnm) return lv_btnm_get_active_btn_text(ext->btnm); @@ -353,6 +380,8 @@ const char * lv_mbox_get_active_btn_text(lv_obj_t * mbox) */ uint16_t lv_mbox_get_anim_time(const lv_obj_t * mbox) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); return ext->anim_time; @@ -370,6 +399,8 @@ uint16_t lv_mbox_get_anim_time(const lv_obj_t * mbox) */ const lv_style_t * lv_mbox_get_style(const lv_obj_t * mbox, lv_mbox_style_t type) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); @@ -394,6 +425,8 @@ const lv_style_t * lv_mbox_get_style(const lv_obj_t * mbox, lv_mbox_style_t type */ bool lv_mbox_get_recolor(const lv_obj_t * mbox) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); if(!ext->btnm) return false; @@ -409,6 +442,8 @@ bool lv_mbox_get_recolor(const lv_obj_t * mbox) */ lv_obj_t * lv_mbox_get_btnm(lv_obj_t * mbox) { + LV_ASSERT_OBJ(mbox, LV_OBJX_NAME); + lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); return ext->btnm; } @@ -441,6 +476,7 @@ static lv_res_t lv_mbox_signal(lv_obj_t * mbox, lv_signal_t sign, void * param) /* Include the ancient signal function */ res = ancestor_signal(mbox, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); if(sign == LV_SIGNAL_CORD_CHG) { @@ -476,13 +512,6 @@ static lv_res_t lv_mbox_signal(lv_obj_t * mbox, lv_signal_t sign, void * param) } #endif } - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_mbox"; } return res; diff --git a/src/lv_objx/lv_mbox.h b/src/lv_objx/lv_mbox.h index df504f851..2068b3735 100644 --- a/src/lv_objx/lv_mbox.h +++ b/src/lv_objx/lv_mbox.h @@ -94,7 +94,7 @@ lv_obj_t * lv_mbox_create(lv_obj_t * par, const lv_obj_t * copy); * @param btn_map button descriptor (button matrix map). * E.g. a const char *txt[] = {"ok", "close", ""} (Can not be local variable) */ -void lv_mbox_add_btns(lv_obj_t * mbox, const char ** btn_mapaction); +void lv_mbox_add_btns(lv_obj_t * mbox, const char * btn_mapaction[]); /*===================== * Setter functions diff --git a/src/lv_objx/lv_objmask.c b/src/lv_objx/lv_objmask.c new file mode 100644 index 000000000..1d426e92d --- /dev/null +++ b/src/lv_objx/lv_objmask.c @@ -0,0 +1,356 @@ +/** + * @file lv_objmask.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_objmask.h" +#include "../lv_core/lv_debug.h" +#include "../lv_draw/lv_draw.h" + +#if defined(LV_USE_OBJMASK) && LV_USE_OBJMASK != 0 + +/********************* + * DEFINES + *********************/ +#define LV_OBJX_NAME "lv_objmask" + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static lv_design_res_t lv_objmask_design(lv_obj_t * objmask, const lv_area_t * clip_area, lv_design_mode_t mode); +static lv_res_t lv_objmask_signal(lv_obj_t * objmask, lv_signal_t sign, void * param); +static uint16_t get_param_size(lv_draw_mask_type_t type); + +/********************** + * STATIC VARIABLES + **********************/ +static lv_signal_cb_t ancestor_signal; +static lv_design_cb_t ancestor_design; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Create a object mask object + * @param par pointer to an object, it will be the parent of the new object mask + * @param copy pointer to a object mask object, if not NULL then the new object will be copied from it + * @return pointer to the created object mask + */ +lv_obj_t * lv_objmask_create(lv_obj_t * par, const lv_obj_t * copy) +{ + LV_LOG_TRACE("object mask create started"); + + /*Create the ancestor of object mask*/ + lv_obj_t * new_objmask = lv_cont_create(par, copy); + LV_ASSERT_MEM(new_objmask); + if(new_objmask == NULL) return NULL; + + /*Allocate the object mask type specific extended data*/ + lv_objmask_ext_t * ext = lv_obj_allocate_ext_attr(new_objmask, sizeof(lv_objmask_ext_t)); + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_objmask); + return NULL; + } + + if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_objmask); + if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_objmask); + + /*Initialize the allocated 'ext' */ + lv_ll_init(&ext->mask_ll, sizeof(lv_objmask_mask_t)); + + /*The signal and design functions are not copied so set them here*/ + lv_obj_set_signal_cb(new_objmask, lv_objmask_signal); + lv_obj_set_design_cb(new_objmask, lv_objmask_design); + + /*Init the new object mask object mask*/ + if(copy == NULL) { + lv_objmask_set_style(new_objmask, LV_OBJMASK_STYLE_BG, &lv_style_transp); + + } + /*TODO: Copy an existing object mask*/ + else { + /* lv_objmask_ext_t * copy_ext = lv_obj_get_ext_attr(copy); */ + + /*Refresh the style with new signal function*/ + lv_obj_refresh_style(new_objmask); + } + + LV_LOG_INFO("object mask created"); + + return new_objmask; +} + +/*====================== + * Add/remove functions + *=====================*/ + +/** + * Add a mask + * @param objmask pointer to an Object mask object + * @param param an initialized mask parameter + * @return pointer to the added mask + */ +lv_objmask_mask_t * lv_objmask_add_mask(lv_obj_t * objmask, void * param) +{ + LV_ASSERT_OBJ(objmask, LV_OBJX_NAME); + LV_ASSERT_NULL(param) + + lv_objmask_ext_t * ext = lv_obj_get_ext_attr(objmask); + + lv_draw_mask_common_dsc_t * dsc = param; + uint16_t param_size = get_param_size(dsc->type); + + lv_objmask_mask_t * m = lv_ll_ins_head(&ext->mask_ll); + m->param = lv_mem_alloc(param_size); + LV_ASSERT_MEM(m->param); + if(m == NULL) return NULL; + + memcpy(m->param, param, param_size); + + lv_obj_invalidate(objmask); + + return m; +} + +/** + * Update an already created mask + * @param objmask pointer to an Object mask object + * @param mask pointer to created mask (returned by `lv_objmask_add_mask`) + * @param param an initialized mask parameter (initialized by `lv_draw_mask_line/angle/.../_init`) + */ +void lv_objmask_update_mask(lv_obj_t * objmask, lv_objmask_mask_t * mask, void * param) +{ + LV_ASSERT_OBJ(objmask, LV_OBJX_NAME); + LV_ASSERT_NULL(mask); + LV_ASSERT_NULL(param); + lv_draw_mask_common_dsc_t * dsc = param; + + memcpy(mask->param, param, get_param_size(dsc->type)); + + lv_obj_invalidate(objmask); +} + +/** + * Remove a mask + * @param objmask pointer to an Object mask object + * @param mask pointer to created mask (returned by `lv_objmask_add_mask`) + * If `NULL` passed all masks will be deleted. + */ +void lv_objmask_remove_mask(lv_obj_t * objmask, lv_objmask_mask_t * mask) +{ + LV_ASSERT_OBJ(objmask, LV_OBJX_NAME); + + lv_objmask_ext_t * ext = lv_obj_get_ext_attr(objmask); + + /*Remove all masks*/ + if(mask == NULL) { + lv_objmask_mask_t * m; + LV_LL_READ(ext->mask_ll, m) { + lv_mem_free(m->param); + } + + lv_ll_clear(&ext->mask_ll); + } + /*Remove only the specified mask*/ + else { + lv_mem_free(mask->param); + lv_ll_remove(&ext->mask_ll, mask); + } + + lv_obj_invalidate(objmask); +} + + + +/*===================== + * Setter functions + *====================*/ + + +/*===================== + * Getter functions + *====================*/ + + +/*===================== + * Other functions + *====================*/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +/** + * Handle the drawing related tasks of the object masks + * @param objmask pointer to an object + * @param clip_area the object will be drawn only in this area + * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area + * (return 'true' if yes) + * LV_DESIGN_DRAW: draw the object (always return 'true') + * LV_DESIGN_DRAW_POST: drawing after every children are drawn + * @param return an element of `lv_design_res_t` + */ +static lv_design_res_t lv_objmask_design(lv_obj_t * objmask, const lv_area_t * clip_area, lv_design_mode_t mode) +{ + /*Return false if the object is not covers the mask_p area*/ + if(mode == LV_DESIGN_COVER_CHK) { + lv_objmask_ext_t * ext = lv_obj_get_ext_attr(objmask); + if(lv_ll_get_len(&ext->mask_ll) > 0) return LV_DESIGN_RES_MASKED; + else return ancestor_design(objmask, clip_area, mode); + } + /*Draw the object*/ + else if(mode == LV_DESIGN_DRAW_MAIN) { + ancestor_design(objmask, clip_area, mode); + + lv_objmask_ext_t * ext = lv_obj_get_ext_attr(objmask); + + lv_coord_t xofs = objmask->coords.x1; + lv_coord_t yofs = objmask->coords.y1; + + lv_objmask_mask_t * m; + + LV_LL_READ(ext->mask_ll, m) { + lv_draw_mask_common_dsc_t * dsc = m->param; + + if(dsc->type == LV_DRAW_MASK_TYPE_LINE) { + lv_draw_mask_line_param_t * p_ori = m->param; + lv_draw_mask_line_param_t * p_new = lv_mem_buf_get(sizeof(lv_draw_mask_line_param_t)); + + lv_draw_mask_line_points_init(p_new, p_ori->cfg.p1.x + xofs, p_ori->cfg.p1.y + yofs, + p_ori->cfg.p2.x + xofs, p_ori->cfg.p2.y + yofs, + p_ori->cfg.side); + lv_draw_mask_add(p_new, m->param); + } + else if(dsc->type == LV_DRAW_MASK_TYPE_ANGLE) { + lv_draw_mask_angle_param_t * p_ori = m->param; + lv_draw_mask_angle_param_t * p_new = lv_mem_buf_get(sizeof(lv_draw_mask_angle_param_t)); + + lv_draw_mask_angle_init(p_new, p_ori->cfg.vertex_p.x + xofs, p_ori->cfg.vertex_p.y + yofs, + p_ori->cfg.start_angle, p_ori->cfg.end_angle); + lv_draw_mask_add(p_new, m->param); + } + else if(dsc->type == LV_DRAW_MASK_TYPE_RADIUS) { + lv_draw_mask_radius_param_t * p_ori = m->param; + lv_draw_mask_radius_param_t * p_new = lv_mem_buf_get(sizeof(lv_draw_mask_radius_param_t)); + + lv_area_t rect; + rect.x1 = p_ori->cfg.rect.x1 + xofs; + rect.y1 = p_ori->cfg.rect.y1 + yofs; + rect.x2 = p_ori->cfg.rect.x2 + xofs; + rect.y2 = p_ori->cfg.rect.y2 + yofs; + + lv_draw_mask_radius_init(p_new, &rect, p_ori->cfg.radius, p_ori->cfg.outer); + lv_draw_mask_add(p_new, m->param); + } + else if(dsc->type == LV_DRAW_MASK_TYPE_FADE) { + lv_draw_mask_fade_param_t * p_ori = m->param; + lv_draw_mask_fade_param_t * p_new = lv_mem_buf_get(sizeof(lv_draw_mask_fade_param_t)); + + lv_area_t rect; + rect.x1 = p_ori->cfg.coords.x1 + xofs; + rect.y1 = p_ori->cfg.coords.y1 + yofs; + rect.x2 = p_ori->cfg.coords.x2 + xofs; + rect.y2 = p_ori->cfg.coords.y2 + yofs; + + lv_draw_mask_fade_init(p_new, &rect, p_ori->cfg.opa_top, p_ori->cfg.y_top + yofs, + p_ori->cfg.opa_bottom, p_ori->cfg.y_bottom + yofs); + lv_draw_mask_add(p_new, m->param); + } + else if(dsc->type == LV_DRAW_MASK_TYPE_MAP) { + lv_draw_mask_map_param_t * p_ori = m->param; + lv_draw_mask_map_param_t * p_new = lv_mem_buf_get(sizeof(lv_draw_mask_map_param_t)); + + lv_area_t rect; + rect.x1 = p_ori->cfg.coords.x1 + xofs; + rect.y1 = p_ori->cfg.coords.y1 + yofs; + rect.x2 = p_ori->cfg.coords.x2 + xofs; + rect.y2 = p_ori->cfg.coords.y2 + yofs; + + lv_draw_mask_map_init(p_new, &rect, p_ori->cfg.map); + lv_draw_mask_add(p_new, m->param); + } + + + } + } + /*Post draw when the children are drawn*/ + else if(mode == LV_DESIGN_DRAW_POST) { + lv_objmask_ext_t * ext = lv_obj_get_ext_attr(objmask); + + + lv_objmask_mask_t * m; + + LV_LL_READ(ext->mask_ll, m) { + void * param; + param = lv_draw_mask_remove_custom(m->param); + lv_mem_buf_release(param); + } + + } + + return LV_DESIGN_RES_OK; +} + +/** + * Signal function of the object mask + * @param objmask pointer to a object mask object + * @param sign a signal type from lv_signal_t enum + * @param param pointer to a signal specific variable + * @return LV_RES_OK: the object is not deleted in the function; LV_RES_INV: the object is deleted + */ +static lv_res_t lv_objmask_signal(lv_obj_t * objmask, lv_signal_t sign, void * param) +{ + lv_res_t res; + + /* Include the ancient signal function */ + res = ancestor_signal(objmask, sign, param); + if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); + + if(sign == LV_SIGNAL_CLEANUP) { + lv_objmask_ext_t * ext = lv_obj_get_ext_attr(objmask); + lv_objmask_mask_t * i; + LV_LL_READ(ext->mask_ll, i) { + if(i->param) { + lv_mem_free(i->param); + i->param = NULL; + } + } + + lv_ll_clear(&ext->mask_ll); + } + + return res; +} + +static uint16_t get_param_size(lv_draw_mask_type_t type) +{ + uint16_t param_size; + switch(type) { + case LV_DRAW_MASK_TYPE_LINE: param_size = sizeof(lv_draw_mask_line_param_t); break; + case LV_DRAW_MASK_TYPE_ANGLE: param_size = sizeof(lv_draw_mask_angle_param_t); break; + case LV_DRAW_MASK_TYPE_RADIUS: param_size = sizeof(lv_draw_mask_radius_param_t); break; + case LV_DRAW_MASK_TYPE_FADE: param_size = sizeof(lv_draw_mask_fade_param_t); break; + case LV_DRAW_MASK_TYPE_MAP: param_size = sizeof(lv_draw_mask_map_param_t); break; + default: param_size = 0; + } + + return param_size; +} + +#else /* Enable this file at the top */ + +#endif diff --git a/src/lv_objx/lv_objmask.h b/src/lv_objx/lv_objmask.h new file mode 100644 index 000000000..18a0506f7 --- /dev/null +++ b/src/lv_objx/lv_objmask.h @@ -0,0 +1,137 @@ +/** + * @file lv_objmask.h + * + */ + +#ifndef LV_OBJMASK_H +#define LV_OBJMASK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#ifdef LV_CONF_INCLUDE_SIMPLE +#include "lv_conf.h" +#else +#include "../../../lv_conf.h" +#endif + +#if LV_USE_OBJMASK != 0 + +#include "../lv_core/lv_obj.h" +#include "../lv_objx/lv_cont.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef struct { + void * param; +}lv_objmask_mask_t; + +/*Data of object mask*/ +typedef struct +{ + lv_cont_ext_t cont; /*Ext. of ancestor*/ + /*New data for this type */ + lv_ll_t mask_ll; /*Store the created masks*/ + +} lv_objmask_ext_t; + +/*Styles*/ +enum { + LV_OBJMASK_STYLE_BG, +}; +typedef uint8_t lv_objmask_style_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Create a object mask objects + * @param par pointer to an object, it will be the parent of the new object mask + * @param copy pointer to a object mask object, if not NULL then the new object will be copied from it + * @return pointer to the created object mask + */ +lv_obj_t * lv_objmask_create(lv_obj_t * par, const lv_obj_t * copy); + +/*====================== + * Add/remove functions + *=====================*/ + +/** + * Add a mask + * @param objmask pointer to an Object mask object + * @param param an initialized mask parameter + * @return pointer to the added mask + */ +lv_objmask_mask_t * lv_objmask_add_mask(lv_obj_t * objmask, void * param); + +/** + * Update an already created mask + * @param objmask pointer to an Object mask object + * @param mask pointer to created mask (returned by `lv_objmask_add_mask`) + * @param param an initialized mask parameter (initialized by `lv_draw_mask_line/angle/.../_init`) + */ +void lv_objmask_update_mask(lv_obj_t * objmask, lv_objmask_mask_t * mask, void * param); + +/** + * Remove a mask + * @param objmask pointer to an Object mask object + * @param mask pointer to created mask (returned by `lv_objmask_add_mask`) + * If `NULL` passed all masks will be deleted. + */ +void lv_objmask_remove_mask(lv_obj_t * objmask, lv_objmask_mask_t * mask); + +/*===================== + * Setter functions + *====================*/ + +/** + * Set the style of a object mask + * @param objmask pointer to a container object + * @param type which style should be set (can be only `LV_CONT_STYLE_MAIN`) + * @param style pointer to the new style + */ +static inline void lv_objmask_set_style(lv_obj_t * objmask, lv_cont_style_t type, const lv_style_t * style) +{ + lv_cont_set_style(objmask, type, style); +} + +/*===================== + * Getter functions + *====================*/ +/** + * Get the style of an object mask + * @param objmask pointer to a container object + * @param type which style should be get (can be only `LV_CONT_STYLE_MAIN`) + * @return pointer to the container's style + */ +static inline const lv_style_t * lv_objmask_get_style(const lv_obj_t * objmask, lv_cont_style_t type) +{ + return lv_cont_get_style(objmask, type); +} + +/*===================== + * Other functions + *====================*/ + +/********************** + * MACROS + **********************/ + +#endif /*LV_USE_OBJMASK*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_OBJMASK_H*/ diff --git a/src/lv_objx/lv_objx.mk b/src/lv_objx/lv_objx.mk index 45b3e2ad3..5879b420e 100644 --- a/src/lv_objx/lv_objx.mk +++ b/src/lv_objx/lv_objx.mk @@ -1,6 +1,7 @@ CSRCS += lv_arc.c CSRCS += lv_bar.c CSRCS += lv_cb.c +CSRCS += lv_cpicker.c CSRCS += lv_ddlist.c CSRCS += lv_kb.c CSRCS += lv_line.c @@ -29,6 +30,7 @@ CSRCS += lv_lmeter.c CSRCS += lv_page.c CSRCS += lv_sw.c CSRCS += lv_win.c +CSRCS += lv_objmask.c DEPPATH += --dep-path $(LVGL_DIR)/lvgl/src/lv_objx VPATH += :$(LVGL_DIR)/lvgl/src/lv_objx diff --git a/src/lv_objx/lv_objx_templ.c b/src/lv_objx/lv_objx_templ.c index b5c1b258e..aebefb4b9 100644 --- a/src/lv_objx/lv_objx_templ.c +++ b/src/lv_objx/lv_objx_templ.c @@ -15,6 +15,7 @@ /********************* * INCLUDES *********************/ +#include "../lv_core/lv_debug.h" //#include "lv_templ.h" /*TODO uncomment this*/ #if defined(LV_USE_TEMPL) && LV_USE_TEMPL != 0 @@ -22,6 +23,7 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_templ" /********************** * TYPEDEFS @@ -30,14 +32,14 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_templ_design(lv_obj_t * templ, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_templ_design(lv_obj_t * templ, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_templ_signal(lv_obj_t * templ, lv_signal_t sign, void * param); /********************** * STATIC VARIABLES **********************/ -static lv_signal_func_t ancestor_signal; -static lv_design_func_t ancestor_design; +static lv_signal_cb_t ancestor_signal; +static lv_design_cb_t ancestor_design; /********************** * MACROS @@ -66,16 +68,20 @@ lv_obj_t * lv_templ_create(lv_obj_t * par, const lv_obj_t * copy) /*Allocate the template type specific extended data*/ lv_templ_ext_t * ext = lv_obj_allocate_ext_attr(new_templ, sizeof(lv_templ_ext_t)); lv_mem_assert(ext); - if(ext == NULL) return NULL; - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_func(new_templ); - if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_func(new_templ); + if(ext == NULL) { + lv_obj_del(new_templ); + return NULL; + } + + if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_templ); + if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_templ); /*Initialize the allocated 'ext' */ ext->xyz = 0; /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_func(new_templ, lv_templ_signal); - lv_obj_set_design_func(new_templ, lv_templ_design); + lv_obj_set_signal_cb(new_templ, lv_templ_signal); + lv_obj_set_design_cb(new_templ, lv_templ_design); /*Init the new template template*/ if(copy == NULL) { @@ -118,6 +124,8 @@ lv_obj_t * lv_templ_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_templ_set_style(lv_obj_t * templ, lv_templ_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(templ, LV_OBJX_NAME); + lv_templ_ext_t * ext = lv_obj_get_ext_attr(templ); switch(type) { @@ -142,6 +150,8 @@ void lv_templ_set_style(lv_obj_t * templ, lv_templ_style_t type, const lv_style_ */ lv_style_t * lv_templ_get_style(const lv_obj_t * templ, lv_templ_style_t type) { + LV_ASSERT_OBJ(templ, LV_OBJX_NAME); + lv_templ_ext_t * ext = lv_obj_get_ext_attr(templ); lv_style_t * style = NULL; @@ -174,13 +184,13 @@ lv_style_t * lv_templ_get_style(const lv_obj_t * templ, lv_templ_style_t type) * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_templ_design(lv_obj_t * templ, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_templ_design(lv_obj_t * templ, const lv_area_t * clip_area, lv_design_mode_t mode) { /*Return false if the object is not covers the mask_p area*/ if(mode == LV_DESIGN_COVER_CHK) { - return false; + return LV_DESIGN_RES_NOT_COVER; } /*Draw the object*/ else if(mode == LV_DESIGN_DRAW_MAIN) { @@ -190,7 +200,7 @@ static bool lv_templ_design(lv_obj_t * templ, const lv_area_t * mask, lv_design_ else if(mode == LV_DESIGN_DRAW_POST) { } - return true; + return LV_DESIGN_RES_OK; } /** @@ -207,16 +217,10 @@ static lv_res_t lv_templ_signal(lv_obj_t * templ, lv_signal_t sign, void * param /* Include the ancient signal function */ res = ancestor_signal(templ, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_CLEANUP) { /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_templ"; } return res; diff --git a/src/lv_objx/lv_page.c b/src/lv_objx/lv_page.c index e6c315363..9b4002bbd 100644 --- a/src/lv_objx/lv_page.c +++ b/src/lv_objx/lv_page.c @@ -9,6 +9,7 @@ #include "../lv_objx/lv_page.h" #if LV_USE_PAGE != 0 +#include "../lv_core/lv_debug.h" #include "../lv_core/lv_group.h" #include "../lv_draw/lv_draw.h" #include "../lv_themes/lv_theme.h" @@ -19,6 +20,8 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_page" + #define LV_PAGE_SB_MIN_SIZE (LV_DPI / 8) /*[ms] Scroll anim time on `lv_page_scroll_up/down/left/rigth`*/ @@ -41,8 +44,8 @@ * STATIC PROTOTYPES **********************/ static void lv_page_sb_refresh(lv_obj_t * page); -static bool lv_page_design(lv_obj_t * page, const lv_area_t * mask, lv_design_mode_t mode); -static bool lv_scrl_design(lv_obj_t * scrl, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_page_design(lv_obj_t * page, const lv_area_t * clip_area, lv_design_mode_t mode); +static lv_design_res_t lv_scrl_design(lv_obj_t * scrl, const lv_area_t * clisp_area, lv_design_mode_t mode); static lv_res_t lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param); static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, void * param); static void scrl_def_event_cb(lv_obj_t * scrl, lv_event_t event); @@ -77,7 +80,7 @@ lv_obj_t * lv_page_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor object*/ lv_obj_t * new_page = lv_cont_create(par, copy); - lv_mem_assert(new_page); + LV_ASSERT_MEM(new_page); if(new_page == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_page); @@ -85,8 +88,11 @@ lv_obj_t * lv_page_create(lv_obj_t * par, const lv_obj_t * copy) /*Allocate the object type specific extended data*/ lv_page_ext_t * ext = lv_obj_allocate_ext_attr(new_page, sizeof(lv_page_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_page); + return NULL; + } ext->scrl = NULL; ext->sb.hor_draw = 0; @@ -104,7 +110,7 @@ lv_obj_t * lv_page_create(lv_obj_t * par, const lv_obj_t * copy) ext->anim_time = LV_PAGE_DEF_ANIM_TIME; #endif ext->scroll_prop = 0; - ext->scroll_prop_ip = 0; + ext->scroll_prop_obj = NULL; /*Init the new page object*/ if(copy == NULL) { @@ -171,11 +177,13 @@ lv_obj_t * lv_page_create(lv_obj_t * par, const lv_obj_t * copy) /** * Delete all children of the scrl object, without deleting scrl child. - * @param obj pointer to an object + * @param page pointer to an object */ -void lv_page_clean(lv_obj_t * obj) +void lv_page_clean(lv_obj_t * page) { - lv_obj_t * scrl = lv_page_get_scrl(obj); + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + + lv_obj_t * scrl = lv_page_get_scrl(page); lv_obj_clean(scrl); } @@ -190,6 +198,8 @@ void lv_page_clean(lv_obj_t * obj) */ void lv_page_set_sb_mode(lv_obj_t * page, lv_sb_mode_t sb_mode) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + lv_page_ext_t * ext = lv_obj_get_ext_attr(page); if(ext->sb.mode == sb_mode) return; @@ -216,6 +226,8 @@ void lv_page_set_sb_mode(lv_obj_t * page, lv_sb_mode_t sb_mode) */ void lv_page_set_anim_time(lv_obj_t * page, uint16_t anim_time) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_page_ext_t * ext = lv_obj_get_ext_attr(page); ext->anim_time = anim_time; @@ -228,12 +240,19 @@ void lv_page_set_anim_time(lv_obj_t * page, uint16_t anim_time) /** * Enable the scroll propagation feature. If enabled then the page will move its parent if there is * no more space to scroll. + * The page needs to have a page-like parent (e.g. `lv_page`, `lv_tabview` tab, `lv_win` content area etc) + * If enabled drag direction will be changed `LV_DRAG_DIR_ONE` automatically to allow scrolling only in one direction at one time. * @param page pointer to a Page * @param en true or false to enable/disable scroll propagation */ void lv_page_set_scroll_propagation(lv_obj_t * page, bool en) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + lv_page_ext_t * ext = lv_obj_get_ext_attr(page); + if(en) lv_obj_set_drag_dir(ext->scrl, LV_DRAG_DIR_ONE); + else lv_obj_set_drag_dir(ext->scrl, LV_DRAG_DIR_BOTH); + ext->scroll_prop = en ? 1 : 0; } @@ -244,6 +263,8 @@ void lv_page_set_scroll_propagation(lv_obj_t * page, bool en) */ void lv_page_set_edge_flash(lv_obj_t * page, bool en) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_page_ext_t * ext = lv_obj_get_ext_attr(page); ext->edge_flash.enabled = en ? 1 : 0; @@ -261,6 +282,8 @@ void lv_page_set_edge_flash(lv_obj_t * page, bool en) * */ void lv_page_set_style(lv_obj_t * page, lv_page_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + lv_page_ext_t * ext = lv_obj_get_ext_attr(page); switch(type) { @@ -291,6 +314,8 @@ void lv_page_set_style(lv_obj_t * page, lv_page_style_t type, const lv_style_t * */ lv_obj_t * lv_page_get_scrl(const lv_obj_t * page) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + lv_page_ext_t * ext = lv_obj_get_ext_attr(page); return ext->scrl; @@ -303,6 +328,8 @@ lv_obj_t * lv_page_get_scrl(const lv_obj_t * page) */ uint16_t lv_page_get_anim_time(const lv_obj_t * page) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_page_ext_t * ext = lv_obj_get_ext_attr(page); return ext->anim_time; @@ -319,6 +346,8 @@ uint16_t lv_page_get_anim_time(const lv_obj_t * page) */ lv_sb_mode_t lv_page_get_sb_mode(const lv_obj_t * page) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + lv_page_ext_t * ext = lv_obj_get_ext_attr(page); return ext->sb.mode; } @@ -330,8 +359,10 @@ lv_sb_mode_t lv_page_get_sb_mode(const lv_obj_t * page) */ bool lv_page_get_scroll_propagation(lv_obj_t * page) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + lv_page_ext_t * ext = lv_obj_get_ext_attr(page); - return ext->scroll_prop == 0 ? false : true; + return ext->scroll_prop ? true : false; } /** @@ -341,6 +372,8 @@ bool lv_page_get_scroll_propagation(lv_obj_t * page) */ bool lv_page_get_edge_flash(lv_obj_t * page) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_page_ext_t * ext = lv_obj_get_ext_attr(page); return ext->edge_flash.enabled == 0 ? false : true; @@ -357,6 +390,8 @@ bool lv_page_get_edge_flash(lv_obj_t * page) */ lv_coord_t lv_page_get_fit_width(lv_obj_t * page) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + const lv_style_t * bg_style = lv_page_get_style(page, LV_PAGE_STYLE_BG); const lv_style_t * scrl_style = lv_page_get_style(page, LV_PAGE_STYLE_SCRL); @@ -371,6 +406,8 @@ lv_coord_t lv_page_get_fit_width(lv_obj_t * page) */ lv_coord_t lv_page_get_fit_height(lv_obj_t * page) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + const lv_style_t * bg_style = lv_page_get_style(page, LV_PAGE_STYLE_BG); const lv_style_t * scrl_style = lv_page_get_style(page, LV_PAGE_STYLE_SCRL); @@ -386,6 +423,8 @@ lv_coord_t lv_page_get_fit_height(lv_obj_t * page) * */ const lv_style_t * lv_page_get_style(const lv_obj_t * page, lv_page_style_t type) { + LV_ASSERT_OBJ(page, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_page_ext_t * ext = lv_obj_get_ext_attr(page); @@ -595,29 +634,45 @@ void lv_page_scroll_ver(lv_obj_t * page, lv_coord_t dist) /** * Not intended to use directly by the user but by other object types internally. - * Start an edge flash animation. Exactly one `ext->edge_flash.xxx_ip` should be set + * Start an edge flash animation. * @param page + * @param edge the edge to flash. Can be `LV_PAGE_EDGE_LEFT/RIGHT/TOP/BOTTOM` */ -void lv_page_start_edge_flash(lv_obj_t * page) +void lv_page_start_edge_flash(lv_obj_t * page, lv_page_edge_t edge) { #if LV_USE_ANIMATION lv_page_ext_t * ext = lv_obj_get_ext_attr(page); - if(ext->edge_flash.enabled) { - lv_anim_t a; - a.var = page; - a.start = 0; - a.end = LV_PAGE_END_FLASH_SIZE; - a.exec_cb = (lv_anim_exec_xcb_t)edge_flash_anim; - a.path_cb = lv_anim_path_linear; - a.ready_cb = edge_flash_anim_end; - a.act_time = 0; - a.time = LV_PAGE_END_ANIM_TIME; - a.playback = 1; - a.playback_pause = LV_PAGE_END_ANIM_WAIT_TIME; - a.repeat = 0; - a.repeat_pause = 0; - lv_anim_create(&a); + if(ext->edge_flash.enabled == 0) return; + + if(ext->edge_flash.left_ip || + ext->edge_flash.right_ip || + ext->edge_flash.top_ip || + ext->edge_flash.bottom_ip) { + return; } + + lv_anim_t a; + a.var = page; + a.start = 0; + a.end = LV_PAGE_END_FLASH_SIZE; + a.exec_cb = (lv_anim_exec_xcb_t)edge_flash_anim; + a.path_cb = lv_anim_path_linear; + a.ready_cb = edge_flash_anim_end; + a.act_time = 0; + a.time = LV_PAGE_END_ANIM_TIME; + a.playback = 1; + a.playback_pause = LV_PAGE_END_ANIM_WAIT_TIME; + a.repeat = 0; + a.repeat_pause = 0; + lv_anim_create(&a); + + switch(edge) { + case LV_PAGE_EDGE_BOTTOM: ext->edge_flash.bottom_ip = 1; break; + case LV_PAGE_EDGE_TOP: ext->edge_flash.top_ip = 1; break; + case LV_PAGE_EDGE_LEFT: ext->edge_flash.left_ip = 1; break; + case LV_PAGE_EDGE_RIGHT: ext->edge_flash.right_ip = 1; break; + } + #else (void)page; /*Unused*/ #endif @@ -630,17 +685,17 @@ void lv_page_start_edge_flash(lv_obj_t * page) /** * Handle the drawing related tasks of the pages * @param page pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_page_design(lv_obj_t * page, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_page_design(lv_obj_t * page, const lv_area_t * clip_area, lv_design_mode_t mode) { if(mode == LV_DESIGN_COVER_CHK) { - return ancestor_design(page, mask, mode); + return ancestor_design(page, clip_area, mode); } /*Cache page bg style for temporary modification*/ const lv_style_t * style = lv_page_get_style(page, LV_PAGE_STYLE_BG); @@ -650,13 +705,20 @@ static bool lv_page_design(lv_obj_t * page, const lv_area_t * mask, lv_design_mo if(mode == LV_DESIGN_DRAW_MAIN) { /*Draw without border*/ style_tmp.body.border.width = 0; - lv_draw_rect(&page->coords, mask, &style_tmp, lv_obj_get_opa_scale(page)); + lv_draw_rect(&page->coords, clip_area, &style_tmp, lv_obj_get_opa_scale(page)); + if(style->body.corner_mask) { + style = lv_page_get_style(page, LV_PAGE_STYLE_BG); + lv_draw_mask_radius_param_t * mp = lv_mem_buf_get(sizeof(lv_draw_mask_radius_param_t));; + lv_draw_mask_radius_init(mp, &page->coords, style->body.radius, false); + /*Add the mask and use `page+8` as custom id. Don't use `page` directly because it might be sued by the user*/ + lv_draw_mask_add(mp, page + 8); + } } else if(mode == LV_DESIGN_DRAW_POST) { /*Draw only a border*/ style_tmp.body.shadow.width = 0; style_tmp.body.opa = LV_OPA_TRANSP; - lv_draw_rect(&page->coords, mask, &style_tmp, lv_obj_get_opa_scale(page)); + lv_draw_rect(&page->coords, clip_area, &style_tmp, lv_obj_get_opa_scale(page)); lv_page_ext_t * ext = lv_obj_get_ext_attr(page); @@ -669,7 +731,7 @@ static bool lv_page_design(lv_obj_t * page, const lv_area_t * mask, lv_design_mo sb_area.y1 += page->coords.y1; sb_area.x2 += page->coords.x1; sb_area.y2 += page->coords.y1; - lv_draw_rect(&sb_area, mask, ext->sb.style, lv_obj_get_opa_scale(page)); + lv_draw_rect(&sb_area, clip_area, ext->sb.style, lv_obj_get_opa_scale(page)); } if(ext->sb.ver_draw && (ext->sb.mode & LV_SB_MODE_HIDE) == 0) { @@ -679,7 +741,7 @@ static bool lv_page_design(lv_obj_t * page, const lv_area_t * mask, lv_design_mo sb_area.y1 += page->coords.y1; sb_area.x2 += page->coords.x1; sb_area.y2 += page->coords.y1; - lv_draw_rect(&sb_area, mask, ext->sb.style, lv_obj_get_opa_scale(page)); + lv_draw_rect(&sb_area, clip_area, ext->sb.style, lv_obj_get_opa_scale(page)); } #if LV_USE_ANIMATION @@ -718,29 +780,34 @@ static bool lv_page_design(lv_obj_t * page, const lv_area_t * mask, lv_design_mo flash_style.body.radius = LV_RADIUS_CIRCLE; uint32_t opa = (flash_style.body.opa * ext->edge_flash.state) / LV_PAGE_END_FLASH_SIZE; flash_style.body.opa = opa; - lv_draw_rect(&flash_area, mask, &flash_style, lv_obj_get_opa_scale(page)); + lv_draw_rect(&flash_area, clip_area, &flash_style, lv_obj_get_opa_scale(page)); } } + + if(style->body.corner_mask) { + void * param = lv_draw_mask_remove_custom(page + 8); + lv_mem_buf_release(param); + } #endif } - return true; + return LV_DESIGN_RES_OK; } /** * Handle the drawing related tasks of the scrollable object * @param scrl pointer to an object - * @param mask the object will be drawn only in this area + * @param clisp_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_scrl_design(lv_obj_t * scrl, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_scrl_design(lv_obj_t * scrl, const lv_area_t * clisp_area, lv_design_mode_t mode) { if(mode == LV_DESIGN_COVER_CHK) { - return ancestor_design(scrl, mask, mode); + return ancestor_design(scrl, clisp_area, mode); } else if(mode == LV_DESIGN_DRAW_MAIN) { #if LV_USE_GROUP /* If the page is focused in a group and @@ -766,16 +833,16 @@ static bool lv_scrl_design(lv_obj_t * scrl, const lv_area_t * mask, lv_design_mo } } #endif - ancestor_design(scrl, mask, mode); + ancestor_design(scrl, clisp_area, mode); #if LV_USE_GROUP scrl->style_p = style_scrl_ori; /*Revert the style*/ #endif } else if(mode == LV_DESIGN_DRAW_POST) { - ancestor_design(scrl, mask, mode); + ancestor_design(scrl, clisp_area, mode); } - return true; + return LV_DESIGN_RES_OK; } /** @@ -792,28 +859,51 @@ static lv_res_t lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param) /* Include the ancient signal function */ res = ancestor_signal(page, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_page_ext_t * ext = lv_obj_get_ext_attr(page); - lv_obj_t * child; - if(sign == LV_SIGNAL_CHILD_CHG) { /*Automatically move children to the scrollable object*/ - const lv_style_t * style = lv_page_get_style(page, LV_PAGE_STYLE_SCRL); + if(sign == LV_SIGNAL_CLEANUP) { + /*Check whether the object being deleted is propagating scroll to the parent */ + if(ext->scroll_prop) { + lv_obj_t * parent_page = lv_obj_get_parent(lv_obj_get_parent(page)); + lv_page_ext_t * parent_ext = lv_obj_get_ext_attr(parent_page); + if(parent_ext->scroll_prop_obj == page) { + parent_ext->scroll_prop_obj = NULL; + } + } + } + /*Automatically move children to the scrollable object*/ + else if(sign == LV_SIGNAL_CHILD_CHG) { + lv_obj_t * child; + const lv_style_t * style_scrl = lv_page_get_style(page, LV_PAGE_STYLE_SCRL); lv_fit_t fit_left = lv_page_get_scrl_fit_left(page); + lv_fit_t fit_right = lv_page_get_scrl_fit_right(page); lv_fit_t fit_top = lv_page_get_scrl_fit_top(page); - child = lv_obj_get_child(page, NULL); + lv_bidi_dir_t base_dir = lv_obj_get_base_dir(page); + + child = lv_obj_get_child(page, NULL); while(child != NULL) { if(lv_obj_is_protected(child, LV_PROTECT_PARENT) == false) { lv_obj_t * tmp = child; child = lv_obj_get_child(page, child); /*Get the next child before move this*/ - /* Reposition the child to take padding into account (Only if it's on (0;0) now) + /* Reposition the child to take padding into account (Only if it's on (0;0) or (widht;height) coordinates now) * It's required to keep new the object on the same coordinate if FIT is enabled.*/ - if((tmp->coords.x1 == page->coords.x1) && (fit_left == LV_FIT_TIGHT || fit_left == LV_FIT_FILL)) { - tmp->coords.x1 += style->body.padding.left; - tmp->coords.x2 += style->body.padding.left; + if((tmp->coords.x1 == page->coords.x1) && + (fit_left == LV_FIT_TIGHT || fit_left == LV_FIT_FILL) && + base_dir != LV_BIDI_DIR_RTL) { + tmp->coords.x1 += style_scrl->body.padding.left; + tmp->coords.x2 += style_scrl->body.padding.left; + } + else if((tmp->coords.x2 == page->coords.x2) && + (fit_right == LV_FIT_TIGHT || fit_right == LV_FIT_FILL) + && base_dir == LV_BIDI_DIR_RTL) { + tmp->coords.x1 -= style_scrl->body.padding.right; + tmp->coords.x2 -= style_scrl->body.padding.right; } if((tmp->coords.y1 == page->coords.y1) && (fit_top == LV_FIT_TIGHT || fit_top == LV_FIT_FILL)) { - tmp->coords.y1 += style->body.padding.top; - tmp->coords.y2 += style->body.padding.top; + tmp->coords.y1 += style_scrl->body.padding.top; + tmp->coords.y2 += style_scrl->body.padding.top; } lv_obj_set_parent(tmp, ext->scrl); } else { @@ -869,13 +959,6 @@ static lv_res_t lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param) } else if(sign == LV_SIGNAL_GET_EDITABLE) { bool * editable = (bool *)param; *editable = true; - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_page"; } return res; @@ -895,6 +978,7 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi /* Include the ancient signal function */ res = ancestor_signal(scrl, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, ""); lv_obj_t * page = lv_obj_get_parent(scrl); const lv_style_t * page_style = lv_obj_get_style(page); @@ -912,28 +996,33 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi lv_obj_get_coords(scrl, &scrl_coords); lv_obj_get_coords(page, &page_coords); - lv_area_t * ori_coords = (lv_area_t *)param; - lv_coord_t diff_x = scrl->coords.x1 - ori_coords->x1; - lv_coord_t diff_y = scrl->coords.y1 - ori_coords->y1; lv_coord_t hpad = page_style->body.padding.left + page_style->body.padding.right; lv_coord_t vpad = page_style->body.padding.top + page_style->body.padding.bottom; lv_obj_t * page_parent = lv_obj_get_parent(page); + /*Handle scroll propagation*/ lv_indev_t * indev = lv_indev_get_act(); - lv_point_t drag_vect; - lv_indev_get_vect(indev, &drag_vect); - - /* Start the scroll propagation if there is drag vector on the indev, but the drag is not - * started yet and the scrollable is in a corner. It will enable the scroll propagation only - * when a new scroll begins and not when the scrollable is already being scrolled.*/ - if(page_ext->scroll_prop && page_ext->scroll_prop_ip == 0 && lv_indev_is_dragging(indev) == false) { - if(((drag_vect.y > 0 && scrl_coords.y1 == page_coords.y1 + page_style->body.padding.top) || - (drag_vect.y < 0 && scrl_coords.y2 == page_coords.y2 - page_style->body.padding.bottom)) && - ((drag_vect.x > 0 && scrl_coords.x1 == page_coords.x1 + page_style->body.padding.left) || - (drag_vect.x < 0 && scrl_coords.x2 == page_coords.x2 - page_style->body.padding.right))) { - - if(lv_obj_get_parent(page_parent) != NULL) { /*Do not propagate the scroll to a screen*/ - page_ext->scroll_prop_ip = 1; + if(page_ext->scroll_prop && indev) { + lv_point_t * drag_sum = &indev->proc.types.pointer.drag_sum; + lv_page_ext_t * parent_ext = lv_obj_get_ext_attr(lv_obj_get_parent(page_parent)); + if(parent_ext->scroll_prop_obj == NULL) { + /*If the dragging just started or scroll is already propagated to this object + * enable the scroll propagation if the conditions are met*/ + if((lv_indev_is_dragging(indev) == false || page_ext->scroll_prop_obj) && (drag_sum->y || drag_sum->x)) { + /*Propagate vertically?*/ + if((drag_sum->y > 0 && lv_page_on_edge(page, LV_PAGE_EDGE_TOP)) || + (drag_sum->y < 0 && lv_page_on_edge(page, LV_PAGE_EDGE_BOTTOM))) { + lv_obj_set_drag_parent(page, true); + lv_obj_set_drag_parent(scrl, true); + parent_ext->scroll_prop_obj = page; + } + /*Propagate horizontally?*/ + if((drag_sum->x > 0 && lv_page_on_edge(page, LV_PAGE_EDGE_LEFT)) || + (drag_sum->x < 0 && lv_page_on_edge(page, LV_PAGE_EDGE_RIGHT))) { + lv_obj_set_drag_parent(page, true); + lv_obj_set_drag_parent(scrl, true); + parent_ext->scroll_prop_obj = page; + } } } } @@ -945,39 +1034,16 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi refr_x = true; } } else { - /*If the scroll propagation is in progress revert the original coordinates (don't let - * the page scroll)*/ - if(page_ext->scroll_prop_ip) { - if(drag_vect.x == diff_x) { /*`scrl` is bouncing: drag pos. it somewhere and here it - is reverted. Handle only the pos. because of drag*/ - new_x = ori_coords->x1 - page_coords.x1; - refr_x = true; - } - } /*The edges of the scrollable can not be in the page (minus hpad) */ - else if(scrl_coords.x2 < page_coords.x2 - page_style->body.padding.right) { + if(scrl_coords.x2 < page_coords.x2 - page_style->body.padding.right) { new_x = lv_area_get_width(&page_coords) - lv_area_get_width(&scrl_coords) - page_style->body.padding.right; /* Right align */ refr_x = true; -#if LV_USE_ANIMATION - if(page_ext->edge_flash.enabled && page_ext->edge_flash.left_ip == 0 && - page_ext->edge_flash.right_ip == 0 && page_ext->edge_flash.top_ip == 0 && - page_ext->edge_flash.bottom_ip == 0) { - lv_page_start_edge_flash(page); - page_ext->edge_flash.right_ip = 1; - } -#endif + lv_page_start_edge_flash(page, LV_PAGE_EDGE_RIGHT); } else if(scrl_coords.x1 > page_coords.x1 + page_style->body.padding.left) { new_x = page_style->body.padding.left; /*Left align*/ refr_x = true; -#if LV_USE_ANIMATION - if(page_ext->edge_flash.enabled && page_ext->edge_flash.left_ip == 0 && - page_ext->edge_flash.right_ip == 0 && page_ext->edge_flash.top_ip == 0 && - page_ext->edge_flash.bottom_ip == 0) { - lv_page_start_edge_flash(page); - page_ext->edge_flash.left_ip = 1; - } -#endif + lv_page_start_edge_flash(page, LV_PAGE_EDGE_LEFT); } } @@ -988,56 +1054,44 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi refr_y = true; } } else { - /*If the scroll propagation is in progress revert the original coordinates (don't let - * the page scroll)*/ - if(page_ext->scroll_prop_ip) { - if(drag_vect.y == diff_y) { /*`scrl` is bouncing: drag pos. it somewhere and here it - is reverted. Handle only the pos. because of drag*/ - new_y = ori_coords->y1 - page_coords.y1; - refr_y = true; - } - } /*The edges of the scrollable can not be in the page (minus vpad) */ - else if(scrl_coords.y2 < page_coords.y2 - page_style->body.padding.bottom) { + if(scrl_coords.y2 < page_coords.y2 - page_style->body.padding.bottom) { new_y = lv_area_get_height(&page_coords) - lv_area_get_height(&scrl_coords) - page_style->body.padding.bottom; /* Bottom align */ refr_y = true; -#if LV_USE_ANIMATION - if(page_ext->edge_flash.enabled && page_ext->edge_flash.left_ip == 0 && - page_ext->edge_flash.right_ip == 0 && page_ext->edge_flash.top_ip == 0 && - page_ext->edge_flash.bottom_ip == 0) { - lv_page_start_edge_flash(page); - page_ext->edge_flash.bottom_ip = 1; - } -#endif + lv_page_start_edge_flash(page, LV_PAGE_EDGE_BOTTOM); } else if(scrl_coords.y1 > page_coords.y1 + page_style->body.padding.top) { new_y = page_style->body.padding.top; /*Top align*/ refr_y = true; -#if LV_USE_ANIMATION - if(page_ext->edge_flash.enabled && page_ext->edge_flash.left_ip == 0 && - page_ext->edge_flash.right_ip == 0 && page_ext->edge_flash.top_ip == 0 && - page_ext->edge_flash.bottom_ip == 0) { - lv_page_start_edge_flash(page); - page_ext->edge_flash.top_ip = 1; - } -#endif + lv_page_start_edge_flash(page, LV_PAGE_EDGE_TOP); } } if(refr_x || refr_y) { lv_obj_set_pos(scrl, new_x, new_y); - - if(page_ext->scroll_prop_ip) { - if(refr_y) lv_obj_set_y(page_parent, lv_obj_get_y(page_parent) + diff_y); - if(refr_x) lv_obj_set_x(page_parent, lv_obj_get_x(page_parent) + diff_x); - } } lv_page_sb_refresh(page); } else if(sign == LV_SIGNAL_DRAG_END) { /*Scroll propagation is finished on drag end*/ - page_ext->scroll_prop_ip = 0; + if(page_ext->scroll_prop_obj) { + lv_obj_t * scroller_page = page_ext->scroll_prop_obj; + page_ext->scroll_prop_obj = NULL; + lv_obj_set_drag_parent(scroller_page, false); + lv_obj_set_drag_parent(lv_page_get_scrl(scroller_page), false); + + /*The scrolling can be chained so stop all of them*/ + lv_page_ext_t * scroller_ext = lv_obj_get_ext_attr(scroller_page); + while(scroller_ext->scroll_prop_obj) { + scroller_page = scroller_ext->scroll_prop_obj; + scroller_ext->scroll_prop_obj = NULL; + lv_obj_set_drag_parent(scroller_page, false); + lv_obj_set_drag_parent(lv_page_get_scrl(scroller_page), false); + + scroller_ext = lv_obj_get_ext_attr(scroller_page); + } + } /*Hide scrollbars if required*/ if(page_ext->sb.mode == LV_SB_MODE_DRAG) { diff --git a/src/lv_objx/lv_page.h b/src/lv_objx/lv_page.h index 344d1aecc..86e1b0a4d 100644 --- a/src/lv_objx/lv_page.h +++ b/src/lv_objx/lv_page.h @@ -86,9 +86,8 @@ typedef struct uint16_t anim_time; /*Scroll animation time*/ #endif - - uint8_t scroll_prop : 1; /*1: Propagate the scrolling the the parent if the edge is reached*/ - uint8_t scroll_prop_ip : 1; /*1: Scroll propagation is in progress (used by the library)*/ + lv_obj_t * scroll_prop_obj; /*Pointer to child page from where the scroll is being propagated */ + uint8_t scroll_prop :1; /*The direction of the scroll propagation*/ } lv_page_ext_t; enum { @@ -113,9 +112,9 @@ lv_obj_t * lv_page_create(lv_obj_t * par, const lv_obj_t * copy); /** * Delete all children of the scrl object, without deleting scrl child. - * @param obj pointer to an object + * @param page pointer to an object */ -void lv_page_clean(lv_obj_t * obj); +void lv_page_clean(lv_obj_t * page); /** * Get the scrollable object of a page @@ -152,6 +151,8 @@ void lv_page_set_anim_time(lv_obj_t * page, uint16_t anim_time); /** * Enable the scroll propagation feature. If enabled then the page will move its parent if there is * no more space to scroll. + * The page needs to have a page-like parent (e.g. `lv_page`, `lv_tabview` tab, `lv_win` content area etc) + * If enabled drag direction will be changed `LV_DRAG_DIR_ONE` automatically to allow scrolling only in one direction at one time. * @param page pointer to a Page * @param en true or false to enable/disable scroll propagation */ @@ -399,10 +400,12 @@ void lv_page_scroll_ver(lv_obj_t * page, lv_coord_t dist); /** * Not intended to use directly by the user but by other object types internally. - * Start an edge flash animation. Exactly one `ext->edge_flash.xxx_ip` should be set + * Start an edge flash animation. * @param page + * @param edge the edge to flash. Can be `LV_PAGE_EDGE_LEFT/RIGHT/TOP/BOTTOM` */ -void lv_page_start_edge_flash(lv_obj_t * page); +void lv_page_start_edge_flash(lv_obj_t * page, lv_page_edge_t edge); + /********************** * MACROS **********************/ diff --git a/src/lv_objx/lv_preload.c b/src/lv_objx/lv_preload.c index eee893203..b00bb8cb5 100644 --- a/src/lv_objx/lv_preload.c +++ b/src/lv_objx/lv_preload.c @@ -9,6 +9,7 @@ #include "lv_preload.h" #if LV_USE_PRELOAD != 0 +#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_math.h" #include "../lv_draw/lv_draw_rect.h" #include "../lv_draw/lv_draw_arc.h" @@ -17,6 +18,8 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_preloader" + #ifndef LV_PRELOAD_DEF_ARC_LENGTH #define LV_PRELOAD_DEF_ARC_LENGTH 60 /*[deg]*/ #endif @@ -36,7 +39,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_preload_design(lv_obj_t * preload, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_preload_design(lv_obj_t * preload, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_preload_signal(lv_obj_t * preload, lv_signal_t sign, void * param); /********************** @@ -66,13 +69,16 @@ lv_obj_t * lv_preload_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor of pre loader*/ lv_obj_t * new_preload = lv_arc_create(par, copy); - lv_mem_assert(new_preload); + LV_ASSERT_MEM(new_preload); if(new_preload == NULL) return NULL; /*Allocate the pre loader type specific extended data*/ lv_preload_ext_t * ext = lv_obj_allocate_ext_attr(new_preload, sizeof(lv_preload_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_preload); + return NULL; + } if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_preload); if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_preload); @@ -81,6 +87,7 @@ lv_obj_t * lv_preload_create(lv_obj_t * par, const lv_obj_t * copy) ext->arc_length = LV_PRELOAD_DEF_ARC_LENGTH; ext->anim_type = LV_PRELOAD_DEF_ANIM; ext->anim_dir = LV_PRELOAD_DIR_FORWARD; + ext->time = LV_PRELOAD_DEF_SPIN_TIME; /*The signal and design functions are not copied so set them here*/ lv_obj_set_signal_cb(new_preload, lv_preload_signal); @@ -98,7 +105,6 @@ lv_obj_t * lv_preload_create(lv_obj_t * par, const lv_obj_t * copy) lv_obj_set_style(new_preload, &lv_style_pretty_color); } - ext->time = LV_PRELOAD_DEF_SPIN_TIME; } /*Copy an existing pre loader*/ @@ -129,6 +135,8 @@ lv_obj_t * lv_preload_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_preload_set_arc_length(lv_obj_t * preload, lv_anim_value_t deg) { + LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + lv_preload_ext_t * ext = lv_obj_get_ext_attr(preload); ext->arc_length = deg; @@ -141,6 +149,8 @@ void lv_preload_set_arc_length(lv_obj_t * preload, lv_anim_value_t deg) */ void lv_preload_set_spin_time(lv_obj_t * preload, uint16_t time) { + LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + lv_preload_ext_t * ext = lv_obj_get_ext_attr(preload); ext->time = time; @@ -158,6 +168,8 @@ void lv_preload_set_spin_time(lv_obj_t * preload, uint16_t time) * */ void lv_preload_set_style(lv_obj_t * preload, lv_preload_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + switch(type) { case LV_PRELOAD_STYLE_MAIN: lv_arc_set_style(preload, LV_ARC_STYLE_MAIN, style); break; } @@ -170,6 +182,8 @@ void lv_preload_set_style(lv_obj_t * preload, lv_preload_style_t type, const lv_ * */ void lv_preload_set_type(lv_obj_t * preload, lv_preload_type_t type) { + LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + lv_preload_ext_t * ext = lv_obj_get_ext_attr(preload); /*delete previous animation*/ @@ -181,11 +195,11 @@ void lv_preload_set_type(lv_obj_t * preload, lv_preload_type_t type) a.var = preload; if(ext->anim_dir == LV_PRELOAD_DIR_FORWARD) { /* Clockwise */ - a.start = 360; - a.end = 0; - } else { a.start = 0; a.end = 360; + } else { + a.start = 360; + a.end = 0; } a.exec_cb = (lv_anim_exec_xcb_t)lv_preload_spinner_anim; a.path_cb = lv_anim_path_ease_in_out; @@ -202,11 +216,11 @@ void lv_preload_set_type(lv_obj_t * preload, lv_preload_type_t type) b.var = preload; if(ext->anim_dir == LV_PRELOAD_DIR_FORWARD) { /* Clockwise */ - b.start = 360 - ext->arc_length; - b.end = ext->arc_length; - } else { b.start = ext->arc_length; b.end = 360 - ext->arc_length; + } else { + b.start = 360 - ext->arc_length; + b.end = ext->arc_length; } b.exec_cb = (lv_anim_exec_xcb_t)lv_preload_set_arc_length; b.path_cb = lv_anim_path_ease_in_out; @@ -220,21 +234,23 @@ void lv_preload_set_type(lv_obj_t * preload, lv_preload_type_t type) lv_anim_create(&b); break; } + case LV_PRELOAD_TYPE_CONSTANT_ARC: case LV_PRELOAD_TYPE_SPINNING_ARC: default: { - ext->anim_type = LV_PRELOAD_TYPE_SPINNING_ARC; + ext->anim_type = type; lv_anim_t a; a.var = preload; if(ext->anim_dir == LV_PRELOAD_DIR_FORWARD) { /* Clockwise */ - a.start = 360; - a.end = 0; - } else { a.start = 0; a.end = 360; + } else { + a.start = 360; + a.end = 0; } a.exec_cb = (lv_anim_exec_xcb_t)lv_preload_spinner_anim; - a.path_cb = lv_anim_path_ease_in_out; + a.path_cb = (LV_PRELOAD_TYPE_CONSTANT_ARC == type ? + lv_anim_path_linear : lv_anim_path_ease_in_out); a.ready_cb = NULL; a.act_time = 0; a.time = ext->time; @@ -250,6 +266,8 @@ void lv_preload_set_type(lv_obj_t * preload, lv_preload_type_t type) void lv_preload_set_dir(lv_obj_t * preload, lv_preload_dir_t dir) { + LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + lv_preload_ext_t * ext = lv_obj_get_ext_attr(preload); ext->anim_dir = dir; @@ -266,6 +284,8 @@ void lv_preload_set_dir(lv_obj_t * preload, lv_preload_dir_t dir) */ lv_anim_value_t lv_preload_get_arc_length(const lv_obj_t * preload) { + LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + lv_preload_ext_t * ext = lv_obj_get_ext_attr(preload); return ext->arc_length; } @@ -276,6 +296,8 @@ lv_anim_value_t lv_preload_get_arc_length(const lv_obj_t * preload) */ uint16_t lv_preload_get_spin_time(const lv_obj_t * preload) { + LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + lv_preload_ext_t * ext = lv_obj_get_ext_attr(preload); return ext->time; } @@ -288,6 +310,8 @@ uint16_t lv_preload_get_spin_time(const lv_obj_t * preload) * */ const lv_style_t * lv_preload_get_style(const lv_obj_t * preload, lv_preload_style_t type) { + LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + const lv_style_t * style = NULL; switch(type) { @@ -305,6 +329,8 @@ const lv_style_t * lv_preload_get_style(const lv_obj_t * preload, lv_preload_sty * */ lv_preload_type_t lv_preload_get_type(lv_obj_t * preload) { + LV_ASSERT_OBJ(preload, LV_OBJX_NAME); + lv_preload_ext_t * ext = lv_obj_get_ext_attr(preload); return ext->anim_type; } @@ -329,13 +355,15 @@ void lv_preload_spinner_anim(void * ptr, lv_anim_value_t val) lv_obj_t * preload = ptr; lv_preload_ext_t * ext = lv_obj_get_ext_attr(preload); - int16_t angle_start = val - ext->arc_length / 2 + 180; + int16_t angle_start = val - ext->arc_length / 2 - 90; + if(angle_start < 0) angle_start += 360; int16_t angle_end = angle_start + ext->arc_length; angle_start = angle_start % 360; angle_end = angle_end % 360; - lv_arc_set_angles(preload, angle_start, angle_end); + lv_arc_set_start_angle(preload, angle_start); + lv_arc_set_end_angle(preload, angle_end); } /********************** @@ -345,18 +373,18 @@ void lv_preload_spinner_anim(void * ptr, lv_anim_value_t val) /** * Handle the drawing related tasks of the pre loaders * @param preload pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_preload_design(lv_obj_t * preload, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_preload_design(lv_obj_t * preload, const lv_area_t * clip_area, lv_design_mode_t mode) { /*Return false if the object is not covers the mask_p area*/ if(mode == LV_DESIGN_COVER_CHK) { - return false; + return LV_DESIGN_RES_NOT_COVER; } /*Draw the object*/ else if(mode == LV_DESIGN_DRAW_MAIN) { @@ -376,6 +404,7 @@ static bool lv_preload_design(lv_obj_t * preload, const lv_area_t * mask, lv_des bg_style.body.radius = LV_RADIUS_CIRCLE; bg_style.body.border.color = style->body.border.color; bg_style.body.border.width = style->body.border.width; + bg_style.body.border.opa = style->body.border.opa; lv_area_t bg_area; bg_area.x1 = x - r; @@ -383,16 +412,16 @@ static bool lv_preload_design(lv_obj_t * preload, const lv_area_t * mask, lv_des bg_area.x2 = x + r; bg_area.y2 = y + r; - lv_draw_rect(&bg_area, mask, &bg_style, lv_obj_get_opa_scale(preload)); + lv_draw_rect(&bg_area, clip_area, &bg_style, lv_obj_get_opa_scale(preload)); } /*Draw the arc above the background circle */ - ancestor_design(preload, mask, mode); + ancestor_design(preload, clip_area, mode); } /*Post draw when the children are drawn*/ else if(mode == LV_DESIGN_DRAW_POST) { } - return true; + return LV_DESIGN_RES_OK; } /** @@ -409,16 +438,10 @@ static lv_res_t lv_preload_signal(lv_obj_t * preload, lv_signal_t sign, void * p /* Include the ancient signal function */ res = ancestor_signal(preload, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_CLEANUP) { /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_preload"; } return res; diff --git a/src/lv_objx/lv_preload.h b/src/lv_objx/lv_preload.h index cbc7826a6..22b87f32f 100644 --- a/src/lv_objx/lv_preload.h +++ b/src/lv_objx/lv_preload.h @@ -48,6 +48,7 @@ extern "C" { enum { LV_PRELOAD_TYPE_SPINNING_ARC, LV_PRELOAD_TYPE_FILLSPIN_ARC, + LV_PRELOAD_TYPE_CONSTANT_ARC, }; typedef uint8_t lv_preload_type_t; @@ -67,7 +68,7 @@ typedef struct /*New data for this type */ lv_anim_value_t arc_length; /*Length of the spinning indicator in degree*/ uint16_t time; /*Time of one round*/ - lv_preload_type_t anim_type : 1; /*Type of the arc animation*/ + lv_preload_type_t anim_type : 2; /*Type of the arc animation*/ lv_preload_dir_t anim_dir : 1; /*Animation Direction*/ } lv_preload_ext_t; diff --git a/src/lv_objx/lv_roller.c b/src/lv_objx/lv_roller.c index 287d139b1..dbd0a79f6 100644 --- a/src/lv_objx/lv_roller.c +++ b/src/lv_objx/lv_roller.c @@ -9,6 +9,7 @@ #include "lv_roller.h" #if LV_USE_ROLLER != 0 +#include "../lv_core/lv_debug.h" #include "../lv_draw/lv_draw.h" #include "../lv_core/lv_group.h" #include "../lv_themes/lv_theme.h" @@ -16,6 +17,8 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_roller" + #if LV_USE_ANIMATION == 0 #undef LV_ROLLER_DEF_ANIM_TIME #define LV_ROLLER_DEF_ANIM_TIME 0 /*No animation*/ @@ -28,7 +31,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_roller_design(lv_obj_t * roller, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_roller_design(lv_obj_t * roller, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_roller_scrl_signal(lv_obj_t * roller_scrl, lv_signal_t sign, void * param); static lv_res_t lv_roller_signal(lv_obj_t * roller, lv_signal_t sign, void * param); static void refr_position(lv_obj_t * roller, lv_anim_enable_t animen); @@ -65,7 +68,7 @@ lv_obj_t * lv_roller_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor of roller*/ lv_obj_t * new_roller = lv_ddlist_create(par, copy); - lv_mem_assert(new_roller); + LV_ASSERT_MEM(new_roller); if(new_roller == NULL) return NULL; if(ancestor_scrl_signal == NULL) ancestor_scrl_signal = lv_obj_get_signal_cb(lv_page_get_scrl(new_roller)); @@ -73,9 +76,13 @@ lv_obj_t * lv_roller_create(lv_obj_t * par, const lv_obj_t * copy) /*Allocate the roller type specific extended data*/ lv_roller_ext_t * ext = lv_obj_allocate_ext_attr(new_roller, sizeof(lv_roller_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; - ext->ddlist.draw_arrow = 0; /*Do not draw arrow by default*/ + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_roller); + return NULL; + } + + ext->mode = LV_ROLLER_MODE_NORMAL; /*The signal and design functions are not copied so set them here*/ lv_obj_set_signal_cb(new_roller, lv_roller_signal); @@ -89,6 +96,7 @@ lv_obj_t * lv_roller_create(lv_obj_t * par, const lv_obj_t * copy) lv_ddlist_open(new_roller, false); lv_ddlist_set_anim_time(new_roller, LV_ROLLER_DEF_ANIM_TIME); lv_ddlist_set_stay_open(new_roller, true); + lv_ddlist_set_symbol(new_roller, NULL); lv_roller_set_visible_row_count(new_roller, 3); lv_label_set_align(ext->ddlist.label, LV_LABEL_ALIGN_CENTER); @@ -134,6 +142,9 @@ lv_obj_t * lv_roller_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_roller_set_options(lv_obj_t * roller, const char * options, lv_roller_mode_t mode) { + LV_ASSERT_OBJ(roller, LV_OBJX_NAME); + LV_ASSERT_STR(options); + lv_roller_ext_t * ext = lv_obj_get_ext_attr(roller); if(mode == LV_ROLLER_MODE_NORMAL) { @@ -147,7 +158,7 @@ void lv_roller_set_options(lv_obj_t * roller, const char * options, lv_roller_mo } else { ext->mode = LV_ROLLER_MODE_INIFINITE; - uint32_t opt_len = strlen(options) + 1; /*+1 to add '\n' after option lists*/ + size_t opt_len = strlen(options) + 1; /*+1 to add '\n' after option lists*/ char * opt_extra = lv_mem_alloc(opt_len * LV_ROLLER_INF_PAGES); uint8_t i; for(i = 0; i < LV_ROLLER_INF_PAGES; i++) { @@ -175,6 +186,8 @@ void lv_roller_set_options(lv_obj_t * roller, const char * options, lv_roller_mo */ void lv_roller_set_align(lv_obj_t * roller, lv_label_align_t align) { + LV_ASSERT_OBJ(roller, LV_OBJX_NAME); + lv_roller_ext_t * ext = lv_obj_get_ext_attr(roller); lv_obj_t * label = ext->ddlist.label; @@ -197,6 +210,8 @@ void lv_roller_set_align(lv_obj_t * roller, lv_label_align_t align) */ void lv_roller_set_selected(lv_obj_t * roller, uint16_t sel_opt, lv_anim_enable_t anim) { + LV_ASSERT_OBJ(roller, LV_OBJX_NAME); + #if LV_USE_ANIMATION == 0 anim = LV_ANIM_OFF; #endif @@ -214,6 +229,8 @@ void lv_roller_set_selected(lv_obj_t * roller, uint16_t sel_opt, lv_anim_enable_ */ void lv_roller_set_visible_row_count(lv_obj_t * roller, uint8_t row_cnt) { + LV_ASSERT_OBJ(roller, LV_OBJX_NAME); + lv_roller_ext_t * ext = lv_obj_get_ext_attr(roller); const lv_style_t * style_label = lv_obj_get_style(ext->ddlist.label); uint8_t n_line_space = (row_cnt > 1) ? row_cnt - 1 : 1; @@ -229,6 +246,8 @@ void lv_roller_set_visible_row_count(lv_obj_t * roller, uint8_t row_cnt) */ void lv_roller_set_style(lv_obj_t * roller, lv_roller_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(roller, LV_OBJX_NAME); + switch(type) { case LV_ROLLER_STYLE_BG: lv_obj_set_style(roller, style); break; case LV_ROLLER_STYLE_SEL: lv_ddlist_set_style(roller, LV_DDLIST_STYLE_SEL, style); break; @@ -246,6 +265,8 @@ void lv_roller_set_style(lv_obj_t * roller, lv_roller_style_t type, const lv_sty */ uint16_t lv_roller_get_selected(const lv_obj_t * roller) { + LV_ASSERT_OBJ(roller, LV_OBJX_NAME); + lv_roller_ext_t * ext = lv_obj_get_ext_attr(roller); if(ext->mode == LV_ROLLER_MODE_INIFINITE) { uint16_t real_id_cnt = ext->ddlist.option_cnt / LV_ROLLER_INF_PAGES; @@ -262,9 +283,11 @@ uint16_t lv_roller_get_selected(const lv_obj_t * roller) */ lv_label_align_t lv_roller_get_align(const lv_obj_t * roller) { + LV_ASSERT_OBJ(roller, LV_OBJX_NAME); + lv_roller_ext_t * ext = lv_obj_get_ext_attr(roller); - lv_mem_assert(ext); - lv_mem_assert(ext->ddlist.label); + LV_ASSERT_MEM(ext); + LV_ASSERT_MEM(ext->ddlist.label); return lv_label_get_align(ext->ddlist.label); } @@ -275,6 +298,8 @@ lv_label_align_t lv_roller_get_align(const lv_obj_t * roller) */ bool lv_roller_get_hor_fit(const lv_obj_t * roller) { + LV_ASSERT_OBJ(roller, LV_OBJX_NAME); + return lv_page_get_scrl_fit_left(roller); } @@ -286,14 +311,21 @@ bool lv_roller_get_hor_fit(const lv_obj_t * roller) * */ const lv_style_t * lv_roller_get_style(const lv_obj_t * roller, lv_roller_style_t type) { + LV_ASSERT_OBJ(roller, LV_OBJX_NAME); + + const lv_style_t * style; switch(type) { - case LV_ROLLER_STYLE_BG: return lv_obj_get_style(roller); - case LV_ROLLER_STYLE_SEL: return lv_ddlist_get_style(roller, LV_DDLIST_STYLE_SEL); - default: return NULL; + case LV_ROLLER_STYLE_BG: + style = lv_obj_get_style(roller); + break; + case LV_ROLLER_STYLE_SEL: + style = lv_ddlist_get_style(roller, LV_DDLIST_STYLE_SEL); + break; + default: + style = NULL; } - /*To avoid warning*/ - return NULL; + return style; } /********************** @@ -303,22 +335,22 @@ const lv_style_t * lv_roller_get_style(const lv_obj_t * roller, lv_roller_style_ /** * Handle the drawing related tasks of the rollers * @param roller pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_roller_design(lv_obj_t * roller, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_roller_design(lv_obj_t * roller, const lv_area_t * clip_area, lv_design_mode_t mode) { /*Return false if the object is not covers the mask_p area*/ if(mode == LV_DESIGN_COVER_CHK) { - return false; + return LV_DESIGN_RES_NOT_COVER; } /*Draw the object*/ else if(mode == LV_DESIGN_DRAW_MAIN) { - draw_bg(roller, mask); + draw_bg(roller, clip_area); const lv_style_t * style = lv_roller_get_style(roller, LV_ROLLER_STYLE_BG); lv_opa_t opa_scale = lv_obj_get_opa_scale(roller); @@ -336,7 +368,7 @@ static bool lv_roller_design(lv_obj_t * roller, const lv_area_t * mask, lv_desig rect_area.x1 = roller_coords.x1; rect_area.x2 = roller_coords.x2; - lv_draw_rect(&rect_area, mask, ext->ddlist.sel_style, opa_scale); + lv_draw_rect(&rect_area, clip_area, ext->ddlist.sel_style, opa_scale); } /*Post draw when the children are drawn*/ else if(mode == LV_DESIGN_DRAW_POST) { @@ -355,7 +387,7 @@ static bool lv_roller_design(lv_obj_t * roller, const lv_area_t * mask, lv_desig rect_area.x2 = roller->coords.x2; lv_area_t mask_sel; bool area_ok; - area_ok = lv_area_intersect(&mask_sel, mask, &rect_area); + area_ok = lv_area_intersect(&mask_sel, clip_area, &rect_area); if(area_ok) { const lv_style_t * sel_style = lv_roller_get_style(roller, LV_ROLLER_STYLE_SEL); lv_style_t new_style; @@ -375,11 +407,11 @@ static bool lv_roller_design(lv_obj_t * roller, const lv_area_t * mask, lv_desig new_style.text.color = sel_style->text.color; new_style.text.opa = sel_style->text.opa; lv_draw_label(&ext->ddlist.label->coords, &mask_sel, &new_style, opa_scale, - lv_label_get_text(ext->ddlist.label), txt_align, NULL, -1, -1, NULL); + lv_label_get_text(ext->ddlist.label), txt_align, NULL, NULL, NULL, lv_obj_get_base_dir(ext->ddlist.label)); } } - return true; + return LV_DESIGN_RES_OK; } /** @@ -399,6 +431,7 @@ static lv_res_t lv_roller_signal(lv_obj_t * roller, lv_signal_t sign, void * par res = ancestor_signal(roller, sign, param); if(res != LV_RES_OK) return res; } + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_roller_ext_t * ext = lv_obj_get_ext_attr(roller); @@ -465,13 +498,6 @@ static lv_res_t lv_roller_signal(lv_obj_t * roller, lv_signal_t sign, void * par ext->ddlist.sel_opt_id_ori = ori_id; } } - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_roller"; } return res; diff --git a/src/lv_objx/lv_slider.c b/src/lv_objx/lv_slider.c index a7fb4333b..79a00042f 100644 --- a/src/lv_objx/lv_slider.c +++ b/src/lv_objx/lv_slider.c @@ -10,16 +10,18 @@ #include "lv_slider.h" #if LV_USE_SLIDER != 0 +#include "../lv_core/lv_debug.h" #include "../lv_core/lv_group.h" +#include "../lv_core/lv_indev.h" #include "../lv_draw/lv_draw.h" #include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_math.h" +#include "lv_img.h" /********************* * DEFINES *********************/ -#define LV_SLIDER_SIZE_MIN 4 /*hor. pad and ver. pad cannot make the bar or indicator smaller then this [px]*/ -#define LV_SLIDER_NOT_PRESSED INT16_MIN +#define LV_OBJX_NAME "lv_slider" /********************** * TYPEDEFS @@ -28,8 +30,10 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_slider_design(lv_obj_t * slider, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_slider_design(lv_obj_t * slider, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_slider_signal(lv_obj_t * slider, lv_signal_t sign, void * param); +static void lv_slider_position_knob(lv_obj_t * slider, lv_area_t * knob_area, lv_coord_t knob_size, bool hor); +static void lv_slider_draw_knob(lv_obj_t * slider, lv_area_t * knob_area, lv_area_t * clip_area); /********************** * STATIC VARIABLES @@ -57,7 +61,7 @@ lv_obj_t * lv_slider_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor slider*/ lv_obj_t * new_slider = lv_bar_create(par, copy); - lv_mem_assert(new_slider); + LV_ASSERT_MEM(new_slider); if(new_slider == NULL) return NULL; if(ancestor_design_f == NULL) ancestor_design_f = lv_obj_get_design_cb(new_slider); @@ -65,13 +69,17 @@ lv_obj_t * lv_slider_create(lv_obj_t * par, const lv_obj_t * copy) /*Allocate the slider type specific extended data*/ lv_slider_ext_t * ext = lv_obj_allocate_ext_attr(new_slider, sizeof(lv_slider_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_slider); + return NULL; + } /*Initialize the allocated 'ext' */ - ext->drag_value = LV_SLIDER_NOT_PRESSED; ext->style_knob = &lv_style_pretty; - ext->knob_in = 0; + ext->value_to_set = NULL; + ext->dragging = false; + ext->img_knob = NULL; /*The signal and design functions are not copied so set them here*/ lv_obj_set_signal_cb(new_slider, lv_slider_signal); @@ -96,7 +104,6 @@ lv_obj_t * lv_slider_create(lv_obj_t * par, const lv_obj_t * copy) else { lv_slider_ext_t * copy_ext = lv_obj_get_ext_attr(copy); ext->style_knob = copy_ext->style_knob; - ext->knob_in = copy_ext->knob_in; /*Refresh the style with new signal function*/ lv_obj_refresh_style(new_slider); } @@ -111,17 +118,19 @@ lv_obj_t * lv_slider_create(lv_obj_t * par, const lv_obj_t * copy) *====================*/ /** - * Set the 'knob in' attribute of a slider - * @param slider pointer to slider object - * @param in true: the knob is drawn always in the slider; - * false: the knob can be out on the edges + * Set an image to display on the knob of the slider + * @param slider pointer to a slider object + * @param img_src pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object) */ -void lv_slider_set_knob_in(lv_obj_t * slider, bool in) +void lv_slider_set_knob_img(lv_obj_t * slider, const void * img_src) { - lv_slider_ext_t * ext = lv_obj_get_ext_attr(slider); - if(ext->knob_in == in) return; + LV_ASSERT_OBJ(slider, LV_OBJX_NAME); - ext->knob_in = in == false ? 0 : 1; + lv_slider_ext_t * ext = lv_obj_get_ext_attr(slider); + + ext->img_knob = img_src; + lv_obj_refresh_ext_draw_pad(slider); lv_obj_invalidate(slider); } @@ -133,6 +142,8 @@ void lv_slider_set_knob_in(lv_obj_t * slider, bool in) */ void lv_slider_set_style(lv_obj_t * slider, lv_slider_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(slider, LV_OBJX_NAME); + lv_slider_ext_t * ext = lv_obj_get_ext_attr(slider); switch(type) { @@ -141,6 +152,7 @@ void lv_slider_set_style(lv_obj_t * slider, lv_slider_style_t type, const lv_sty case LV_SLIDER_STYLE_KNOB: ext->style_knob = style; lv_obj_refresh_ext_draw_pad(slider); + lv_obj_invalidate(slider); break; } } @@ -156,12 +168,8 @@ void lv_slider_set_style(lv_obj_t * slider, lv_slider_style_t type, const lv_sty */ int16_t lv_slider_get_value(const lv_obj_t * slider) { - lv_slider_ext_t * ext = lv_obj_get_ext_attr(slider); - - if(ext->drag_value != LV_SLIDER_NOT_PRESSED) - return ext->drag_value; - else - return lv_bar_get_value(slider); + LV_ASSERT_OBJ(slider, LV_OBJX_NAME); + return lv_bar_get_value(slider); } /** @@ -171,20 +179,24 @@ int16_t lv_slider_get_value(const lv_obj_t * slider) */ bool lv_slider_is_dragged(const lv_obj_t * slider) { + LV_ASSERT_OBJ(slider, LV_OBJX_NAME); + lv_slider_ext_t * ext = lv_obj_get_ext_attr(slider); - return ext->drag_value == LV_SLIDER_NOT_PRESSED ? false : true; + return ext->dragging ? true : false; } /** - * Get the 'knob in' attribute of a slider - * @param slider pointer to slider object - * @return true: the knob is drawn always in the slider; - * false: the knob can be out on the edges + * Get an image to display on the knob of the slider + * @param slider pointer to a slider object + * @return the image source: pointer to an `lv_img_dsc_t` variable or a path to an image (not an `lv_img` object) */ -bool lv_slider_get_knob_in(const lv_obj_t * slider) +const void * lv_slider_get_knob_img(lv_obj_t * slider, const void * img_src) { + LV_ASSERT_OBJ(slider, LV_OBJX_NAME); + lv_slider_ext_t * ext = lv_obj_get_ext_attr(slider); - return ext->knob_in == 0 ? false : true; + + return ext->img_knob; } /** @@ -195,6 +207,8 @@ bool lv_slider_get_knob_in(const lv_obj_t * slider) */ const lv_style_t * lv_slider_get_style(const lv_obj_t * slider, lv_slider_style_t type) { + LV_ASSERT_OBJ(slider, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_slider_ext_t * ext = lv_obj_get_ext_attr(slider); @@ -215,240 +229,85 @@ const lv_style_t * lv_slider_get_style(const lv_obj_t * slider, lv_slider_style_ /** * Handle the drawing related tasks of the sliders * @param slider pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_slider_design(lv_obj_t * slider, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_slider_design(lv_obj_t * slider, const lv_area_t * clip_area, lv_design_mode_t mode) { /*Return false if the object is not covers the mask_p area*/ if(mode == LV_DESIGN_COVER_CHK) { - return false; + return LV_DESIGN_RES_NOT_COVER; } /*Draw the object*/ else if(mode == LV_DESIGN_DRAW_MAIN) { + + /*The ancestor design function will draw the background and the indicator. + * It also sets ext->bar.indic_area*/ + ancestor_design_f(slider, clip_area, mode); + lv_slider_ext_t * ext = lv_obj_get_ext_attr(slider); - const lv_style_t * style_bg = lv_slider_get_style(slider, LV_SLIDER_STYLE_BG); - const lv_style_t * style_knob = lv_slider_get_style(slider, LV_SLIDER_STYLE_KNOB); - const lv_style_t * style_indic = lv_slider_get_style(slider, LV_SLIDER_STYLE_INDIC); + lv_coord_t objw = lv_obj_get_width(slider); + lv_coord_t objh = lv_obj_get_height(slider); + bool hor = objw >= objh ? true : false; + lv_coord_t knob_size = hor ? objh : objw; + bool sym = false; + if(ext->bar.type == LV_BAR_TYPE_SYM && ext->bar.min_value < 0 && ext->bar.max_value > 0) sym = true; - lv_opa_t opa_scale = lv_obj_get_opa_scale(slider); - - lv_coord_t slider_w = lv_area_get_width(&slider->coords); - lv_coord_t slider_h = lv_area_get_height(&slider->coords); - - /*Draw the bar*/ - lv_area_t area_bg; - lv_area_copy(&area_bg, &slider->coords); - - /*Be sure at least LV_SLIDER_SIZE_MIN size will remain*/ - lv_coord_t pad_top_bg = style_bg->body.padding.top; - lv_coord_t pad_bottom_bg = style_bg->body.padding.bottom; - lv_coord_t pad_left_bg = style_bg->body.padding.left; - lv_coord_t pad_right_bg = style_bg->body.padding.right; - if(pad_top_bg + pad_bottom_bg + LV_SLIDER_SIZE_MIN > lv_area_get_height(&area_bg)) { - pad_top_bg = (lv_area_get_height(&area_bg) - LV_SLIDER_SIZE_MIN) >> 1; - pad_bottom_bg = pad_top_bg; - } - if(pad_left_bg + pad_right_bg + LV_SLIDER_SIZE_MIN > lv_area_get_width(&area_bg)) { - pad_left_bg = (lv_area_get_width(&area_bg) - LV_SLIDER_SIZE_MIN) >> 1; - pad_right_bg = (lv_area_get_width(&area_bg) - LV_SLIDER_SIZE_MIN) >> 1; - } - - if(ext->knob_in) { /*Enable extra size if the knob is inside */ - area_bg.x1 += pad_left_bg; - area_bg.x2 -= pad_right_bg; - area_bg.y1 += pad_top_bg; - area_bg.y2 -= pad_bottom_bg; - } else { /*Let space only in the perpendicular directions*/ - area_bg.x1 += slider_w < slider_h ? pad_left_bg : 0; /*Pad only for vertical slider*/ - area_bg.x2 -= slider_w < slider_h ? pad_right_bg : 0; /*Pad only for vertical slider*/ - area_bg.y1 += slider_w > slider_h ? pad_top_bg : 0; /*Pad only for horizontal slider*/ - area_bg.y2 -= slider_w > slider_h ? pad_bottom_bg : 0; /*Pad only for horizontal slider*/ - } - -#if LV_USE_GROUP == 0 - lv_draw_rect(&area_bg, mask, style_bg, lv_obj_get_opa_scale(slider)); -#else - /* Draw the borders later if the slider is focused. - * At value = 100% the indicator can cover to whole background and the focused style won't - * be visible*/ - if(lv_obj_is_focused(slider)) { - lv_style_t style_tmp; - lv_style_copy(&style_tmp, style_bg); - style_tmp.body.border.width = 0; - lv_draw_rect(&area_bg, mask, &style_tmp, opa_scale); - } else { - lv_draw_rect(&area_bg, mask, style_bg, opa_scale); - } -#endif - - /*Draw the indicator*/ - lv_area_t area_indic; - lv_area_copy(&area_indic, &area_bg); - - /*Be sure at least ver pad/hor pad width indicator will remain*/ - lv_coord_t pad_top_indic = style_indic->body.padding.top; - lv_coord_t pad_bottom_indic = style_indic->body.padding.bottom; - lv_coord_t pad_left_indic = style_indic->body.padding.left; - lv_coord_t pad_right_indic = style_indic->body.padding.right; - if(pad_top_indic + pad_bottom_indic + LV_SLIDER_SIZE_MIN > lv_area_get_height(&area_bg)) { - pad_top_indic = (lv_area_get_height(&area_bg) - LV_SLIDER_SIZE_MIN) >> 1; - pad_bottom_indic = pad_top_indic; - } - if(pad_left_indic + pad_right_indic + LV_SLIDER_SIZE_MIN > lv_area_get_width(&area_bg)) { - pad_left_indic = (lv_area_get_width(&area_bg) - LV_SLIDER_SIZE_MIN) >> 1; - pad_right_indic = pad_left_indic; - } - - area_indic.x1 += pad_left_indic; - area_indic.x2 -= pad_right_indic; - area_indic.y1 += pad_top_indic; - area_indic.y2 -= pad_bottom_indic; - - lv_coord_t cur_value = lv_slider_get_value(slider); - lv_coord_t min_value = lv_slider_get_min_value(slider); - lv_coord_t max_value = lv_slider_get_max_value(slider); - - /*If dragged draw to the drag position*/ - if(ext->drag_value != LV_SLIDER_NOT_PRESSED) cur_value = ext->drag_value; - - if(slider_w >= slider_h) { - lv_coord_t indic_w = lv_area_get_width(&area_indic); -#if LV_USE_ANIMATION - if(ext->bar.anim_state != LV_BAR_ANIM_STATE_INV) { - /*Calculate the coordinates of anim. start and end*/ - lv_coord_t anim_start_x = - (int32_t)((int32_t)indic_w * (ext->bar.anim_start - min_value)) / (max_value - min_value); - lv_coord_t anim_end_x = - (int32_t)((int32_t)indic_w * (ext->bar.anim_end - min_value)) / (max_value - min_value); - - /*Calculate the real position based on `anim_state` (between `anim_start` and - * `anim_end`)*/ - area_indic.x2 = anim_start_x + (((anim_end_x - anim_start_x) * ext->bar.anim_state) >> 8); - } else -#endif - { - area_indic.x2 = (int32_t)((int32_t)indic_w * (cur_value - min_value)) / (max_value - min_value); - } - area_indic.x2 = area_indic.x1 + area_indic.x2 - 1; - - /*Draw the indicator but don't draw an ugly 1px wide rectangle on the left on min. - * value*/ - if(area_indic.x1 != area_indic.x2) lv_draw_rect(&area_indic, mask, style_indic, opa_scale); - - } else { - lv_coord_t indic_h = lv_area_get_height(&area_indic); -#if LV_USE_ANIMATION - if(ext->bar.anim_state != LV_BAR_ANIM_STATE_INV) { - /*Calculate the coordinates of anim. start and end*/ - lv_coord_t anim_start_y = - (int32_t)((int32_t)indic_h * (ext->bar.anim_start - min_value)) / (max_value - min_value); - lv_coord_t anim_end_y = - (int32_t)((int32_t)indic_h * (ext->bar.anim_end - min_value)) / (max_value - min_value); - - /*Calculate the real position based on `anim_state` (between `anim_start` and - * `anim_end`)*/ - area_indic.y1 = anim_start_y + (((anim_end_y - anim_start_y) * ext->bar.anim_state) >> 8); - } else -#endif - { - area_indic.y1 = (int32_t)((int32_t)indic_h * (cur_value - min_value)) / (max_value - min_value); - } - area_indic.y1 = area_indic.y2 - area_indic.y1 + 1; - - /*Draw the indicator but don't draw an ugly 1px height rectangle on the bottom on min. - * value*/ - if(area_indic.x1 != area_indic.x2) lv_draw_rect(&area_indic, mask, style_indic, opa_scale); - } - - /*Before the knob add the border if required*/ -#if LV_USE_GROUP - /* Draw the borders later if the bar is focused. - * At value = 100% the indicator can cover to whole background and the focused style won't - * be visible*/ - if(lv_obj_is_focused(slider)) { - lv_style_t style_tmp; - lv_style_copy(&style_tmp, style_bg); - style_tmp.body.opa = LV_OPA_TRANSP; - style_tmp.body.shadow.width = 0; - lv_draw_rect(&area_bg, mask, &style_tmp, opa_scale); - } -#endif - - /*Draw the knob*/ lv_area_t knob_area; - lv_area_copy(&knob_area, &slider->coords); - if(slider_w >= slider_h) { - if(ext->knob_in == 0) { - knob_area.x1 = area_indic.x2 - slider_h / 2; - knob_area.x2 = knob_area.x1 + slider_h - 1; + /*Horizontal*/ + if(hor) { + if(!sym) { + knob_area.x1 = ext->bar.indic_area.x2; } else { -#if LV_USE_ANIMATION - if(ext->bar.anim_state != LV_BAR_ANIM_STATE_INV) { - lv_coord_t w = slider_w - slider_h - 1; - lv_coord_t anim_start_x = - (int32_t)((int32_t)w * (ext->bar.anim_start - min_value)) / (max_value - min_value); - lv_coord_t anim_end_x = - (int32_t)((int32_t)w * (ext->bar.anim_end - min_value)) / (max_value - min_value); - - /*Calculate the real position based on `anim_state` (between `anim_start` and - * `anim_end`)*/ - knob_area.x1 = anim_start_x + (((anim_end_x - anim_start_x) * ext->bar.anim_state) >> 8); - } else -#endif - { - knob_area.x1 = (int32_t)((int32_t)(slider_w - slider_h - 1) * (cur_value - min_value)) / - (max_value - min_value); + if(ext->bar.cur_value >= 0) { + knob_area.x1 = ext->bar.indic_area.x2; + } else { + knob_area.x1 = ext->bar.indic_area.x1; } - - knob_area.x1 += slider->coords.x1; - knob_area.x2 = knob_area.x1 + slider_h - 1; } - - knob_area.y1 = slider->coords.y1; - knob_area.y2 = slider->coords.y2; - } else { - if(ext->knob_in == 0) { - knob_area.y1 = area_indic.y1 - slider_w / 2; - knob_area.y2 = knob_area.y1 + slider_w - 1; - } else { -#if LV_USE_ANIMATION - if(ext->bar.anim_state != LV_BAR_ANIM_STATE_INV) { - lv_coord_t h = slider_h - slider_w - 1; - lv_coord_t anim_start_x = - (int32_t)((int32_t)h * (ext->bar.anim_start - min_value)) / (max_value - min_value); - lv_coord_t anim_end_x = - (int32_t)((int32_t)h * (ext->bar.anim_end - min_value)) / (max_value - min_value); - - /*Calculate the real position based on `anim_state` (between `anim_start` and - * `anim_end`)*/ - knob_area.y2 = anim_start_x + (((anim_end_x - anim_start_x) * ext->bar.anim_state) >> 8); - } else -#endif - { - knob_area.y2 = (int32_t)((int32_t)(slider_h - slider_w - 1) * (cur_value - min_value)) / - (max_value - min_value); - } - - knob_area.y2 = slider->coords.y2 - knob_area.y2; - knob_area.y1 = knob_area.y2 - slider_w - 1; - } - knob_area.x1 = slider->coords.x1; - knob_area.x2 = slider->coords.x2; } - lv_draw_rect(&knob_area, mask, style_knob, opa_scale); + /*Vertical*/ + else { + if(!sym) { + knob_area.y1 = ext->bar.indic_area.y1; + } else { + if(ext->bar.cur_value >= 0) { + knob_area.y1 = ext->bar.indic_area.y1; + } else { + knob_area.y1 = ext->bar.indic_area.y2; + } + } + } + lv_slider_position_knob(slider, &knob_area, knob_size, hor); + + lv_area_copy(&ext->left_knob_area, &knob_area); + lv_slider_draw_knob(slider, &knob_area, clip_area); + + if(lv_slider_get_type(slider) == LV_SLIDER_TYPE_RANGE) { + /* Draw a second knob for the start_value side */ + if(hor) { + knob_area.x1 = ext->bar.indic_area.x1; + } else { + knob_area.y1 = ext->bar.indic_area.y1; + } + lv_slider_position_knob(slider, &knob_area, knob_size, hor); + + lv_area_copy(&ext->right_knob_area, &knob_area); + lv_slider_draw_knob(slider, &knob_area, clip_area); + } } /*Post draw when the children are drawn*/ else if(mode == LV_DESIGN_DRAW_POST) { + return ancestor_design_f(slider, clip_area, mode); } - return true; + return LV_DESIGN_RES_OK; } /** @@ -465,45 +324,75 @@ static lv_res_t lv_slider_signal(lv_obj_t * slider, lv_signal_t sign, void * par /* Include the ancient signal function */ res = ancestor_signal(slider, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_slider_ext_t * ext = lv_obj_get_ext_attr(slider); lv_point_t p; - lv_coord_t w = lv_obj_get_width(slider); - lv_coord_t h = lv_obj_get_height(slider); if(sign == LV_SIGNAL_PRESSED) { - ext->drag_value = lv_slider_get_value(slider); - } else if(sign == LV_SIGNAL_PRESSING) { + ext->dragging = true; + if(lv_slider_get_type(slider) == LV_SLIDER_TYPE_RANGE) { + lv_indev_get_point(param, &p); + bool hor = lv_obj_get_width(slider) >= lv_obj_get_height(slider); + + /* Calculate the distance from each knob */ + lv_coord_t dist_left, dist_right; + if(hor) { + dist_left = LV_MATH_ABS((ext->left_knob_area.x1+(ext->left_knob_area.x2 - ext->left_knob_area.x1)/2) - p.x); + dist_right = LV_MATH_ABS((ext->right_knob_area.x1+(ext->right_knob_area.x2 - ext->right_knob_area.x1)/2) - p.x); + } else { + dist_left = LV_MATH_ABS((ext->left_knob_area.y1+(ext->left_knob_area.y2 - ext->left_knob_area.y1)/2) - p.y); + dist_right = LV_MATH_ABS((ext->right_knob_area.y1+(ext->right_knob_area.y2 - ext->right_knob_area.y1)/2) - p.y); + } + + /* Use whichever one is closer */ + if(dist_right > dist_left) + ext->value_to_set = &ext->bar.cur_value; + else + ext->value_to_set = &ext->bar.start_value; + } else + ext->value_to_set = &ext->bar.cur_value; + } else if(sign == LV_SIGNAL_PRESSING && ext->value_to_set != NULL) { lv_indev_get_point(param, &p); - int16_t tmp = 0; - if(w > h) { - lv_coord_t knob_w = h; - p.x -= - slider->coords.x1 + h / 2; /*Modify the point to shift with half knob (important on the start and end)*/ - tmp = (int32_t)((int32_t)p.x * (ext->bar.max_value - ext->bar.min_value + 1)) / (w - knob_w); - tmp += ext->bar.min_value; - } else { - lv_coord_t knob_h = w; - p.y -= - slider->coords.y1 + w / 2; /*Modify the point to shift with half knob (important on the start and end)*/ - tmp = (int32_t)((int32_t)p.y * (ext->bar.max_value - ext->bar.min_value + 1)) / (h - knob_h); - tmp = ext->bar.max_value - tmp; /*Invert the value: smaller value means higher y*/ - } - if(tmp < ext->bar.min_value) - tmp = ext->bar.min_value; - else if(tmp > ext->bar.max_value) - tmp = ext->bar.max_value; + lv_coord_t w = lv_obj_get_width(slider); + lv_coord_t h = lv_obj_get_height(slider); + const lv_style_t * indic_style = lv_slider_get_style(slider, LV_SLIDER_STYLE_INDIC); + int32_t range = ext->bar.max_value - ext->bar.min_value; + int16_t new_value = 0, real_max_value = ext->bar.max_value, real_min_value = ext->bar.min_value; - if(tmp != ext->drag_value) { - ext->drag_value = tmp; - lv_obj_invalidate(slider); - res = lv_event_send(slider, LV_EVENT_VALUE_CHANGED, NULL); - if(res != LV_RES_OK) return res; - } + if(w >= h) { + lv_coord_t indic_w = w - indic_style->body.padding.left - indic_style->body.padding.right; + new_value = p.x - (slider->coords.x1 + indic_style->body.padding.left); /*Make the point relative to the indicator*/ + new_value = (new_value * range) / indic_w; + new_value += ext->bar.min_value; + } else { + lv_coord_t indic_h = h - indic_style->body.padding.bottom - indic_style->body.padding.top; + new_value = p.y - (slider->coords.y2 + indic_style->body.padding.bottom); /*Make the point relative to the indicator*/ + new_value = (-new_value * range) / indic_h; + new_value += ext->bar.min_value; + + } + + /* Figure out the min. and max. for this mode */ + if(ext->value_to_set == &ext->bar.start_value) { + real_max_value = ext->bar.cur_value; + } else + real_min_value = ext->bar.start_value; + + if(new_value < real_min_value) new_value = real_min_value; + else if(new_value > real_max_value) new_value = real_max_value; + + if(new_value != ext->bar.cur_value) { + *ext->value_to_set = new_value; + lv_obj_invalidate(slider); + res = lv_event_send(slider, LV_EVENT_VALUE_CHANGED, NULL); + if(res != LV_RES_OK) return res; + } + } else if(sign == LV_SIGNAL_RELEASED || sign == LV_SIGNAL_PRESS_LOST) { - if(ext->drag_value != LV_SLIDER_NOT_PRESSED) lv_slider_set_value(slider, ext->drag_value, false); - ext->drag_value = LV_SLIDER_NOT_PRESSED; + ext->dragging = false; + ext->value_to_set = NULL; #if LV_USE_GROUP /*Leave edit mode if released. (No need to wait for LONG_PRESS) */ @@ -523,30 +412,45 @@ static lv_res_t lv_slider_signal(lv_obj_t * slider, lv_signal_t sign, void * par slider->signal_cb(slider, LV_SIGNAL_REFR_EXT_DRAW_PAD, NULL); } } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { - const lv_style_t * style = lv_slider_get_style(slider, LV_SLIDER_STYLE_BG); + const lv_style_t * bg_style = lv_slider_get_style(slider, LV_SLIDER_STYLE_BG); + const lv_style_t * indic_style = lv_slider_get_style(slider, LV_SLIDER_STYLE_INDIC); const lv_style_t * knob_style = lv_slider_get_style(slider, LV_SLIDER_STYLE_KNOB); - lv_coord_t shadow_w = knob_style->body.shadow.width; - if(ext->knob_in == 0) { - /* The smaller size is the knob diameter*/ - lv_coord_t x = LV_MATH_MIN(w / 2 + 1 + shadow_w, h / 2 + 1 + shadow_w); - if(slider->ext_draw_pad < x) slider->ext_draw_pad = x; - } else { - lv_coord_t pad = 0; - pad = LV_MATH_MIN(pad, style->body.padding.top); - pad = LV_MATH_MIN(pad, style->body.padding.bottom); - pad = LV_MATH_MIN(pad, style->body.padding.left); - pad = LV_MATH_MIN(pad, style->body.padding.right); - if(pad < 0) pad = -pad; - if(slider->ext_draw_pad < pad) slider->ext_draw_pad = pad; + /* The smaller size is the knob diameter*/ + lv_coord_t knob_size = LV_MATH_MIN(lv_obj_get_width(slider), lv_obj_get_height(slider)) >> 1; + knob_size += LV_MATH_MAX( + LV_MATH_MAX(knob_style->body.padding.left, knob_style->body.padding.right), + LV_MATH_MAX(knob_style->body.padding.bottom,knob_style->body.padding.top)); - if(slider->ext_draw_pad < shadow_w) slider->ext_draw_pad = shadow_w; + knob_size += knob_style->body.shadow.width + knob_style->body.shadow.spread; + knob_size += LV_MATH_MAX(LV_MATH_ABS(knob_style->body.shadow.offset.x), LV_MATH_ABS(knob_style->body.shadow.offset.y)); + + if(ext->img_knob) { + lv_img_header_t info; + lv_res_t res; + res = lv_img_decoder_get_info(ext->img_knob, &info); + if(res == LV_RES_OK) { + knob_size = LV_MATH_MAX(knob_size, info.w / 2); + knob_size = LV_MATH_MAX(knob_size, info.h / 2); + } else { + LV_LOG_WARN("slider signal (LV_SIGNAL_REFR_EXT_DRAW_PAD): can't get knob image info") + } } + + + lv_coord_t bg_size = bg_style->body.shadow.width + bg_style->body.shadow.spread; + bg_size += LV_MATH_MAX(LV_MATH_ABS(bg_style->body.shadow.offset.x), LV_MATH_ABS(bg_style->body.shadow.offset.y)); + + lv_coord_t indic_size = indic_style->body.shadow.width + indic_style->body.shadow.spread; + indic_size += LV_MATH_MAX(LV_MATH_ABS(indic_style->body.shadow.offset.x), LV_MATH_ABS(indic_style->body.shadow.offset.y)); + + slider->ext_draw_pad = LV_MATH_MAX(slider->ext_draw_pad, knob_size); + slider->ext_draw_pad = LV_MATH_MAX(slider->ext_draw_pad, indic_size); + slider->ext_draw_pad = LV_MATH_MAX(slider->ext_draw_pad, bg_size); + } else if(sign == LV_SIGNAL_CONTROL) { char c = *((char *)param); - ext->drag_value = LV_SLIDER_NOT_PRESSED; - if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { lv_slider_set_value(slider, lv_slider_get_value(slider) + 1, true); res = lv_event_send(slider, LV_EVENT_VALUE_CHANGED, NULL); @@ -559,15 +463,58 @@ static lv_res_t lv_slider_signal(lv_obj_t * slider, lv_signal_t sign, void * par } else if(sign == LV_SIGNAL_GET_EDITABLE) { bool * editable = (bool *)param; *editable = true; - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_slider"; } return res; } + +static void lv_slider_position_knob(lv_obj_t * slider, lv_area_t * knob_area, lv_coord_t knob_size, bool hor) +{ + const lv_style_t * style_knob = lv_slider_get_style(slider, LV_SLIDER_STYLE_KNOB); + + if(hor) { + knob_area->x1 -= (knob_size >> 1); + knob_area->x2 = knob_area->x1 + knob_size; + knob_area->y1 = slider->coords.y1; + knob_area->y2 = slider->coords.y2; + } else { + knob_area->y1 -= (knob_size >> 1); + knob_area->y2 = knob_area->y1 + knob_size; + knob_area->x1 = slider->coords.x1; + knob_area->x2 = slider->coords.x2; + } + + /*Apply the paddings on the knob area*/ + knob_area->x1 -= style_knob->body.padding.left; + knob_area->x2 += style_knob->body.padding.right; + knob_area->y1 -= style_knob->body.padding.top; + knob_area->y2 += style_knob->body.padding.bottom; +} + +static void lv_slider_draw_knob(lv_obj_t * slider, lv_area_t * knob_area, lv_area_t * clip_area) { + lv_slider_ext_t * ext = lv_obj_get_ext_attr(slider); + const lv_style_t * style_knob = lv_slider_get_style(slider, LV_SLIDER_STYLE_KNOB); + lv_opa_t opa_scale = lv_obj_get_opa_scale(slider); + + lv_draw_rect(knob_area, clip_area, style_knob, opa_scale); + + if(ext->img_knob) { + lv_res_t res; + lv_img_header_t info; + res = lv_img_decoder_get_info(ext->img_knob, &info); + if(res == LV_RES_OK) { + lv_coord_t x_ofs = knob_area->x1 + (lv_area_get_width(knob_area) - info.w) / 2; + lv_coord_t y_ofs = knob_area->y1 + (lv_area_get_height(knob_area) - info.h) / 2; + lv_area_t a; + a.x1 = x_ofs; + a.y1 = y_ofs; + a.x2 = info.w - 1 + x_ofs; + a.y2 = info.h - 1 + y_ofs; + + lv_draw_img(&a, clip_area, ext->img_knob, style_knob, 0, NULL, LV_IMG_ZOOM_NONE, false, opa_scale); + } else { + LV_LOG_WARN("lv_slider_design: can't get knob image info") + } + } +} #endif diff --git a/src/lv_objx/lv_slider.h b/src/lv_objx/lv_slider.h index 07086efe4..34398889c 100644 --- a/src/lv_objx/lv_slider.h +++ b/src/lv_objx/lv_slider.h @@ -36,14 +36,24 @@ extern "C" { /********************** * TYPEDEFS **********************/ + +enum { + LV_SLIDER_TYPE_NORMAL, + LV_SLIDER_TYPE_SYM, + LV_SLIDER_TYPE_RANGE +}; +typedef uint8_t lv_slider_type_t; /*Data of slider*/ typedef struct { lv_bar_ext_t bar; /*Ext. of ancestor*/ /*New data for this type */ const lv_style_t * style_knob; /*Style of the knob*/ - int16_t drag_value; /*Store a temporal value during press until release (Handled by the library)*/ - uint8_t knob_in : 1; /*1: Draw the knob inside the bar*/ + lv_area_t left_knob_area; + lv_area_t right_knob_area; + int16_t *value_to_set; /* Which bar value to set */ + const void * img_knob; + uint8_t dragging :1; /*1: the slider is being dragged*/ } lv_slider_ext_t; /** Built-in styles of slider*/ @@ -81,6 +91,17 @@ static inline void lv_slider_set_value(lv_obj_t * slider, int16_t value, lv_anim lv_bar_set_value(slider, value, anim); } +/** + * Set a new value for the left knob of a slider + * @param slider pointer to a slider object + * @param left_value new value + * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately + */ +static inline void lv_slider_set_left_value(lv_obj_t * slider, int16_t left_value, lv_anim_enable_t anim) +{ + lv_bar_set_start_value(slider, left_value, anim); +} + /** * Set minimum and the maximum values of a bar * @param slider pointer to the slider object @@ -93,9 +114,10 @@ static inline void lv_slider_set_range(lv_obj_t * slider, int16_t min, int16_t m } /** - * Set the animation time of the slider - * @param slider pointer to a bar object - * @param anim_time the animation time in milliseconds. + * Make the slider symmetric to zero. The indicator will grow from zero instead of the minimum + * position. + * @param slider pointer to a slider object + * @param en true: enable disable symmetric behavior; false: disable */ static inline void lv_slider_set_anim_time(lv_obj_t * slider, uint16_t anim_time) { @@ -103,12 +125,27 @@ static inline void lv_slider_set_anim_time(lv_obj_t * slider, uint16_t anim_time } /** - * Set the 'knob in' attribute of a slider - * @param slider pointer to slider object - * @param in true: the knob is drawn always in the slider; - * false: the knob can be out on the edges + * Set an image to display on the knob of the slider + * @param slider pointer to a slider object + * @param img_src pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object) */ -void lv_slider_set_knob_in(lv_obj_t * slider, bool in); +void lv_slider_set_knob_img(lv_obj_t * slider, const void * img_src); + +/** + * Set the animation time of the slider + * @param slider pointer to a bar object + * @param anim_time the animation time in milliseconds. + */ +static inline void lv_slider_set_type(lv_obj_t * slider, lv_slider_type_t type) +{ + if(type == LV_SLIDER_TYPE_NORMAL) + lv_bar_set_type(slider, LV_BAR_TYPE_NORMAL); + else if(type == LV_SLIDER_TYPE_SYM) + lv_bar_set_type(slider, LV_BAR_TYPE_SYM); + else if(type == LV_SLIDER_TYPE_RANGE) + lv_bar_set_type(slider, LV_BAR_TYPE_CUSTOM); +} /** * Set a style of a slider @@ -123,12 +160,22 @@ void lv_slider_set_style(lv_obj_t * slider, lv_slider_style_t type, const lv_sty *====================*/ /** - * Get the value of a slider + * Get the value of the main knob of a slider * @param slider pointer to a slider object - * @return the value of the slider + * @return the value of the main knob of the slider */ int16_t lv_slider_get_value(const lv_obj_t * slider); +/** + * Get the value of the left knob of a slider + * @param slider pointer to a slider object + * @return the value of the left knob of the slider + */ +static inline int16_t lv_slider_get_left_value(const lv_obj_t * slider) +{ + return lv_bar_get_start_value(slider); +} + /** * Get the minimum value of a slider * @param slider pointer to a slider object @@ -157,12 +204,37 @@ static inline int16_t lv_slider_get_max_value(const lv_obj_t * slider) bool lv_slider_is_dragged(const lv_obj_t * slider); /** - * Get the 'knob in' attribute of a slider - * @param slider pointer to slider object - * @return true: the knob is drawn always in the slider; - * false: the knob can be out on the edges + * Get an image to display on the knob of the slider + * @param slider pointer to a slider object + * @return the image source: pointer to an `lv_img_dsc_t` variable or a path to an image (not an `lv_img` object) */ -bool lv_slider_get_knob_in(const lv_obj_t * slider); +const void * lv_slider_get_knob_img(lv_obj_t * slider, const void * img_src); + +/** + * Get the animation time of the slider + * @param slider pointer to a slider object + * @return the animation time in milliseconds. + */ +static inline uint16_t lv_slider_get_anim_time(lv_obj_t * slider) +{ + return lv_bar_get_anim_time(slider); +} + +/** + * Get whether the slider is symmetric or not. + * @param slider pointer to a bar object + * @return true: symmetric is enabled; false: disable + */ +static inline lv_slider_type_t lv_slider_get_type(lv_obj_t * slider) +{ + lv_bar_type_t type = lv_bar_get_type(slider); + if(type == LV_BAR_TYPE_SYM) + return LV_SLIDER_TYPE_SYM; + else if(type == LV_BAR_TYPE_CUSTOM) + return LV_SLIDER_TYPE_RANGE; + else + return LV_SLIDER_TYPE_NORMAL; +} /** * Get a style of a slider diff --git a/src/lv_objx/lv_spinbox.c b/src/lv_objx/lv_spinbox.c index 4dc544942..914f7afe3 100644 --- a/src/lv_objx/lv_spinbox.c +++ b/src/lv_objx/lv_spinbox.c @@ -9,6 +9,7 @@ #include "lv_spinbox.h" #if LV_USE_SPINBOX != 0 +#include "../lv_core/lv_debug.h" #include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_math.h" #include "../lv_misc/lv_utils.h" @@ -16,6 +17,7 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_spinbox" /********************** * TYPEDEFS @@ -53,13 +55,17 @@ lv_obj_t * lv_spinbox_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor of spinbox*/ lv_obj_t * new_spinbox = lv_ta_create(par, copy); - lv_mem_assert(new_spinbox); + LV_ASSERT_MEM(new_spinbox); if(new_spinbox == NULL) return NULL; /*Allocate the spinbox type specific extended data*/ lv_spinbox_ext_t * ext = lv_obj_allocate_ext_attr(new_spinbox, sizeof(lv_spinbox_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_spinbox); + return NULL; + } + if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_spinbox); if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_spinbox); @@ -121,6 +127,8 @@ lv_obj_t * lv_spinbox_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_spinbox_set_value(lv_obj_t * spinbox, int32_t i) { + LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); if(ext == NULL) return; @@ -141,6 +149,8 @@ void lv_spinbox_set_value(lv_obj_t * spinbox, int32_t i) */ void lv_spinbox_set_digit_format(lv_obj_t * spinbox, uint8_t digit_count, uint8_t separator_position) { + LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); if(ext == NULL) return; @@ -161,6 +171,8 @@ void lv_spinbox_set_digit_format(lv_obj_t * spinbox, uint8_t digit_count, uint8_ */ void lv_spinbox_set_step(lv_obj_t * spinbox, uint32_t step) { + LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); if(ext == NULL) return; @@ -175,6 +187,8 @@ void lv_spinbox_set_step(lv_obj_t * spinbox, uint32_t step) */ void lv_spinbox_set_range(lv_obj_t * spinbox, int32_t range_min, int32_t range_max) { + LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); if(ext == NULL) return; @@ -198,6 +212,8 @@ void lv_spinbox_set_range(lv_obj_t * spinbox, int32_t range_min, int32_t range_m */ void lv_spinbox_set_padding_left(lv_obj_t * spinbox, uint8_t padding) { + LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); ext->digit_padding_left = padding; lv_spinbox_updatevalue(spinbox); @@ -214,6 +230,8 @@ void lv_spinbox_set_padding_left(lv_obj_t * spinbox, uint8_t padding) */ int32_t lv_spinbox_get_value(lv_obj_t * spinbox) { + LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); return ext->value; @@ -229,6 +247,8 @@ int32_t lv_spinbox_get_value(lv_obj_t * spinbox) */ void lv_spinbox_step_next(lv_obj_t * spinbox) { + LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); int32_t new_step = ext->step / 10; @@ -246,6 +266,8 @@ void lv_spinbox_step_next(lv_obj_t * spinbox) */ void lv_spinbox_step_prev(lv_obj_t * spinbox) { + LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); int32_t step_limit; step_limit = LV_MATH_MAX(ext->range_max, (ext->range_min < 0 ? (-ext->range_min) : ext->range_min)); @@ -261,6 +283,8 @@ void lv_spinbox_step_prev(lv_obj_t * spinbox) */ void lv_spinbox_increment(lv_obj_t * spinbox) { + LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); if(ext->value + ext->step <= ext->range_max) { @@ -281,6 +305,8 @@ void lv_spinbox_increment(lv_obj_t * spinbox) */ void lv_spinbox_decrement(lv_obj_t * spinbox) { + LV_ASSERT_OBJ(spinbox, LV_OBJX_NAME); + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); if(ext->value - ext->step >= ext->range_min) { @@ -308,8 +334,6 @@ void lv_spinbox_decrement(lv_obj_t * spinbox) static lv_res_t lv_spinbox_signal(lv_obj_t * spinbox, lv_signal_t sign, void * param) { - lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); - lv_res_t res = LV_RES_OK; /* Include the ancient signal function */ @@ -317,7 +341,10 @@ static lv_res_t lv_spinbox_signal(lv_obj_t * spinbox, lv_signal_t sign, void * p res = ancestor_signal(spinbox, sign, param); if(res != LV_RES_OK) return res; } + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); + + lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); if(sign == LV_SIGNAL_CLEANUP) { /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ } else if(sign == LV_SIGNAL_GET_TYPE) { @@ -383,11 +410,13 @@ static void lv_spinbox_updatevalue(lv_obj_t * spinbox) memset(buf, 0, sizeof(buf)); char * buf_p = buf; - /*Add the sign*/ - (*buf_p) = ext->value >= 0 ? '+' : '-'; - buf_p++; + if (ext->range_min < 0) { // hide sign if there are only positive values + /*Add the sign*/ + (*buf_p) = ext->value >= 0 ? '+' : '-'; + buf_p++; + } - int i; + int32_t i; /*padding left*/ for(i = 0; i < ext->digit_padding_left; i++) { (*buf_p) = ' '; @@ -401,7 +430,7 @@ static void lv_spinbox_updatevalue(lv_obj_t * spinbox) /*Add leading zeros*/ int lz_cnt = ext->digit_count - (int)strlen(digits); if(lz_cnt > 0) { - for(i = strlen(digits); i >= 0; i--) { + for(i = (uint16_t)strlen(digits); i >= 0; i--) { digits[i + lz_cnt] = digits[i]; } for(i = 0; i < lz_cnt; i++) { @@ -434,7 +463,7 @@ static void lv_spinbox_updatevalue(lv_obj_t * spinbox) /*Set the cursor position*/ int32_t step = ext->step; - uint8_t cur_pos = ext->digit_count; + uint8_t cur_pos = (uint8_t)ext->digit_count; while(step >= 10) { step /= 10; cur_pos--; diff --git a/src/lv_objx/lv_sw.c b/src/lv_objx/lv_sw.c index 80854b0a0..8ceaab05d 100644 --- a/src/lv_objx/lv_sw.c +++ b/src/lv_objx/lv_sw.c @@ -15,12 +15,16 @@ #error "lv_sw: lv_slider is required. Enable it in lv_conf.h (LV_USE_SLIDER 1) " #endif +#include "../lv_core/lv_debug.h" #include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_math.h" +#include "../lv_core/lv_indev.h" +#include "lv_img.h" /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_sw" /********************** * TYPEDEFS @@ -29,12 +33,14 @@ /********************** * STATIC PROTOTYPES **********************/ +static lv_design_res_t lv_sw_design(lv_obj_t * slider, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param); /********************** * STATIC VARIABLES **********************/ static lv_signal_cb_t ancestor_signal; +static lv_design_cb_t ancestor_design; /********************** * MACROS @@ -55,33 +61,39 @@ lv_obj_t * lv_sw_create(lv_obj_t * par, const lv_obj_t * copy) LV_LOG_TRACE("switch create started"); /*Create the ancestor of switch*/ - lv_obj_t * new_sw = lv_slider_create(par, copy); - lv_mem_assert(new_sw); + lv_obj_t * new_sw = lv_bar_create(par, copy); + LV_ASSERT_MEM(new_sw); + if(new_sw == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_sw); + if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_sw); /*Allocate the switch type specific extended data*/ lv_sw_ext_t * ext = lv_obj_allocate_ext_attr(new_sw, sizeof(lv_sw_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_sw); + return NULL; + } /*Initialize the allocated 'ext' */ ext->changed = 0; -#if LV_USE_ANIMATION - ext->anim_time = 0; -#endif - ext->style_knob_off = ext->slider.style_knob; - ext->style_knob_on = ext->slider.style_knob; + ext->style_knob_off = &lv_style_pretty; + ext->style_knob_on = &lv_style_pretty; + ext->img_knob_off = NULL; + ext->img_knob_on = NULL; /*The signal and design functions are not copied so set them here*/ lv_obj_set_signal_cb(new_sw, lv_sw_signal); + lv_obj_set_design_cb(new_sw, lv_sw_design); /*Init the new switch switch*/ if(copy == NULL) { + lv_obj_set_click(new_sw, true); + lv_obj_set_protect(new_sw, LV_PROTECT_PRESS_LOST); lv_obj_set_size(new_sw, 2 * LV_DPI / 3, LV_DPI / 3); - lv_slider_set_knob_in(new_sw, true); - lv_slider_set_range(new_sw, 0, LV_SW_MAX_VALUE); + lv_bar_set_range(new_sw, 0, LV_SW_MAX_VALUE); /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); @@ -93,26 +105,17 @@ lv_obj_t * lv_sw_create(lv_obj_t * par, const lv_obj_t * copy) } else { /*Let the slider' style*/ } - } /*Copy an existing switch*/ else { lv_sw_ext_t * copy_ext = lv_obj_get_ext_attr(copy); ext->style_knob_off = copy_ext->style_knob_off; ext->style_knob_on = copy_ext->style_knob_on; -#if LV_USE_ANIMATION - ext->anim_time = copy_ext->anim_time; -#endif - - if(lv_sw_get_state(new_sw)) - lv_slider_set_style(new_sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_on); - else - lv_slider_set_style(new_sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_off); - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_sw); } + /*Refresh the style with new signal function*/ + lv_obj_refresh_style(new_sw); + LV_LOG_INFO("switch created"); return new_sw; @@ -129,12 +132,15 @@ lv_obj_t * lv_sw_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_sw_on(lv_obj_t * sw, lv_anim_enable_t anim) { + LV_ASSERT_OBJ(sw, LV_OBJX_NAME); + #if LV_USE_ANIMATION == 0 anim = LV_ANIM_OFF; #endif lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); - lv_slider_set_value(sw, LV_SW_MAX_VALUE, anim); - lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_on); + ext->state = 1; + lv_bar_set_value(sw, LV_SW_MAX_VALUE, anim); + lv_obj_invalidate(sw); } /** @@ -144,12 +150,15 @@ void lv_sw_on(lv_obj_t * sw, lv_anim_enable_t anim) */ void lv_sw_off(lv_obj_t * sw, lv_anim_enable_t anim) { + LV_ASSERT_OBJ(sw, LV_OBJX_NAME); + #if LV_USE_ANIMATION == 0 anim = LV_ANIM_OFF; #endif lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); - lv_slider_set_value(sw, 0, anim); - lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_off); + ext->state = 0; + lv_bar_set_value(sw, 0, anim); + lv_obj_invalidate(sw); } /** @@ -160,6 +169,8 @@ void lv_sw_off(lv_obj_t * sw, lv_anim_enable_t anim) */ bool lv_sw_toggle(lv_obj_t * sw, lv_anim_enable_t anim) { + LV_ASSERT_OBJ(sw, LV_OBJX_NAME); + #if LV_USE_ANIMATION == 0 anim = LV_ANIM_OFF; #endif @@ -173,6 +184,40 @@ bool lv_sw_toggle(lv_obj_t * sw, lv_anim_enable_t anim) return !state; } +/** + * Set an image to display on the knob of the switch when it's in OFF state + * @param sw pointer to a switch object + * @param img_src pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object) + */ +void lv_sw_set_knob_off_img(lv_obj_t * sw, const void * img_src) +{ + LV_ASSERT_OBJ(sw, LV_OBJX_NAME); + + lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); + + ext->img_knob_off = img_src; + lv_obj_refresh_ext_draw_pad(sw); + lv_obj_invalidate(sw); +} + +/** + * Set an image to display on the knob of the switch when it's in ON state + * @param sw pointer to a switch object + * @param img_src pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object) + */ +void lv_sw_set_knob_on_img(lv_obj_t * sw, const void * img_src) +{ + LV_ASSERT_OBJ(sw, LV_OBJX_NAME); + + lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); + + ext->img_knob_on = img_src; + lv_obj_refresh_ext_draw_pad(sw); + lv_obj_invalidate(sw); +} + /** * Set a style of a switch * @param sw pointer to a switch object @@ -181,37 +226,60 @@ bool lv_sw_toggle(lv_obj_t * sw, lv_anim_enable_t anim) */ void lv_sw_set_style(lv_obj_t * sw, lv_sw_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(sw, LV_OBJX_NAME); + lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); switch(type) { - case LV_SLIDER_STYLE_BG: lv_slider_set_style(sw, LV_SLIDER_STYLE_BG, style); break; - case LV_SLIDER_STYLE_INDIC: lv_bar_set_style(sw, LV_SLIDER_STYLE_INDIC, style); break; + case LV_SW_STYLE_BG: lv_bar_set_style(sw, LV_BAR_STYLE_BG, style); break; + case LV_SW_STYLE_INDIC: lv_bar_set_style(sw, LV_BAR_STYLE_INDIC, style); break; case LV_SW_STYLE_KNOB_OFF: ext->style_knob_off = style; - if(lv_sw_get_state(sw) == 0) lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, style); + lv_obj_refresh_ext_draw_pad(sw); + lv_obj_invalidate(sw); break; case LV_SW_STYLE_KNOB_ON: ext->style_knob_on = style; - if(lv_sw_get_state(sw) != 0) lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, style); + lv_obj_refresh_ext_draw_pad(sw); + lv_obj_invalidate(sw); break; } } -void lv_sw_set_anim_time(lv_obj_t * sw, uint16_t anim_time) -{ -#if LV_USE_ANIMATION - lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); - ext->anim_time = anim_time; -#else - (void)sw; - (void)anim_time; -#endif -} - /*===================== * Getter functions *====================*/ +/** + * Get an image to display on the knob of the switch when it's in OFF state + * @param sw pointer to a switch object + * @return the image source: pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object) + */ +const void * lv_slider_get_knob_off_img(lv_obj_t * sw, const void * img_src) +{ + LV_ASSERT_OBJ(sw, LV_OBJX_NAME); + + lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); + + return ext->img_knob_off; +} + +/** + * Get an image to display on the knob of the switch when it's in ON state + * @param sw pointer to a switch object + * @return the image source: pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object) + */ +const void * lv_slider_get_knob_on_img(lv_obj_t * sw, const void * img_src) +{ + LV_ASSERT_OBJ(sw, LV_OBJX_NAME); + + lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); + + return ext->img_knob_on; +} + /** * Get a style of a switch * @param sw pointer to a switch object @@ -220,12 +288,14 @@ void lv_sw_set_anim_time(lv_obj_t * sw, uint16_t anim_time) */ const lv_style_t * lv_sw_get_style(const lv_obj_t * sw, lv_sw_style_t type) { + LV_ASSERT_OBJ(sw, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); switch(type) { - case LV_SW_STYLE_BG: style = lv_slider_get_style(sw, LV_SLIDER_STYLE_BG); break; - case LV_SW_STYLE_INDIC: style = lv_slider_get_style(sw, LV_SLIDER_STYLE_INDIC); break; + case LV_SW_STYLE_BG: style = lv_bar_get_style(sw, LV_BAR_STYLE_BG); break; + case LV_SW_STYLE_INDIC: style = lv_bar_get_style(sw, LV_BAR_STYLE_INDIC); break; case LV_SW_STYLE_KNOB_OFF: style = ext->style_knob_off; break; case LV_SW_STYLE_KNOB_ON: style = ext->style_knob_on; break; default: style = NULL; break; @@ -234,22 +304,90 @@ const lv_style_t * lv_sw_get_style(const lv_obj_t * sw, lv_sw_style_t type) return style; } -uint16_t lv_sw_get_anim_time(const lv_obj_t * sw) -{ - -#if LV_USE_ANIMATION - lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); - return ext->anim_time; -#else - (void)sw; /*Unused*/ - return 0; -#endif -} - /********************** * STATIC FUNCTIONS **********************/ +/** + * Handle the drawing related tasks of the sliders + * @param sw pointer to an object + * @param clip_area the object will be drawn only in this area + * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area + * (return 'true' if yes) + * LV_DESIGN_DRAW: draw the object (always return 'true') + * LV_DESIGN_DRAW_POST: drawing after every children are drawn + * @param return an element of `lv_design_res_t` + */ +static lv_design_res_t lv_sw_design(lv_obj_t * sw, const lv_area_t * clip_area, lv_design_mode_t mode) +{ + /*Return false if the object is not covers the mask_p area*/ + if(mode == LV_DESIGN_COVER_CHK) { + return LV_DESIGN_RES_NOT_COVER; + } + /*Draw the object*/ + else if(mode == LV_DESIGN_DRAW_MAIN) { + /*The ancestor design function will draw the background and the indicator. + * It also sets ext->bar.indic_area*/ + ancestor_design(sw, clip_area, mode); + + lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); + lv_opa_t opa_scale = lv_obj_get_opa_scale(sw); + const lv_style_t * style_knob = lv_sw_get_style(sw, ext->state ? + LV_SW_STYLE_KNOB_ON : LV_SW_STYLE_KNOB_OFF); + + const lv_style_t * style_indic = lv_sw_get_style(sw, LV_SW_STYLE_INDIC); + + lv_coord_t objw = lv_obj_get_width(sw); + lv_coord_t objh = lv_obj_get_height(sw); + lv_coord_t indic_maxw = objw - style_indic->body.padding.left - style_indic->body.padding.right; + lv_coord_t knob_size = objh; + + lv_coord_t indic_p = (lv_area_get_width(&ext->bar.indic_area) * 256) / (indic_maxw); + lv_area_t knob_area; + knob_area.x2 = ext->bar.indic_area.x2; + knob_area.x2 += (knob_size * (256 - indic_p)) >> 8; + if(knob_area.x2 < sw->coords.x1 + knob_size) knob_area.x2 = sw->coords.x1 + knob_size; + knob_area.x1 = knob_area.x2 - knob_size; + knob_area.y1 = sw->coords.y1; + knob_area.y2 = sw->coords.y2; + + knob_area.x1 -= style_knob->body.padding.left; + knob_area.x2 += style_knob->body.padding.right; + knob_area.y1 -= style_knob->body.padding.top; + knob_area.y2 += style_knob->body.padding.bottom; + + lv_draw_rect(&knob_area, clip_area, style_knob, opa_scale); + + const void * img = ext->state ? ext->img_knob_on : ext->img_knob_off; + + if(img) { + lv_res_t res; + lv_img_header_t info; + res = lv_img_decoder_get_info(img, &info); + if(res == LV_RES_OK) { + lv_coord_t x_ofs = knob_area.x1 + (lv_area_get_width(&knob_area) - info.w) / 2; + lv_coord_t y_ofs = knob_area.y1 + (lv_area_get_height(&knob_area) - info.h) / 2; + lv_area_t a; + a.x1 = x_ofs; + a.y1 = y_ofs; + a.x2 = info.w - 1 + x_ofs; + a.y2 = info.h - 1 + y_ofs; + + lv_draw_img(&a, clip_area, img, style_knob, 0, NULL, LV_IMG_ZOOM_NONE, false, opa_scale); + } else { + LV_LOG_WARN("lv_slider_design: can't get knob image info") + } + } + } + /*Post draw when the children are drawn*/ + else if(mode == LV_DESIGN_DRAW_POST) { + return ancestor_design(sw, clip_area, mode); + } + + return LV_DESIGN_RES_OK; +} + + /** * Signal function of the switch * @param sw pointer to a switch object @@ -261,25 +399,11 @@ static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param) { lv_sw_ext_t * ext = lv_obj_get_ext_attr(sw); - /*Save the current (old) value before slider signal modifies it. It will be required in the - * later calculations*/ - int16_t old_val; - if(sign == LV_SIGNAL_PRESSING) - old_val = ext->slider.drag_value; - else - old_val = lv_slider_get_value(sw); - - /*Don't let the slider to call the action. Switch handles it differently*/ - lv_event_cb_t event_cb = sw->event_cb; - sw->event_cb = NULL; - lv_res_t res; /* Include the ancient signal function */ - res = ancestor_signal(sw, sign, param); if(res != LV_RES_OK) return res; - - sw->event_cb = event_cb; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_CLEANUP) { /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ @@ -297,37 +421,42 @@ static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param) } else if(sign == LV_SIGNAL_PRESSING) { /*See if the switch was slid (moved at least a little)*/ lv_indev_t * indev = lv_indev_get_act(); + lv_point_t p; if(indev) { - lv_point_t p = {0, 0}; lv_indev_get_point(indev, &p); - if(LV_MATH_ABS(p.x - ext->start_x) > LV_INDEV_DEF_DRAG_LIMIT) ext->slided = 1; - } + if(LV_MATH_ABS(p.x - ext->start_x) > indev->driver.drag_limit) ext->slided = 1; - /*If didn't slide then revert the min/max value. So click without slide won't move the - * switch as a slider*/ - if(ext->slided == 0) { - if(lv_sw_get_state(sw)) - ext->slider.drag_value = LV_SW_MAX_VALUE; - else - ext->slider.drag_value = 0; - } + /*If slid set the value accordingly*/ + if(ext->slided) { + lv_coord_t w = lv_obj_get_width(sw); + const lv_style_t * indic_style = lv_sw_get_style(sw, LV_SW_STYLE_INDIC); + int16_t new_val = 0; - /*If explicitly changed (by slide) don't need to be toggled on release*/ - int16_t threshold = LV_SW_MAX_VALUE / 2; - if((old_val < threshold && ext->slider.drag_value > threshold) || - (old_val > threshold && ext->slider.drag_value < threshold)) { - ext->changed = 1; + lv_coord_t indic_w = w - indic_style->body.padding.left - indic_style->body.padding.right; + int32_t range = ext->bar.max_value - ext->bar.min_value; + new_val = p.x - (sw->coords.x1 + indic_style->body.padding.left); /*Make the point relative to the indicator*/ + new_val = (new_val * range) / indic_w; + new_val += ext->bar.min_value; + + if(new_val < ext->bar.min_value) new_val = ext->bar.min_value; + else if(new_val > ext->bar.max_value) new_val = ext->bar.max_value; + + /*If explicitly changed (by slide) don't need to be toggled on release*/ + int16_t threshold = LV_SW_MAX_VALUE / 2; + if((new_val < threshold && ext->bar.cur_value > threshold) || + (new_val > threshold && ext->bar.cur_value < threshold)) { + ext->changed = 1; + } + + if(new_val != ext->bar.cur_value) { + ext->bar.cur_value = new_val; + lv_obj_invalidate(sw); + } + } } } else if(sign == LV_SIGNAL_PRESS_LOST) { - if(lv_sw_get_state(sw)) { - lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_on); - lv_slider_set_value(sw, LV_SW_MAX_VALUE, LV_ANIM_ON); - if(res != LV_RES_OK) return res; - } else { - lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, ext->style_knob_off); - lv_slider_set_value(sw, 0, LV_ANIM_ON); - if(res != LV_RES_OK) return res; - } + if(lv_sw_get_state(sw)) lv_sw_on(sw, LV_ANIM_ON); + else lv_sw_off(sw, LV_ANIM_ON); } else if(sign == LV_SIGNAL_RELEASED) { /*If not dragged then toggle the switch*/ if(ext->changed == 0) { @@ -345,7 +474,7 @@ static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param) } /*If the switch was dragged then calculate the new state based on the current position*/ else { - int16_t v = lv_slider_get_value(sw); + int16_t v = lv_bar_get_value(sw); int32_t state; if(v > LV_SW_MAX_VALUE / 2) { lv_sw_on(sw, LV_ANIM_ON); @@ -361,26 +490,78 @@ static lv_res_t lv_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param) char c = *((char *)param); uint32_t state; if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { - lv_slider_set_value(sw, LV_SW_MAX_VALUE, true); + lv_bar_set_value(sw, LV_SW_MAX_VALUE, LV_ANIM_ON); state = 1; res = lv_event_send(sw, LV_EVENT_VALUE_CHANGED, &state); if(res != LV_RES_OK) return res; } else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { - lv_slider_set_value(sw, 0, true); + lv_bar_set_value(sw, 0, LV_ANIM_ON); state = 0; res = lv_event_send(sw, LV_EVENT_VALUE_CHANGED, &state); if(res != LV_RES_OK) return res; } - } else if(sign == LV_SIGNAL_GET_EDITABLE) { + } + else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { + const lv_style_t * bg_style = lv_sw_get_style(sw, LV_SW_STYLE_BG); + const lv_style_t * indic_style = lv_sw_get_style(sw, LV_SW_STYLE_INDIC); + const lv_style_t * knob_on_style = lv_sw_get_style(sw, LV_SW_STYLE_KNOB_OFF); + const lv_style_t * knob_off_style = lv_sw_get_style(sw, LV_SW_STYLE_KNOB_ON); + /* The smaller size is the knob diameter*/ + lv_coord_t knob_on_size = LV_MATH_MIN(lv_obj_get_width(sw), lv_obj_get_height(sw)) >> 1; + knob_on_size += LV_MATH_MAX( + LV_MATH_MAX(knob_on_style->body.padding.left, knob_on_style->body.padding.right), + LV_MATH_MAX(knob_on_style->body.padding.bottom, knob_on_style->body.padding.top)); + + knob_on_size += knob_on_style->body.shadow.width + knob_on_style->body.shadow.spread; + knob_on_size += LV_MATH_MAX(LV_MATH_ABS(knob_on_style->body.shadow.offset.x), LV_MATH_ABS(knob_on_style->body.shadow.offset.y)); + + if(ext->img_knob_on) { + lv_img_header_t info; + lv_res_t res; + res = lv_img_decoder_get_info(ext->img_knob_on, &info); + if(res == LV_RES_OK) { + knob_on_size = LV_MATH_MAX(knob_on_size, info.w / 2); + knob_on_size = LV_MATH_MAX(knob_on_size, info.h / 2); + } else { + LV_LOG_WARN("slider signal (LV_SIGNAL_REFR_EXT_DRAW_PAD): can't get knob image info") + } + } + + lv_coord_t knob_off_size = LV_MATH_MIN(lv_obj_get_width(sw), lv_obj_get_height(sw)) >> 1; + knob_off_size += LV_MATH_MAX( + LV_MATH_MAX(knob_off_style->body.padding.left, knob_off_style->body.padding.right), + LV_MATH_MAX(knob_off_style->body.padding.bottom, knob_off_style->body.padding.top)); + + knob_off_size += knob_off_style->body.shadow.width + knob_off_style->body.shadow.spread; + knob_off_size += LV_MATH_MAX(LV_MATH_ABS(knob_off_style->body.shadow.offset.x), LV_MATH_ABS(knob_off_style->body.shadow.offset.y)); + + if(ext->img_knob_off) { + lv_img_header_t info; + lv_res_t res; + res = lv_img_decoder_get_info(ext->img_knob_off, &info); + if(res == LV_RES_OK) { + knob_off_size = LV_MATH_MAX(knob_on_size, info.w / 2); + knob_off_size = LV_MATH_MAX(knob_on_size, info.h / 2); + } else { + LV_LOG_WARN("slider signal (LV_SIGNAL_REFR_EXT_DRAW_PAD): can't get knob image info") + } + } + + lv_coord_t bg_size = bg_style->body.shadow.width + bg_style->body.shadow.spread; + bg_size += LV_MATH_MAX(LV_MATH_ABS(bg_style->body.shadow.offset.x), LV_MATH_ABS(bg_style->body.shadow.offset.y)); + + lv_coord_t indic_size = indic_style->body.shadow.width + indic_style->body.shadow.spread; + indic_size += LV_MATH_MAX(LV_MATH_ABS(indic_style->body.shadow.offset.x), LV_MATH_ABS(indic_style->body.shadow.offset.y)); + + sw->ext_draw_pad = LV_MATH_MAX(sw->ext_draw_pad, knob_on_size); + sw->ext_draw_pad = LV_MATH_MAX(sw->ext_draw_pad, knob_off_size); + sw->ext_draw_pad = LV_MATH_MAX(sw->ext_draw_pad, bg_size); + sw->ext_draw_pad = LV_MATH_MAX(sw->ext_draw_pad, indic_size); + + } + else if(sign == LV_SIGNAL_GET_EDITABLE) { bool * editable = (bool *)param; *editable = false; /*The ancestor slider is editable the switch is not*/ - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_sw"; } return res; diff --git a/src/lv_objx/lv_sw.h b/src/lv_objx/lv_sw.h index f4b44aeb1..da988b0c8 100644 --- a/src/lv_objx/lv_sw.h +++ b/src/lv_objx/lv_sw.h @@ -27,7 +27,7 @@ extern "C" { #endif #include "../lv_core/lv_obj.h" -#include "lv_slider.h" +#include "lv_bar.h" /********************* * DEFINES @@ -40,16 +40,16 @@ extern "C" { /*Data of switch*/ typedef struct { - lv_slider_ext_t slider; /*Ext. of ancestor*/ + lv_bar_ext_t bar; /*Ext. of ancestor*/ /*New data for this type */ const lv_style_t * style_knob_off; /**< Style of the knob when the switch is OFF*/ const lv_style_t * style_knob_on; /**< Style of the knob when the switch is ON (NULL to use the same as OFF)*/ + const void * img_knob_off; /**< Image to display when the switch is OFF*/ + const void * img_knob_on; /**< Image to display when the switch is ON*/ lv_coord_t start_x; - uint8_t changed : 1; /*Indicates the switch state explicitly changed by drag*/ - uint8_t slided : 1; -#if LV_USE_ANIMATION - uint16_t anim_time; /*switch animation time */ -#endif + uint8_t changed :1; /*Indicates the switch state explicitly changed by drag*/ + uint8_t slided :1; + uint8_t state :1; /*The current state*/ } lv_sw_ext_t; /** @@ -102,12 +102,20 @@ void lv_sw_off(lv_obj_t * sw, lv_anim_enable_t anim); bool lv_sw_toggle(lv_obj_t * sw, lv_anim_enable_t anim); /** - * Set a style of a switch + * Set an image to display on the knob of the switch when it's in OFF state * @param sw pointer to a switch object - * @param type which style should be set - * @param style pointer to a style + * @param img_src pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object) */ -void lv_sw_set_style(lv_obj_t * sw, lv_sw_style_t type, const lv_style_t * style); +void lv_sw_set_knob_off_img(lv_obj_t * sw, const void * img_src); + +/** + * Set an image to display on the knob of the switch when it's in ON state + * @param sw pointer to a switch object + * @param img_src pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object) + */ +void lv_sw_set_knob_on_img(lv_obj_t * sw, const void * img_src); /** * Set the animation time of the switch @@ -115,7 +123,18 @@ void lv_sw_set_style(lv_obj_t * sw, lv_sw_style_t type, const lv_style_t * style * @param anim_time animation time * @return style pointer to a style */ -void lv_sw_set_anim_time(lv_obj_t * sw, uint16_t anim_time); +static inline void lv_sw_set_anim_time(lv_obj_t * sw, uint16_t anim_time) +{ + lv_bar_set_anim_time(sw, anim_time); +} +/** + * Set a style of a switch + * @param sw pointer to a switch object + * @param type which style should be set + * @param style pointer to a style + */ +void lv_sw_set_style(lv_obj_t * sw, lv_sw_style_t type, const lv_style_t * style); + /*===================== * Getter functions @@ -128,7 +147,32 @@ void lv_sw_set_anim_time(lv_obj_t * sw, uint16_t anim_time); */ static inline bool lv_sw_get_state(const lv_obj_t * sw) { - return lv_bar_get_value(sw) < LV_SW_MAX_VALUE / 2 ? false : true; + lv_sw_ext_t * ext = (lv_sw_ext_t *)lv_obj_get_ext_attr(sw); + return ext->state ? true : false; +} +/** + * Get an image to display on the knob of the switch when it's in OFF state + * @param sw pointer to a switch object + * @return the image source: pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object) + */ +const void * lv_slider_get_knob_off_img(lv_obj_t * sw, const void * img_src); + +/** + * Get an image to display on the knob of the switch when it's in ON state + * @param sw pointer to a switch object + * @return the image source: pointer to an `lv_img_dsc_t` variable or a path to an image + * (not an `lv_img` object) + */ +const void * lv_slider_get_knob_on_img(lv_obj_t * sw, const void * img_src); +/** + * Get the animation time of the switch + * @param sw pointer to a switch object + * @return style pointer to a style + */ +static inline uint16_t lv_sw_get_anim_time(const lv_obj_t * sw) +{ + return lv_bar_get_anim_time(sw); } /** @@ -139,12 +183,7 @@ static inline bool lv_sw_get_state(const lv_obj_t * sw) */ const lv_style_t * lv_sw_get_style(const lv_obj_t * sw, lv_sw_style_t type); -/** - * Get the animation time of the switch - * @param sw pointer to a switch object - * @return style pointer to a style - */ -uint16_t lv_sw_get_anim_time(const lv_obj_t * sw); + /********************** * MACROS diff --git a/src/lv_objx/lv_ta.c b/src/lv_objx/lv_ta.c index 48188dcd1..66e174502 100644 --- a/src/lv_objx/lv_ta.c +++ b/src/lv_objx/lv_ta.c @@ -9,6 +9,7 @@ #include "lv_ta.h" #if LV_USE_TA != 0 #include +#include "../lv_core/lv_debug.h" #include "../lv_core/lv_group.h" #include "../lv_core/lv_refr.h" #include "../lv_draw/lv_draw.h" @@ -20,8 +21,9 @@ /********************* * DEFINES *********************/ -/*Test configuration*/ +#define LV_OBJX_NAME "lv_ta" +/*Test configuration*/ #ifndef LV_TA_DEF_CURSOR_BLINK_TIME #define LV_TA_DEF_CURSOR_BLINK_TIME 400 /*ms*/ #endif @@ -40,8 +42,8 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_ta_design(lv_obj_t * ta, const lv_area_t * mask, lv_design_mode_t mode); -static bool lv_ta_scrollable_design(lv_obj_t * scrl, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_ta_design(lv_obj_t * ta, const lv_area_t * clip_area, lv_design_mode_t mode); +static lv_design_res_t lv_ta_scrollable_design(lv_obj_t * scrl, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_ta_signal(lv_obj_t * ta, lv_signal_t sign, void * param); static lv_res_t lv_ta_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, void * param); #if LV_USE_ANIMATION @@ -85,7 +87,7 @@ lv_obj_t * lv_ta_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor object*/ lv_obj_t * new_ta = lv_page_create(par, copy); - lv_mem_assert(new_ta); + LV_ASSERT_MEM(new_ta); if(new_ta == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_ta); @@ -95,8 +97,11 @@ lv_obj_t * lv_ta_create(lv_obj_t * par, const lv_obj_t * copy) /*Allocate the object type specific extended data*/ lv_ta_ext_t * ext = lv_obj_allocate_ext_attr(new_ta, sizeof(lv_ta_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_ta); + return NULL; + } ext->cursor.state = 1; ext->pwd_mode = 0; @@ -173,7 +178,7 @@ lv_obj_t * lv_ta_create(lv_obj_t * par, const lv_obj_t * copy) if(copy_ext->pwd_tmp) { uint16_t len = lv_mem_get_size(copy_ext->pwd_tmp); ext->pwd_tmp = lv_mem_alloc(len); - lv_mem_assert(ext->pwd_tmp); + LV_ASSERT_MEM(ext->pwd_tmp); if(ext->pwd_tmp == NULL) return NULL; memcpy(ext->pwd_tmp, copy_ext->pwd_tmp, len); @@ -224,6 +229,8 @@ lv_obj_t * lv_ta_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_ta_add_char(lv_obj_t * ta, uint32_t c) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); uint32_t letter_buf[2]; @@ -267,7 +274,7 @@ void lv_ta_add_char(lv_obj_t * ta, uint32_t c) if(ext->pwd_mode != 0) { ext->pwd_tmp = lv_mem_realloc(ext->pwd_tmp, strlen(ext->pwd_tmp) + 2); /*+2: the new char + \0 */ - lv_mem_assert(ext->pwd_tmp); + LV_ASSERT_MEM(ext->pwd_tmp); if(ext->pwd_tmp == NULL) return; lv_txt_ins(ext->pwd_tmp, ext->cursor.pos, (const char *)letter_buf); @@ -312,6 +319,9 @@ void lv_ta_add_char(lv_obj_t * ta, uint32_t c) */ void lv_ta_add_text(lv_obj_t * ta, const char * txt) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + LV_ASSERT_NULL(txt); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); ta_insert_replace = NULL; @@ -348,7 +358,7 @@ void lv_ta_add_text(lv_obj_t * ta, const char * txt) if(ext->pwd_mode != 0) { ext->pwd_tmp = lv_mem_realloc(ext->pwd_tmp, strlen(ext->pwd_tmp) + strlen(txt) + 1); - lv_mem_assert(ext->pwd_tmp); + LV_ASSERT_MEM(ext->pwd_tmp); if(ext->pwd_tmp == NULL) return; lv_txt_ins(ext->pwd_tmp, ext->cursor.pos, txt); @@ -391,6 +401,8 @@ void lv_ta_add_text(lv_obj_t * ta, const char * txt) */ void lv_ta_del_char(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); uint16_t cur_pos = ext->cursor.pos; @@ -427,7 +439,7 @@ void lv_ta_del_char(lv_obj_t * ta) lv_txt_cut(ext->pwd_tmp, ext->cursor.pos - 1, lv_txt_encoded_size(&label_txt[byte_pos])); ext->pwd_tmp = lv_mem_realloc(ext->pwd_tmp, strlen(ext->pwd_tmp) + 1); - lv_mem_assert(ext->pwd_tmp); + LV_ASSERT_MEM(ext->pwd_tmp); if(ext->pwd_tmp == NULL) return; } @@ -445,6 +457,8 @@ void lv_ta_del_char(lv_obj_t * ta) */ void lv_ta_del_char_forward(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + uint16_t cp = lv_ta_get_cursor_pos(ta); lv_ta_set_cursor_pos(ta, cp + 1); if(cp != lv_ta_get_cursor_pos(ta)) lv_ta_del_char(ta); @@ -461,6 +475,9 @@ void lv_ta_del_char_forward(lv_obj_t * ta) */ void lv_ta_set_text(lv_obj_t * ta, const char * txt) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + LV_ASSERT_NULL(txt); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); /*Clear the existing selection*/ @@ -489,7 +506,7 @@ void lv_ta_set_text(lv_obj_t * ta, const char * txt) if(ext->pwd_mode != 0) { ext->pwd_tmp = lv_mem_realloc(ext->pwd_tmp, strlen(txt) + 1); - lv_mem_assert(ext->pwd_tmp); + LV_ASSERT_MEM(ext->pwd_tmp); if(ext->pwd_tmp == NULL) return; strcpy(ext->pwd_tmp, txt); @@ -526,6 +543,9 @@ void lv_ta_set_text(lv_obj_t * ta, const char * txt) */ void lv_ta_set_placeholder_text(lv_obj_t * ta, const char * txt) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + LV_ASSERT_NULL(txt); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); /*Create the placeholder label only when it is needed*/ @@ -541,6 +561,9 @@ void lv_ta_set_placeholder_text(lv_obj_t * ta, const char * txt) lv_label_set_text(ext->placeholder, txt); + /*Refresh the placeholder's align*/ + lv_ta_set_text_align(ta, lv_label_get_align(ext->label)); + placeholder_update(ta); } @@ -553,6 +576,8 @@ void lv_ta_set_placeholder_text(lv_obj_t * ta, const char * txt) */ void lv_ta_set_cursor_pos(lv_obj_t * ta, int16_t pos) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); if(ext->cursor.pos == pos) return; @@ -629,6 +654,8 @@ void lv_ta_set_cursor_pos(lv_obj_t * ta, int16_t pos) */ void lv_ta_set_cursor_type(lv_obj_t * ta, lv_cursor_type_t cur_type) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); if(ext->cursor.type == cur_type) return; @@ -644,6 +671,8 @@ void lv_ta_set_cursor_type(lv_obj_t * ta, lv_cursor_type_t cur_type) */ void lv_ta_set_cursor_click_pos(lv_obj_t * ta, bool en) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); ext->cursor.click_pos = en ? 1 : 0; } @@ -655,15 +684,17 @@ void lv_ta_set_cursor_click_pos(lv_obj_t * ta, bool en) */ void lv_ta_set_pwd_mode(lv_obj_t * ta, bool en) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); if(ext->pwd_mode == en) return; /*Pwd mode is now enabled*/ if(ext->pwd_mode == 0 && en != false) { char * txt = lv_label_get_text(ext->label); - uint16_t len = strlen(txt); + size_t len = strlen(txt); ext->pwd_tmp = lv_mem_alloc(len + 1); - lv_mem_assert(ext->pwd_tmp); + LV_ASSERT_MEM(ext->pwd_tmp); if(ext->pwd_tmp == NULL) return; strcpy(ext->pwd_tmp, txt); @@ -699,6 +730,8 @@ void lv_ta_set_pwd_mode(lv_obj_t * ta, bool en) */ void lv_ta_set_one_line(lv_obj_t * ta, bool en) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); if(ext->one_line == en) return; @@ -740,16 +773,20 @@ void lv_ta_set_one_line(lv_obj_t * ta, bool en) */ void lv_ta_set_text_align(lv_obj_t * ta, lv_label_align_t align) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); lv_obj_t * label = lv_ta_get_label(ta); if(!ext->one_line) { lv_label_set_align(label, align); + if(ext->placeholder) lv_label_set_align(ext->placeholder, align); } else { /*Normal left align. Just let the text expand*/ if(align == LV_LABEL_ALIGN_LEFT) { lv_label_set_long_mode(label, LV_LABEL_LONG_EXPAND); lv_page_set_scrl_fit2(ta, LV_FIT_TIGHT, LV_FIT_FLOOD); lv_label_set_align(label, align); + if(ext->placeholder) lv_label_set_align(ext->placeholder, align); } /*Else use fix label width equal to the Text area width*/ @@ -757,6 +794,7 @@ void lv_ta_set_text_align(lv_obj_t * ta, lv_label_align_t align) lv_label_set_long_mode(label, LV_LABEL_LONG_CROP); lv_page_set_scrl_fit2(ta, LV_FIT_FLOOD, LV_FIT_FLOOD); lv_label_set_align(label, align); + if(ext->placeholder) lv_label_set_align(ext->placeholder, align); lv_obj_set_width(label, lv_page_get_fit_width(ta)); } @@ -772,6 +810,8 @@ void lv_ta_set_text_align(lv_obj_t * ta, lv_label_align_t align) */ void lv_ta_set_accepted_chars(lv_obj_t * ta, const char * list) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); ext->accapted_chars = list; @@ -784,6 +824,8 @@ void lv_ta_set_accepted_chars(lv_obj_t * ta, const char * list) */ void lv_ta_set_max_length(lv_obj_t * ta, uint16_t num) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); ext->max_length = num; @@ -799,6 +841,8 @@ void lv_ta_set_max_length(lv_obj_t * ta, uint16_t num) */ void lv_ta_set_insert_replace(lv_obj_t * ta, const char * txt) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + (void)ta; /*Unused*/ ta_insert_replace = txt; } @@ -811,6 +855,8 @@ void lv_ta_set_insert_replace(lv_obj_t * ta, const char * txt) */ void lv_ta_set_style(lv_obj_t * ta, lv_ta_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); switch(type) { @@ -835,6 +881,8 @@ void lv_ta_set_style(lv_obj_t * ta, lv_ta_style_t type, const lv_style_t * style */ void lv_ta_set_text_sel(lv_obj_t * ta, bool en) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + #if LV_LABEL_TEXT_SEL lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); @@ -854,6 +902,8 @@ void lv_ta_set_text_sel(lv_obj_t * ta, bool en) */ void lv_ta_set_pwd_show_time(lv_obj_t * ta, uint16_t time) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + #if LV_USE_ANIMATION == 0 time = 0; #endif @@ -869,6 +919,8 @@ void lv_ta_set_pwd_show_time(lv_obj_t * ta, uint16_t time) */ void lv_ta_set_cursor_blink_time(lv_obj_t * ta, uint16_t time) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + #if LV_USE_ANIMATION == 0 time = 0; #endif @@ -912,6 +964,8 @@ void lv_ta_set_cursor_blink_time(lv_obj_t * ta, uint16_t time) */ const char * lv_ta_get_text(const lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); const char * txt; @@ -931,6 +985,8 @@ const char * lv_ta_get_text(const lv_obj_t * ta) */ const char * lv_ta_get_placeholder_text(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); const char * txt = NULL; @@ -947,6 +1003,8 @@ const char * lv_ta_get_placeholder_text(lv_obj_t * ta) */ lv_obj_t * lv_ta_get_label(const lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); return ext->label; } @@ -958,6 +1016,8 @@ lv_obj_t * lv_ta_get_label(const lv_obj_t * ta) */ uint16_t lv_ta_get_cursor_pos(const lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); return ext->cursor.pos; } @@ -969,6 +1029,8 @@ uint16_t lv_ta_get_cursor_pos(const lv_obj_t * ta) */ lv_cursor_type_t lv_ta_get_cursor_type(const lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); return ext->cursor.type; } @@ -980,6 +1042,8 @@ lv_cursor_type_t lv_ta_get_cursor_type(const lv_obj_t * ta) */ bool lv_ta_get_cursor_click_pos(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); return ext->cursor.click_pos ? true : false; } @@ -991,6 +1055,8 @@ bool lv_ta_get_cursor_click_pos(lv_obj_t * ta) */ bool lv_ta_get_pwd_mode(const lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); return ext->pwd_mode == 0 ? false : true; } @@ -1002,6 +1068,8 @@ bool lv_ta_get_pwd_mode(const lv_obj_t * ta) */ bool lv_ta_get_one_line(const lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); return ext->one_line == 0 ? false : true; } @@ -1013,6 +1081,8 @@ bool lv_ta_get_one_line(const lv_obj_t * ta) */ const char * lv_ta_get_accepted_chars(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); return ext->accapted_chars; @@ -1025,6 +1095,8 @@ const char * lv_ta_get_accepted_chars(lv_obj_t * ta) */ uint16_t lv_ta_get_max_length(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); return ext->max_length; } @@ -1037,6 +1109,8 @@ uint16_t lv_ta_get_max_length(lv_obj_t * ta) */ const lv_style_t * lv_ta_get_style(const lv_obj_t * ta, lv_ta_style_t type) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); @@ -1061,11 +1135,13 @@ const lv_style_t * lv_ta_get_style(const lv_obj_t * ta, lv_ta_style_t type) */ bool lv_ta_text_is_selected(const lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + #if LV_LABEL_TEXT_SEL lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); - if((lv_label_get_text_sel_start(ext->label) == LV_LABEL_TEXT_SEL_OFF || - lv_label_get_text_sel_end(ext->label) == LV_LABEL_TEXT_SEL_OFF)) { + if((lv_label_get_text_sel_start(ext->label) == LV_DRAW_LABEL_NO_TXT_SEL || + lv_label_get_text_sel_end(ext->label) == LV_DRAW_LABEL_NO_TXT_SEL)) { return true; } else { return false; @@ -1083,6 +1159,8 @@ bool lv_ta_text_is_selected(const lv_obj_t * ta) */ bool lv_ta_get_text_sel_en(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + #if LV_LABEL_TEXT_SEL lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); return ext->text_sel_en; @@ -1099,6 +1177,8 @@ bool lv_ta_get_text_sel_en(lv_obj_t * ta) */ uint16_t lv_ta_get_pwd_show_time(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); return ext->pwd_show_time; @@ -1111,6 +1191,8 @@ uint16_t lv_ta_get_pwd_show_time(lv_obj_t * ta) */ uint16_t lv_ta_get_cursor_blink_time(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); return ext->cursor.blink_time; } @@ -1125,13 +1207,15 @@ uint16_t lv_ta_get_cursor_blink_time(lv_obj_t * ta) */ void lv_ta_clear_selection(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + #if LV_LABEL_TEXT_SEL lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); - if(lv_label_get_text_sel_start(ext->label) != LV_LABEL_TEXT_SEL_OFF || - lv_label_get_text_sel_end(ext->label) != LV_LABEL_TEXT_SEL_OFF) { - lv_label_set_text_sel_start(ext->label, LV_LABEL_TEXT_SEL_OFF); - lv_label_set_text_sel_end(ext->label, LV_LABEL_TEXT_SEL_OFF); + if(lv_label_get_text_sel_start(ext->label) != LV_DRAW_LABEL_NO_TXT_SEL || + lv_label_get_text_sel_end(ext->label) != LV_DRAW_LABEL_NO_TXT_SEL) { + lv_label_set_text_sel_start(ext->label, LV_DRAW_LABEL_NO_TXT_SEL); + lv_label_set_text_sel_end(ext->label, LV_DRAW_LABEL_NO_TXT_SEL); } #else (void)ta; /*Unused*/ @@ -1144,6 +1228,8 @@ void lv_ta_clear_selection(lv_obj_t * ta) */ void lv_ta_cursor_right(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + uint16_t cp = lv_ta_get_cursor_pos(ta); cp++; lv_ta_set_cursor_pos(ta, cp); @@ -1155,6 +1241,8 @@ void lv_ta_cursor_right(lv_obj_t * ta) */ void lv_ta_cursor_left(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + uint16_t cp = lv_ta_get_cursor_pos(ta); if(cp > 0) { cp--; @@ -1168,6 +1256,8 @@ void lv_ta_cursor_left(lv_obj_t * ta) */ void lv_ta_cursor_down(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); lv_point_t pos; @@ -1198,6 +1288,8 @@ void lv_ta_cursor_down(lv_obj_t * ta) */ void lv_ta_cursor_up(lv_obj_t * ta) { + LV_ASSERT_OBJ(ta, LV_OBJX_NAME); + lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); lv_point_t pos; @@ -1225,48 +1317,48 @@ void lv_ta_cursor_up(lv_obj_t * ta) /** * Handle the drawing related tasks of the text areas * @param ta pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW_MAIN: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_ta_design(lv_obj_t * ta, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_ta_design(lv_obj_t * ta, const lv_area_t * clip_area, lv_design_mode_t mode) { if(mode == LV_DESIGN_COVER_CHK) { /*Return false if the object is not covers the mask_p area*/ - return ancestor_design(ta, mask, mode); + return ancestor_design(ta, clip_area, mode); } else if(mode == LV_DESIGN_DRAW_MAIN) { /*Draw the object*/ - ancestor_design(ta, mask, mode); + ancestor_design(ta, clip_area, mode); } else if(mode == LV_DESIGN_DRAW_POST) { - ancestor_design(ta, mask, mode); + ancestor_design(ta, clip_area, mode); } - return true; + return LV_DESIGN_RES_OK; } /** * An extended scrollable design of the page. Calls the normal design function and draws a cursor. * @param scrl pointer to the scrollable part of the Text area - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW_MAIN: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn * @return return true/false, depends on 'mode' */ -static bool lv_ta_scrollable_design(lv_obj_t * scrl, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_ta_scrollable_design(lv_obj_t * scrl, const lv_area_t * clip_area, lv_design_mode_t mode) { if(mode == LV_DESIGN_COVER_CHK) { /*Return false if the object is not covers the mask_p area*/ - return scrl_design(scrl, mask, mode); + return scrl_design(scrl, clip_area, mode); } else if(mode == LV_DESIGN_DRAW_MAIN) { /*Draw the object*/ - scrl_design(scrl, mask, mode); + scrl_design(scrl, clip_area, mode); } else if(mode == LV_DESIGN_DRAW_POST) { - scrl_design(scrl, mask, mode); + scrl_design(scrl, clip_area, mode); /*Draw the cursor*/ lv_obj_t * ta = lv_obj_get_parent(scrl); @@ -1293,28 +1385,27 @@ static bool lv_ta_scrollable_design(lv_obj_t * scrl, const lv_area_t * mask, lv_ lv_opa_t opa_scale = lv_obj_get_opa_scale(ta); if(ext->cursor.type == LV_CURSOR_LINE) { - lv_draw_rect(&cur_area, mask, &cur_style, opa_scale); + lv_draw_rect(&cur_area, clip_area, &cur_style, opa_scale); } else if(ext->cursor.type == LV_CURSOR_BLOCK) { - lv_draw_rect(&cur_area, mask, &cur_style, opa_scale); + lv_draw_rect(&cur_area, clip_area, &cur_style, opa_scale); char letter_buf[8] = {0}; memcpy(letter_buf, &txt[ext->cursor.txt_byte_pos], lv_txt_encoded_size(&txt[ext->cursor.txt_byte_pos])); cur_area.x1 += cur_style.body.padding.left; cur_area.y1 += cur_style.body.padding.top; - lv_draw_label(&cur_area, mask, &cur_style, opa_scale, letter_buf, LV_TXT_FLAG_NONE, 0, - LV_LABEL_TEXT_SEL_OFF, LV_LABEL_TEXT_SEL_OFF, NULL); + lv_draw_label(&cur_area, clip_area, &cur_style, opa_scale, letter_buf, LV_TXT_FLAG_NONE, NULL, NULL, NULL, lv_obj_get_base_dir(ta)); } else if(ext->cursor.type == LV_CURSOR_OUTLINE) { cur_style.body.opa = LV_OPA_TRANSP; if(cur_style.body.border.width == 0) cur_style.body.border.width = 1; /*Be sure the border will be drawn*/ - lv_draw_rect(&cur_area, mask, &cur_style, opa_scale); + lv_draw_rect(&cur_area, clip_area, &cur_style, opa_scale); } else if(ext->cursor.type == LV_CURSOR_UNDERLINE) { - lv_draw_rect(&cur_area, mask, &cur_style, opa_scale); + lv_draw_rect(&cur_area, clip_area, &cur_style, opa_scale); } } - return true; + return LV_DESIGN_RES_OK; } /** @@ -1331,6 +1422,7 @@ static lv_res_t lv_ta_signal(lv_obj_t * ta, lv_signal_t sign, void * param) /* Include the ancient signal function */ res = ancestor_signal(ta, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); if(sign == LV_SIGNAL_CLEANUP) { @@ -1346,6 +1438,7 @@ static lv_res_t lv_ta_signal(lv_obj_t * ta, lv_signal_t sign, void * param) /*In one line mode refresh the Text Area height because 'vpad' can modify it*/ const lv_style_t * style_label = lv_obj_get_style(ext->label); lv_coord_t font_h = lv_font_get_line_height(style_label->text.font); + lv_obj_set_height(ext->label, font_h); lv_obj_set_height(ta, font_h + style_ta->body.padding.top + style_ta->body.padding.bottom + style_scrl->body.padding.top + style_scrl->body.padding.bottom); } else { @@ -1411,13 +1504,6 @@ static lv_res_t lv_ta_signal(lv_obj_t * ta, lv_signal_t sign, void * param) } else if(sign == LV_SIGNAL_GET_EDITABLE) { bool * editable = (bool *)param; *editable = true; - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_ta"; } else if(sign == LV_SIGNAL_DEFOCUS) { lv_cursor_type_t cur_type; cur_type = lv_ta_get_cursor_type(ta); @@ -1461,6 +1547,7 @@ static lv_res_t lv_ta_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, void /* Include the ancient signal function */ res = scrl_signal(scrl, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, ""); lv_obj_t * ta = lv_obj_get_parent(scrl); lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); @@ -1704,6 +1791,11 @@ static void refr_cursor_area(lv_obj_t * ta) cur_area.x2 = letter_pos.x + cur_style.body.padding.right + letter_w; cur_area.y2 = letter_pos.y + cur_style.body.padding.bottom + letter_h + (cur_style.line.width >> 1) + (cur_style.line.width & 0x1); + } else if(ext->cursor.type == LV_CURSOR_NONE) { + cur_area.x1 = letter_pos.x; + cur_area.y1 = letter_pos.y; + lv_area_set_width(&cur_area, 0); + lv_area_set_height(&cur_area, 0); } /*Save the new area*/ @@ -1771,69 +1863,69 @@ static void update_cursor_position_on_click(lv_obj_t * ta, lv_signal_t sign, lv_ lv_indev_get_vect(click_source, &vect_act); if(point_act.x < 0 || point_act.y < 0) return; /*Ignore event from keypad*/ - lv_point_t relative_position; - relative_position.x = point_act.x - label_coords.x1; - relative_position.y = point_act.y - label_coords.y1; + lv_point_t rel_pos; + rel_pos.x = point_act.x - label_coords.x1; + rel_pos.y = point_act.y - label_coords.y1; lv_coord_t label_width = lv_obj_get_width(ext->label); - uint16_t index_of_char_at_position; + uint16_t char_id_at_click; #if LV_LABEL_TEXT_SEL lv_label_ext_t * ext_label = lv_obj_get_ext_attr(ext->label); bool click_outside_label; /*Check if the click happened on the left side of the area outside the label*/ - if(relative_position.x < 0) { - index_of_char_at_position = 0; + if(rel_pos.x < 0) { + char_id_at_click = 0; click_outside_label = true; } /*Check if the click happened on the right side of the area outside the label*/ - else if(relative_position.x >= label_width) { - index_of_char_at_position = LV_TA_CURSOR_LAST; + else if(rel_pos.x >= label_width) { + char_id_at_click = LV_TA_CURSOR_LAST; click_outside_label = true; } else { - index_of_char_at_position = lv_label_get_letter_on(ext->label, &relative_position); - click_outside_label = !lv_label_is_char_under_pos(ext->label, &relative_position); + char_id_at_click = lv_label_get_letter_on(ext->label, &rel_pos); + click_outside_label = !lv_label_is_char_under_pos(ext->label, &rel_pos); } if(ext->text_sel_en) { if(!ext->text_sel_in_prog && !click_outside_label && sign == LV_SIGNAL_PRESSED) { /*Input device just went down. Store the selection start position*/ - ext->tmp_sel_start = index_of_char_at_position; - ext->tmp_sel_end = LV_LABEL_TEXT_SEL_OFF; + ext->sel.start = char_id_at_click; + ext->sel.end = LV_LABEL_TEXT_SEL_OFF; ext->text_sel_in_prog = 1; lv_obj_set_drag(lv_page_get_scrl(ta), false); } else if(ext->text_sel_in_prog && sign == LV_SIGNAL_PRESSING) { /*Input device may be moving. Store the end position */ - ext->tmp_sel_end = index_of_char_at_position; + ext->sel.end = char_id_at_click; } else if(ext->text_sel_in_prog && (sign == LV_SIGNAL_PRESS_LOST || sign == LV_SIGNAL_RELEASED)) { /*Input device is released. Check if anything was selected.*/ lv_obj_set_drag(lv_page_get_scrl(ta), true); } } - if(ext->text_sel_in_prog || sign == LV_SIGNAL_PRESSED) lv_ta_set_cursor_pos(ta, index_of_char_at_position); + if(ext->text_sel_in_prog || sign == LV_SIGNAL_PRESSED) lv_ta_set_cursor_pos(ta, char_id_at_click); if(ext->text_sel_in_prog) { /*If the selected area has changed then update the real values and*/ - /*invalidate the text area.*/ - if(ext->tmp_sel_start > ext->tmp_sel_end) { - if(ext_label->txt_sel_start != ext->tmp_sel_end || ext_label->txt_sel_end != ext->tmp_sel_start) { - ext_label->txt_sel_start = ext->tmp_sel_end; - ext_label->txt_sel_end = ext->tmp_sel_start; + /*Invalidate the text area.*/ + if(ext->sel.start > ext->sel.end) { + if(ext_label->txt_sel.start != ext->sel.end || ext_label->txt_sel.end != ext->sel.start) { + ext_label->txt_sel.start = ext->sel.end; + ext_label->txt_sel.end = ext->sel.start; lv_obj_invalidate(ta); } - } else if(ext->tmp_sel_start < ext->tmp_sel_end) { - if(ext_label->txt_sel_start != ext->tmp_sel_start || ext_label->txt_sel_end != ext->tmp_sel_end) { - ext_label->txt_sel_start = ext->tmp_sel_start; - ext_label->txt_sel_end = ext->tmp_sel_end; + } else if(ext->sel.start < ext->sel.end) { + if(ext_label->txt_sel.start != ext->sel.start || ext_label->txt_sel.end != ext->sel.end) { + ext_label->txt_sel.start = ext->sel.start; + ext_label->txt_sel.end = ext->sel.end; lv_obj_invalidate(ta); } } else { - if(ext_label->txt_sel_start != LV_LABEL_TEXT_SEL_OFF || ext_label->txt_sel_end != LV_LABEL_TEXT_SEL_OFF) { - ext_label->txt_sel_start = LV_LABEL_TEXT_SEL_OFF; - ext_label->txt_sel_end = LV_LABEL_TEXT_SEL_OFF; + if(ext_label->txt_sel.start != LV_DRAW_LABEL_NO_TXT_SEL || ext_label->txt_sel.end != LV_DRAW_LABEL_NO_TXT_SEL) { + ext_label->txt_sel.start = LV_DRAW_LABEL_NO_TXT_SEL; + ext_label->txt_sel.end = LV_DRAW_LABEL_NO_TXT_SEL; lv_obj_invalidate(ta); } } @@ -1844,17 +1936,17 @@ static void update_cursor_position_on_click(lv_obj_t * ta, lv_signal_t sign, lv_ } #else /*Check if the click happened on the left side of the area outside the label*/ - if(relative_position.x < 0) { - index_of_char_at_position = 0; + if(rel_pos.x < 0) { + char_id_at_click = 0; } /*Check if the click happened on the right side of the area outside the label*/ - else if(relative_position.x >= label_width) { - index_of_char_at_position = LV_TA_CURSOR_LAST; + else if(rel_pos.x >= label_width) { + char_id_at_click = LV_TA_CURSOR_LAST; } else { - index_of_char_at_position = lv_label_get_letter_on(ext->label, &relative_position); + char_id_at_click = lv_label_get_letter_on(ext->label, &rel_pos); } - if(sign == LV_SIGNAL_PRESSED) lv_ta_set_cursor_pos(ta, index_of_char_at_position); + if(sign == LV_SIGNAL_PRESSED) lv_ta_set_cursor_pos(ta, char_id_at_click); #endif } diff --git a/src/lv_objx/lv_ta.h b/src/lv_objx/lv_ta.h index 4d3a4a4e3..afbb94bc2 100644 --- a/src/lv_objx/lv_ta.h +++ b/src/lv_objx/lv_ta.h @@ -39,6 +39,8 @@ extern "C" { *********************/ #define LV_TA_CURSOR_LAST (0x7FFF) /*Put the cursor after the last character*/ +LV_EXPORT_CONST_INT(LV_TA_CURSOR_LAST); + /********************** * TYPEDEFS **********************/ @@ -80,8 +82,7 @@ typedef struct uint8_t click_pos : 1; /*1: Enable positioning the cursor by clicking the text area*/ } cursor; #if LV_LABEL_TEXT_SEL - uint16_t tmp_sel_start; /*Temporary value*/ - uint16_t tmp_sel_end; /*Temporary value*/ + lv_draw_label_txt_sel_t sel; /*Temporary values for text selection*/ uint8_t text_sel_in_prog : 1; /*User is in process of selecting */ uint8_t text_sel_en : 1; /*Text can be selected on this text area*/ #endif diff --git a/src/lv_objx/lv_table.c b/src/lv_objx/lv_table.c index ab0e47879..a7ff1ffef 100644 --- a/src/lv_objx/lv_table.c +++ b/src/lv_objx/lv_table.c @@ -9,6 +9,7 @@ #include "lv_table.h" #if LV_USE_TABLE != 0 +#include "../lv_core/lv_debug.h" #include "../lv_misc/lv_txt.h" #include "../lv_misc/lv_math.h" #include "../lv_draw/lv_draw_label.h" @@ -17,6 +18,7 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_table" /********************** * TYPEDEFS @@ -25,7 +27,7 @@ /********************** * STATIC PROTOTYPES **********************/ -static bool lv_table_design(lv_obj_t * table, const lv_area_t * mask, lv_design_mode_t mode); +static lv_design_res_t lv_table_design(lv_obj_t * table, const lv_area_t * clip_area, lv_design_mode_t mode); static lv_res_t lv_table_signal(lv_obj_t * table, lv_signal_t sign, void * param); static lv_coord_t get_row_height(lv_obj_t * table, uint16_t row_id); static void refr_size(lv_obj_t * table); @@ -56,13 +58,17 @@ lv_obj_t * lv_table_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor of table*/ lv_obj_t * new_table = lv_obj_create(par, copy); - lv_mem_assert(new_table); + LV_ASSERT_MEM(new_table); if(new_table == NULL) return NULL; /*Allocate the table type specific extended data*/ lv_table_ext_t * ext = lv_obj_allocate_ext_attr(new_table, sizeof(lv_table_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_table); + return NULL; + } + if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_table); if(ancestor_scrl_design == NULL) ancestor_scrl_design = lv_obj_get_design_cb(new_table); @@ -132,6 +138,9 @@ lv_obj_t * lv_table_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_table_set_cell_value(lv_obj_t * table, uint16_t row, uint16_t col, const char * txt) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + LV_ASSERT_NULL(txt); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); if(row >= ext->row_cnt || col >= ext->col_cnt) { LV_LOG_WARN("lv_table_set_cell_value: invalid row or column"); @@ -146,14 +155,23 @@ void lv_table_set_cell_value(lv_obj_t * table, uint16_t row, uint16_t col, const } /*Initialize the format byte*/ else { - format.s.align = LV_LABEL_ALIGN_LEFT; + lv_bidi_dir_t base_dir = lv_obj_get_base_dir(table); + if(base_dir == LV_BIDI_DIR_LTR) format.s.align = LV_LABEL_ALIGN_LEFT; + else if(base_dir == LV_BIDI_DIR_RTL) format.s.align = LV_LABEL_ALIGN_RIGHT; + else if(base_dir == LV_BIDI_DIR_AUTO) +#if LV_USE_BIDI + format.s.align = lv_bidi_detect_base_dir(txt); +#else + format.s.align = LV_LABEL_ALIGN_LEFT; +#endif format.s.right_merge = 0; format.s.type = 0; format.s.crop = 0; } ext->cell_data[cell] = lv_mem_realloc(ext->cell_data[cell], strlen(txt) + 2); /*+1: trailing '\0; +1: format byte*/ - strcpy(ext->cell_data[cell] + 1, txt); /*Leave the format byte*/ + strcpy(ext->cell_data[cell] + 1, txt); /*+1 to skip the format byte*/ + ext->cell_data[cell][0] = format.format_byte; refr_size(table); } @@ -165,6 +183,8 @@ void lv_table_set_cell_value(lv_obj_t * table, uint16_t row, uint16_t col, const */ void lv_table_set_row_cnt(lv_obj_t * table, uint16_t row_cnt) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); uint16_t old_row_cnt = ext->row_cnt; ext->row_cnt = row_cnt; @@ -193,6 +213,7 @@ void lv_table_set_row_cnt(lv_obj_t * table, uint16_t row_cnt) */ void lv_table_set_col_cnt(lv_obj_t * table, uint16_t col_cnt) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); if(col_cnt >= LV_TABLE_COL_MAX) { LV_LOG_WARN("lv_table_set_col_cnt: too many columns. Must be < LV_TABLE_COL_MAX."); @@ -227,6 +248,8 @@ void lv_table_set_col_cnt(lv_obj_t * table, uint16_t col_cnt) */ void lv_table_set_col_width(lv_obj_t * table, uint16_t col_id, lv_coord_t w) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + if(col_id >= LV_TABLE_COL_MAX) { LV_LOG_WARN("lv_table_set_col_width: too big 'col_id'. Must be < LV_TABLE_COL_MAX."); return; @@ -246,6 +269,8 @@ void lv_table_set_col_width(lv_obj_t * table, uint16_t col_id, lv_coord_t w) */ void lv_table_set_cell_align(lv_obj_t * table, uint16_t row, uint16_t col, lv_label_align_t align) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); if(row >= ext->row_cnt || col >= ext->col_cnt) { LV_LOG_WARN("lv_table_set_cell_align: invalid row or column"); @@ -274,6 +299,8 @@ void lv_table_set_cell_align(lv_obj_t * table, uint16_t row, uint16_t col, lv_la */ void lv_table_set_cell_type(lv_obj_t * table, uint16_t row, uint16_t col, uint8_t type) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); if(row >= ext->row_cnt || col >= ext->col_cnt) { LV_LOG_WARN("lv_table_set_cell_type: invalid row or column"); @@ -305,6 +332,8 @@ void lv_table_set_cell_type(lv_obj_t * table, uint16_t row, uint16_t col, uint8_ */ void lv_table_set_cell_crop(lv_obj_t * table, uint16_t row, uint16_t col, bool crop) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); if(row >= ext->row_cnt || col >= ext->col_cnt) { LV_LOG_WARN("lv_table_set_cell_crop: invalid row or column"); @@ -333,6 +362,8 @@ void lv_table_set_cell_crop(lv_obj_t * table, uint16_t row, uint16_t col, bool c */ void lv_table_set_cell_merge_right(lv_obj_t * table, uint16_t row, uint16_t col, bool en) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); if(row >= ext->row_cnt || col >= ext->col_cnt) { LV_LOG_WARN("lv_table_set_cell_merge_right: invalid row or column"); @@ -362,6 +393,8 @@ void lv_table_set_cell_merge_right(lv_obj_t * table, uint16_t row, uint16_t col, */ void lv_table_set_style(lv_obj_t * table, lv_table_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); switch(type) { @@ -401,6 +434,8 @@ void lv_table_set_style(lv_obj_t * table, lv_table_style_t type, const lv_style_ */ const char * lv_table_get_cell_value(lv_obj_t * table, uint16_t row, uint16_t col) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); if(row >= ext->row_cnt || col >= ext->col_cnt) { LV_LOG_WARN("lv_table_set_cell_value: invalid row or column"); @@ -420,6 +455,8 @@ const char * lv_table_get_cell_value(lv_obj_t * table, uint16_t row, uint16_t co */ uint16_t lv_table_get_row_cnt(lv_obj_t * table) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); return ext->row_cnt; } @@ -431,6 +468,8 @@ uint16_t lv_table_get_row_cnt(lv_obj_t * table) */ uint16_t lv_table_get_col_cnt(lv_obj_t * table) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); return ext->col_cnt; } @@ -443,6 +482,8 @@ uint16_t lv_table_get_col_cnt(lv_obj_t * table) */ lv_coord_t lv_table_get_col_width(lv_obj_t * table, uint16_t col_id) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + if(col_id >= LV_TABLE_COL_MAX) { LV_LOG_WARN("lv_table_set_col_width: too big 'col_id'. Must be < LV_TABLE_COL_MAX."); return 0; @@ -462,6 +503,8 @@ lv_coord_t lv_table_get_col_width(lv_obj_t * table, uint16_t col_id) */ lv_label_align_t lv_table_get_cell_align(lv_obj_t * table, uint16_t row, uint16_t col) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); if(row >= ext->row_cnt || col >= ext->col_cnt) { LV_LOG_WARN("lv_table_set_cell_align: invalid row or column"); @@ -487,6 +530,8 @@ lv_label_align_t lv_table_get_cell_align(lv_obj_t * table, uint16_t row, uint16_ */ lv_label_align_t lv_table_get_cell_type(lv_obj_t * table, uint16_t row, uint16_t col) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); if(row >= ext->row_cnt || col >= ext->col_cnt) { LV_LOG_WARN("lv_table_get_cell_type: invalid row or column"); @@ -512,6 +557,8 @@ lv_label_align_t lv_table_get_cell_type(lv_obj_t * table, uint16_t row, uint16_t */ lv_label_align_t lv_table_get_cell_crop(lv_obj_t * table, uint16_t row, uint16_t col) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); if(row >= ext->row_cnt || col >= ext->col_cnt) { LV_LOG_WARN("lv_table_get_cell_crop: invalid row or column"); @@ -537,6 +584,8 @@ lv_label_align_t lv_table_get_cell_crop(lv_obj_t * table, uint16_t row, uint16_t */ bool lv_table_get_cell_merge_right(lv_obj_t * table, uint16_t row, uint16_t col) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); if(row >= ext->row_cnt || col >= ext->col_cnt) { LV_LOG_WARN("lv_table_get_cell_merge_right: invalid row or column"); @@ -562,6 +611,8 @@ bool lv_table_get_cell_merge_right(lv_obj_t * table, uint16_t row, uint16_t col) */ const lv_style_t * lv_table_get_style(const lv_obj_t * table, lv_table_style_t type) { + LV_ASSERT_OBJ(table, LV_OBJX_NAME); + lv_table_ext_t * ext = lv_obj_get_ext_attr(table); const lv_style_t * style = NULL; @@ -584,22 +635,22 @@ const lv_style_t * lv_table_get_style(const lv_obj_t * table, lv_table_style_t t /** * Handle the drawing related tasks of the tables * @param table pointer to an object - * @param mask the object will be drawn only in this area + * @param clip_area the object will be drawn only in this area * @param mode LV_DESIGN_COVER_CHK: only check if the object fully covers the 'mask_p' area * (return 'true' if yes) * LV_DESIGN_DRAW: draw the object (always return 'true') * LV_DESIGN_DRAW_POST: drawing after every children are drawn - * @param return true/false, depends on 'mode' + * @param return an element of `lv_design_res_t` */ -static bool lv_table_design(lv_obj_t * table, const lv_area_t * mask, lv_design_mode_t mode) +static lv_design_res_t lv_table_design(lv_obj_t * table, const lv_area_t * clip_area, lv_design_mode_t mode) { /*Return false if the object is not covers the mask_p area*/ if(mode == LV_DESIGN_COVER_CHK) { - return false; + return LV_DESIGN_RES_NOT_COVER; } /*Draw the object*/ else if(mode == LV_DESIGN_DRAW_MAIN) { - ancestor_scrl_design(table, mask, mode); + ancestor_scrl_design(table, clip_area, mode); lv_table_ext_t * ext = lv_obj_get_ext_attr(table); const lv_style_t * bg_style = lv_obj_get_style(table); @@ -654,7 +705,7 @@ static bool lv_table_design(lv_obj_t * table, const lv_area_t * mask, lv_design_ } } - lv_draw_rect(&cell_area, mask, cell_style, opa_scale); + lv_draw_rect(&cell_area, clip_area, cell_style, opa_scale); if(ext->cell_data[cell]) { @@ -688,10 +739,10 @@ static bool lv_table_design(lv_obj_t * table, const lv_area_t * mask, lv_design_ lv_area_t label_mask; bool label_mask_ok; - label_mask_ok = lv_area_intersect(&label_mask, mask, &cell_area); + label_mask_ok = lv_area_intersect(&label_mask, clip_area, &cell_area); if(label_mask_ok) { lv_draw_label(&txt_area, &label_mask, cell_style, opa_scale, ext->cell_data[cell] + 1, - txt_flags, NULL, -1, -1, NULL); + txt_flags, NULL, NULL, NULL, lv_obj_get_base_dir(table)); } /*Draw lines after '\n's*/ lv_point_t p1; @@ -708,7 +759,7 @@ static bool lv_table_design(lv_obj_t * table, const lv_area_t * mask, lv_design_ p1.y = txt_area.y1 + txt_size.y + cell_style->text.line_space / 2; p2.y = txt_area.y1 + txt_size.y + cell_style->text.line_space / 2; - lv_draw_line(&p1, &p2, mask, cell_style, opa_scale); + lv_draw_line(&p1, &p2, clip_area, cell_style, opa_scale); ext->cell_data[cell][i] = '\n'; } @@ -724,7 +775,7 @@ static bool lv_table_design(lv_obj_t * table, const lv_area_t * mask, lv_design_ else if(mode == LV_DESIGN_DRAW_POST) { } - return true; + return LV_DESIGN_RES_OK; } /** @@ -741,6 +792,7 @@ static lv_res_t lv_table_signal(lv_obj_t * table, lv_signal_t sign, void * param /* Include the ancient signal function */ res = ancestor_signal(table, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_CLEANUP) { /*Free the cell texts*/ @@ -754,13 +806,6 @@ static lv_res_t lv_table_signal(lv_obj_t * table, lv_signal_t sign, void * param } if(ext->cell_data != NULL) lv_mem_free(ext->cell_data); - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_table"; } return res; diff --git a/src/lv_objx/lv_tabview.c b/src/lv_objx/lv_tabview.c index ab0ad28a8..a306a9531 100644 --- a/src/lv_objx/lv_tabview.c +++ b/src/lv_objx/lv_tabview.c @@ -10,6 +10,7 @@ #if LV_USE_TABVIEW != 0 #include "lv_btnm.h" +#include "../lv_core/lv_debug.h" #include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_anim.h" #include "../lv_core/lv_disp.h" @@ -17,6 +18,8 @@ /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_tabview" + #if LV_USE_ANIMATION #ifndef LV_TABVIEW_DEF_ANIM_TIME #define LV_TABVIEW_DEF_ANIM_TIME 300 /*Animation time of focusing to the a list element [ms] (0: no animation) */ @@ -34,21 +37,21 @@ * STATIC PROTOTYPES **********************/ static lv_res_t lv_tabview_signal(lv_obj_t * tabview, lv_signal_t sign, void * param); -static lv_res_t tabpage_signal(lv_obj_t * tab_page, lv_signal_t sign, void * param); -static lv_res_t tabpage_scrl_signal(lv_obj_t * tab_scrl, lv_signal_t sign, void * param); +static lv_res_t tabview_scrl_signal(lv_obj_t * tabview_scrl, lv_signal_t sign, void * param); -static void tabpage_pressed_handler(lv_obj_t * tabview, lv_obj_t * tabpage); -static void tabpage_pressing_handler(lv_obj_t * tabview, lv_obj_t * tabpage); -static void tabpage_press_lost_handler(lv_obj_t * tabview, lv_obj_t * tabpage); static void tab_btnm_event_cb(lv_obj_t * tab_btnm, lv_event_t event); static void tabview_realign(lv_obj_t * tabview); +static void refr_indic_size(lv_obj_t * tabview); +static void refr_btns_size(lv_obj_t * tabview); +static void refr_content_size(lv_obj_t * tabview); +static void refr_align(lv_obj_t * tabview); /********************** * STATIC VARIABLES **********************/ static lv_signal_cb_t ancestor_signal; +static lv_signal_cb_t ancestor_scrl_signal; static lv_signal_cb_t page_signal; -static lv_signal_cb_t page_scrl_signal; static const char * tab_def[] = {""}; /********************** @@ -71,20 +74,19 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor of tab*/ lv_obj_t * new_tabview = lv_obj_create(par, copy); - lv_mem_assert(new_tabview); + LV_ASSERT_MEM(new_tabview); if(new_tabview == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_tabview); /*Allocate the tab type specific extended data*/ lv_tabview_ext_t * ext = lv_obj_allocate_ext_attr(new_tabview, sizeof(lv_tabview_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_tabview); + return NULL; + } /*Initialize the allocated 'ext' */ - ext->drag_hor = 0; - ext->draging = 0; - ext->scroll_ver = 0; - ext->slide_enable = 1; ext->tab_cur = 0; ext->point_last.x = 0; ext->point_last.y = 0; @@ -95,7 +97,6 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) #if LV_USE_ANIMATION ext->anim_time = LV_TABVIEW_DEF_ANIM_TIME; #endif - ext->btns_hide = 0; /*The signal and design functions are not copied so set them here*/ lv_obj_set_signal_cb(new_tabview, lv_tabview_signal); @@ -103,7 +104,7 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) /*Init the new tab tab*/ if(copy == NULL) { ext->tab_name_ptr = lv_mem_alloc(sizeof(char *)); - lv_mem_assert(ext->tab_name_ptr); + LV_ASSERT_MEM(ext->tab_name_ptr); if(ext->tab_name_ptr == NULL) return NULL; ext->tab_name_ptr[0] = ""; ext->tab_cnt = 0; @@ -112,25 +113,26 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) * Don't use `par` directly because if the tabview is created on a page it is moved to the * scrollable so the parent has changed */ lv_obj_set_size(new_tabview, lv_obj_get_width_fit(lv_obj_get_parent(new_tabview)), - lv_obj_get_height_fit(lv_obj_get_parent(new_tabview))); + lv_obj_get_height_fit(lv_obj_get_parent(new_tabview))); - ext->content = lv_cont_create(new_tabview, NULL); + ext->content = lv_page_create(new_tabview, NULL); ext->btns = lv_btnm_create(new_tabview, NULL); ext->indic = lv_obj_create(ext->btns, NULL); - lv_obj_set_height(ext->btns, 3 * LV_DPI / 4); + if(ancestor_scrl_signal == NULL) ancestor_scrl_signal = lv_obj_get_signal_cb(lv_page_get_scrl(ext->content)); + lv_obj_set_signal_cb(lv_page_get_scrl(ext->content), tabview_scrl_signal); + lv_btnm_set_map(ext->btns, tab_def); lv_obj_set_event_cb(ext->btns, tab_btnm_event_cb); - lv_obj_set_width(ext->indic, LV_DPI); - lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); lv_obj_set_click(ext->indic, false); - lv_cont_set_fit2(ext->content, LV_FIT_TIGHT, LV_FIT_NONE); - lv_cont_set_layout(ext->content, LV_LAYOUT_ROW_T); - lv_cont_set_style(ext->content, LV_CONT_STYLE_MAIN, &lv_style_transp_tight); - lv_obj_set_height(ext->content, lv_obj_get_height(new_tabview) - lv_obj_get_height(ext->btns)); - lv_obj_align(ext->content, ext->btns, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); + lv_page_set_style(ext->content, LV_PAGE_STYLE_BG, &lv_style_transp_tight); + lv_page_set_style(ext->content, LV_PAGE_STYLE_SCRL, &lv_style_transp_tight); + lv_page_set_scrl_fit2(ext->content, LV_FIT_TIGHT, LV_FIT_FLOOD); + lv_page_set_scrl_layout(ext->content, LV_LAYOUT_ROW_T); + lv_page_set_sb_mode(ext->content, LV_SB_MODE_OFF); + lv_obj_set_drag_dir(lv_page_get_scrl(ext->content), LV_DRAG_DIR_ONE); /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); @@ -144,7 +146,7 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BTN_TGL_PR, th->style.tabview.btn.tgl_pr); } else { lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BG, &lv_style_plain); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BTN_BG, &lv_style_transp); + lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BTN_BG, &lv_style_pretty);//transp); lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_INDIC, &lv_style_plain_color); } } @@ -155,13 +157,13 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) ext->point_last.y = 0; ext->btns = lv_btnm_create(new_tabview, copy_ext->btns); ext->indic = lv_obj_create(ext->btns, copy_ext->indic); - ext->content = lv_cont_create(new_tabview, copy_ext->content); + ext->content = lv_page_create(new_tabview, copy_ext->content); #if LV_USE_ANIMATION ext->anim_time = copy_ext->anim_time; #endif ext->tab_name_ptr = lv_mem_alloc(sizeof(char *)); - lv_mem_assert(ext->tab_name_ptr); + LV_ASSERT_MEM(ext->tab_name_ptr); if(ext->tab_name_ptr == NULL) return NULL; ext->tab_name_ptr[0] = ""; lv_btnm_set_map(ext->btns, ext->tab_name_ptr); @@ -181,6 +183,8 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) lv_obj_refresh_style(new_tabview); } + tabview_realign(new_tabview); + LV_LOG_INFO("tab view created"); return new_tabview; @@ -188,11 +192,13 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) /** * Delete all children of the scrl object, without deleting scrl child. - * @param obj pointer to an object + * @param tabview pointer to an object */ -void lv_tabview_clean(lv_obj_t * obj) +void lv_tabview_clean(lv_obj_t * tabview) { - lv_obj_t * scrl = lv_page_get_scrl(obj); + LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); + + lv_obj_t * scrl = lv_page_get_scrl(tabview); lv_obj_clean(scrl); } @@ -208,24 +214,25 @@ void lv_tabview_clean(lv_obj_t * obj) */ lv_obj_t * lv_tabview_add_tab(lv_obj_t * tabview, const char * name) { + LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); + LV_ASSERT_STR(name); + lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); /*Create the container page*/ lv_obj_t * h = lv_page_create(ext->content, NULL); lv_obj_set_size(h, lv_obj_get_width(tabview), lv_obj_get_height(ext->content)); lv_page_set_sb_mode(h, LV_SB_MODE_AUTO); - lv_page_set_style(h, LV_PAGE_STYLE_BG, &lv_style_transp); + lv_page_set_style(h, LV_PAGE_STYLE_BG, &lv_style_transp_tight); lv_page_set_style(h, LV_PAGE_STYLE_SCRL, &lv_style_transp); + lv_page_set_scroll_propagation(h, true); if(page_signal == NULL) page_signal = lv_obj_get_signal_cb(h); - if(page_scrl_signal == NULL) page_scrl_signal = lv_obj_get_signal_cb(lv_page_get_scrl(h)); - lv_obj_set_signal_cb(h, tabpage_signal); - lv_obj_set_signal_cb(lv_page_get_scrl(h), tabpage_scrl_signal); /*Extend the button matrix map with the new name*/ char * name_dm; name_dm = lv_mem_alloc(strlen(name) + 1); /*+1 for the the closing '\0' */ - lv_mem_assert(name_dm); + LV_ASSERT_MEM(name_dm); if(name_dm == NULL) return NULL; strcpy(name_dm, name); @@ -234,15 +241,15 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * tabview, const char * name) switch(ext->btns_pos) { case LV_TABVIEW_BTNS_POS_TOP: case LV_TABVIEW_BTNS_POS_BOTTOM: - ext->tab_name_ptr = lv_mem_realloc(ext->tab_name_ptr, sizeof(char *) * (ext->tab_cnt + 1)); + ext->tab_name_ptr = lv_mem_realloc((void*)ext->tab_name_ptr, sizeof(char *) * (ext->tab_cnt + 1)); break; case LV_TABVIEW_BTNS_POS_LEFT: case LV_TABVIEW_BTNS_POS_RIGHT: - ext->tab_name_ptr = lv_mem_realloc(ext->tab_name_ptr, sizeof(char *) * (ext->tab_cnt * 2)); + ext->tab_name_ptr = lv_mem_realloc((void*)ext->tab_name_ptr, sizeof(char *) * (ext->tab_cnt * 2)); break; } - lv_mem_assert(ext->tab_name_ptr); + LV_ASSERT_MEM(ext->tab_name_ptr); if(ext->tab_name_ptr == NULL) return NULL; /* FIXME: It is not possible yet to switch tab button position from/to top/bottom from/to left/right at runtime. @@ -250,22 +257,35 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * tabview, const char * name) * to LV_TABVIEW_BTNS_POS_TOP or LV_TABVIEW_BTNS_POS_BOTTOM. */ switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: - ext->tab_name_ptr[ext->tab_cnt - 1] = name_dm; - ext->tab_name_ptr[ext->tab_cnt] = ""; - break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: - if(ext->tab_cnt == 1) { - ext->tab_name_ptr[0] = name_dm; - ext->tab_name_ptr[1] = ""; - } else { - ext->tab_name_ptr[ext->tab_cnt * 2 - 3] = "\n"; - ext->tab_name_ptr[ext->tab_cnt * 2 - 2] = name_dm; - ext->tab_name_ptr[ext->tab_cnt * 2 - 1] = ""; - } - break; + default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ + case LV_TABVIEW_BTNS_POS_NONE: + case LV_TABVIEW_BTNS_POS_TOP: + case LV_TABVIEW_BTNS_POS_BOTTOM: + ext->tab_name_ptr = lv_mem_realloc(ext->tab_name_ptr, sizeof(char *) * (ext->tab_cnt + 1)); + + LV_ASSERT_MEM(ext->tab_name_ptr); + if(ext->tab_name_ptr == NULL) return NULL; + + ext->tab_name_ptr[ext->tab_cnt - 1] = name_dm; + ext->tab_name_ptr[ext->tab_cnt] = ""; + + break; + case LV_TABVIEW_BTNS_POS_LEFT: + case LV_TABVIEW_BTNS_POS_RIGHT: + ext->tab_name_ptr = lv_mem_realloc(ext->tab_name_ptr, sizeof(char *) * (ext->tab_cnt * 2)); + + LV_ASSERT_MEM(ext->tab_name_ptr); + if(ext->tab_name_ptr == NULL) return NULL; + + if(ext->tab_cnt == 1) { + ext->tab_name_ptr[0] = name_dm; + ext->tab_name_ptr[1] = ""; + } else { + ext->tab_name_ptr[ext->tab_cnt * 2 - 3] = "\n"; + ext->tab_name_ptr[ext->tab_cnt * 2 - 2] = name_dm; + ext->tab_name_ptr[ext->tab_cnt * 2 - 1] = ""; + } + break; } /* The button matrix's map still points to the old `tab_name_ptr` which might be freed by @@ -276,38 +296,8 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * tabview, const char * name) lv_btnm_set_map(ext->btns, ext->tab_name_ptr); lv_btnm_set_btn_ctrl(ext->btns, ext->tab_cur, LV_BTNM_CTRL_NO_REPEAT); - /*Modify the indicator size*/ - const lv_style_t * style_tabs = lv_obj_get_style(ext->btns); - lv_coord_t indic_size; - lv_coord_t max_h, btn_h, act_y; - - switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: - indic_size = (lv_obj_get_width(tabview) - style_tabs->body.padding.inner * (ext->tab_cnt - 1) - - style_tabs->body.padding.left - style_tabs->body.padding.right) / - ext->tab_cnt; - lv_obj_set_width(ext->indic, indic_size); - lv_obj_set_x(ext->indic, indic_size * ext->tab_cur + style_tabs->body.padding.inner * ext->tab_cur + - style_tabs->body.padding.left); - break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: - max_h = lv_obj_get_height(ext->btns) - style_tabs->body.padding.top - style_tabs->body.padding.bottom; - btn_h = max_h - ((ext->tab_cnt - 1) * style_tabs->body.padding.inner); - btn_h = btn_h / ext->tab_cnt; - btn_h--; /*-1 because e.g. height = 100 means 101 pixels (0..100)*/ - act_y = style_tabs->body.padding.top + ext->tab_cur * (btn_h + style_tabs->body.padding.inner); - - lv_obj_set_height(ext->indic, btn_h); - lv_obj_set_y(ext->indic, act_y); - break; - } - /*Set the first btn as active*/ - if(ext->tab_cnt == 1) { - ext->tab_cur = 0; - } + if(ext->tab_cnt == 1) ext->tab_cur = 0; tabview_realign(tabview); /*Set the size of the pages, tab buttons and indicator*/ @@ -328,12 +318,15 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * tabview, const char * name) */ void lv_tabview_set_tab_act(lv_obj_t * tabview, uint16_t id, lv_anim_enable_t anim) { + LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); + #if LV_USE_ANIMATION == 0 anim = LV_ANIM_OFF; #endif lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); - const lv_style_t * style = lv_obj_get_style(ext->content); + const lv_style_t * cont_style = lv_obj_get_style(ext->content); + const lv_style_t * cont_scrl_style = lv_obj_get_style(lv_page_get_scrl(ext->content)); if(id >= ext->tab_cnt) id = ext->tab_cnt - 1; @@ -341,32 +334,36 @@ void lv_tabview_set_tab_act(lv_obj_t * tabview, uint16_t id, lv_anim_enable_t an ext->tab_cur = id; + if(lv_obj_get_base_dir(tabview) == LV_BIDI_DIR_RTL) { + id = (ext->tab_cnt - (id + 1)); + } + lv_coord_t cont_x; switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: - cont_x = -(lv_obj_get_width(tabview) * id + style->body.padding.inner * id + style->body.padding.left); - break; - case LV_TABVIEW_BTNS_POS_LEFT: - cont_x = -((lv_obj_get_width(tabview) - lv_obj_get_width(ext->btns)) * id + style->body.padding.inner * id + - style->body.padding.left) + - lv_obj_get_width(ext->btns); - break; - case LV_TABVIEW_BTNS_POS_RIGHT: - cont_x = -((lv_obj_get_width(tabview) - lv_obj_get_width(ext->btns)) * id + style->body.padding.inner * id + - style->body.padding.left); - break; + default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ + case LV_TABVIEW_BTNS_POS_NONE: + case LV_TABVIEW_BTNS_POS_TOP: + case LV_TABVIEW_BTNS_POS_BOTTOM: + cont_x = -(lv_obj_get_width(tabview) * id + cont_scrl_style->body.padding.inner * id + cont_scrl_style->body.padding.left); + break; + case LV_TABVIEW_BTNS_POS_LEFT: + case LV_TABVIEW_BTNS_POS_RIGHT: + cont_x = -((lv_obj_get_width(tabview) - lv_obj_get_width(ext->btns)) * id + cont_scrl_style->body.padding.inner * id + + cont_scrl_style->body.padding.left); + break; } + cont_x += cont_style->body.padding.left; + if(anim == LV_ANIM_OFF || lv_tabview_get_anim_time(tabview) == 0) { - lv_obj_set_x(ext->content, cont_x); + lv_obj_set_x(lv_page_get_scrl(ext->content), cont_x); } #if LV_USE_ANIMATION else { lv_anim_t a; - a.var = ext->content; - a.start = lv_obj_get_x(ext->content); + a.var = lv_page_get_scrl(ext->content); + a.start = lv_obj_get_x(lv_page_get_scrl(ext->content)); a.end = cont_x; a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_x; a.path_cb = lv_anim_path_linear; @@ -384,19 +381,22 @@ void lv_tabview_set_tab_act(lv_obj_t * tabview, uint16_t id, lv_anim_enable_t an /*Move the indicator*/ const lv_style_t * tabs_style = lv_obj_get_style(ext->btns); lv_coord_t indic_size; - lv_coord_t indic_pos; + lv_coord_t indic_pos = 0; /*silence uninitialized variable warning*/; switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: - indic_size = lv_obj_get_width(ext->indic); - indic_pos = indic_size * id + tabs_style->body.padding.inner * id + tabs_style->body.padding.left; - break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: - indic_size = lv_obj_get_height(ext->indic); - indic_pos = tabs_style->body.padding.top + id * (indic_size + tabs_style->body.padding.inner); - break; + default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ + case LV_TABVIEW_BTNS_POS_NONE: + break; + case LV_TABVIEW_BTNS_POS_TOP: + case LV_TABVIEW_BTNS_POS_BOTTOM: + indic_size = lv_obj_get_width(ext->indic); + indic_pos = indic_size * id + tabs_style->body.padding.inner * id + tabs_style->body.padding.left; + break; + case LV_TABVIEW_BTNS_POS_LEFT: + case LV_TABVIEW_BTNS_POS_RIGHT: + indic_size = lv_obj_get_height(ext->indic); + indic_pos = tabs_style->body.padding.top + id * (indic_size + tabs_style->body.padding.inner); + break; } #if LV_USE_ANIMATION @@ -404,10 +404,12 @@ void lv_tabview_set_tab_act(lv_obj_t * tabview, uint16_t id, lv_anim_enable_t an #endif { switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: lv_obj_set_x(ext->indic, indic_pos); break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: lv_obj_set_y(ext->indic, indic_pos); break; + default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ + case LV_TABVIEW_BTNS_POS_NONE: break; + case LV_TABVIEW_BTNS_POS_TOP: + case LV_TABVIEW_BTNS_POS_BOTTOM: lv_obj_set_x(ext->indic, indic_pos); break; + case LV_TABVIEW_BTNS_POS_LEFT: + case LV_TABVIEW_BTNS_POS_RIGHT: lv_obj_set_y(ext->indic, indic_pos); break; } } #if LV_USE_ANIMATION @@ -416,18 +418,21 @@ void lv_tabview_set_tab_act(lv_obj_t * tabview, uint16_t id, lv_anim_enable_t an a.var = ext->indic; switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: - a.start = lv_obj_get_x(ext->indic); - a.end = indic_pos; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_x; - break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: - a.start = lv_obj_get_y(ext->indic); - a.end = indic_pos; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_y; - break; + default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ + case LV_TABVIEW_BTNS_POS_NONE: + break; + case LV_TABVIEW_BTNS_POS_TOP: + case LV_TABVIEW_BTNS_POS_BOTTOM: + a.start = lv_obj_get_x(ext->indic); + a.end = indic_pos; + a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_x; + break; + case LV_TABVIEW_BTNS_POS_LEFT: + case LV_TABVIEW_BTNS_POS_RIGHT: + a.start = lv_obj_get_y(ext->indic); + a.end = indic_pos; + a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_y; + break; } a.path_cb = lv_anim_path_linear; @@ -445,17 +450,6 @@ void lv_tabview_set_tab_act(lv_obj_t * tabview, uint16_t id, lv_anim_enable_t an lv_btnm_set_btn_ctrl(ext->btns, ext->tab_cur, LV_BTNM_CTRL_TGL_STATE); } -/** - * Enable horizontal sliding with touch pad - * @param tabview pointer to Tab view object - * @param en true: enable sliding; false: disable sliding - */ -void lv_tabview_set_sliding(lv_obj_t * tabview, bool en) -{ - lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); - ext->slide_enable = en == false ? 0 : 1; -} - /** * Set the animation time of tab view when a new tab is loaded * @param tabview pointer to Tab view object @@ -463,6 +457,8 @@ void lv_tabview_set_sliding(lv_obj_t * tabview, bool en) */ void lv_tabview_set_anim_time(lv_obj_t * tabview, uint16_t anim_time) { + LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); ext->anim_time = anim_time; @@ -480,33 +476,27 @@ void lv_tabview_set_anim_time(lv_obj_t * tabview, uint16_t anim_time) */ void lv_tabview_set_style(lv_obj_t * tabview, lv_tabview_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); + lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); switch(type) { - case LV_TABVIEW_STYLE_BG: lv_obj_set_style(tabview, style); break; - case LV_TABVIEW_STYLE_BTN_BG: - lv_btnm_set_style(ext->btns, LV_BTNM_STYLE_BG, style); - tabview_realign(tabview); - break; - case LV_TABVIEW_STYLE_BTN_REL: - lv_btnm_set_style(ext->btns, LV_BTNM_STYLE_BTN_REL, style); - tabview_realign(tabview); - break; - case LV_TABVIEW_STYLE_BTN_PR: lv_btnm_set_style(ext->btns, LV_BTNM_STYLE_BTN_PR, style); break; - case LV_TABVIEW_STYLE_BTN_TGL_REL: lv_btnm_set_style(ext->btns, LV_BTNM_STYLE_BTN_TGL_REL, style); break; - case LV_TABVIEW_STYLE_BTN_TGL_PR: lv_btnm_set_style(ext->btns, LV_BTNM_STYLE_BTN_TGL_PR, style); break; - case LV_TABVIEW_STYLE_INDIC: - lv_obj_set_style(ext->indic, style); - - switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: lv_obj_set_height(ext->indic, style->body.padding.inner); break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: lv_obj_set_width(ext->indic, style->body.padding.inner); break; - } - - tabview_realign(tabview); - break; + case LV_TABVIEW_STYLE_BG: lv_obj_set_style(tabview, style); break; + case LV_TABVIEW_STYLE_BTN_BG: + lv_btnm_set_style(ext->btns, LV_BTNM_STYLE_BG, style); + tabview_realign(tabview); + break; + case LV_TABVIEW_STYLE_BTN_REL: + lv_btnm_set_style(ext->btns, LV_BTNM_STYLE_BTN_REL, style); + tabview_realign(tabview); + break; + case LV_TABVIEW_STYLE_BTN_PR: lv_btnm_set_style(ext->btns, LV_BTNM_STYLE_BTN_PR, style); break; + case LV_TABVIEW_STYLE_BTN_TGL_REL: lv_btnm_set_style(ext->btns, LV_BTNM_STYLE_BTN_TGL_REL, style); break; + case LV_TABVIEW_STYLE_BTN_TGL_PR: lv_btnm_set_style(ext->btns, LV_BTNM_STYLE_BTN_TGL_PR, style); break; + case LV_TABVIEW_STYLE_INDIC: + lv_obj_set_style(ext->indic, style); + tabview_realign(tabview); + break; } } @@ -517,25 +507,22 @@ void lv_tabview_set_style(lv_obj_t * tabview, lv_tabview_style_t type, const lv_ */ void lv_tabview_set_btns_pos(lv_obj_t * tabview, lv_tabview_btns_pos_t btns_pos) { + if(btns_pos != LV_TABVIEW_BTNS_POS_NONE && + btns_pos != LV_TABVIEW_BTNS_POS_TOP && + btns_pos != LV_TABVIEW_BTNS_POS_BOTTOM && + btns_pos != LV_TABVIEW_BTNS_POS_LEFT && + btns_pos != LV_TABVIEW_BTNS_POS_RIGHT) { + LV_LOG_WARN("lv_tabview_set_btns_pos: unexpected button position"); + return; + } + LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); + lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); ext->btns_pos = btns_pos; tabview_realign(tabview); } -/** - * Set whether tab buttons are hidden - * @param tabview pointer to a tab view object - * @param en whether tab buttons are hidden - */ -void lv_tabview_set_btns_hidden(lv_obj_t * tabview, bool en) -{ - lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); - - ext->btns_hide = en; - tabview_realign(tabview); -} - /*===================== * Getter functions *====================*/ @@ -547,6 +534,8 @@ void lv_tabview_set_btns_hidden(lv_obj_t * tabview, bool en) */ uint16_t lv_tabview_get_tab_act(const lv_obj_t * tabview) { + LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); + lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); return ext->tab_cur; } @@ -558,6 +547,8 @@ uint16_t lv_tabview_get_tab_act(const lv_obj_t * tabview) */ uint16_t lv_tabview_get_tab_count(const lv_obj_t * tabview) { + LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); + lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); return ext->tab_cnt; } @@ -570,13 +561,16 @@ uint16_t lv_tabview_get_tab_count(const lv_obj_t * tabview) */ lv_obj_t * lv_tabview_get_tab(const lv_obj_t * tabview, uint16_t id) { + LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); + lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); + lv_obj_t * content_scrl = lv_page_get_scrl(ext->content); uint16_t i = 0; - lv_obj_t * page = lv_obj_get_child_back(ext->content, NULL); + lv_obj_t * page = lv_obj_get_child_back(content_scrl, NULL); while(page != NULL && i != id) { - i++; - page = lv_obj_get_child_back(ext->content, page); + if(lv_obj_get_signal_cb(page) == page_signal) i++; + page = lv_obj_get_child_back(content_scrl, page); } if(i == id) return page; @@ -584,17 +578,6 @@ lv_obj_t * lv_tabview_get_tab(const lv_obj_t * tabview, uint16_t id) return NULL; } -/** - * Get horizontal sliding is enabled or not - * @param tabview pointer to Tab view object - * @return true: enable sliding; false: disable sliding - */ -bool lv_tabview_get_sliding(const lv_obj_t * tabview) -{ - lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); - return ext->slide_enable ? true : false; -} - /** * Get the animation time of tab view when a new tab is loaded * @param tabview pointer to Tab view object @@ -602,6 +585,8 @@ bool lv_tabview_get_sliding(const lv_obj_t * tabview) */ uint16_t lv_tabview_get_anim_time(const lv_obj_t * tabview) { + LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); + #if LV_USE_ANIMATION lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); return ext->anim_time; @@ -619,17 +604,19 @@ uint16_t lv_tabview_get_anim_time(const lv_obj_t * tabview) */ const lv_style_t * lv_tabview_get_style(const lv_obj_t * tabview, lv_tabview_style_t type) { + LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); switch(type) { - case LV_TABVIEW_STYLE_BG: style = lv_obj_get_style(tabview); break; - case LV_TABVIEW_STYLE_BTN_BG: style = lv_btnm_get_style(ext->btns, LV_BTNM_STYLE_BG); break; - case LV_TABVIEW_STYLE_BTN_REL: style = lv_btnm_get_style(ext->btns, LV_BTNM_STYLE_BTN_REL); break; - case LV_TABVIEW_STYLE_BTN_PR: style = lv_btnm_get_style(ext->btns, LV_BTNM_STYLE_BTN_PR); break; - case LV_TABVIEW_STYLE_BTN_TGL_REL: style = lv_btnm_get_style(ext->btns, LV_BTNM_STYLE_BTN_TGL_REL); break; - case LV_TABVIEW_STYLE_BTN_TGL_PR: style = lv_btnm_get_style(ext->btns, LV_BTNM_STYLE_BTN_TGL_PR); break; - default: style = NULL; break; + case LV_TABVIEW_STYLE_BG: style = lv_obj_get_style(tabview); break; + case LV_TABVIEW_STYLE_BTN_BG: style = lv_btnm_get_style(ext->btns, LV_BTNM_STYLE_BG); break; + case LV_TABVIEW_STYLE_BTN_REL: style = lv_btnm_get_style(ext->btns, LV_BTNM_STYLE_BTN_REL); break; + case LV_TABVIEW_STYLE_BTN_PR: style = lv_btnm_get_style(ext->btns, LV_BTNM_STYLE_BTN_PR); break; + case LV_TABVIEW_STYLE_BTN_TGL_REL: style = lv_btnm_get_style(ext->btns, LV_BTNM_STYLE_BTN_TGL_REL); break; + case LV_TABVIEW_STYLE_BTN_TGL_PR: style = lv_btnm_get_style(ext->btns, LV_BTNM_STYLE_BTN_TGL_PR); break; + default: style = NULL; break; } return style; @@ -641,22 +628,12 @@ const lv_style_t * lv_tabview_get_style(const lv_obj_t * tabview, lv_tabview_sty */ lv_tabview_btns_pos_t lv_tabview_get_btns_pos(const lv_obj_t * tabview) { + LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); + lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); return ext->btns_pos; } -/** - * Get whether tab buttons are hidden - * @param tabview pointer to a tab view object - * @return whether tab buttons are hidden - */ -bool lv_tabview_get_btns_hidden(const lv_obj_t * tabview) -{ - lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); - - return ext->btns_hide; -} - /********************** * STATIC FUNCTIONS **********************/ @@ -675,6 +652,7 @@ static lv_res_t lv_tabview_signal(lv_obj_t * tabview, lv_signal_t sign, void * p /* Include the ancient signal function */ res = ancestor_signal(tabview, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); if(sign == LV_SIGNAL_CLEANUP) { @@ -687,7 +665,7 @@ static lv_res_t lv_tabview_signal(lv_obj_t * tabview, lv_signal_t sign, void * p ext->content = NULL; } else if(sign == LV_SIGNAL_CORD_CHG) { if(ext->content != NULL && (lv_obj_get_width(tabview) != lv_area_get_width(param) || - lv_obj_get_height(tabview) != lv_area_get_height(param))) { + lv_obj_get_height(tabview) != lv_area_get_height(param))) { tabview_realign(tabview); } } else if(sign == LV_SIGNAL_RELEASED) { @@ -697,7 +675,7 @@ static lv_res_t lv_tabview_signal(lv_obj_t * tabview, lv_signal_t sign, void * p lv_indev_t * indev = lv_indev_get_act(); lv_indev_type_t indev_type = lv_indev_get_type(indev); if(indev_type == LV_INDEV_TYPE_KEYPAD || - (indev_type == LV_INDEV_TYPE_ENCODER && lv_group_get_editing(lv_obj_get_group(tabview)))) { + (indev_type == LV_INDEV_TYPE_ENCODER && lv_group_get_editing(lv_obj_get_group(tabview)))) { lv_event_send(ext->btns, LV_EVENT_CLICKED, lv_event_get_data()); } #endif @@ -710,227 +688,95 @@ static lv_res_t lv_tabview_signal(lv_obj_t * tabview, lv_signal_t sign, void * p if(sign == LV_SIGNAL_FOCUS) { lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); + /*If not focused by an input device assume the last input device*/ + if(indev_type == LV_INDEV_TYPE_NONE) { + indev_type = lv_indev_get_type(lv_indev_get_next(NULL)); + } + /*With ENCODER select the first button only in edit mode*/ if(indev_type == LV_INDEV_TYPE_ENCODER) { #if LV_USE_GROUP lv_group_t * g = lv_obj_get_group(tabview); if(lv_group_get_editing(g)) { - lv_btnm_ext_t * btnm_ext = lv_obj_get_ext_attr(ext->btns); - btnm_ext->btn_id_pr = 0; - lv_obj_invalidate(ext->btns); + lv_btnm_set_pressed(ext->btns, ext->tab_cur); } #endif } else { - lv_btnm_ext_t * btnm_ext = lv_obj_get_ext_attr(ext->btns); - btnm_ext->btn_id_pr = 0; - lv_obj_invalidate(ext->btns); + lv_btnm_set_pressed(ext->btns, ext->tab_cur); } } } else if(sign == LV_SIGNAL_GET_EDITABLE) { bool * editable = (bool *)param; *editable = true; - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_tabview"; } + return res; } /** - * Signal function of a tab's page + * Signal function of a tab views main scrollable area * @param tab pointer to a tab page object * @param sign a signal type from lv_signal_t enum * @param param pointer to a signal specific variable * @return LV_RES_OK: the object is not deleted in the function; LV_RES_INV: the object is deleted */ -static lv_res_t tabpage_signal(lv_obj_t * tab_page, lv_signal_t sign, void * param) +static lv_res_t tabview_scrl_signal(lv_obj_t * tabview_scrl, lv_signal_t sign, void * param) { lv_res_t res; /* Include the ancient signal function */ - res = page_signal(tab_page, sign, param); + res = ancestor_scrl_signal(tabview_scrl, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, ""); - lv_obj_t * cont = lv_obj_get_parent(tab_page); + lv_obj_t * cont = lv_obj_get_parent(tabview_scrl); lv_obj_t * tabview = lv_obj_get_parent(cont); - if(lv_tabview_get_sliding(tabview) == false) return res; + if(sign == LV_SIGNAL_DRAG_THROW_BEGIN) { + lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); - if(sign == LV_SIGNAL_PRESSED) { - tabpage_pressed_handler(tabview, tab_page); - } else if(sign == LV_SIGNAL_PRESSING) { - tabpage_pressing_handler(tabview, tab_page); - } else if(sign == LV_SIGNAL_RELEASED || sign == LV_SIGNAL_PRESS_LOST) { - tabpage_press_lost_handler(tabview, tab_page); - } + lv_indev_t * indev = lv_indev_get_act(); + lv_point_t point_act; + lv_indev_get_point(indev, &point_act); + lv_point_t vect; + lv_indev_get_vect(indev, &vect); + lv_coord_t x_predict = 0; - return res; -} -/** - * Signal function of the tab page's scrollable object - * @param tab_scrl pointer to a tab page's scrollable object - * @param sign a signal type from lv_signal_t enum - * @param param pointer to a signal specific variable - * @return LV_RES_OK: the object is not deleted in the function; LV_RES_INV: the object is deleted - */ -static lv_res_t tabpage_scrl_signal(lv_obj_t * tab_scrl, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* Include the ancient signal function */ - res = page_scrl_signal(tab_scrl, sign, param); - if(res != LV_RES_OK) return res; - - lv_obj_t * tab_page = lv_obj_get_parent(tab_scrl); - lv_obj_t * cont = lv_obj_get_parent(tab_page); - lv_obj_t * tabview = lv_obj_get_parent(cont); - - if(lv_tabview_get_sliding(tabview) == false) return res; - - if(sign == LV_SIGNAL_PRESSED) { - tabpage_pressed_handler(tabview, tab_page); - } else if(sign == LV_SIGNAL_PRESSING) { - tabpage_pressing_handler(tabview, tab_page); - } else if(sign == LV_SIGNAL_RELEASED || sign == LV_SIGNAL_PRESS_LOST) { - tabpage_press_lost_handler(tabview, tab_page); - } - - return res; -} - -/** - * Called when a tab's page or scrollable object is pressed - * @param tabview pointer to the btn view object - * @param tabpage pointer to the page of a btn - */ -static void tabpage_pressed_handler(lv_obj_t * tabview, lv_obj_t * tabpage) -{ - (void)tabpage; - - lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); - lv_indev_t * indev = lv_indev_get_act(); - lv_indev_get_point(indev, &ext->point_last); -} - -/** - * Called when a tab's page or scrollable object is being pressed - * @param tabview pointer to the btn view object - * @param tabpage pointer to the page of a btn - */ -static void tabpage_pressing_handler(lv_obj_t * tabview, lv_obj_t * tabpage) -{ - lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); - lv_indev_t * indev = lv_indev_get_act(); - lv_point_t point_act; - lv_indev_get_point(indev, &point_act); - lv_coord_t x_diff = point_act.x - ext->point_last.x; - lv_coord_t y_diff = point_act.y - ext->point_last.y; - - if(!ext->scroll_ver && (x_diff >= LV_INDEV_DEF_DRAG_LIMIT || x_diff <= -LV_INDEV_DEF_DRAG_LIMIT)) { - ext->draging = 1; - /*Check if the page is on the edge */ - if((lv_page_on_edge(tabpage, LV_PAGE_EDGE_LEFT) && x_diff > 0) || - (lv_page_on_edge(tabpage, LV_PAGE_EDGE_RIGHT) && x_diff < 0)) { - if(ext->drag_hor == 0) { - ext->point_last.x = point_act.x; - ext->point_last.y = point_act.y; - } - ext->drag_hor = 1; - lv_obj_set_drag(lv_page_get_scrl(tabpage), false); - - } else if(ext->drag_hor == 0) { - ext->drag_hor = 0; + while(vect.x != 0) { + x_predict += vect.x; + vect.x = vect.x * (100 - LV_INDEV_DEF_DRAG_THROW) / 100; } - } else if(y_diff >= LV_INDEV_DEF_DRAG_LIMIT || y_diff <= -LV_INDEV_DEF_DRAG_LIMIT) { - ext->drag_hor = 0; - ext->draging = 1; - ext->scroll_ver = 1; - } else - ext->draging = 0; - if(ext->drag_hor) { - lv_obj_set_x(ext->content, lv_obj_get_x(ext->content) + point_act.x - ext->point_last.x); - ext->point_last.x = point_act.x; - ext->point_last.y = point_act.y; + res = lv_indev_finish_drag(indev); + if(res != LV_RES_OK) return res; + lv_obj_t * tab_page = lv_tabview_get_tab(tabview, ext->tab_cur); + lv_coord_t page_x1 = tab_page->coords.x1 - tabview->coords.x1 + x_predict; + lv_coord_t page_x2 = page_x1 + lv_obj_get_width(tabview); + lv_coord_t treshold = lv_obj_get_width(tabview) / 2; - /*Move the indicator*/ - const lv_style_t * tabs_style = lv_obj_get_style(ext->btns); - lv_coord_t indic_size; - lv_coord_t p; - lv_coord_t indic_y; - const lv_style_t * indic_style; - - switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: - indic_size = lv_obj_get_width(ext->indic); - indic_style = lv_obj_get_style(ext->indic); - p = ((tabpage->coords.x1 - tabview->coords.x1) * (indic_size + tabs_style->body.padding.inner)) / - lv_obj_get_width(tabview); - - lv_obj_set_x(ext->indic, indic_size * ext->tab_cur + tabs_style->body.padding.inner * ext->tab_cur + - indic_style->body.padding.left - p); - break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: - indic_size = lv_obj_get_height(ext->indic); - indic_y = tabs_style->body.padding.top + ext->tab_cur * (indic_size + tabs_style->body.padding.inner); - lv_obj_set_y(ext->indic, indic_y); - break; + lv_bidi_dir_t base_dir = lv_obj_get_base_dir(tabview); + int16_t tab_cur = ext->tab_cur; + if(page_x1 > treshold) { + if(base_dir != LV_BIDI_DIR_RTL) tab_cur--; + else tab_cur ++; + } else if(page_x2 < treshold) { + if(base_dir != LV_BIDI_DIR_RTL) tab_cur++; + else tab_cur --; } + + if(tab_cur > ext->tab_cnt - 1) tab_cur = ext->tab_cnt - 1; + if(tab_cur < 0) tab_cur = 0; + + uint32_t id_prev = lv_tabview_get_tab_act(tabview); + lv_tabview_set_tab_act(tabview, tab_cur, LV_ANIM_ON); + uint32_t id_new = lv_tabview_get_tab_act(tabview); + + if(id_prev != id_new) res = lv_event_send(tabview, LV_EVENT_VALUE_CHANGED, &id_new); + if(res != LV_RES_OK) return res; + } -} - -/** - * Called when a tab's page or scrollable object is released or the press is lost - * @param tabview pointer to the btn view object - * @param tabpage pointer to the page of a btn - */ -static void tabpage_press_lost_handler(lv_obj_t * tabview, lv_obj_t * tabpage) -{ - lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); - ext->drag_hor = 0; - ext->draging = 0; - ext->scroll_ver = 0; - - lv_obj_set_drag(lv_page_get_scrl(tabpage), true); - - lv_indev_t * indev = lv_indev_get_act(); - lv_point_t point_act; - lv_indev_get_point(indev, &point_act); - lv_point_t vect; - lv_indev_get_vect(indev, &vect); - lv_coord_t x_predict = 0; - - while(vect.x != 0) { - x_predict += vect.x; - vect.x = vect.x * (100 - LV_INDEV_DEF_DRAG_THROW) / 100; - } - - lv_coord_t page_x1 = tabpage->coords.x1 - tabview->coords.x1 + x_predict; - lv_coord_t page_x2 = page_x1 + lv_obj_get_width(tabpage); - lv_coord_t treshold = lv_obj_get_width(tabview) / 2; - - uint16_t tab_cur = ext->tab_cur; - if(page_x1 > treshold) { - if(tab_cur != 0) tab_cur--; - } else if(page_x2 < treshold) { - if(tab_cur < ext->tab_cnt - 1) tab_cur++; - } - - uint32_t id_prev = lv_tabview_get_tab_act(tabview); - lv_tabview_set_tab_act(tabview, tab_cur, LV_ANIM_ON); - uint32_t id_new = lv_tabview_get_tab_act(tabview); - - lv_res_t res = LV_RES_OK; - if(id_prev != id_new) res = lv_event_send(tabview, LV_EVENT_VALUE_CHANGED, &id_new); - - if(res != LV_RES_OK) return; + return res; } /** @@ -968,147 +814,183 @@ static void tabview_realign(lv_obj_t * tabview) { lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); - lv_obj_set_width(ext->btns, lv_obj_get_width(tabview)); + refr_btns_size(tabview); + refr_content_size(tabview); + refr_indic_size(tabview); - if(ext->btns_hide) { - lv_obj_set_hidden(ext->btns, true); - lv_obj_set_hidden(ext->indic, true); - lv_obj_set_height(ext->content, lv_obj_get_height(tabview)); - lv_obj_align(ext->content, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); - } else if(ext->tab_cnt != 0) { - lv_obj_set_hidden(ext->btns, false); - lv_obj_set_hidden(ext->indic, false); - - const lv_style_t * style_btn_bg = lv_tabview_get_style(tabview, LV_TABVIEW_STYLE_BTN_BG); - const lv_style_t * style_btn_rel = lv_tabview_get_style(tabview, LV_TABVIEW_STYLE_BTN_REL); - - /*Set the indicator width/height*/ - lv_coord_t indic_size; - lv_coord_t max_h; - - switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: - indic_size = (lv_obj_get_width(tabview) - style_btn_bg->body.padding.inner * (ext->tab_cnt - 1) - - style_btn_bg->body.padding.left - style_btn_bg->body.padding.right) / - ext->tab_cnt; - lv_obj_set_width(ext->indic, indic_size); - break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: - lv_obj_set_height(ext->btns, lv_obj_get_height(tabview)); - - max_h = - lv_obj_get_height(ext->btns) - style_btn_bg->body.padding.top - style_btn_bg->body.padding.bottom; - indic_size = max_h - ((ext->tab_cnt - 1) * style_btn_bg->body.padding.inner); - indic_size = indic_size / ext->tab_cnt; - indic_size--; /*-1 because e.g. height = 100 means 101 pixels (0..100)*/ - lv_obj_set_height(ext->indic, indic_size); - break; - } - - /*Set the tabs height/width*/ - lv_coord_t btns_size; - - switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: - btns_size = lv_font_get_line_height(style_btn_rel->text.font) + style_btn_rel->body.padding.top + - style_btn_rel->body.padding.bottom + style_btn_bg->body.padding.top + - style_btn_bg->body.padding.bottom; - lv_obj_set_height(ext->btns, btns_size); - break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: - btns_size = lv_font_get_glyph_width(style_btn_rel->text.font, 'A', '\0') + - style_btn_rel->body.padding.left + style_btn_rel->body.padding.right + - style_btn_bg->body.padding.left + style_btn_bg->body.padding.right; - lv_obj_set_width(ext->btns, btns_size); - break; - } - - switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: - lv_obj_set_height(ext->content, lv_obj_get_height(tabview) - lv_obj_get_height(ext->btns)); - break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: lv_obj_set_height(ext->content, lv_obj_get_height(tabview)); break; - } - - switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - lv_obj_align(ext->btns, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); - lv_obj_align(ext->content, ext->btns, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); - lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); - - lv_cont_set_fit2(ext->content, LV_FIT_TIGHT, LV_FIT_NONE); - lv_cont_set_layout(ext->content, LV_LAYOUT_ROW_T); - lv_obj_set_height(ext->content, lv_obj_get_height(tabview) - lv_obj_get_height(ext->btns)); - break; - case LV_TABVIEW_BTNS_POS_BOTTOM: - lv_obj_align(ext->content, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); - lv_obj_align(ext->btns, ext->content, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); - lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_TOP_LEFT, 0, 0); - - lv_cont_set_fit2(ext->content, LV_FIT_TIGHT, LV_FIT_NONE); - lv_cont_set_layout(ext->content, LV_LAYOUT_ROW_T); - lv_obj_set_height(ext->content, lv_obj_get_height(tabview) - lv_obj_get_height(ext->btns)); - break; - case LV_TABVIEW_BTNS_POS_LEFT: - lv_obj_align(ext->btns, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); - lv_obj_align(ext->content, tabview, LV_ALIGN_IN_TOP_LEFT, lv_obj_get_width(ext->btns), 0); - lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_TOP_RIGHT, 0, 0); - - lv_cont_set_fit2(ext->content, LV_FIT_TIGHT, LV_FIT_NONE); - lv_cont_set_layout(ext->content, LV_LAYOUT_ROW_T); - lv_obj_set_width(ext->content, lv_obj_get_width(tabview) - lv_obj_get_width(ext->btns)); - - lv_obj_set_height(ext->btns, lv_obj_get_height(tabview)); - lv_obj_set_width(ext->indic, style_btn_bg->body.padding.inner); - break; - case LV_TABVIEW_BTNS_POS_RIGHT: - lv_obj_align(ext->btns, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); - lv_obj_align(ext->content, tabview, LV_ALIGN_IN_TOP_LEFT, 0, 0); - lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_TOP_LEFT, 0, 0); - - lv_cont_set_fit2(ext->content, LV_FIT_TIGHT, LV_FIT_NONE); - lv_cont_set_layout(ext->content, LV_LAYOUT_ROW_T); - lv_obj_set_width(ext->content, lv_obj_get_width(tabview) - lv_obj_get_width(ext->btns)); - - lv_obj_set_height(ext->btns, lv_obj_get_height(tabview)); - lv_obj_set_width(ext->indic, style_btn_bg->body.padding.inner); - break; - } - } - - lv_obj_t * pages = lv_obj_get_child(ext->content, NULL); - while(pages != NULL) { - if(lv_obj_get_signal_cb(pages) == tabpage_signal) { /*Be sure adjust only the pages (user can other things)*/ - switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: - lv_obj_set_size(pages, lv_obj_get_width(tabview), lv_obj_get_height(ext->content)); - break; - case LV_TABVIEW_BTNS_POS_LEFT: - case LV_TABVIEW_BTNS_POS_RIGHT: - lv_obj_set_size(pages, lv_obj_get_width(tabview) - lv_obj_get_width(ext->btns), - lv_obj_get_height(ext->content)); - break; - } - } - pages = lv_obj_get_child(ext->content, pages); - } - - if(!ext->btns_hide) { - switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); break; - case LV_TABVIEW_BTNS_POS_BOTTOM: lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_TOP_LEFT, 0, 0); break; - case LV_TABVIEW_BTNS_POS_LEFT: lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_TOP_RIGHT, 0, 0); break; - case LV_TABVIEW_BTNS_POS_RIGHT: lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_TOP_LEFT, 0, 0); break; - } - } + refr_align(tabview); lv_tabview_set_tab_act(tabview, ext->tab_cur, LV_ANIM_OFF); } + + + +static void refr_indic_size(lv_obj_t * tabview) +{ + lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); + + const lv_style_t * style_btn_bg = lv_tabview_get_style(tabview, LV_TABVIEW_STYLE_BTN_BG); + const lv_style_t * style_indic = lv_tabview_get_style(tabview, LV_TABVIEW_STYLE_INDIC); + + if(style_indic == NULL) style_indic = &lv_style_plain_color; + + + /*Set the indicator width/height*/ + lv_coord_t indic_w; + lv_coord_t indic_h; + lv_coord_t max_h; + + switch(ext->btns_pos) { + default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ + case LV_TABVIEW_BTNS_POS_NONE: + lv_obj_set_hidden(ext->indic, true); + indic_w = 0; + indic_h = 0; + break; + case LV_TABVIEW_BTNS_POS_TOP: + case LV_TABVIEW_BTNS_POS_BOTTOM: + lv_obj_set_hidden(ext->indic, false); + if(ext->tab_cnt) { + indic_h = style_indic->body.padding.inner; + indic_w = (lv_obj_get_width(tabview) - style_btn_bg->body.padding.inner * (ext->tab_cnt - 1) - + style_btn_bg->body.padding.left - style_btn_bg->body.padding.right) / + ext->tab_cnt; + } else { + indic_w = 0; + indic_h = 0; + } + break; + case LV_TABVIEW_BTNS_POS_LEFT: + case LV_TABVIEW_BTNS_POS_RIGHT: + lv_obj_set_hidden(ext->indic, false); + if(ext->tab_cnt) { + indic_w = style_indic->body.padding.inner; + max_h = lv_obj_get_height(ext->btns) - style_btn_bg->body.padding.top - style_btn_bg->body.padding.bottom; + indic_h= max_h - ((ext->tab_cnt - 1) * style_btn_bg->body.padding.inner); + indic_h = indic_h / ext->tab_cnt; + indic_h--; /*-1 because e.g. height = 100 means 101 pixels (0..100)*/ + } else { + indic_w = 0; + indic_h = 0; + } + break; + } + + lv_obj_set_width(ext->indic, indic_w); + lv_obj_set_height(ext->indic, indic_h); +} + + +static void refr_btns_size(lv_obj_t * tabview) +{ + lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); + const lv_style_t * style_btn_bg = lv_tabview_get_style(tabview, LV_TABVIEW_STYLE_BTN_BG); + const lv_style_t * style_btn_rel = lv_tabview_get_style(tabview, LV_TABVIEW_STYLE_BTN_REL); + + + /*Set the tabs height/width*/ + lv_coord_t btns_w; + lv_coord_t btns_h; + + switch(ext->btns_pos) { + default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ + case LV_TABVIEW_BTNS_POS_NONE: + btns_w = 0; + btns_h = 0; + lv_obj_set_hidden(ext->btns, true); + break; + case LV_TABVIEW_BTNS_POS_TOP: + case LV_TABVIEW_BTNS_POS_BOTTOM: + lv_obj_set_hidden(ext->btns, false); + btns_h = lv_font_get_line_height(style_btn_rel->text.font) + style_btn_rel->body.padding.top + + style_btn_rel->body.padding.bottom + style_btn_bg->body.padding.top + + style_btn_bg->body.padding.bottom; + btns_w = lv_obj_get_width(tabview); + + break; + case LV_TABVIEW_BTNS_POS_LEFT: + case LV_TABVIEW_BTNS_POS_RIGHT: + lv_obj_set_hidden(ext->btns, false); + btns_w = lv_font_get_glyph_width(style_btn_rel->text.font, 'A', '\0') + + style_btn_rel->body.padding.left + style_btn_rel->body.padding.right + + style_btn_bg->body.padding.left + style_btn_bg->body.padding.right; + btns_h = lv_obj_get_height(tabview); + break; + } + + lv_obj_set_size(ext->btns, btns_w, btns_h); +} + +static void refr_content_size(lv_obj_t * tabview) +{ + lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); + const lv_style_t * style_cont = lv_obj_get_style(ext->content); + lv_coord_t cont_w; + lv_coord_t cont_h; + + switch(ext->btns_pos) { + default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ + case LV_TABVIEW_BTNS_POS_NONE: + cont_w = lv_obj_get_width(tabview); + cont_h = lv_obj_get_height(tabview); + break; + case LV_TABVIEW_BTNS_POS_TOP: + case LV_TABVIEW_BTNS_POS_BOTTOM: + cont_w = lv_obj_get_width(tabview); + cont_h = lv_obj_get_height(tabview) - lv_obj_get_height(ext->btns); + break; + case LV_TABVIEW_BTNS_POS_LEFT: + case LV_TABVIEW_BTNS_POS_RIGHT: + cont_w = lv_obj_get_width(tabview) - lv_obj_get_width(ext->btns); + cont_h = lv_obj_get_height(tabview); + break; + } + + lv_obj_set_size(ext->content, cont_w, cont_h); + + + /*Refresh the size of the tab pages too. `ext->content` has a layout to align the pages*/ + cont_h -= style_cont->body.padding.top + style_cont->body.padding.bottom; + lv_obj_t * content_scrl = lv_page_get_scrl(ext->content); + lv_obj_t * pages = lv_obj_get_child(content_scrl, NULL); + while(pages != NULL) { + /*Be sure adjust only the pages (user can other things)*/ + if(lv_obj_get_signal_cb(pages) == page_signal) { + lv_obj_set_size(pages, cont_w, cont_h); + } + pages = lv_obj_get_child(content_scrl, pages); + } +} + +static void refr_align(lv_obj_t * tabview) +{ + lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); + + switch(ext->btns_pos) { + default: /*default case is prevented in lv_tabview_set_btns_pos(), but here for safety*/ + case LV_TABVIEW_BTNS_POS_NONE: + lv_obj_align(ext->content, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); + break; + case LV_TABVIEW_BTNS_POS_TOP: + lv_obj_align(ext->btns, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); + lv_obj_align(ext->content, ext->btns, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); + lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); + break; + case LV_TABVIEW_BTNS_POS_BOTTOM: + lv_obj_align(ext->content, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); + lv_obj_align(ext->btns, ext->content, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); + lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_TOP_LEFT, 0, 0); + break; + case LV_TABVIEW_BTNS_POS_LEFT: + lv_obj_align(ext->btns, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); + lv_obj_align(ext->content, tabview, LV_ALIGN_IN_TOP_LEFT, lv_obj_get_width(ext->btns), 0); + lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_TOP_RIGHT, 0, 0); + break; + case LV_TABVIEW_BTNS_POS_RIGHT: + lv_obj_align(ext->btns, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); + lv_obj_align(ext->content, tabview, LV_ALIGN_IN_TOP_LEFT, 0, 0); + lv_obj_align(ext->indic, ext->btns, LV_ALIGN_IN_TOP_LEFT, 0, 0); + break; + } +} #endif diff --git a/src/lv_objx/lv_tabview.h b/src/lv_objx/lv_tabview.h index 419a0bb70..e1383140b 100644 --- a/src/lv_objx/lv_tabview.h +++ b/src/lv_objx/lv_tabview.h @@ -43,7 +43,13 @@ extern "C" { **********************/ /** Position of tabview buttons. */ -enum { LV_TABVIEW_BTNS_POS_TOP, LV_TABVIEW_BTNS_POS_BOTTOM, LV_TABVIEW_BTNS_POS_LEFT, LV_TABVIEW_BTNS_POS_RIGHT }; +enum { + LV_TABVIEW_BTNS_POS_NONE, + LV_TABVIEW_BTNS_POS_TOP, + LV_TABVIEW_BTNS_POS_BOTTOM, + LV_TABVIEW_BTNS_POS_LEFT, + LV_TABVIEW_BTNS_POS_RIGHT +}; typedef uint8_t lv_tabview_btns_pos_t; /*Data of tab*/ @@ -53,7 +59,7 @@ typedef struct /*New data for this type */ lv_obj_t * btns; lv_obj_t * indic; - lv_obj_t * content; /*A rectangle to show the current tab*/ + lv_obj_t * content; /*A background page which holds tab's pages*/ const char ** tab_name_ptr; lv_point_t point_last; uint16_t tab_cur; @@ -61,12 +67,7 @@ typedef struct #if LV_USE_ANIMATION uint16_t anim_time; #endif - uint8_t slide_enable : 1; /*1: enable horizontal sliding by touch pad*/ - uint8_t draging : 1; - uint8_t drag_hor : 1; - uint8_t scroll_ver : 1; - uint8_t btns_hide : 1; - lv_tabview_btns_pos_t btns_pos : 2; + lv_tabview_btns_pos_t btns_pos : 3; } lv_tabview_ext_t; enum { @@ -94,9 +95,9 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy); /** * Delete all children of the scrl object, without deleting scrl child. - * @param obj pointer to an object + * @param tabview pointer to an object */ -void lv_tabview_clean(lv_obj_t * obj); +void lv_tabview_clean(lv_obj_t * tabview); /*====================== * Add/remove functions @@ -122,13 +123,6 @@ lv_obj_t * lv_tabview_add_tab(lv_obj_t * tabview, const char * name); */ void lv_tabview_set_tab_act(lv_obj_t * tabview, uint16_t id, lv_anim_enable_t anim); -/** - * Enable horizontal sliding with touch pad - * @param tabview pointer to Tab view object - * @param en true: enable sliding; false: disable sliding - */ -void lv_tabview_set_sliding(lv_obj_t * tabview, bool en); - /** * Set the animation time of tab view when a new tab is loaded * @param tabview pointer to Tab view object @@ -151,13 +145,6 @@ void lv_tabview_set_style(lv_obj_t * tabview, lv_tabview_style_t type, const lv_ */ void lv_tabview_set_btns_pos(lv_obj_t * tabview, lv_tabview_btns_pos_t btns_pos); -/** - * Set whether tab buttons are hidden - * @param tabview pointer to a tab view object - * @param en whether tab buttons are hidden - */ -void lv_tabview_set_btns_hidden(lv_obj_t * tabview, bool en); - /*===================== * Getter functions *====================*/ @@ -183,13 +170,6 @@ uint16_t lv_tabview_get_tab_count(const lv_obj_t * tabview); */ lv_obj_t * lv_tabview_get_tab(const lv_obj_t * tabview, uint16_t id); -/** - * Get horizontal sliding is enabled or not - * @param tabview pointer to Tab view object - * @return true: enable sliding; false: disable sliding - */ -bool lv_tabview_get_sliding(const lv_obj_t * tabview); - /** * Get the animation time of tab view when a new tab is loaded * @param tabview pointer to Tab view object @@ -211,13 +191,6 @@ const lv_style_t * lv_tabview_get_style(const lv_obj_t * tabview, lv_tabview_sty */ lv_tabview_btns_pos_t lv_tabview_get_btns_pos(const lv_obj_t * tabview); -/** - * Get whether tab buttons are hidden - * @param tabview pointer to a tab view object - * @return whether tab buttons are hidden - */ -bool lv_tabview_get_btns_hidden(const lv_obj_t * tabview); - /********************** * MACROS **********************/ diff --git a/src/lv_objx/lv_tileview.c b/src/lv_objx/lv_tileview.c index ae86ea7dd..a8e6598bc 100644 --- a/src/lv_objx/lv_tileview.c +++ b/src/lv_objx/lv_tileview.c @@ -11,11 +11,15 @@ #include #include "lv_cont.h" +#include "../lv_misc/lv_math.h" +#include "../lv_core/lv_debug.h" #include "../lv_themes/lv_theme.h" /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_tileview" + #if LV_USE_ANIMATION #ifndef LV_TILEVIEW_DEF_ANIM_TIME #define LV_TILEVIEW_DEF_ANIM_TIME 300 /*Animation time loading a tile [ms] (0: no animation) */ @@ -34,7 +38,6 @@ **********************/ static lv_res_t lv_tileview_signal(lv_obj_t * tileview, lv_signal_t sign, void * param); static lv_res_t lv_tileview_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void * param); -static void tileview_scrl_event_cb(lv_obj_t * scrl, lv_event_t event); static void drag_end_handler(lv_obj_t * tileview); static bool set_valid_drag_dirs(lv_obj_t * tileview); @@ -65,18 +68,22 @@ lv_obj_t * lv_tileview_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor of tileview*/ lv_obj_t * new_tileview = lv_page_create(par, copy); - lv_mem_assert(new_tileview); + LV_ASSERT_MEM(new_tileview); if(new_tileview == NULL) return NULL; /*Allocate the tileview type specific extended data*/ lv_tileview_ext_t * ext = lv_obj_allocate_ext_attr(new_tileview, sizeof(lv_tileview_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_tileview); + return NULL; + } + if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_tileview); if(ancestor_scrl_signal == NULL) ancestor_scrl_signal = lv_obj_get_signal_cb(lv_page_get_scrl(new_tileview)); if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_tileview); - /*Initialize the allocated 'ext' */ + /*Initialize the allocated 'ext' */ #if LV_USE_ANIMATION ext->anim_time = LV_TILEVIEW_DEF_ANIM_TIME; #endif @@ -95,11 +102,10 @@ lv_obj_t * lv_tileview_create(lv_obj_t * par, const lv_obj_t * copy) * Don't use `par` directly because if the tileview is created on a page it is moved to the * scrollable so the parent has changed */ lv_obj_set_size(new_tileview, lv_obj_get_width_fit(lv_obj_get_parent(new_tileview)), - lv_obj_get_height_fit(lv_obj_get_parent(new_tileview))); - - lv_obj_set_drag_throw(lv_page_get_scrl(new_tileview), false); + lv_obj_get_height_fit(lv_obj_get_parent(new_tileview))); + lv_obj_set_drag_dir(lv_page_get_scrl(new_tileview), LV_DRAG_DIR_ONE); + lv_obj_set_drag_throw(lv_page_get_scrl(new_tileview), true); lv_page_set_scrl_fit(new_tileview, LV_FIT_TIGHT); - lv_obj_set_event_cb(ext->page.scrl, tileview_scrl_event_cb); /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); if(th) { @@ -142,16 +148,10 @@ lv_obj_t * lv_tileview_create(lv_obj_t * par, const lv_obj_t * copy) */ void lv_tileview_add_element(lv_obj_t * tileview, lv_obj_t * element) { - /* Let the objects event to propagate to the scrollable part of the tileview. - * It is required the handle dargging of the tileview with the element.*/ - element->parent_event = 1; - lv_obj_set_drag_parent(element, true); + LV_ASSERT_OBJ(tileview, LV_OBJX_NAME); + LV_ASSERT_NULL(tileview); - /* When adding a new element the coordinates may shift. - * For example y=1 can become y=1 if an element is added to the top. - * So be sure the current tile is correctly shown*/ - lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); - lv_tileview_set_tile_act(tileview, ext->act_id.x, ext->act_id.y, false); + lv_page_glue_obj(element, true); } /*===================== @@ -161,20 +161,25 @@ void lv_tileview_add_element(lv_obj_t * tileview, lv_obj_t * element) /** * Set the valid position's indices. The scrolling will be possible only to these positions. * @param tileview pointer to a Tileview object - * @param valid_pos array width the indices. E.g. `lv_point_t p[] = {{0,0}, {1,0}, {1,1}`. Only the - * pointer is saved so can't be a local variable. + * @param valid_pos array width the indices. E.g. `lv_point_t p[] = {{0,0}, {1,0}, {1,1}`. + * Only the pointer is saved so can't be a local variable. * @param valid_pos_cnt numner of elements in `valid_pos` array */ -void lv_tileview_set_valid_positions(lv_obj_t * tileview, const lv_point_t * valid_pos, uint16_t valid_pos_cnt) +void lv_tileview_set_valid_positions(lv_obj_t * tileview, const lv_point_t valid_pos[], uint16_t valid_pos_cnt) { + LV_ASSERT_OBJ(tileview, LV_OBJX_NAME); + LV_ASSERT_NULL(valid_pos); + lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); ext->valid_pos = valid_pos; ext->valid_pos_cnt = valid_pos_cnt; + set_valid_drag_dirs(tileview); + /*If valid pos. is selected do nothing*/ uint16_t i; for(i = 0; i < valid_pos_cnt; i++) { - if(valid_pos->x == ext->act_id.x && valid_pos->y == ext->act_id.y) { + if(valid_pos[i].x == ext->act_id.x && valid_pos[i].y == ext->act_id.y) { return; } } @@ -194,6 +199,8 @@ void lv_tileview_set_valid_positions(lv_obj_t * tileview, const lv_point_t * val */ void lv_tileview_set_tile_act(lv_obj_t * tileview, lv_coord_t x, lv_coord_t y, lv_anim_enable_t anim) { + LV_ASSERT_OBJ(tileview, LV_OBJX_NAME); + #if LV_USE_ANIMATION == 0 anim = LV_ANIM_OFF; #endif @@ -253,6 +260,8 @@ void lv_tileview_set_tile_act(lv_obj_t * tileview, lv_coord_t x, lv_coord_t y, l lv_res_t res = LV_RES_OK; res = lv_event_send(tileview, LV_EVENT_VALUE_CHANGED, &tile_id); if(res != LV_RES_OK) return; /*Prevent the tile loading*/ + + set_valid_drag_dirs(tileview); } /** @@ -263,9 +272,10 @@ void lv_tileview_set_tile_act(lv_obj_t * tileview, lv_coord_t x, lv_coord_t y, l */ void lv_tileview_set_style(lv_obj_t * tileview, lv_tileview_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(tileview, LV_OBJX_NAME); switch(type) { - case LV_TILEVIEW_STYLE_MAIN: lv_obj_set_style(tileview, style); break; + case LV_TILEVIEW_STYLE_MAIN: lv_obj_set_style(tileview, style); break; } } @@ -276,6 +286,19 @@ void lv_tileview_set_style(lv_obj_t * tileview, lv_tileview_style_t type, const /* * New object specific "get" functions come here */ +/** +* Get the tile to be shown +* @param tileview pointer to a tileview object +* @param x column id (0, 1, 2...) +* @param y line id (0, 1, 2...) +*/ +void lv_tileview_get_tile_act(lv_obj_t * tileview, lv_coord_t *x, lv_coord_t *y) +{ + lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); + + *x = ext->act_id.x; + *y = ext->act_id.y; +} /** * Get style of a tileview. @@ -285,10 +308,12 @@ void lv_tileview_set_style(lv_obj_t * tileview, lv_tileview_style_t type, const */ const lv_style_t * lv_tileview_get_style(const lv_obj_t * tileview, lv_tileview_style_t type) { + LV_ASSERT_OBJ(tileview, LV_OBJX_NAME); + const lv_style_t * style = NULL; switch(type) { - case LV_TILEVIEW_STYLE_MAIN: style = lv_obj_get_style(tileview); break; - default: style = NULL; + case LV_TILEVIEW_STYLE_MAIN: style = lv_obj_get_style(tileview); break; + default: style = NULL; } return style; @@ -320,16 +345,10 @@ static lv_res_t lv_tileview_signal(lv_obj_t * tileview, lv_signal_t sign, void * /* Include the ancient signal function */ res = ancestor_signal(tileview, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); if(sign == LV_SIGNAL_CLEANUP) { /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_tileview"; } return res; @@ -354,135 +373,55 @@ static lv_res_t lv_tileview_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void lv_obj_t * tileview = lv_obj_get_parent(scrl); const lv_style_t * style_bg = lv_tileview_get_style(tileview, LV_TILEVIEW_STYLE_MAIN); + if(sign == LV_SIGNAL_DRAG_BEGIN) { + set_valid_drag_dirs(tileview); + } + else if(sign == LV_SIGNAL_DRAG_THROW_BEGIN) { + drag_end_handler(tileview); + + res = lv_indev_finish_drag(lv_indev_get_act()); + if(res != LV_RES_OK) return res; + } /*Apply constraint on moving of the tileview*/ - if(sign == LV_SIGNAL_CORD_CHG) { + else if(sign == LV_SIGNAL_CORD_CHG) { lv_indev_t * indev = lv_indev_get_act(); if(indev) { lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); - /*Set horizontal drag constraint if no vertical constraint an dragged to valid x - * direction */ - if(ext->drag_ver == 0 && - ((ext->drag_right_en && indev->proc.types.pointer.drag_sum.x <= -LV_INDEV_DEF_DRAG_LIMIT) || - (ext->drag_left_en && indev->proc.types.pointer.drag_sum.x >= LV_INDEV_DEF_DRAG_LIMIT))) { - ext->drag_hor = 1; - } - /*Set vertical drag constraint if no horizontal constraint an dragged to valid y - * direction */ - if(ext->drag_hor == 0 && - ((ext->drag_bottom_en && indev->proc.types.pointer.drag_sum.y <= -LV_INDEV_DEF_DRAG_LIMIT) || - (ext->drag_top_en && indev->proc.types.pointer.drag_sum.y >= LV_INDEV_DEF_DRAG_LIMIT))) { - ext->drag_ver = 1; - } - -#if LV_USE_ANIMATION - if(ext->drag_hor) { - ext->page.edge_flash.top_ip = 0; - ext->page.edge_flash.bottom_ip = 0; - } - - if(ext->drag_ver) { - ext->page.edge_flash.right_ip = 0; - ext->page.edge_flash.left_ip = 0; - } -#endif - lv_coord_t x = lv_obj_get_x(scrl); lv_coord_t y = lv_obj_get_y(scrl); lv_coord_t h = lv_obj_get_height(tileview); lv_coord_t w = lv_obj_get_width(tileview); - if(ext->drag_top_en == 0) { - if(y > -(ext->act_id.y * h) && indev->proc.types.pointer.vect.y > 0 && ext->drag_hor == 0) { -#if LV_USE_ANIMATION - if(ext->page.edge_flash.enabled && ext->page.edge_flash.left_ip == 0 && - ext->page.edge_flash.right_ip == 0 && ext->page.edge_flash.top_ip == 0 && - ext->page.edge_flash.bottom_ip == 0) { - ext->page.edge_flash.top_ip = 1; - lv_page_start_edge_flash(tileview); - } -#endif - - lv_obj_set_y(scrl, -ext->act_id.y * h + style_bg->body.padding.top); - } - } - if(ext->drag_bottom_en == 0 && indev->proc.types.pointer.vect.y < 0 && ext->drag_hor == 0) { - if(y < -(ext->act_id.y * h)) { -#if LV_USE_ANIMATION - if(ext->page.edge_flash.enabled && ext->page.edge_flash.left_ip == 0 && - ext->page.edge_flash.right_ip == 0 && ext->page.edge_flash.top_ip == 0 && - ext->page.edge_flash.bottom_ip == 0) { - ext->page.edge_flash.bottom_ip = 1; - lv_page_start_edge_flash(tileview); - } -#endif - } - + if(!ext->drag_top_en && y > -(ext->act_id.y * h) && indev->proc.types.pointer.vect.y > 0) { + lv_page_start_edge_flash(tileview, LV_PAGE_EDGE_TOP); lv_obj_set_y(scrl, -ext->act_id.y * h + style_bg->body.padding.top); } - if(ext->drag_left_en == 0) { - if(x > -(ext->act_id.x * w) && indev->proc.types.pointer.vect.x > 0 && ext->drag_ver == 0) { -#if LV_USE_ANIMATION - if(ext->page.edge_flash.enabled && ext->page.edge_flash.left_ip == 0 && - ext->page.edge_flash.right_ip == 0 && ext->page.edge_flash.top_ip == 0 && - ext->page.edge_flash.bottom_ip == 0) { - ext->page.edge_flash.left_ip = 1; - lv_page_start_edge_flash(tileview); - } -#endif - - lv_obj_set_x(scrl, -ext->act_id.x * w + style_bg->body.padding.left); - } + if(!ext->drag_bottom_en && indev->proc.types.pointer.vect.y < 0 && y < -(ext->act_id.y * h)) { + lv_page_start_edge_flash(tileview, LV_PAGE_EDGE_BOTTOM); + lv_obj_set_y(scrl, -ext->act_id.y * h + style_bg->body.padding.top); } - if(ext->drag_right_en == 0 && indev->proc.types.pointer.vect.x < 0 && ext->drag_ver == 0) { - if(x < -(ext->act_id.x * w)) { -#if LV_USE_ANIMATION - if(ext->page.edge_flash.enabled && ext->page.edge_flash.left_ip == 0 && - ext->page.edge_flash.right_ip == 0 && ext->page.edge_flash.top_ip == 0 && - ext->page.edge_flash.bottom_ip == 0) { - ext->page.edge_flash.right_ip = 1; - lv_page_start_edge_flash(tileview); - } -#endif - } + if(!ext->drag_left_en && x > -(ext->act_id.x * w) && indev->proc.types.pointer.vect.x > 0) { + lv_page_start_edge_flash(tileview, LV_PAGE_EDGE_LEFT); + lv_obj_set_x(scrl, -ext->act_id.x * w + style_bg->body.padding.left); + } + + if(!ext->drag_right_en && indev->proc.types.pointer.vect.x < 0 && x < -(ext->act_id.x * w)) { + lv_page_start_edge_flash(tileview, LV_PAGE_EDGE_RIGHT); lv_obj_set_x(scrl, -ext->act_id.x * w + style_bg->body.padding.top); } /*Apply the drag constraints*/ - if(ext->drag_ver == 0) + lv_drag_dir_t drag_dir = indev->proc.types.pointer.drag_dir; + if(drag_dir == LV_DRAG_DIR_HOR) lv_obj_set_y(scrl, -ext->act_id.y * lv_obj_get_height(tileview) + style_bg->body.padding.top); - if(ext->drag_hor == 0) + else if(drag_dir == LV_DRAG_DIR_VER) lv_obj_set_x(scrl, -ext->act_id.x * lv_obj_get_width(tileview) + style_bg->body.padding.left); } } return res; } -static void tileview_scrl_event_cb(lv_obj_t * scrl, lv_event_t event) -{ - lv_obj_t * tileview = lv_obj_get_parent(scrl); - - /*Initialize some variables on PRESS*/ - if(event == LV_EVENT_PRESSED) { - lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); - ext->drag_hor = 0; - ext->drag_ver = 0; - set_valid_drag_dirs(tileview); - } - /*Animate the tabview to the correct location on RELEASE*/ - else if(event == LV_EVENT_PRESS_LOST || event == LV_EVENT_RELEASED) { - /* If the element was dragged and it moved the tileview finish the drag manually to - * let the tileview to finish the move.*/ - lv_indev_t * indev = lv_indev_get_act(); - lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); - if(lv_indev_is_dragging(indev) && (ext->drag_hor || ext->drag_ver)) { - indev->proc.types.pointer.drag_in_prog = 0; - } - - drag_end_handler(tileview); - } -} - /** * Called when the user releases an element of the tileview after dragging it. * @param tileview pointer to a tileview object @@ -499,8 +438,9 @@ static void drag_end_handler(lv_obj_t * tileview) p.x = -(scrl->coords.x1 - lv_obj_get_width(tileview) / 2); p.y = -(scrl->coords.y1 - lv_obj_get_height(tileview) / 2); + lv_drag_dir_t drag_dir = indev->proc.types.pointer.drag_dir; /*From the drag vector (drag throw) predict the end position*/ - if(ext->drag_hor) { + if(drag_dir & LV_DRAG_DIR_HOR) { lv_point_t vect; lv_indev_get_vect(indev, &vect); lv_coord_t predict = 0; @@ -511,7 +451,8 @@ static void drag_end_handler(lv_obj_t * tileview) } p.x -= predict; - } else if(ext->drag_ver) { + + } else if(drag_dir & LV_DRAG_DIR_VER) { lv_point_t vect; lv_indev_get_vect(indev, &vect); lv_coord_t predict = 0; diff --git a/src/lv_objx/lv_tileview.h b/src/lv_objx/lv_tileview.h index 9852f6ff5..aca10f76a 100644 --- a/src/lv_objx/lv_tileview.h +++ b/src/lv_objx/lv_tileview.h @@ -46,8 +46,6 @@ typedef struct uint8_t drag_bottom_en : 1; uint8_t drag_left_en : 1; uint8_t drag_right_en : 1; - uint8_t drag_hor : 1; - uint8_t drag_ver : 1; } lv_tileview_ext_t; /*Styles*/ @@ -86,11 +84,11 @@ void lv_tileview_add_element(lv_obj_t * tileview, lv_obj_t * element); /** * Set the valid position's indices. The scrolling will be possible only to these positions. * @param tileview pointer to a Tileview object - * @param valid_pos array width the indices. E.g. `lv_point_t p[] = {{0,0}, {1,0}, {1,1}`. Only the - * pointer is saved so can't be a local variable. + * @param valid_pos array width the indices. E.g. `lv_point_t p[] = {{0,0}, {1,0}, {1,1}`. + * Only the pointer is saved so can't be a local variable. * @param valid_pos_cnt numner of elements in `valid_pos` array */ -void lv_tileview_set_valid_positions(lv_obj_t * tileview, const lv_point_t * valid_pos, uint16_t valid_pos_cnt); +void lv_tileview_set_valid_positions(lv_obj_t * tileview, const lv_point_t valid_pos[], uint16_t valid_pos_cnt); /** * Set the tile to be shown @@ -132,7 +130,13 @@ void lv_tileview_set_style(lv_obj_t * tileview, lv_tileview_style_t type, const /*===================== * Getter functions *====================*/ - +/** +* Get the tile to be shown +* @param tileview pointer to a tileview object +* @param x column id (0, 1, 2...) +* @param y line id (0, 1, 2...) +*/ +void lv_tileview_get_tile_act(lv_obj_t * tileview, lv_coord_t *x, lv_coord_t *y); /** * Get the scroll propagation property * @param tileview pointer to a Tileview diff --git a/src/lv_objx/lv_win.c b/src/lv_objx/lv_win.c index 946c8a8f8..e0be314f6 100644 --- a/src/lv_objx/lv_win.c +++ b/src/lv_objx/lv_win.c @@ -9,12 +9,14 @@ #include "lv_win.h" #if LV_USE_WIN != 0 +#include "../lv_core/lv_debug.h" #include "../lv_themes/lv_theme.h" #include "../lv_core/lv_disp.h" /********************* * DEFINES *********************/ +#define LV_OBJX_NAME "lv_win" /********************** * TYPEDEFS @@ -51,15 +53,18 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy) /*Create the ancestor object*/ lv_obj_t * new_win = lv_obj_create(par, copy); - lv_mem_assert(new_win); + LV_ASSERT_MEM(new_win); if(new_win == NULL) return NULL; if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_win); /*Allocate the object type specific extended data*/ lv_win_ext_t * ext = lv_obj_allocate_ext_attr(new_win, sizeof(lv_win_ext_t)); - lv_mem_assert(ext); - if(ext == NULL) return NULL; + LV_ASSERT_MEM(ext); + if(ext == NULL) { + lv_obj_del(new_win); + return NULL; + } ext->page = NULL; ext->header = NULL; @@ -94,6 +99,8 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy) ext->title = lv_label_create(ext->header, NULL); lv_label_set_text(ext->title, "My title"); + lv_obj_set_signal_cb(new_win, lv_win_signal); + /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); if(th) { @@ -108,8 +115,6 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy) lv_win_set_style(new_win, LV_WIN_STYLE_CONTENT, &lv_style_transp); lv_win_set_style(new_win, LV_WIN_STYLE_HEADER, &lv_style_plain_color); } - - lv_obj_set_signal_cb(new_win, lv_win_signal); } /*Copy an existing object*/ else { @@ -146,11 +151,13 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy) /** * Delete all children of the scrl object, without deleting scrl child. - * @param obj pointer to an object + * @param win pointer to an object */ -void lv_win_clean(lv_obj_t * obj) +void lv_win_clean(lv_obj_t * win) { - lv_obj_t * scrl = lv_page_get_scrl(obj); + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + + lv_obj_t * scrl = lv_page_get_scrl(win); lv_obj_clean(scrl); } @@ -166,6 +173,9 @@ void lv_win_clean(lv_obj_t * obj) */ lv_obj_t * lv_win_add_btn(lv_obj_t * win, const void * img_src) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + LV_ASSERT_NULL(img_src); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); lv_obj_t * btn = lv_btn_create(ext->header, NULL); @@ -193,6 +203,8 @@ lv_obj_t * lv_win_add_btn(lv_obj_t * win, const void * img_src) */ void lv_win_close_event_cb(lv_obj_t * btn, lv_event_t event) { + LV_ASSERT_OBJ(btn, "lv_btn"); + if(event == LV_EVENT_RELEASED) { lv_obj_t * win = lv_win_get_from_btn(btn); @@ -207,6 +219,9 @@ void lv_win_close_event_cb(lv_obj_t * btn, lv_event_t event) */ void lv_win_set_title(lv_obj_t * win, const char * title) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + LV_ASSERT_STR(title); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); lv_label_set_text(ext->title, title); @@ -220,6 +235,8 @@ void lv_win_set_title(lv_obj_t * win, const char * title) */ void lv_win_set_btn_size(lv_obj_t * win, lv_coord_t size) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); if(ext->btn_size == size) return; @@ -228,6 +245,22 @@ void lv_win_set_btn_size(lv_obj_t * win, lv_coord_t size) lv_win_realign(win); } +/** + * Set the size of the content area. + * @param win pointer to a window object + * @param w width + * @param h height (the window will be higher with the height of the header) + */ +void lv_win_set_content_size(lv_obj_t * win, lv_coord_t w, lv_coord_t h) +{ + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); + h += lv_obj_get_height(ext->header); + + lv_obj_set_size(win, w, h); +} + /** * Set the layout of the window * @param win pointer to a window object @@ -235,6 +268,8 @@ void lv_win_set_btn_size(lv_obj_t * win, lv_coord_t size) */ void lv_win_set_layout(lv_obj_t * win, lv_layout_t layout) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); lv_page_set_scrl_layout(ext->page, layout); } @@ -246,6 +281,8 @@ void lv_win_set_layout(lv_obj_t * win, lv_layout_t layout) */ void lv_win_set_sb_mode(lv_obj_t * win, lv_sb_mode_t sb_mode) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); lv_page_set_sb_mode(ext->page, sb_mode); } @@ -256,6 +293,8 @@ void lv_win_set_sb_mode(lv_obj_t * win, lv_sb_mode_t sb_mode) */ void lv_win_set_anim_time(lv_obj_t * win, uint16_t anim_time) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + lv_page_set_anim_time(lv_win_get_content(win), anim_time); } @@ -267,6 +306,8 @@ void lv_win_set_anim_time(lv_obj_t * win, uint16_t anim_time) */ void lv_win_set_style(lv_obj_t * win, lv_win_style_t type, const lv_style_t * style) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); switch(type) { @@ -306,6 +347,8 @@ void lv_win_set_style(lv_obj_t * win, lv_win_style_t type, const lv_style_t * st */ void lv_win_set_drag(lv_obj_t * win, bool en) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); lv_obj_t * win_header = ext->header; lv_obj_set_drag_parent(win_header, en); @@ -323,6 +366,8 @@ void lv_win_set_drag(lv_obj_t * win, bool en) */ const char * lv_win_get_title(const lv_obj_t * win) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); return lv_label_get_text(ext->title); } @@ -334,6 +379,8 @@ const char * lv_win_get_title(const lv_obj_t * win) */ lv_obj_t * lv_win_get_content(const lv_obj_t * win) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); return ext->page; } @@ -345,6 +392,8 @@ lv_obj_t * lv_win_get_content(const lv_obj_t * win) */ lv_coord_t lv_win_get_btn_size(const lv_obj_t * win) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); return ext->btn_size; } @@ -357,6 +406,8 @@ lv_coord_t lv_win_get_btn_size(const lv_obj_t * win) */ lv_obj_t * lv_win_get_from_btn(const lv_obj_t * ctrl_btn) { + LV_ASSERT_OBJ(ctrl_btn, "lv_btn"); + lv_obj_t * header = lv_obj_get_parent(ctrl_btn); lv_obj_t * win = lv_obj_get_parent(header); @@ -370,6 +421,8 @@ lv_obj_t * lv_win_get_from_btn(const lv_obj_t * ctrl_btn) */ lv_layout_t lv_win_get_layout(lv_obj_t * win) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); return lv_page_get_scrl_layout(ext->page); } @@ -381,6 +434,8 @@ lv_layout_t lv_win_get_layout(lv_obj_t * win) */ lv_sb_mode_t lv_win_get_sb_mode(lv_obj_t * win) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); return lv_page_get_sb_mode(ext->page); } @@ -392,6 +447,8 @@ lv_sb_mode_t lv_win_get_sb_mode(lv_obj_t * win) */ uint16_t lv_win_get_anim_time(const lv_obj_t * win) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + return lv_page_get_anim_time(lv_win_get_content(win)); } @@ -402,6 +459,8 @@ uint16_t lv_win_get_anim_time(const lv_obj_t * win) */ lv_coord_t lv_win_get_width(lv_obj_t * win) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); lv_obj_t * scrl = lv_page_get_scrl(ext->page); const lv_style_t * style_scrl = lv_obj_get_style(scrl); @@ -417,6 +476,8 @@ lv_coord_t lv_win_get_width(lv_obj_t * win) */ const lv_style_t * lv_win_get_style(const lv_obj_t * win, lv_win_style_t type) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + const lv_style_t * style = NULL; lv_win_ext_t * ext = lv_obj_get_ext_attr(win); @@ -445,6 +506,10 @@ const lv_style_t * lv_win_get_style(const lv_obj_t * win, lv_win_style_t type) */ void lv_win_focus(lv_obj_t * win, lv_obj_t * obj, lv_anim_enable_t anim_en) { + LV_ASSERT_OBJ(win, LV_OBJX_NAME); + LV_ASSERT_OBJ(obj, ""); + + lv_win_ext_t * ext = lv_obj_get_ext_attr(win); lv_page_focus(ext->page, obj, anim_en); } @@ -467,6 +532,7 @@ static lv_res_t lv_win_signal(lv_obj_t * win, lv_signal_t sign, void * param) /* Include the ancient signal function */ res = ancestor_signal(win, sign, param); if(res != LV_RES_OK) return res; + if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); lv_win_ext_t * ext = lv_obj_get_ext_attr(win); if(sign == LV_SIGNAL_CHILD_CHG) { /*Move children to the page*/ @@ -498,13 +564,6 @@ static lv_res_t lv_win_signal(lv_obj_t * win, lv_signal_t sign, void * param) } else if(sign == LV_SIGNAL_CONTROL) { /*Forward all the control signals to the page*/ ext->page->signal_cb(ext->page, sign, param); - } else if(sign == LV_SIGNAL_GET_TYPE) { - lv_obj_type_t * buf = param; - uint8_t i; - for(i = 0; i < LV_MAX_ANCESTOR_NUM - 1; i++) { /*Find the last set data*/ - if(buf->type[i] == NULL) break; - } - buf->type[i] = "lv_win"; } return res; diff --git a/src/lv_objx/lv_win.h b/src/lv_objx/lv_win.h index 5cdbd1145..28560cf6c 100644 --- a/src/lv_objx/lv_win.h +++ b/src/lv_objx/lv_win.h @@ -91,9 +91,9 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy); /** * Delete all children of the scrl object, without deleting scrl child. - * @param obj pointer to an object + * @param win pointer to an object */ -void lv_win_clean(lv_obj_t * obj); +void lv_win_clean(lv_obj_t * win); /*====================== * Add/remove functions @@ -132,6 +132,15 @@ void lv_win_set_title(lv_obj_t * win, const char * title); */ void lv_win_set_btn_size(lv_obj_t * win, lv_coord_t size); + +/** + * Set the size of the content area. + * @param win pointer to a window object + * @param w width + * @param h height (the window will be higher with the height of the header) + */ +void lv_win_set_content_size(lv_obj_t * win, lv_coord_t w, lv_coord_t h); + /** * Set the layout of the window * @param win pointer to a window object diff --git a/src/lv_themes/lv_theme_alien.c b/src/lv_themes/lv_theme_alien.c index 987a36310..c5c726ec4 100644 --- a/src/lv_themes/lv_theme_alien.c +++ b/src/lv_themes/lv_theme_alien.c @@ -85,7 +85,6 @@ static void basic_init(void) def.body.border.opa = LV_OPA_COVER; def.body.shadow.color = LV_COLOR_SILVER; def.body.shadow.width = 0; - def.body.shadow.type = LV_SHADOW_FULL; def.text.color = lv_color_hex3(0xDDD); def.text.font = _font; @@ -328,6 +327,10 @@ static void slider_init(void) slider_knob.body.border.width = 1; slider_knob.body.border.color = LV_COLOR_GRAY; slider_knob.body.border.opa = LV_OPA_50; + slider_knob.body.padding.left = LV_DPI/25; + slider_knob.body.padding.right = LV_DPI/25; + slider_knob.body.padding.top = LV_DPI/25; + slider_knob.body.padding.bottom = LV_DPI/25; theme.style.slider.bg = &bar_bg; theme.style.slider.indic = &bar_indic; @@ -824,7 +827,7 @@ static void win_init(void) header.body.border.opa = panel.body.border.opa; header.body.border.width = panel.body.border.width; header.body.border.color = lv_color_hsv_to_rgb(_hue, 20, 80); - header.body.border.part = LV_BORDER_BOTTOM; + header.body.border.part = LV_BORDER_PART_BOTTOM; header.text.color = lv_color_hsv_to_rgb(_hue, 5, 100); header.image.color = lv_color_hsv_to_rgb(_hue, 5, 100); diff --git a/src/lv_themes/lv_theme_material.c b/src/lv_themes/lv_theme_material.c index 6d162bf53..a5694bfde 100644 --- a/src/lv_themes/lv_theme_material.c +++ b/src/lv_themes/lv_theme_material.c @@ -72,8 +72,8 @@ static void basic_init(void) panel.body.border.color = lv_color_hex3(0xbbb); panel.body.border.opa = LV_OPA_COVER; panel.body.shadow.color = DEF_SHADOW_COLOR; - panel.body.shadow.type = LV_SHADOW_BOTTOM; - panel.body.shadow.width = 4; + panel.body.shadow.width = 6; + panel.body.shadow.offset.y = 2; panel.body.padding.left = LV_DPI / 8; panel.body.padding.right = LV_DPI / 8; panel.body.padding.top = LV_DPI / 8; @@ -117,8 +117,8 @@ static void btn_init(void) rel.body.padding.bottom = LV_DPI / 8; rel.body.padding.inner = LV_DPI / 10; rel.body.shadow.color = DEF_SHADOW_COLOR; - rel.body.shadow.type = LV_SHADOW_BOTTOM; rel.body.shadow.width = 6; + rel.body.shadow.offset.y = 2; rel.text.color = lv_color_hsv_to_rgb(_hue, 5, 95); rel.image.color = lv_color_hsv_to_rgb(_hue, 5, 95); @@ -254,6 +254,10 @@ static void slider_init(void) knob.body.border.width = 0; knob.body.main_color = theme.style.bar.indic->body.main_color; knob.body.grad_color = knob.body.main_color; + knob.body.padding.left = LV_DPI/25; + knob.body.padding.right = LV_DPI/25; + knob.body.padding.top = LV_DPI/25; + knob.body.padding.bottom = LV_DPI/25; theme.style.slider.bg = theme.style.bar.bg; theme.style.slider.indic = theme.style.bar.indic; @@ -270,11 +274,13 @@ static void sw_init(void) lv_style_copy(&sw_indic, theme.style.slider.bg); sw_indic.body.radius = LV_RADIUS_CIRCLE; + sw_indic.body.padding.left = 0; + sw_indic.body.padding.right = 0; lv_style_copy(&sw_knob_on, theme.style.slider.knob); - sw_knob_on.body.shadow.width = 3; - sw_knob_on.body.shadow.type = LV_SHADOW_BOTTOM; + sw_knob_on.body.shadow.width = 5; sw_knob_on.body.shadow.color = DEF_SHADOW_COLOR; + sw_knob_on.body.shadow.offset.y= 3; lv_style_copy(&sw_knob_off, &sw_knob_on); sw_knob_off.body.main_color = lv_color_hex(0xfafafa); @@ -381,7 +387,7 @@ static void calendar_init(void) week_box.body.padding.right = theme.style.panel->body.padding.right; week_box.body.border.color = theme.style.panel->body.border.color; week_box.body.border.width = theme.style.panel->body.border.width; - week_box.body.border.part = LV_BORDER_LEFT | LV_BORDER_RIGHT; + week_box.body.border.part = LV_BORDER_PART_LEFT | LV_BORDER_PART_RIGHT; week_box.body.radius = 0; static lv_style_t today_box; @@ -406,7 +412,6 @@ static void cb_init(void) #if LV_USE_CB != 0 static lv_style_t rel, pr, tgl_rel, tgl_pr, ina; lv_style_copy(&rel, theme.style.panel); - rel.body.shadow.type = LV_SHADOW_BOTTOM; rel.body.shadow.width = 3; lv_style_copy(&pr, &rel); @@ -417,7 +422,6 @@ static void cb_init(void) lv_style_copy(&tgl_rel, &rel); tgl_rel.body.main_color = lv_color_hsv_to_rgb(_hue, 75, 85); tgl_rel.body.grad_color = tgl_rel.body.main_color; - tgl_rel.body.shadow.type = LV_SHADOW_FULL; tgl_rel.body.shadow.width = 0; lv_style_copy(&tgl_pr, &tgl_rel); @@ -450,7 +454,7 @@ static void btnm_init(void) bg.text.color = lv_color_hex3(0x555); lv_style_copy(&rel, theme.style.panel); - rel.body.border.part = LV_BORDER_FULL | LV_BORDER_INTERNAL; + rel.body.border.part = LV_BORDER_PART_FULL | LV_BORDER_PART_INTERNAL; rel.body.border.width = 1; rel.body.border.color = lv_color_hex3(0xbbb); rel.body.opa = LV_OPA_TRANSP; @@ -541,7 +545,7 @@ static void ta_init(void) lv_style_copy(&oneline, &def); oneline.body.opa = LV_OPA_TRANSP; oneline.body.radius = 0; - oneline.body.border.part = LV_BORDER_BOTTOM; + oneline.body.border.part = LV_BORDER_PART_BOTTOM; oneline.body.border.width = 3; oneline.body.border.color = lv_color_hex3(0x333); oneline.body.border.opa = LV_OPA_COVER; @@ -584,7 +588,7 @@ static void list_init(void) rel.body.radius = 10; rel.body.border.color = lv_color_hex3(0xbbb); rel.body.border.width = 1; - rel.body.border.part = LV_BORDER_BOTTOM; + rel.body.border.part = LV_BORDER_PART_BOTTOM; lv_style_copy(&pr, &rel); pr.glass = 0; @@ -684,11 +688,12 @@ static void tabview_init(void) btn_bg.body.radius = 0; btn_bg.body.border.width = 1; btn_bg.body.border.color = lv_color_hex3(0x888); - btn_bg.body.border.part = LV_BORDER_BOTTOM; + btn_bg.body.border.part = LV_BORDER_PART_BOTTOM; btn_bg.body.border.opa = LV_OPA_COVER; btn_bg.body.shadow.width = 5; + btn_bg.body.shadow.spread = 2; + btn_bg.body.shadow.offset.y = 1; btn_bg.body.shadow.color = DEF_SHADOW_COLOR; - btn_bg.body.shadow.type = LV_SHADOW_BOTTOM; btn_bg.body.padding.inner = 0; btn_bg.body.padding.left = 0; btn_bg.body.padding.right = 0; @@ -709,7 +714,7 @@ static void tabview_init(void) pr.body.radius = 0; pr.body.border.width = 1; pr.body.border.color = lv_color_hex3(0x888); - pr.body.border.part = LV_BORDER_BOTTOM; + pr.body.border.part = LV_BORDER_PART_BOTTOM; pr.body.border.opa = LV_OPA_COVER; pr.text.color = lv_color_hex3(0x111); @@ -756,6 +761,7 @@ static void table_init(void) cell.body.padding.right = LV_DPI / 12; cell.body.padding.top = LV_DPI / 12; cell.body.padding.bottom = LV_DPI / 12; + cell.body.shadow.width = 0; theme.style.table.bg = &lv_style_transp_tight; theme.style.table.cell = &cell; @@ -773,7 +779,7 @@ static void win_init(void) header.body.radius = 0; header.body.border.width = 1; header.body.border.color = lv_color_hex3(0xbbb); - header.body.border.part = LV_BORDER_BOTTOM; + header.body.border.part = LV_BORDER_PART_BOTTOM; header.body.border.opa = LV_OPA_COVER; header.body.padding.inner = 0; header.body.padding.left = 0; diff --git a/src/lv_themes/lv_theme_mono.c b/src/lv_themes/lv_theme_mono.c index 9c2e7743f..bea4dced6 100644 --- a/src/lv_themes/lv_theme_mono.c +++ b/src/lv_themes/lv_theme_mono.c @@ -61,7 +61,7 @@ static void basic_init(void) def.body.border.color = LV_COLOR_BLACK; def.body.border.width = 1; def.body.border.opa = LV_OPA_COVER; - def.body.border.part = LV_BORDER_FULL; + def.body.border.part = LV_BORDER_PART_FULL; def.text.font = _font; def.text.color = LV_COLOR_BLACK; @@ -76,14 +76,14 @@ static void basic_init(void) def.image.intense = LV_OPA_TRANSP; def.image.opa = LV_OPA_COVER; + lv_style_copy(&light_plain, &def); + lv_style_copy(&scr, &light_plain); scr.body.padding.bottom = 0; scr.body.padding.top = 0; scr.body.padding.left = 0; scr.body.padding.right = 0; - lv_style_copy(&light_plain, &def); - lv_style_copy(&light_frame, &light_plain); light_frame.body.radius = LV_DPI / 20; @@ -127,9 +127,9 @@ static void label_init(void) { #if LV_USE_LABEL != 0 - theme.style.label.prim = NULL; - theme.style.label.sec = NULL; - theme.style.label.hint = NULL; + theme.style.label.prim = &light_plain; + theme.style.label.sec = &light_plain; + theme.style.label.hint = &light_plain; #endif } @@ -145,7 +145,7 @@ static void img_init(void) static void line_init(void) { #if LV_USE_LINE != 0 - theme.style.line.decor = NULL; + theme.style.line.decor = &light_plain; #endif } @@ -157,7 +157,6 @@ static void led_init(void) led.body.radius = LV_RADIUS_CIRCLE; led.body.shadow.width = LV_DPI / 8; led.body.shadow.color = LV_COLOR_BLACK; - led.body.shadow.type = LV_SHADOW_FULL; theme.style.led = &led; #endif diff --git a/src/lv_themes/lv_theme_nemo.c b/src/lv_themes/lv_theme_nemo.c index cd4bd002a..36cf8b188 100644 --- a/src/lv_themes/lv_theme_nemo.c +++ b/src/lv_themes/lv_theme_nemo.c @@ -87,7 +87,6 @@ static void basic_init(void) def.body.border.opa = LV_OPA_COVER; def.body.shadow.color = LV_COLOR_SILVER; def.body.shadow.width = 0; - def.body.shadow.type = LV_SHADOW_FULL; def.text.color = lv_color_hex3(0xDDD); def.text.font = _font; @@ -620,7 +619,6 @@ static void list_init(void) list_rel.text.font = _font; lv_style_copy(&list_pr, &list_rel); - list_pr.body.opa = LV_OPA_TRANSP; list_pr.body.opa = LV_OPA_COVER; list_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 34, 41); list_pr.body.grad_color = lv_color_hsv_to_rgb(_hue, 34, 41); diff --git a/src/lv_themes/lv_theme_night.c b/src/lv_themes/lv_theme_night.c index c908939cf..6dfbe5324 100644 --- a/src/lv_themes/lv_theme_night.c +++ b/src/lv_themes/lv_theme_night.c @@ -115,7 +115,6 @@ static void btn_init(void) btn_rel.body.padding.right = LV_DPI / 4; btn_rel.body.padding.top = LV_DPI / 8; btn_rel.body.padding.bottom = LV_DPI / 8; - btn_rel.body.shadow.type = LV_SHADOW_BOTTOM; btn_rel.body.shadow.color = lv_color_hex3(0x111); btn_rel.body.shadow.width = LV_DPI / 30; btn_rel.text.color = lv_color_hex3(0xeee); @@ -218,6 +217,7 @@ static void bar_init(void) bar_bg.body.padding.top = LV_DPI / 16; bar_bg.body.padding.bottom = LV_DPI / 16; bar_bg.body.radius = LV_RADIUS_CIRCLE; +// bar_bg.body.corner_mask = 1; lv_style_copy(&bar_indic, &def); bar_indic.body.main_color = lv_color_hsv_to_rgb(_hue, 80, 70); @@ -242,6 +242,10 @@ static void slider_init(void) static lv_style_t slider_knob; lv_style_copy(&slider_knob, theme.style.btn.rel); slider_knob.body.radius = LV_RADIUS_CIRCLE; + slider_knob.body.padding.left = LV_DPI/25; + slider_knob.body.padding.right = LV_DPI/25; + slider_knob.body.padding.top = LV_DPI/25; + slider_knob.body.padding.bottom = LV_DPI/25; theme.style.slider.bg = theme.style.bar.bg; theme.style.slider.indic = theme.style.bar.indic; @@ -457,7 +461,7 @@ static void btnm_init(void) btnm_bg.body.border.width = 1; lv_style_copy(&rel, theme.style.btn.rel); - rel.body.border.part = LV_BORDER_FULL | LV_BORDER_INTERNAL; + rel.body.border.part = LV_BORDER_PART_FULL | LV_BORDER_PART_INTERNAL; rel.body.border.width = 1; rel.body.radius = 2; @@ -572,7 +576,7 @@ static void list_init(void) lv_style_copy(&list_btn_rel, &bg); list_btn_rel.body.opa = LV_OPA_TRANSP; - list_btn_rel.body.border.part = LV_BORDER_BOTTOM; + list_btn_rel.body.border.part = LV_BORDER_PART_BOTTOM; list_btn_rel.body.border.color = lv_color_hsv_to_rgb(_hue, 10, 5); list_btn_rel.body.border.width = 1; list_btn_rel.body.radius = LV_DPI / 10; diff --git a/src/lv_themes/lv_theme_zen.c b/src/lv_themes/lv_theme_zen.c index 55569993d..879dfc7fb 100644 --- a/src/lv_themes/lv_theme_zen.c +++ b/src/lv_themes/lv_theme_zen.c @@ -681,7 +681,7 @@ static void tabview_init(void) lv_style_copy(&btn_bg, &def); btn_bg.body.opa = LV_OPA_TRANSP; btn_bg.body.border.width = 2; - btn_bg.body.border.part = LV_BORDER_BOTTOM; + btn_bg.body.border.part = LV_BORDER_PART_BOTTOM; btn_bg.body.border.color = lv_color_hsv_to_rgb(_hue, 10, 90); lv_style_copy(&indic, &def); @@ -750,7 +750,7 @@ static void win_init(void) lv_style_copy(&header, &def); header.body.opa = LV_OPA_TRANSP; header.body.border.width = 2; - header.body.border.part = LV_BORDER_BOTTOM; + header.body.border.part = LV_BORDER_PART_BOTTOM; header.body.border.color = lv_color_hsv_to_rgb(_hue, 10, 90); header.text.color = lv_color_hex3(0x666); header.image.color = lv_color_hex3(0x666); diff --git a/src/lv_version.h b/src/lv_version.h deleted file mode 100644 index c447d5620..000000000 --- a/src/lv_version.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @file lv_version.h - * - */ - -#ifndef LV_VERSION_H -#define LV_VERSION_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -/*Current version of LittlevGL*/ -#define LVGL_VERSION_MAJOR 6 -#define LVGL_VERSION_MINOR 0 -#define LVGL_VERSION_PATCH 2 -#define LVGL_VERSION_INFO "" - - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ -/** Gives 1 if the x.y.z version is supported in the current version - * Usage: - * - * - Require v6 - * #if LV_VERSION_CHECK(6,0,0) - * new_func_in_v6(); - * #endif - * - * - * - Require at least v5.3 - * #if LV_VERSION_CHECK(5,3,0) - * new_feature_from_v5_3(); - * #endif - * - * - * - Require v5.3.2 bugfixes - * #if LV_VERSION_CHECK(5,3,2) - * bugfix_in_v5_3_2(); - * #endif - * - * */ -#define LV_VERSION_CHECK(x,y,z) (x == LVGL_VERSION_MAJOR && (y < LVGL_VERSION_MINOR || (y == LVGL_VERSION_MINOR && z <= LVGL_VERSION_PATCH))) - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_VERSION_H*/