diff options
Diffstat (limited to 'src/libs/lvgl/src')
181 files changed, 0 insertions, 84003 deletions
diff --git a/src/libs/lvgl/src/lv_conf_checker.h b/src/libs/lvgl/src/lv_conf_checker.h deleted file mode 100644 index 4b0d9a67..00000000 --- a/src/libs/lvgl/src/lv_conf_checker.h +++ /dev/null @@ -1,851 +0,0 @@ -/** - * GENERATED FILE, DO NOT EDIT IT! - * @file lv_conf_checker.h - * Make sure all the defines of lv_conf.h have a default value -**/ - -#ifndef LV_CONF_CHECKER_H -#define LV_CONF_CHECKER_H -/* clang-format off */ - -#include <stdint.h> - -/*==================== - Graphical settings - *====================*/ - -/* Maximal horizontal and vertical resolution to support by the library.*/ -#ifndef LV_HOR_RES_MAX -#define LV_HOR_RES_MAX (480) -#endif -#ifndef LV_VER_RES_MAX -#define LV_VER_RES_MAX (320) -#endif - -/* Color depth: - * - 1: 1 byte per pixel - * - 8: RGB233 - * - 16: RGB565 - * - 32: ARGB8888 - */ -#ifndef LV_COLOR_DEPTH -#define LV_COLOR_DEPTH 16 -#endif - -/* Swap the 2 bytes of RGB565 color. - * Useful if the display has a 8 bit interface (e.g. SPI)*/ -#ifndef LV_COLOR_16_SWAP -#define LV_COLOR_16_SWAP 0 -#endif - -/* 1: Enable screen transparency. - * Useful for OSD or other overlapping GUIs. - * Requires `LV_COLOR_DEPTH = 32` colors and the screen's style should be modified: `style.body.opa = ...`*/ -#ifndef LV_COLOR_SCREEN_TRANSP -#define LV_COLOR_SCREEN_TRANSP 0 -#endif - -/*Images pixels with this color will not be drawn (with chroma keying)*/ -#ifndef LV_COLOR_TRANSP -#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 -#endif - -/* Default display refresh period. - * Can be changed in the display driver (`lv_disp_drv_t`).*/ -#ifndef LV_DISP_DEF_REFR_PERIOD -#define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/ -#endif - -/* Dot Per Inch: used to initialize default sizes. - * E.g. a button with width = LV_DPI / 2 -> half inch wide - * (Not so important, you can adjust it to modify default sizes and spaces)*/ -#ifndef LV_DPI -#define LV_DPI 100 /*[px]*/ -#endif - -/* Type of coordinates. Should be `int16_t` (or `int32_t` for extreme cases) */ - -/*========================= - Memory manager settings - *=========================*/ - -/* LittelvGL's internal memory manager's settings. - * The graphical objects and other related data are stored here. */ - -/* 1: use custom malloc/free, 0: use the built-in `lv_mem_alloc` and `lv_mem_free` */ -#ifndef LV_MEM_CUSTOM -#define LV_MEM_CUSTOM 0 -#endif -#if LV_MEM_CUSTOM == 0 -/* Size of the memory used by `lv_mem_alloc` in bytes (>= 2kB)*/ -#ifndef LV_MEM_SIZE -# define LV_MEM_SIZE (32U * 1024U) -#endif - -/* Complier prefix for a big array declaration */ -#ifndef LV_MEM_ATTR -# define LV_MEM_ATTR -#endif - -/* Set an address for the memory pool instead of allocating it as an array. - * Can be in external SRAM too. */ -#ifndef LV_MEM_ADR -# define LV_MEM_ADR 0 -#endif - -/* Automatically defrag. on free. Defrag. means joining the adjacent free cells. */ -#ifndef LV_MEM_AUTO_DEFRAG -# define LV_MEM_AUTO_DEFRAG 1 -#endif -#else /*LV_MEM_CUSTOM*/ -#ifndef LV_MEM_CUSTOM_INCLUDE -# define LV_MEM_CUSTOM_INCLUDE <stdlib.h> /*Header for the dynamic memory function*/ -#endif -#ifndef LV_MEM_CUSTOM_ALLOC -# define LV_MEM_CUSTOM_ALLOC malloc /*Wrapper to malloc*/ -#endif -#ifndef LV_MEM_CUSTOM_FREE -# define LV_MEM_CUSTOM_FREE free /*Wrapper to free*/ -#endif -#endif /*LV_MEM_CUSTOM*/ - -/* Garbage Collector settings - * Used if lvgl is binded to higher level language and the memory is managed by that language */ -#ifndef LV_ENABLE_GC -#define LV_ENABLE_GC 0 -#endif -#if LV_ENABLE_GC != 0 -#ifndef LV_GC_INCLUDE -# define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/ -#endif -#ifndef LV_MEM_CUSTOM_REALLOC -# define LV_MEM_CUSTOM_REALLOC your_realloc /*Wrapper to realloc*/ -#endif -#ifndef LV_MEM_CUSTOM_GET_SIZE -# define LV_MEM_CUSTOM_GET_SIZE your_mem_get_size /*Wrapper to lv_mem_get_size*/ -#endif -#endif /* LV_ENABLE_GC */ - -/*======================= - Input device settings - *=======================*/ - -/* Input device default settings. - * Can be changed in the Input device driver (`lv_indev_drv_t`)*/ - -/* Input device read period in milliseconds */ -#ifndef LV_INDEV_DEF_READ_PERIOD -#define LV_INDEV_DEF_READ_PERIOD 30 -#endif - -/* Drag threshold in pixels */ -#ifndef LV_INDEV_DEF_DRAG_LIMIT -#define LV_INDEV_DEF_DRAG_LIMIT 10 -#endif - -/* Drag throw slow-down in [%]. Greater value -> faster slow-down */ -#ifndef LV_INDEV_DEF_DRAG_THROW -#define LV_INDEV_DEF_DRAG_THROW 20 -#endif - -/* Long press time in milliseconds. - * Time to send `LV_EVENT_LONG_PRESSSED`) */ -#ifndef LV_INDEV_DEF_LONG_PRESS_TIME -#define LV_INDEV_DEF_LONG_PRESS_TIME 400 -#endif - -/* Repeated trigger period in long press [ms] - * Time between `LV_EVENT_LONG_PRESSED_REPEAT */ -#ifndef LV_INDEV_DEF_LONG_PRESS_REP_TIME -#define LV_INDEV_DEF_LONG_PRESS_REP_TIME 100 -#endif - -/*================== - * Feature usage - *==================*/ - -/*1: Enable the Animations */ -#ifndef LV_USE_ANIMATION -#define LV_USE_ANIMATION 1 -#endif -#if LV_USE_ANIMATION - -/*Declare the type of the user data of animations (can be e.g. `void *`, `int`, `struct`)*/ - -#endif - -/* 1: Enable shadow drawing*/ -#ifndef LV_USE_SHADOW -#define LV_USE_SHADOW 1 -#endif - -/* 1: Enable object groups (for keyboard/encoder navigation) */ -#ifndef LV_USE_GROUP -#define LV_USE_GROUP 1 -#endif -#if LV_USE_GROUP -#endif /*LV_USE_GROUP*/ - -/* 1: Enable GPU interface*/ -#ifndef LV_USE_GPU -#define LV_USE_GPU 1 -#endif - -/* 1: Enable file system (might be required for images */ -#ifndef LV_USE_FILESYSTEM -#define LV_USE_FILESYSTEM 1 -#endif -#if LV_USE_FILESYSTEM -/*Declare the type of the user data of file system drivers (can be e.g. `void *`, `int`, `struct`)*/ -#endif - -/*1: Add a `user_data` to drivers and objects*/ -#ifndef LV_USE_USER_DATA -#define LV_USE_USER_DATA 0 -#endif - -/*======================== - * Image decoder and cache - *========================*/ - -/* 1: Enable indexed (palette) images */ -#ifndef LV_IMG_CF_INDEXED -#define LV_IMG_CF_INDEXED 1 -#endif - -/* 1: Enable alpha indexed images */ -#ifndef LV_IMG_CF_ALPHA -#define LV_IMG_CF_ALPHA 1 -#endif - -/* Default image cache size. Image caching keeps the images opened. - * If only the built-in image formats are used there is no real advantage of caching. - * (I.e. no new image decoder is added) - * With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images. - * However the opened images might consume additional RAM. - * LV_IMG_CACHE_DEF_SIZE must be >= 1 */ -#ifndef LV_IMG_CACHE_DEF_SIZE -#define LV_IMG_CACHE_DEF_SIZE 1 -#endif - -/*Declare the type of the user data of image decoder (can be e.g. `void *`, `int`, `struct`)*/ - -/*===================== - * Compiler settings - *====================*/ -/* Define a custom attribute to `lv_tick_inc` function */ -#ifndef LV_ATTRIBUTE_TICK_INC -#define LV_ATTRIBUTE_TICK_INC -#endif - -/* Define a custom attribute to `lv_task_handler` function */ -#ifndef LV_ATTRIBUTE_TASK_HANDLER -#define LV_ATTRIBUTE_TASK_HANDLER -#endif - -/* With size optimization (-Os) the compiler might not align data to - * 4 or 8 byte boundary. This alignment will be explicitly applied where needed. - * E.g. __attribute__((aligned(4))) */ -#ifndef LV_ATTRIBUTE_MEM_ALIGN -#define LV_ATTRIBUTE_MEM_ALIGN -#endif - -/* Attribute to mark large constant arrays for example - * font's bitmaps */ -#ifndef LV_ATTRIBUTE_LARGE_CONST -#define LV_ATTRIBUTE_LARGE_CONST -#endif - -/* Export integer constant to binding. - * This macro is used with constants in the form of LV_<CONST> 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 - *==================*/ - -/* 1: use a custom tick source. - * It removes the need to manually update the tick with `lv_tick_inc`) */ -#ifndef LV_TICK_CUSTOM -#define LV_TICK_CUSTOM 0 -#endif -#if LV_TICK_CUSTOM == 1 -#ifndef LV_TICK_CUSTOM_INCLUDE -#define LV_TICK_CUSTOM_INCLUDE "something.h" /*Header for the sys time function*/ -#endif -#ifndef LV_TICK_CUSTOM_SYS_TIME_EXPR -#define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current systime in ms*/ -#endif -#endif /*LV_TICK_CUSTOM*/ - - -/*================ - * Log settings - *===============*/ - -/*1: Enable the log module*/ -#ifndef LV_USE_LOG -#define LV_USE_LOG 0 -#endif -#if LV_USE_LOG -/* How important log should be added: - * LV_LOG_LEVEL_TRACE A lot of logs to give detailed information - * LV_LOG_LEVEL_INFO Log important events - * LV_LOG_LEVEL_WARN Log if something unwanted happened but didn't cause a problem - * LV_LOG_LEVEL_ERROR Only critical issue, when the system may fail - * LV_LOG_LEVEL_NONE Do not log anything - */ -#ifndef LV_LOG_LEVEL -# define LV_LOG_LEVEL LV_LOG_LEVEL_WARN -#endif - -/* 1: Print the log with 'printf'; - * 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) <my_assert_code> - */ -#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 - *================*/ -#ifndef LV_THEME_LIVE_UPDATE -#define LV_THEME_LIVE_UPDATE 0 /*1: Allow theme switching at run time. Uses 8..10 kB of RAM*/ -#endif - -#ifndef LV_USE_THEME_TEMPL -#define LV_USE_THEME_TEMPL 0 /*Just for test*/ -#endif -#ifndef LV_USE_THEME_DEFAULT -#define LV_USE_THEME_DEFAULT 0 /*Built mainly from the built-in styles. Consumes very few RAM*/ -#endif -#ifndef LV_USE_THEME_ALIEN -#define LV_USE_THEME_ALIEN 0 /*Dark futuristic theme*/ -#endif -#ifndef LV_USE_THEME_NIGHT -#define LV_USE_THEME_NIGHT 0 /*Dark elegant theme*/ -#endif -#ifndef LV_USE_THEME_MONO -#define LV_USE_THEME_MONO 0 /*Mono color theme for monochrome displays*/ -#endif -#ifndef LV_USE_THEME_MATERIAL -#define LV_USE_THEME_MATERIAL 0 /*Flat theme with bold colors and light shadows*/ -#endif -#ifndef LV_USE_THEME_ZEN -#define LV_USE_THEME_ZEN 0 /*Peaceful, mainly light theme */ -#endif -#ifndef LV_USE_THEME_NEMO -#define LV_USE_THEME_NEMO 0 /*Water-like theme based on the movie "Finding Nemo"*/ -#endif - -/*================== - * FONT USAGE - *===================*/ - -/* The built-in fonts contains the ASCII range and some Symbols with 4 bit-per-pixel. - * The symbols are available via `LV_SYMBOL_...` defines - * More info about fonts: https://docs.littlevgl.com/#Fonts - * To create a new font go to: https://littlevgl.com/ttf-font-to-c-array - */ - -/* Robot fonts with bpp = 4 - * https://fonts.google.com/specimen/Roboto */ -#ifndef LV_FONT_ROBOTO_12 -#define LV_FONT_ROBOTO_12 0 -#endif -#ifndef LV_FONT_ROBOTO_16 -#define LV_FONT_ROBOTO_16 1 -#endif -#ifndef LV_FONT_ROBOTO_22 -#define LV_FONT_ROBOTO_22 0 -#endif -#ifndef LV_FONT_ROBOTO_28 -#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 -#define LV_FONT_UNSCII_8 0 -#endif - -/* Optionally declare your custom fonts here. - * You can use these fonts as default font too - * and they will be available globally. E.g. - * #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) \ - * LV_FONT_DECLARE(my_font_2) - */ -#ifndef LV_FONT_CUSTOM_DECLARE -#define LV_FONT_CUSTOM_DECLARE -#endif - -/*Always set a default font from the built-in fonts*/ -#ifndef LV_FONT_DEFAULT -#define LV_FONT_DEFAULT &lv_font_roboto_16 -#endif - -/* Enable it if you have fonts with a lot of characters. - * The limit depends on the font size, font face and bpp - * but with > 10,000 characters if you see issues probably you need to enable it.*/ -#ifndef LV_FONT_FMT_TXT_LARGE -#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`)*/ - -/*================= - * Text settings - *=================*/ - -/* Select a character encoding for strings. - * Your IDE or editor should have the same character encoding - * - LV_TXT_ENC_UTF8 - * - LV_TXT_ENC_ASCII - * */ -#ifndef LV_TXT_ENC -#define LV_TXT_ENC LV_TXT_ENC_UTF8 -#endif - - /*Can break (wrap) texts on these chars*/ -#ifndef LV_TXT_BREAK_CHARS -#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 <stdio.h> -#endif -#ifndef lv_snprintf -# define lv_snprintf snprintf -#endif -#ifndef lv_vsnprintf -# define lv_vsnprintf vsnprintf -#endif -#endif /*LV_SPRINTF_CUSTOM*/ - -/*=================== - * LV_OBJ SETTINGS - *==================*/ - -/*Declare the type of the user data of object (can be e.g. `void *`, `int`, `struct`)*/ - -/*1: enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/ -#ifndef LV_USE_OBJ_REALIGN -#define LV_USE_OBJ_REALIGN 1 -#endif - -/* Enable to make the object clickable on a larger area. - * LV_EXT_CLICK_AREA_OFF or 0: Disable this feature - * LV_EXT_CLICK_AREA_TINY: The extra area can be adjusted horizontally and vertically (0..255 px) - * LV_EXT_CLICK_AREA_FULL: The extra area can be adjusted in all 4 directions (-32k..+32k px) - */ -#ifndef LV_USE_EXT_CLICK_AREA -#define LV_USE_EXT_CLICK_AREA LV_EXT_CLICK_AREA_OFF -#endif - -/*================== - * LV OBJ X USAGE - *================*/ -/* - * Documentation of the object types: https://docs.littlevgl.com/#Object-types - */ - -/*Arc (dependencies: -)*/ -#ifndef LV_USE_ARC -#define LV_USE_ARC 1 -#endif - -/*Bar (dependencies: -)*/ -#ifndef LV_USE_BAR -#define LV_USE_BAR 1 -#endif - -/*Button (dependencies: lv_cont*/ -#ifndef LV_USE_BTN -#define LV_USE_BTN 1 -#endif -#if LV_USE_BTN != 0 -/*Enable button-state animations - draw a circle on click (dependencies: LV_USE_ANIMATION)*/ -#ifndef LV_BTN_INK_EFFECT -# define LV_BTN_INK_EFFECT 0 -#endif -#endif - -/*Button matrix (dependencies: -)*/ -#ifndef LV_USE_BTNM -#define LV_USE_BTNM 1 -#endif - -/*Calendar (dependencies: -)*/ -#ifndef LV_USE_CALENDAR -#define LV_USE_CALENDAR 1 -#endif - -/*Canvas (dependencies: lv_img)*/ -#ifndef LV_USE_CANVAS -#define LV_USE_CANVAS 1 -#endif - -/*Check box (dependencies: lv_btn, lv_label)*/ -#ifndef LV_USE_CB -#define LV_USE_CB 1 -#endif - -/*Chart (dependencies: -)*/ -#ifndef LV_USE_CHART -#define LV_USE_CHART 1 -#endif -#if LV_USE_CHART -#ifndef LV_CHART_AXIS_TICK_LABEL_MAX_LEN -# define LV_CHART_AXIS_TICK_LABEL_MAX_LEN 20 -#endif -#endif - -/*Container (dependencies: -*/ -#ifndef LV_USE_CONT -#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 -#endif -#if LV_USE_DDLIST != 0 -/*Open and close default animation time [ms] (0: no animation)*/ -#ifndef LV_DDLIST_DEF_ANIM_TIME -# define LV_DDLIST_DEF_ANIM_TIME 200 -#endif -#endif - -/*Gauge (dependencies:lv_bar, lv_lmeter)*/ -#ifndef LV_USE_GAUGE -#define LV_USE_GAUGE 1 -#endif - -/*Image (dependencies: lv_label*/ -#ifndef LV_USE_IMG -#define LV_USE_IMG 1 -#endif - -/*Image Button (dependencies: lv_btn*/ -#ifndef LV_USE_IMGBTN -#define LV_USE_IMGBTN 1 -#endif -#if LV_USE_IMGBTN -/*1: The imgbtn requires left, mid and right parts and the width can be set freely*/ -#ifndef LV_IMGBTN_TILED -# define LV_IMGBTN_TILED 0 -#endif -#endif - -/*Keyboard (dependencies: lv_btnm)*/ -#ifndef LV_USE_KB -#define LV_USE_KB 1 -#endif - -/*Label (dependencies: -*/ -#ifndef LV_USE_LABEL -#define LV_USE_LABEL 1 -#endif -#if LV_USE_LABEL != 0 -/*Hor, or ver. scroll speed [px/sec] in 'LV_LABEL_LONG_ROLL/ROLL_CIRC' mode*/ -#ifndef LV_LABEL_DEF_SCROLL_SPEED -# define LV_LABEL_DEF_SCROLL_SPEED 25 -#endif - -/* Waiting period at beginning/end of animation cycle */ -#ifndef LV_LABEL_WAIT_CHAR_COUNT -# define LV_LABEL_WAIT_CHAR_COUNT 3 -#endif - -/*Enable selecting text of the label */ -#ifndef LV_LABEL_TEXT_SEL -# define LV_LABEL_TEXT_SEL 0 -#endif - -/*Store extra some info in labels (12 bytes) to speed up drawing of very long texts*/ -#ifndef LV_LABEL_LONG_TXT_HINT -# define LV_LABEL_LONG_TXT_HINT 0 -#endif -#endif - -/*LED (dependencies: -)*/ -#ifndef LV_USE_LED -#define LV_USE_LED 1 -#endif - -/*Line (dependencies: -*/ -#ifndef LV_USE_LINE -#define LV_USE_LINE 1 -#endif - -/*List (dependencies: lv_page, lv_btn, lv_label, (lv_img optionally for icons ))*/ -#ifndef LV_USE_LIST -#define LV_USE_LIST 1 -#endif -#if LV_USE_LIST != 0 -/*Default animation time of focusing to a list element [ms] (0: no animation) */ -#ifndef LV_LIST_DEF_ANIM_TIME -# define LV_LIST_DEF_ANIM_TIME 100 -#endif -#endif - -/*Line meter (dependencies: *;)*/ -#ifndef LV_USE_LMETER -#define LV_USE_LMETER 1 -#endif - -/*Message box (dependencies: lv_rect, lv_btnm, lv_label)*/ -#ifndef LV_USE_MBOX -#define LV_USE_MBOX 1 -#endif - -/*Page (dependencies: lv_cont)*/ -#ifndef LV_USE_PAGE -#define LV_USE_PAGE 1 -#endif -#if LV_USE_PAGE != 0 -/*Focus default animation time [ms] (0: no animation)*/ -#ifndef LV_PAGE_DEF_ANIM_TIME -# define LV_PAGE_DEF_ANIM_TIME 400 -#endif -#endif - -/*Preload (dependencies: lv_arc, lv_anim)*/ -#ifndef LV_USE_PRELOAD -#define LV_USE_PRELOAD 1 -#endif -#if LV_USE_PRELOAD != 0 -#ifndef LV_PRELOAD_DEF_ARC_LENGTH -# define LV_PRELOAD_DEF_ARC_LENGTH 60 /*[deg]*/ -#endif -#ifndef LV_PRELOAD_DEF_SPIN_TIME -# define LV_PRELOAD_DEF_SPIN_TIME 1000 /*[ms]*/ -#endif -#ifndef LV_PRELOAD_DEF_ANIM -# define LV_PRELOAD_DEF_ANIM LV_PRELOAD_TYPE_SPINNING_ARC -#endif -#endif - -/*Roller (dependencies: lv_ddlist)*/ -#ifndef LV_USE_ROLLER -#define LV_USE_ROLLER 1 -#endif -#if LV_USE_ROLLER != 0 -/*Focus animation time [ms] (0: no animation)*/ -#ifndef LV_ROLLER_DEF_ANIM_TIME -# define LV_ROLLER_DEF_ANIM_TIME 200 -#endif - -/*Number of extra "pages" when the roller is infinite*/ -#ifndef LV_ROLLER_INF_PAGES -# define LV_ROLLER_INF_PAGES 7 -#endif -#endif - -/*Slider (dependencies: lv_bar)*/ -#ifndef LV_USE_SLIDER -#define LV_USE_SLIDER 1 -#endif - -/*Spinbox (dependencies: lv_ta)*/ -#ifndef LV_USE_SPINBOX -#define LV_USE_SPINBOX 1 -#endif - -/*Switch (dependencies: lv_slider)*/ -#ifndef LV_USE_SW -#define LV_USE_SW 1 -#endif - -/*Text area (dependencies: lv_label, lv_page)*/ -#ifndef LV_USE_TA -#define LV_USE_TA 1 -#endif -#if LV_USE_TA != 0 -#ifndef LV_TA_DEF_CURSOR_BLINK_TIME -# define LV_TA_DEF_CURSOR_BLINK_TIME 400 /*ms*/ -#endif -#ifndef LV_TA_DEF_PWD_SHOW_TIME -# define LV_TA_DEF_PWD_SHOW_TIME 1500 /*ms*/ -#endif -#endif - -/*Table (dependencies: lv_label)*/ -#ifndef LV_USE_TABLE -#define LV_USE_TABLE 1 -#endif -#if LV_USE_TABLE -#ifndef LV_TABLE_COL_MAX -# define LV_TABLE_COL_MAX 12 -#endif -#endif - -/*Tab (dependencies: lv_page, lv_btnm)*/ -#ifndef LV_USE_TABVIEW -#define LV_USE_TABVIEW 1 -#endif -# if LV_USE_TABVIEW != 0 -/*Time of slide animation [ms] (0: no animation)*/ -#ifndef LV_TABVIEW_DEF_ANIM_TIME -# define LV_TABVIEW_DEF_ANIM_TIME 300 -#endif -#endif - -/*Tileview (dependencies: lv_page) */ -#ifndef LV_USE_TILEVIEW -#define LV_USE_TILEVIEW 1 -#endif -#if LV_USE_TILEVIEW -/*Time of slide animation [ms] (0: no animation)*/ -#ifndef LV_TILEVIEW_DEF_ANIM_TIME -# define LV_TILEVIEW_DEF_ANIM_TIME 300 -#endif -#endif - -/*Window (dependencies: lv_cont, lv_btn, lv_label, lv_img, lv_page)*/ -#ifndef LV_USE_WIN -#define LV_USE_WIN 1 -#endif - -/*================== - * Non-user section - *==================*/ - -#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) /* Disable warnings for Visual Studio*/ -#ifndef _CRT_SECURE_NO_WARNINGS -# define _CRT_SECURE_NO_WARNINGS -#endif -#endif - - -#endif /*LV_CONF_CHECKER_H*/ diff --git a/src/libs/lvgl/src/lv_core/lv_core.mk b/src/libs/lvgl/src/lv_core/lv_core.mk deleted file mode 100644 index eb1c5e0c..00000000 --- a/src/libs/lvgl/src/lv_core/lv_core.mk +++ /dev/null @@ -1,12 +0,0 @@ -CSRCS += lv_group.c -CSRCS += lv_indev.c -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 - -CFLAGS += "-I$(LVGL_DIR)/lvgl/src/lv_core" diff --git a/src/libs/lvgl/src/lv_core/lv_debug.c b/src/libs/lvgl/src/lv_core/lv_debug.c deleted file mode 100644 index 83071af5..00000000 --- a/src/libs/lvgl/src/lv_core/lv_debug.c +++ /dev/null @@ -1,193 +0,0 @@ -/** - * @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/libs/lvgl/src/lv_core/lv_debug.h b/src/libs/lvgl/src/lv_core/lv_debug.h deleted file mode 100644 index a932004e..00000000 --- a/src/libs/lvgl/src/lv_core/lv_debug.h +++ /dev/null @@ -1,154 +0,0 @@ -/** - * @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) \ -{ \ - if(!(expr)) { \ - LV_LOG_ERROR(__func__); \ - lv_debug_log_error(msg, (uint64_t)((uintptr_t)value)); \ - while(1); \ - } \ -} -#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/libs/lvgl/src/lv_core/lv_disp.c b/src/libs/lvgl/src/lv_core/lv_disp.c deleted file mode 100644 index bcb73829..00000000 --- a/src/libs/lvgl/src/lv_core/lv_disp.c +++ /dev/null @@ -1,178 +0,0 @@ -/** - * @file lv_disp.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_disp.h" -#include "../lv_misc/lv_math.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Return with a pointer to the active screen - * @param disp pointer to display which active screen should be get. (NULL to use the default - * screen) - * @return pointer to the active screen object (loaded by 'lv_scr_load()') - */ -lv_obj_t * lv_disp_get_scr_act(lv_disp_t * disp) -{ - if(!disp) disp = lv_disp_get_default(); - if(!disp) { - LV_LOG_WARN("lv_scr_act: no display registered to get its top layer"); - return NULL; - } - - return disp->act_scr; -} - -/** - * Make a screen active - * @param scr pointer to a screen - */ -void lv_disp_load_scr(lv_obj_t * scr) -{ - lv_disp_t * d = lv_obj_get_disp(scr); - - d->act_scr = scr; - - lv_obj_invalidate(scr); -} - -/** - * Return with the top layer. (Same on every screen and it is above the normal screen layer) - * @param disp pointer to display which top layer should be get. (NULL to use the default screen) - * @return pointer to the top layer object (transparent screen sized lv_obj) - */ -lv_obj_t * lv_disp_get_layer_top(lv_disp_t * disp) -{ - if(!disp) disp = lv_disp_get_default(); - if(!disp) { - LV_LOG_WARN("lv_layer_top: no display registered to get its top layer"); - return NULL; - } - - return disp->top_layer; -} - -/** - * Return with the sys. layer. (Same on every screen and it is above the normal screen and the top - * layer) - * @param disp pointer to display which sys. layer should be get. (NULL to use the default screen) - * @return pointer to the sys layer object (transparent screen sized lv_obj) - */ -lv_obj_t * lv_disp_get_layer_sys(lv_disp_t * disp) -{ - if(!disp) disp = lv_disp_get_default(); - if(!disp) { - LV_LOG_WARN("lv_layer_sys: no display registered to get its top layer"); - return NULL; - } - - return disp->sys_layer; -} - -/** - * Assign a screen to a display. - * @param disp pointer to a display where to assign the screen - * @param scr pointer to a screen object to assign - */ -void lv_disp_assign_screen(lv_disp_t * disp, lv_obj_t * scr) -{ - if(lv_obj_get_parent(scr) != NULL) { - LV_LOG_WARN("lv_disp_assign_screen: try to assign a non-screen object"); - return; - } - - lv_disp_t * old_disp = lv_obj_get_disp(scr); - - if(old_disp == disp) return; - - lv_ll_chg_list(&old_disp->scr_ll, &disp->scr_ll, scr, true); -} - -/** - * Get a pointer to the screen refresher task to - * modify its parameters with `lv_task_...` functions. - * @param disp pointer to a display - * @return pointer to the display refresher task. (NULL on error) - */ -lv_task_t * lv_disp_get_refr_task(lv_disp_t * disp) -{ - if(!disp) disp = lv_disp_get_default(); - if(!disp) { - LV_LOG_WARN("lv_disp_get_refr_task: no display registered"); - return NULL; - } - - return disp->refr_task; -} - -/** - * Get elapsed time since last user activity on a display (e.g. click) - * @param disp pointer to an display (NULL to get the overall smallest inactivity) - * @return elapsed ticks (milliseconds) since the last activity - */ -uint32_t lv_disp_get_inactive_time(const lv_disp_t * disp) -{ - if(!disp) disp = lv_disp_get_default(); - if(!disp) { - LV_LOG_WARN("lv_disp_get_inactive_time: no display registered"); - return 0; - } - - if(disp) return lv_tick_elaps(disp->last_activity_time); - - lv_disp_t * d; - uint32_t t = UINT32_MAX; - d = lv_disp_get_next(NULL); - while(d) { - t = LV_MATH_MIN(t, lv_tick_elaps(d->last_activity_time)); - d = lv_disp_get_next(d); - } - - return t; -} - -/** - * Manually trigger an activity on a display - * @param disp pointer to an display (NULL to use the default display) - */ -void lv_disp_trig_activity(lv_disp_t * disp) -{ - if(!disp) disp = lv_disp_get_default(); - if(!disp) { - LV_LOG_WARN("lv_disp_trig_activity: no display registered"); - return; - } - - disp->last_activity_time = lv_tick_get(); -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/libs/lvgl/src/lv_core/lv_disp.h b/src/libs/lvgl/src/lv_core/lv_disp.h deleted file mode 100644 index 30471543..00000000 --- a/src/libs/lvgl/src/lv_core/lv_disp.h +++ /dev/null @@ -1,152 +0,0 @@ -/** - * @file lv_disp.h - * - */ - -#ifndef LV_DISP_H -#define LV_DISP_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "../lv_hal/lv_hal.h" -#include "lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Return with a pointer to the active screen - * @param disp pointer to display which active screen should be get. (NULL to use the default - * screen) - * @return pointer to the active screen object (loaded by 'lv_scr_load()') - */ -lv_obj_t * lv_disp_get_scr_act(lv_disp_t * disp); - -/** - * Make a screen active - * @param scr pointer to a screen - */ -void lv_disp_load_scr(lv_obj_t * scr); - -/** - * Return with the top layer. (Same on every screen and it is above the normal screen layer) - * @param disp pointer to display which top layer should be get. (NULL to use the default screen) - * @return pointer to the top layer object (transparent screen sized lv_obj) - */ -lv_obj_t * lv_disp_get_layer_top(lv_disp_t * disp); - -/** - * Return with the sys. layer. (Same on every screen and it is above the normal screen and the top - * layer) - * @param disp pointer to display which sys. layer should be get. (NULL to use the default screen) - * @return pointer to the sys layer object (transparent screen sized lv_obj) - */ -lv_obj_t * lv_disp_get_layer_sys(lv_disp_t * disp); - -/** - * Assign a screen to a display. - * @param disp pointer to a display where to assign the screen - * @param scr pointer to a screen object to assign - */ -void lv_disp_assign_screen(lv_disp_t * disp, lv_obj_t * scr); - -/** - * Get a pointer to the screen refresher task to - * modify its parameters with `lv_task_...` functions. - * @param disp pointer to a display - * @return pointer to the display refresher task. (NULL on error) - */ -lv_task_t * lv_disp_get_refr_task(lv_disp_t * disp); - -/** - * Get elapsed time since last user activity on a display (e.g. click) - * @param disp pointer to an display (NULL to get the overall smallest inactivity) - * @return elapsed ticks (milliseconds) since the last activity - */ -uint32_t lv_disp_get_inactive_time(const lv_disp_t * disp); - -/** - * Manually trigger an activity on a display - * @param disp pointer to an display (NULL to use the default display) - */ -void lv_disp_trig_activity(lv_disp_t * disp); - -/*------------------------------------------------ - * To improve backward compatibility - * Recommended only if you have one display - *------------------------------------------------*/ - -/** - * Get the active screen of the default display - * @return pointer to the active screen - */ -static inline lv_obj_t * lv_scr_act(void) -{ - return lv_disp_get_scr_act(lv_disp_get_default()); -} - -/** - * Get the top layer of the default display - * @return pointer to the top layer - */ -static inline lv_obj_t * lv_layer_top(void) -{ - return lv_disp_get_layer_top(lv_disp_get_default()); -} - -/** - * Get the active screen of the default display - * @return pointer to the sys layer - */ -static inline lv_obj_t * lv_layer_sys(void) -{ - return lv_disp_get_layer_sys(lv_disp_get_default()); -} - -static inline void lv_scr_load(lv_obj_t * scr) -{ - lv_disp_load_scr(scr); -} - -/********************** - * MACROS - **********************/ - -/*------------------------------------------------ - * To improve backward compatibility - * Recommended only if you have one display - *------------------------------------------------*/ - -#ifndef LV_HOR_RES -/** - * The horizontal resolution of the currently active display. - */ -#define LV_HOR_RES lv_disp_get_hor_res(lv_disp_get_default()) -#endif - -#ifndef LV_VER_RES -/** - * The vertical resolution of the currently active display. - */ -#define LV_VER_RES lv_disp_get_ver_res(lv_disp_get_default()) -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_TEMPL_H*/ diff --git a/src/libs/lvgl/src/lv_core/lv_group.c b/src/libs/lvgl/src/lv_core/lv_group.c deleted file mode 100644 index b26de56e..00000000 --- a/src/libs/lvgl/src/lv_core/lv_group.c +++ /dev/null @@ -1,708 +0,0 @@ -/** - * @file lv_group.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_group.h" -#if LV_USE_GROUP != 0 -#include <stddef.h> -#include "../lv_core/lv_debug.h" -#include "../lv_themes/lv_theme.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 void style_mod_def(lv_group_t * group, lv_style_t * style); -static void style_mod_edit_def(lv_group_t * group, lv_style_t * style); -static void refresh_theme(lv_group_t * g, lv_theme_t * th); -static void focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *), - void * (*move)(const lv_ll_t *, const void *)); -static void lv_group_refocus(lv_group_t * g); -static void obj_to_foreground(lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Init. the group module - */ -void lv_group_init(void) -{ - lv_ll_init(&LV_GC_ROOT(_lv_group_ll), sizeof(lv_group_t)); -} - -/** - * Create a new object group - * @return pointer to the new object group - */ -lv_group_t * lv_group_create(void) -{ - lv_group_t * group = lv_ll_ins_head(&LV_GC_ROOT(_lv_group_ll)); - LV_ASSERT_MEM(group); - if(group == NULL) return NULL; - lv_ll_init(&group->obj_ll, sizeof(lv_obj_t *)); - - group->obj_focus = NULL; - group->frozen = 0; - group->focus_cb = NULL; - group->click_focus = 1; - group->editing = 0; - group->refocus_policy = LV_GROUP_REFOCUS_POLICY_PREV; - group->wrap = 1; - -#if LV_USE_USER_DATA - memset(&group->user_data, 0, sizeof(lv_group_user_data_t)); -#endif - - /*Initialize style modification callbacks from current theme*/ - refresh_theme(group, lv_theme_get_current()); - - return group; -} - -/** - * Delete a group object - * @param group pointer to a group - */ -void lv_group_del(lv_group_t * group) -{ - /*Defocus the the currently focused object*/ - if(group->obj_focus != NULL) { - (*group->obj_focus)->signal_cb(*group->obj_focus, LV_SIGNAL_DEFOCUS, NULL); - lv_obj_invalidate(*group->obj_focus); - } - - /*Remove the objects from the group*/ - lv_obj_t ** obj; - LV_LL_READ(group->obj_ll, obj) - { - (*obj)->group_p = NULL; - } - - lv_ll_clear(&(group->obj_ll)); - lv_ll_rem(&LV_GC_ROOT(_lv_group_ll), group); - lv_mem_free(group); -} - -/** - * Add an object to a group - * @param group pointer to a group - * @param obj pointer to an object to add - */ -void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj) -{ - if(group == NULL) return; - - /*Do not add the object twice*/ - lv_obj_t ** obj_i; - LV_LL_READ(group->obj_ll, obj_i) - { - if((*obj_i) == obj) { - LV_LOG_INFO("lv_group_add_obj: the object is already added to this group"); - return; - } - } - - /*If the object is already in a group and focused then defocus it*/ - if(obj->group_p) { - if(lv_obj_is_focused(obj)) { - lv_group_refocus(obj->group_p); - - LV_LOG_INFO("lv_group_add_obj: assign object to an other group"); - } - } - - obj->group_p = group; - lv_obj_t ** next = lv_ll_ins_tail(&group->obj_ll); - LV_ASSERT_MEM(next); - if(next == NULL) return; - *next = obj; - - /* If the head and the tail is equal then there is only one object in the linked list. - * In this case automatically activate it*/ - if(lv_ll_get_head(&group->obj_ll) == next) { - lv_group_refocus(group); - } -} - -/** - * Remove an object from its group - * @param obj pointer to an object to remove - */ -void lv_group_remove_obj(lv_obj_t * obj) -{ - lv_group_t * g = obj->group_p; - if(g == NULL) return; - if(g->obj_focus == NULL) return; /*Just to be sure (Not possible if there is at least one object in the group)*/ - - /*Focus on the next object*/ - if(*g->obj_focus == obj) { - /*If this is the only object in the group then focus to nothing.*/ - if(lv_ll_get_head(&g->obj_ll) == g->obj_focus && lv_ll_get_tail(&g->obj_ll) == g->obj_focus) { - (*g->obj_focus)->signal_cb(*g->obj_focus, LV_SIGNAL_DEFOCUS, NULL); - } - /*If there more objects in the group then focus to the next/prev object*/ - else { - lv_group_refocus(g); - } - } - - /* If the focuses object is still the same then it was the only object in the group but it will - * be deleted. Set the `obj_focus` to NULL to get back to the initial state of the group with - * zero objects*/ - if(*g->obj_focus == obj) { - g->obj_focus = NULL; - } - - /*Search the object and remove it from its group */ - lv_obj_t ** i; - LV_LL_READ(g->obj_ll, i) - { - if(*i == obj) { - lv_ll_rem(&g->obj_ll, i); - lv_mem_free(i); - obj->group_p = NULL; - break; - } - } -} - -/** - * Remove all objects from a group - * @param group pointer to a group - */ -void lv_group_remove_all_objs(lv_group_t * group) -{ - /*Defocus the the currently focused object*/ - if(group->obj_focus != NULL) { - (*group->obj_focus)->signal_cb(*group->obj_focus, LV_SIGNAL_DEFOCUS, NULL); - lv_obj_invalidate(*group->obj_focus); - group->obj_focus = NULL; - } - - /*Remove the objects from the group*/ - lv_obj_t ** obj; - LV_LL_READ(group->obj_ll, obj) - { - (*obj)->group_p = NULL; - } - - lv_ll_clear(&(group->obj_ll)); -} - -/** - * Focus on an object (defocus the current) - * @param obj pointer to an object to focus on - */ -void lv_group_focus_obj(lv_obj_t * obj) -{ - if(obj == NULL) return; - lv_group_t * g = obj->group_p; - if(g == NULL) return; - - if(g->frozen != 0) return; - - /*On defocus edit mode must be leaved*/ - lv_group_set_editing(g, false); - - lv_obj_t ** i; - LV_LL_READ(g->obj_ll, i) - { - if(*i == obj) { - if(g->obj_focus != NULL) { - (*g->obj_focus)->signal_cb(*g->obj_focus, LV_SIGNAL_DEFOCUS, NULL); - lv_res_t res = lv_event_send(*g->obj_focus, LV_EVENT_DEFOCUSED, NULL); - if(res != LV_RES_OK) return; - lv_obj_invalidate(*g->obj_focus); - } - - g->obj_focus = i; - - if(g->obj_focus != NULL) { - (*g->obj_focus)->signal_cb(*g->obj_focus, LV_SIGNAL_FOCUS, NULL); - if(g->focus_cb) g->focus_cb(g); - lv_res_t res = lv_event_send(*g->obj_focus, LV_EVENT_FOCUSED, NULL); - if(res != LV_RES_OK) return; - lv_obj_invalidate(*g->obj_focus); - - /*If the object or its parent has `top == true` bring it to the foregorund*/ - obj_to_foreground(*g->obj_focus); - } - break; - } - } -} - -/** - * Focus the next object in a group (defocus the current) - * @param group pointer to a group - */ -void lv_group_focus_next(lv_group_t * group) -{ - focus_next_core(group, lv_ll_get_head, lv_ll_get_next); -} - -/** - * Focus the previous object in a group (defocus the current) - * @param group pointer to a group - */ -void lv_group_focus_prev(lv_group_t * group) -{ - focus_next_core(group, lv_ll_get_tail, lv_ll_get_prev); -} - -/** - * Do not let to change the focus from the current object - * @param group pointer to a group - * @param en true: freeze, false: release freezing (normal mode) - */ -void lv_group_focus_freeze(lv_group_t * group, bool en) -{ - if(en == false) - group->frozen = 0; - else - group->frozen = 1; -} - -/** - * Send a control character to the focuses object of a group - * @param group pointer to a group - * @param c a character (use LV_KEY_.. to navigate) - * @return result of focused object in group. - */ -lv_res_t lv_group_send_data(lv_group_t * group, uint32_t c) -{ - lv_obj_t * act = lv_group_get_focused(group); - if(act == NULL) return LV_RES_OK; - - lv_res_t res; - - res = act->signal_cb(act, LV_SIGNAL_CONTROL, &c); - if(res != LV_RES_OK) return res; - - res = lv_event_send(act, LV_EVENT_KEY, &c); - if(res != LV_RES_OK) return res; - - return res; -} - -/** - * Set a function for a group which will modify the object's style if it is in focus - * @param group pointer to a group - * @param style_mod_cb the style modifier function pointer - */ -void lv_group_set_style_mod_cb(lv_group_t * group, lv_group_style_mod_cb_t style_mod_cb) -{ - group->style_mod_cb = style_mod_cb; - if(group->obj_focus != NULL) lv_obj_invalidate(*group->obj_focus); -} - -/** - * Set a function for a group which will modify the object's style if it is in focus in edit mode - * @param group pointer to a group - * @param style_mod_func the style modifier function pointer - */ -void lv_group_set_style_mod_edit_cb(lv_group_t * group, lv_group_style_mod_cb_t style_mod_edit_cb) -{ - group->style_mod_edit_cb = style_mod_edit_cb; - if(group->obj_focus != NULL) lv_obj_invalidate(*group->obj_focus); -} - -/** - * Set a function for a group which will be called when a new object is focused - * @param group pointer to a group - * @param focus_cb the call back function or NULL if unused - */ -void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb) -{ - group->focus_cb = focus_cb; -} - -/** - * Manually set the current mode (edit or navigate). - * @param group pointer to group - * @param edit: true: edit mode; false: navigate mode - */ -void lv_group_set_editing(lv_group_t * group, bool edit) -{ - uint8_t en_val = edit ? 1 : 0; - - if(en_val == group->editing) return; /*Do not set the same mode again*/ - - group->editing = en_val; - lv_obj_t * focused = lv_group_get_focused(group); - - if(focused) { - focused->signal_cb(focused, LV_SIGNAL_FOCUS, NULL); /*Focus again to properly leave/open edit/navigate mode*/ - lv_res_t res = lv_event_send(*group->obj_focus, LV_EVENT_FOCUSED, NULL); - if(res != LV_RES_OK) return; - } - - lv_obj_invalidate(focused); -} - -/** - * Set the `click_focus` attribute. If enabled then the object will be focused then it is clicked. - * @param group pointer to group - * @param en: true: enable `click_focus` - */ -void lv_group_set_click_focus(lv_group_t * group, bool en) -{ - group->click_focus = en ? 1 : 0; -} - -void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy) -{ - group->refocus_policy = policy & 0x01; -} - -/** - * Set whether focus next/prev will allow wrapping from first->last or last->first. - * @param group pointer to group - * @param en: true: enable `wrap` - */ -void lv_group_set_wrap(lv_group_t * group, bool en) -{ - group->wrap = en ? 1 : 0; -} - -/** - * Modify a style with the set 'style_mod' function. The input style remains unchanged. - * @param group pointer to group - * @param style pointer to a style to modify - * @return a copy of the input style but modified with the 'style_mod' function - */ -lv_style_t * lv_group_mod_style(lv_group_t * group, const lv_style_t * style) -{ - /*Load the current style. It will be modified by the callback*/ - lv_style_copy(&group->style_tmp, style); - - if(group->editing) { - if(group->style_mod_edit_cb) group->style_mod_edit_cb(group, &group->style_tmp); - } else { - if(group->style_mod_cb) group->style_mod_cb(group, &group->style_tmp); - } - return &group->style_tmp; -} - -/** - * Get the focused object or NULL if there isn't one - * @param group pointer to a group - * @return pointer to the focused object - */ -lv_obj_t * lv_group_get_focused(const lv_group_t * group) -{ - if(!group) return NULL; - if(group->obj_focus == NULL) return NULL; - - return *group->obj_focus; -} - -#if LV_USE_USER_DATA -/** - * Get a pointer to the group's user data - * @param group pointer to an group - * @return pointer to the user data - */ -lv_group_user_data_t * lv_group_get_user_data(lv_group_t * group) -{ - return &group->user_data; -} -#endif - -/** - * Get a the style modifier function of a group - * @param group pointer to a group - * @return pointer to the style modifier function - */ -lv_group_style_mod_cb_t lv_group_get_style_mod_cb(const lv_group_t * group) -{ - if(!group) return false; - return group->style_mod_cb; -} - -/** - * Get a the style modifier function of a group in edit mode - * @param group pointer to a group - * @return pointer to the style modifier function - */ -lv_group_style_mod_cb_t lv_group_get_style_mod_edit_cb(const lv_group_t * group) -{ - if(!group) return false; - return group->style_mod_edit_cb; -} - -/** - * Get the focus callback function of a group - * @param group pointer to a group - * @return the call back function or NULL if not set - */ -lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group) -{ - if(!group) return false; - return group->focus_cb; -} - -/** - * Get the current mode (edit or navigate). - * @param group pointer to group - * @return true: edit mode; false: navigate mode - */ -bool lv_group_get_editing(const lv_group_t * group) -{ - if(!group) return false; - return group->editing ? true : false; -} - -/** - * Get the `click_focus` attribute. - * @param group pointer to group - * @return true: `click_focus` is enabled; false: disabled - */ -bool lv_group_get_click_focus(const lv_group_t * group) -{ - if(!group) return false; - return group->click_focus ? true : false; -} - -/** - * Get whether focus next/prev will allow wrapping from first->last or last->first object. - * @param group pointer to group - * @param en: true: wrapping enabled; false: wrapping disabled - */ -bool lv_group_get_wrap(lv_group_t * group) -{ - if(!group) return false; - return group->wrap ? true : false; -} - -/** - * Notify the group that current theme changed and style modification callbacks need to be - * refreshed. - * @param group pointer to group. If NULL then all groups are notified. - */ -void lv_group_report_style_mod(lv_group_t * group) -{ - lv_theme_t * th = lv_theme_get_current(); - - if(group != NULL) { - refresh_theme(group, th); - return; - } - - lv_group_t * i; - LV_LL_READ(LV_GC_ROOT(_lv_group_ll), i) - { - refresh_theme(i, th); - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_group_refocus(lv_group_t * g) -{ - /*Refocus must temporarily allow wrapping to work correctly*/ - uint8_t temp_wrap = g->wrap; - g->wrap = 1; - - if(g->refocus_policy == LV_GROUP_REFOCUS_POLICY_NEXT) - lv_group_focus_next(g); - else if(g->refocus_policy == LV_GROUP_REFOCUS_POLICY_PREV) - lv_group_focus_prev(g); - /*Restore wrap property*/ - g->wrap = temp_wrap; -} - -/** - * Default style modifier function - * @param group pointer to the caller group - * @param style pointer to a style to modify. (Typically group.style_tmp) It will be OVERWRITTEN. - */ -static void style_mod_def(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_ORANGE; - - /*If not transparent or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 20; - - style->body.main_color = lv_color_mix(style->body.main_color, LV_COLOR_ORANGE, LV_OPA_70); - style->body.grad_color = lv_color_mix(style->body.grad_color, LV_COLOR_ORANGE, LV_OPA_70); - style->body.shadow.color = lv_color_mix(style->body.shadow.color, LV_COLOR_ORANGE, LV_OPA_60); - - style->text.color = lv_color_mix(style->text.color, LV_COLOR_ORANGE, LV_OPA_70); - - /*Add some recolor to the images*/ - if(style->image.intense < LV_OPA_MIN) { - style->image.color = LV_COLOR_ORANGE; - style->image.intense = LV_OPA_40; - } -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 2; - -#endif -} - -/** - * Default style modifier function - * @param group pointer to the caller group - * @param style pointer to a style to modify. (Typically group.style_tmp) It will be OVERWRITTEN. - */ -static void style_mod_edit_def(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_GREEN; - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 20; - - style->body.main_color = lv_color_mix(style->body.main_color, LV_COLOR_GREEN, LV_OPA_70); - style->body.grad_color = lv_color_mix(style->body.grad_color, LV_COLOR_GREEN, LV_OPA_70); - style->body.shadow.color = lv_color_mix(style->body.shadow.color, LV_COLOR_GREEN, LV_OPA_60); - - style->text.color = lv_color_mix(style->text.color, LV_COLOR_GREEN, LV_OPA_70); - - /*Add some recolor to the images*/ - if(style->image.intense < LV_OPA_MIN) { - style->image.color = LV_COLOR_GREEN; - style->image.intense = LV_OPA_40; - } - -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 3; - -#endif -} - -static void refresh_theme(lv_group_t * g, lv_theme_t * th) -{ - g->style_mod_cb = style_mod_def; - g->style_mod_edit_cb = style_mod_edit_def; - if(th) { - if(th->group.style_mod_xcb) g->style_mod_cb = th->group.style_mod_xcb; - if(th->group.style_mod_edit_xcb) g->style_mod_edit_cb = th->group.style_mod_edit_xcb; - } -} - -static void focus_next_core(lv_group_t * group, void * (*begin)(const lv_ll_t *), - void * (*move)(const lv_ll_t *, const void *)) -{ - if(group->frozen) return; - - lv_obj_t ** obj_next = group->obj_focus; - lv_obj_t ** obj_sentinel = NULL; - bool can_move = true; - bool can_begin = true; - - for(;;) { - if(obj_next == NULL) { - if(group->wrap || obj_sentinel == NULL) { - if(!can_begin) return; - obj_next = begin(&group->obj_ll); - can_move = false; - can_begin = false; - } else { - /*Currently focused object is the last/first in the group, keep it that way*/ - return; - } - } - - if(obj_sentinel == NULL) { - obj_sentinel = obj_next; - if(obj_sentinel == NULL) return; /*Group is empty*/ - } - - if(can_move) { - obj_next = move(&group->obj_ll, obj_next); - - /*Give up if we walked the entire list and haven't found another visible object*/ - if(obj_next == obj_sentinel) return; - } - - can_move = true; - - if(obj_next == NULL) continue; - - /*Hidden objects don't receive focus*/ - if(!lv_obj_get_hidden(*obj_next)) break; - } - - if(obj_next == group->obj_focus) return; /*There's only one visible object and it's already focused*/ - - if(group->obj_focus) { - (*group->obj_focus)->signal_cb(*group->obj_focus, LV_SIGNAL_DEFOCUS, NULL); - lv_res_t res = lv_event_send(*group->obj_focus, LV_EVENT_DEFOCUSED, NULL); - if(res != LV_RES_OK) return; - lv_obj_invalidate(*group->obj_focus); - } - - group->obj_focus = obj_next; - - (*group->obj_focus)->signal_cb(*group->obj_focus, LV_SIGNAL_FOCUS, NULL); - lv_res_t res = lv_event_send(*group->obj_focus, LV_EVENT_FOCUSED, NULL); - if(res != LV_RES_OK) return; - - /*If the object or its parent has `top == true` bring it to the foregorund*/ - obj_to_foreground(*group->obj_focus); - - lv_obj_invalidate(*group->obj_focus); - - if(group->focus_cb) group->focus_cb(group); -} - -static void obj_to_foreground(lv_obj_t * obj) -{ - /*Search for 'top' attribute*/ - lv_obj_t * i = obj; - lv_obj_t * last_top = NULL; - while(i != NULL) { - if(i->top != 0) last_top = i; - i = lv_obj_get_parent(i); - } - - if(last_top != NULL) { - /*Move the last_top object to the foreground*/ - lv_obj_move_foreground(last_top); - } -} - -#endif /*LV_USE_GROUP != 0*/ diff --git a/src/libs/lvgl/src/lv_core/lv_group.h b/src/libs/lvgl/src/lv_core/lv_group.h deleted file mode 100644 index c27f7693..00000000 --- a/src/libs/lvgl/src/lv_core/lv_group.h +++ /dev/null @@ -1,293 +0,0 @@ -/** - * @file lv_group.h - * - */ - -#ifndef LV_GROUP_H -#define LV_GROUP_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include "lv_obj.h" - -/********************* - * DEFINES - *********************/ -/*Predefined keys to control the focused object via lv_group_send(group, c)*/ -/*For compatibility in signal function define the keys regardless to `LV_USE_GROUP`*/ - -enum { - LV_KEY_UP = 17, /*0x11*/ - LV_KEY_DOWN = 18, /*0x12*/ - LV_KEY_RIGHT = 19, /*0x13*/ - LV_KEY_LEFT = 20, /*0x14*/ - LV_KEY_ESC = 27, /*0x1B*/ - LV_KEY_DEL = 127, /*0x7F*/ - LV_KEY_BACKSPACE = 8, /*0x08*/ - LV_KEY_ENTER = 10, /*0x0A, '\n'*/ - LV_KEY_NEXT = 9, /*0x09, '\t'*/ - LV_KEY_PREV = 11, /*0x0B, '*/ - LV_KEY_HOME = 2, /*0x02, STX*/ - LV_KEY_END = 3, /*0x03, ETX*/ -}; -typedef uint8_t lv_key_t; - -#if LV_USE_GROUP != 0 -/********************** - * TYPEDEFS - **********************/ -struct _lv_group_t; - -typedef void (*lv_group_style_mod_cb_t)(struct _lv_group_t *, lv_style_t *); -typedef void (*lv_group_focus_cb_t)(struct _lv_group_t *); - -/** - * Groups can be used to logically hold objects so that they can be individually focused. - * They are NOT for laying out objects on a screen (try `lv_cont` for that). - */ -typedef struct _lv_group_t -{ - lv_ll_t obj_ll; /**< Linked list to store the objects in the group */ - lv_obj_t ** obj_focus; /**< The object in focus*/ - - lv_group_style_mod_cb_t style_mod_cb; /**< A function to modifies the style of the focused object*/ - lv_group_style_mod_cb_t style_mod_edit_cb; /**< A function which modifies the style of the edited object*/ - lv_group_focus_cb_t focus_cb; /**< A function to call when a new object is focused (optional)*/ - lv_style_t style_tmp; /**< Stores the modified style of the focused object */ -#if LV_USE_USER_DATA - lv_group_user_data_t user_data; -#endif - - uint8_t frozen : 1; /**< 1: can't focus to new object*/ - uint8_t editing : 1; /**< 1: Edit mode, 0: Navigate mode*/ - uint8_t click_focus : 1; /**< 1: If an object in a group is clicked by an indev then it will be - focused */ - uint8_t refocus_policy : 1; /**< 1: Focus prev if focused on deletion. 0: Focus next if focused on - deletion.*/ - uint8_t wrap : 1; /**< 1: Focus next/prev can wrap at end of list. 0: Focus next/prev stops at end - of list.*/ -} lv_group_t; - -enum { LV_GROUP_REFOCUS_POLICY_NEXT = 0, LV_GROUP_REFOCUS_POLICY_PREV = 1 }; -typedef uint8_t lv_group_refocus_policy_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Init. the group module - * @remarks Internal function, do not call directly. - */ -void lv_group_init(void); - -/** - * Create a new object group - * @return pointer to the new object group - */ -lv_group_t * lv_group_create(void); - -/** - * Delete a group object - * @param group pointer to a group - */ -void lv_group_del(lv_group_t * group); - -/** - * Add an object to a group - * @param group pointer to a group - * @param obj pointer to an object to add - */ -void lv_group_add_obj(lv_group_t * group, lv_obj_t * obj); - -/** - * Remove an object from its group - * @param obj pointer to an object to remove - */ -void lv_group_remove_obj(lv_obj_t * obj); - -/** - * Remove all objects from a group - * @param group pointer to a group - */ -void lv_group_remove_all_objs(lv_group_t * group); - -/** - * Focus on an object (defocus the current) - * @param obj pointer to an object to focus on - */ -void lv_group_focus_obj(lv_obj_t * obj); - -/** - * Focus the next object in a group (defocus the current) - * @param group pointer to a group - */ -void lv_group_focus_next(lv_group_t * group); - -/** - * Focus the previous object in a group (defocus the current) - * @param group pointer to a group - */ -void lv_group_focus_prev(lv_group_t * group); - -/** - * Do not let to change the focus from the current object - * @param group pointer to a group - * @param en true: freeze, false: release freezing (normal mode) - */ -void lv_group_focus_freeze(lv_group_t * group, bool en); - -/** - * Send a control character to the focuses object of a group - * @param group pointer to a group - * @param c a character (use LV_KEY_.. to navigate) - * @return result of focused object in group. - */ -lv_res_t lv_group_send_data(lv_group_t * group, uint32_t c); - -/** - * Set a function for a group which will modify the object's style if it is in focus - * @param group pointer to a group - * @param style_mod_cb the style modifier function pointer - */ -void lv_group_set_style_mod_cb(lv_group_t * group, lv_group_style_mod_cb_t style_mod_cb); - -/** - * Set a function for a group which will modify the object's style if it is in focus in edit mode - * @param group pointer to a group - * @param style_mod_edit_cb the style modifier function pointer - */ -void lv_group_set_style_mod_edit_cb(lv_group_t * group, lv_group_style_mod_cb_t style_mod_edit_cb); - -/** - * Set a function for a group which will be called when a new object is focused - * @param group pointer to a group - * @param focus_cb the call back function or NULL if unused - */ -void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb); - -/** - * Set whether the next or previous item in a group is focused if the currently focussed obj is - * deleted. - * @param group pointer to a group - * @param new refocus policy enum - */ -void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy); - -/** - * Manually set the current mode (edit or navigate). - * @param group pointer to group - * @param edit: true: edit mode; false: navigate mode - */ -void lv_group_set_editing(lv_group_t * group, bool edit); - -/** - * Set the `click_focus` attribute. If enabled then the object will be focused then it is clicked. - * @param group pointer to group - * @param en: true: enable `click_focus` - */ -void lv_group_set_click_focus(lv_group_t * group, bool en); - -/** - * Set whether focus next/prev will allow wrapping from first->last or last->first object. - * @param group pointer to group - * @param en: true: wrapping enabled; false: wrapping disabled - */ -void lv_group_set_wrap(lv_group_t * group, bool en); - -/** - * Modify a style with the set 'style_mod' function. The input style remains unchanged. - * @param group pointer to group - * @param style pointer to a style to modify - * @return a copy of the input style but modified with the 'style_mod' function - */ -lv_style_t * lv_group_mod_style(lv_group_t * group, const lv_style_t * style); - -/** - * Get the focused object or NULL if there isn't one - * @param group pointer to a group - * @return pointer to the focused object - */ -lv_obj_t * lv_group_get_focused(const lv_group_t * group); - -#if LV_USE_USER_DATA -/** - * Get a pointer to the group's user data - * @param group pointer to an group - * @return pointer to the user data - */ -lv_group_user_data_t * lv_group_get_user_data(lv_group_t * group); - -#endif - -/** - * Get a the style modifier function of a group - * @param group pointer to a group - * @return pointer to the style modifier function - */ -lv_group_style_mod_cb_t lv_group_get_style_mod_cb(const lv_group_t * group); - -/** - * Get a the style modifier function of a group in edit mode - * @param group pointer to a group - * @return pointer to the style modifier function - */ -lv_group_style_mod_cb_t lv_group_get_style_mod_edit_cb(const lv_group_t * group); - -/** - * Get the focus callback function of a group - * @param group pointer to a group - * @return the call back function or NULL if not set - */ -lv_group_focus_cb_t lv_group_get_focus_cb(const lv_group_t * group); - -/** - * Get the current mode (edit or navigate). - * @param group pointer to group - * @return true: edit mode; false: navigate mode - */ -bool lv_group_get_editing(const lv_group_t * group); - -/** - * Get the `click_focus` attribute. - * @param group pointer to group - * @return true: `click_focus` is enabled; false: disabled - */ -bool lv_group_get_click_focus(const lv_group_t * group); - -/** - * Get whether focus next/prev will allow wrapping from first->last or last->first object. - * @param group pointer to group - * @param en: true: wrapping enabled; false: wrapping disabled - */ -bool lv_group_get_wrap(lv_group_t * group); - -/** - * Notify the group that current theme changed and style modification callbacks need to be - * refreshed. - * @param group pointer to group. If NULL then all groups are notified. - */ -void lv_group_report_style_mod(lv_group_t * group); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_GROUP != 0*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_GROUP_H*/ diff --git a/src/libs/lvgl/src/lv_core/lv_indev.c b/src/libs/lvgl/src/lv_core/lv_indev.c deleted file mode 100644 index 6ec59bda..00000000 --- a/src/libs/lvgl/src/lv_core/lv_indev.c +++ /dev/null @@ -1,1240 +0,0 @@ -/** - * @file lv_indev.c - * - */ - -/********************* - * INCLUDES - ********************/ -#include "lv_indev.h" -#include "lv_disp.h" -#include "lv_obj.h" - -#include "../lv_hal/lv_hal_tick.h" -#include "../lv_core/lv_group.h" -#include "../lv_core/lv_refr.h" -#include "../lv_misc/lv_task.h" -#include "../lv_misc/lv_math.h" - -/********************* - * DEFINES - *********************/ - -#if LV_INDEV_DEF_DRAG_THROW <= 0 -#warning "LV_INDEV_DRAG_THROW must be greater than 0" -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data); -static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data); -static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data); -static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data); -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_throw(lv_indev_proc_t * proc); -static bool indev_reset_check(lv_indev_proc_t * proc); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_indev_t * indev_act; -static lv_obj_t * indev_obj_act = NULL; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the display input device subsystem - */ -void lv_indev_init(void) -{ - lv_indev_reset(NULL); /*Reset all input devices*/ -} - -/** - * Called periodically to read the input devices - * @param param pointer to and input device to read - */ -void lv_indev_read_task(lv_task_t * task) -{ - LV_LOG_TRACE("indev read task started"); - - lv_indev_data_t data; - - indev_act = task->user_data; - - /*Read and process all indevs*/ - if(indev_act->driver.disp == NULL) return; /*Not assigned to any displays*/ - - /*Handle reset query before processing the point*/ - indev_proc_reset_query_handler(indev_act); - - if(indev_act->proc.disabled) return; - bool more_to_read; - do { - /*Read the data*/ - more_to_read = lv_indev_read(indev_act, &data); - - /*The active object might deleted even in the read function*/ - indev_proc_reset_query_handler(indev_act); - indev_obj_act = NULL; - - indev_act->proc.state = data.state; - - /*Save the last activity time*/ - if(indev_act->proc.state == LV_INDEV_STATE_PR) { - indev_act->driver.disp->last_activity_time = lv_tick_get(); - } else if(indev_act->driver.type == LV_INDEV_TYPE_ENCODER && data.enc_diff) { - indev_act->driver.disp->last_activity_time = lv_tick_get(); - } - - if(indev_act->driver.type == LV_INDEV_TYPE_POINTER) { - indev_pointer_proc(indev_act, &data); - } else if(indev_act->driver.type == LV_INDEV_TYPE_KEYPAD) { - indev_keypad_proc(indev_act, &data); - } else if(indev_act->driver.type == LV_INDEV_TYPE_ENCODER) { - indev_encoder_proc(indev_act, &data); - } else if(indev_act->driver.type == LV_INDEV_TYPE_BUTTON) { - indev_button_proc(indev_act, &data); - } - /*Handle reset query if it happened in during processing*/ - indev_proc_reset_query_handler(indev_act); - } while(more_to_read); - - /*End of indev processing, so no act indev*/ - indev_act = NULL; - indev_obj_act = NULL; - - LV_LOG_TRACE("indev read task finished"); -} - -/** - * Get the currently processed input device. Can be used in action functions too. - * @return pointer to the currently processed input device or NULL if no input device processing - * right now - */ -lv_indev_t * lv_indev_get_act(void) -{ - return indev_act; -} - -/** - * Get the type of an input device - * @param indev pointer to an input device - * @return the type of the input device from `lv_hal_indev_type_t` (`LV_INDEV_TYPE_...`) - */ -lv_indev_type_t lv_indev_get_type(const lv_indev_t * indev) -{ - if(indev == NULL) return LV_INDEV_TYPE_NONE; - - return indev->driver.type; -} -/** - * Reset one or all input devices - * @param indev pointer to an input device to reset or NULL to reset all of them - */ -void lv_indev_reset(lv_indev_t * indev) -{ - if(indev) - indev->proc.reset_query = 1; - else { - lv_indev_t * i = lv_indev_get_next(NULL); - while(i) { - i->proc.reset_query = 1; - - i = lv_indev_get_next(i); - } - } -} - -/** - * Reset the long press state of an input device - * @param indev pointer to an input device - */ -void lv_indev_reset_long_press(lv_indev_t * indev) -{ - indev->proc.long_pr_sent = 0; - indev->proc.longpr_rep_timestamp = lv_tick_get(); - indev->proc.pr_timestamp = lv_tick_get(); -} - -/** - * Enable or disable an input devices - * @param indev pointer to an input device - * @param en true: enable; false: disable - */ -void lv_indev_enable(lv_indev_t * indev, bool en) -{ - if(!indev) return; - - indev->proc.disabled = en ? 0 : 1; -} - -/** - * Set a cursor for a pointer input device (for LV_INPUT_TYPE_POINTER and LV_INPUT_TYPE_BUTTON) - * @param indev pointer to an input device - * @param cur_obj pointer to an object to be used as cursor - */ -void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj) -{ - if(indev->driver.type != LV_INDEV_TYPE_POINTER) return; - - indev->cursor = cur_obj; - lv_obj_set_parent(indev->cursor, lv_disp_get_layer_sys(indev->driver.disp)); - lv_obj_set_pos(indev->cursor, indev->proc.types.pointer.act_point.x, indev->proc.types.pointer.act_point.y); -} - -#if LV_USE_GROUP -/** - * Set a destination group for a keypad input device (for LV_INDEV_TYPE_KEYPAD) - * @param indev pointer to an input device - * @param group point to a group - */ -void lv_indev_set_group(lv_indev_t * indev, lv_group_t * group) -{ - if(indev->driver.type == LV_INDEV_TYPE_KEYPAD || indev->driver.type == LV_INDEV_TYPE_ENCODER) { - indev->group = group; - } -} -#endif - -/** - * Set the an array of points for LV_INDEV_TYPE_BUTTON. - * These points will be assigned to the buttons to press a specific point on the screen - * @param indev pointer to an input device - * @param group point to a group - */ -void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t * points) -{ - if(indev->driver.type == LV_INDEV_TYPE_BUTTON) { - indev->btn_points = points; - } -} - -/** - * Get the last point of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON) - * @param indev pointer to an input device - * @param point pointer to a point to store the result - */ -void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point) -{ - if(indev->driver.type != LV_INDEV_TYPE_POINTER && indev->driver.type != LV_INDEV_TYPE_BUTTON) { - point->x = -1; - point->y = -1; - } else { - point->x = indev->proc.types.pointer.act_point.x; - point->y = indev->proc.types.pointer.act_point.y; - } -} - -/** - * Get the last pressed key of an input device (for LV_INDEV_TYPE_KEYPAD) - * @param indev pointer to an input device - * @return the last pressed key (0 on error) - */ -uint32_t lv_indev_get_key(const lv_indev_t * indev) -{ - if(indev->driver.type != LV_INDEV_TYPE_KEYPAD) - return 0; - else - return indev->proc.types.keypad.last_key; -} - -/** - * Check if there is dragging with an input device or not (for LV_INDEV_TYPE_POINTER and - * LV_INDEV_TYPE_BUTTON) - * @param indev pointer to an input device - * @return true: drag is in progress - */ -bool lv_indev_is_dragging(const lv_indev_t * indev) -{ - if(indev == NULL) return false; - if(indev->driver.type != LV_INDEV_TYPE_POINTER && indev->driver.type != LV_INDEV_TYPE_BUTTON) return false; - return indev->proc.types.pointer.drag_in_prog == 0 ? false : true; -} - -/** - * Get the types.pointer.vector of dragging of an input device (for LV_INDEV_TYPE_POINTER and - * LV_INDEV_TYPE_BUTTON) - * @param indev pointer to an input device - * @param point pointer to a point to store the types.pointer.vector - */ -void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point) -{ - if(indev == NULL) { - point->x = 0; - point->y = 0; - return; - } - - if(indev->driver.type != LV_INDEV_TYPE_POINTER && indev->driver.type != LV_INDEV_TYPE_BUTTON) { - point->x = 0; - point->y = 0; - } else { - point->x = indev->proc.types.pointer.vect.x; - point->y = indev->proc.types.pointer.vect.y; - } -} - -/** - * Do nothing until the next release - * @param indev pointer to an input device - */ -void lv_indev_wait_release(lv_indev_t * indev) -{ - indev->proc.wait_until_release = 1; -} - -/** - * Get a pointer to the indev read task to - * modify its parameters with `lv_task_...` functions. - * @param indev pointer to an input device - * @return pointer to the indev read refresher task. (NULL on error) - */ -lv_task_t * lv_indev_get_read_task(lv_disp_t * indev) -{ - if(!indev) { - LV_LOG_WARN("lv_indev_get_read_task: indev was NULL"); - return NULL; - } - - return indev->refr_task; -} - -/** - * Gets a pointer to the currently active object in the currently processed input device. - * @return pointer to currently active object or NULL if no active object - */ -lv_obj_t * lv_indev_get_obj_act(void) -{ - return indev_obj_act; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Process a new point from LV_INDEV_TYPE_POINTER input device - * @param i pointer to an input device - * @param data pointer to the data read from the input device - */ -static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data) -{ - /*Move the cursor if set and moved*/ - if(i->cursor != NULL && - (i->proc.types.pointer.last_point.x != data->point.x || i->proc.types.pointer.last_point.y != data->point.y)) { - lv_obj_set_pos(i->cursor, data->point.x, data->point.y); - } - - i->proc.types.pointer.act_point.x = data->point.x; - i->proc.types.pointer.act_point.y = data->point.y; - - if(i->proc.state == LV_INDEV_STATE_PR) { - indev_proc_press(&i->proc); - } else { - indev_proc_release(&i->proc); - } - - i->proc.types.pointer.last_point.x = i->proc.types.pointer.act_point.x; - i->proc.types.pointer.last_point.y = i->proc.types.pointer.act_point.y; -} - -/** - * Process a new point from LV_INDEV_TYPE_KEYPAD input device - * @param i pointer to an input device - * @param data pointer to the data read from the input device - */ -static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) -{ -#if LV_USE_GROUP - if(data->state == LV_INDEV_STATE_PR && i->proc.wait_until_release) return; - - if(i->proc.wait_until_release) { - i->proc.wait_until_release = 0; - i->proc.pr_timestamp = 0; - i->proc.long_pr_sent = 0; - i->proc.types.keypad.last_state = LV_INDEV_STATE_REL; /*To skip the processing of release*/ - } - - lv_group_t * g = i->group; - if(g == NULL) return; - - indev_obj_act = lv_group_get_focused(g); - if(indev_obj_act == NULL) return; - - /*Save the last key to compare it with the current latter on RELEASE*/ - uint32_t prev_key = i->proc.types.keypad.last_key; - - /* Save the last key. - * It must be done here else `lv_indev_get_key` will return the last key in events and signals*/ - i->proc.types.keypad.last_key = data->key; - - /* Save the previous state so we can detect state changes below and also set the last state now - * so if any signal/event handler on the way returns `LV_RES_INV` the last state is remembered - * for the next time*/ - uint32_t prev_state = i->proc.types.keypad.last_state; - i->proc.types.keypad.last_state = data->state; - - /*Key press happened*/ - if(data->state == LV_INDEV_STATE_PR && prev_state == LV_INDEV_STATE_REL) { - i->proc.pr_timestamp = lv_tick_get(); - - /*Simulate a press on the object if ENTER was pressed*/ - if(data->key == LV_KEY_ENTER) { - /*Send the ENTER as a normal KEY*/ - lv_group_send_data(g, LV_KEY_ENTER); - - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_PRESSED, NULL); - if(indev_reset_check(&i->proc)) return; - lv_event_send(indev_obj_act, LV_EVENT_PRESSED, NULL); - if(indev_reset_check(&i->proc)) return; - } else if(data->key == LV_KEY_ESC) { - /*Send the ESC as a normal KEY*/ - lv_group_send_data(g, LV_KEY_ESC); - - lv_event_send(indev_obj_act, LV_EVENT_CANCEL, NULL); - if(indev_reset_check(&i->proc)) return; - } - /*Move the focus on NEXT*/ - else if(data->key == LV_KEY_NEXT) { - lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ - lv_group_focus_next(g); - if(indev_reset_check(&i->proc)) return; - } - /*Move the focus on PREV*/ - else if(data->key == LV_KEY_PREV) { - lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ - lv_group_focus_prev(g); - if(indev_reset_check(&i->proc)) return; - } - /*Just send other keys to the object (e.g. 'A' or `LV_GROUP_KEY_RIGHT`)*/ - else { - lv_group_send_data(g, data->key); - } - } - /*Pressing*/ - else if(data->state == LV_INDEV_STATE_PR && prev_state == LV_INDEV_STATE_PR) { - /*Long press time has elapsed?*/ - if(i->proc.long_pr_sent == 0 && lv_tick_elaps(i->proc.pr_timestamp) > i->driver.long_press_time) { - i->proc.long_pr_sent = 1; - if(data->key == LV_KEY_ENTER) { - i->proc.longpr_rep_timestamp = lv_tick_get(); - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_LONG_PRESS, NULL); - if(indev_reset_check(&i->proc)) return; - lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED, NULL); - if(indev_reset_check(&i->proc)) return; - } - } - /*Long press repeated time has elapsed?*/ - else if(i->proc.long_pr_sent != 0 && - lv_tick_elaps(i->proc.longpr_rep_timestamp) > i->driver.long_press_rep_time) { - - i->proc.longpr_rep_timestamp = lv_tick_get(); - - /*Send LONG_PRESS_REP on ENTER*/ - if(data->key == LV_KEY_ENTER) { - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_LONG_PRESS_REP, NULL); - if(indev_reset_check(&i->proc)) return; - lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED_REPEAT, NULL); - if(indev_reset_check(&i->proc)) return; - } - /*Move the focus on NEXT again*/ - else if(data->key == LV_KEY_NEXT) { - lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ - lv_group_focus_next(g); - if(indev_reset_check(&i->proc)) return; - } - /*Move the focus on PREV again*/ - else if(data->key == LV_KEY_PREV) { - lv_group_set_editing(g, false); /*Editing is not used by KEYPAD is be sure it is disabled*/ - lv_group_focus_prev(g); - if(indev_reset_check(&i->proc)) return; - } - /*Just send other keys again to the object (e.g. 'A' or `LV_GORUP_KEY_RIGHT)*/ - else { - lv_group_send_data(g, data->key); - if(indev_reset_check(&i->proc)) return; - } - } - } - /*Release happened*/ - else if(data->state == LV_INDEV_STATE_REL && prev_state == LV_INDEV_STATE_PR) { - /*The user might clear the key when it was released. Always release the pressed key*/ - data->key = prev_key; - if(data->key == LV_KEY_ENTER) { - - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_RELEASED, NULL); - if(indev_reset_check(&i->proc)) return; - - if(i->proc.long_pr_sent == 0) { - lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, NULL); - if(indev_reset_check(&i->proc)) return; - } - - lv_event_send(indev_obj_act, LV_EVENT_CLICKED, NULL); - if(indev_reset_check(&i->proc)) return; - - lv_event_send(indev_obj_act, LV_EVENT_RELEASED, NULL); - if(indev_reset_check(&i->proc)) return; - } - i->proc.pr_timestamp = 0; - i->proc.long_pr_sent = 0; - } - indev_obj_act = NULL; -#else - (void)data; /*Unused*/ - (void)i; /*Unused*/ -#endif -} - -/** - * Process a new point from LV_INDEV_TYPE_ENCODER input device - * @param i pointer to an input device - * @param data pointer to the data read from the input device - */ -static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) -{ -#if LV_USE_GROUP - - if(data->state == LV_INDEV_STATE_PR && i->proc.wait_until_release) return; - - if(i->proc.wait_until_release) { - i->proc.wait_until_release = 0; - i->proc.pr_timestamp = 0; - i->proc.long_pr_sent = 0; - i->proc.types.keypad.last_state = LV_INDEV_STATE_REL; /*To skip the processing of release*/ - } - - /* Save the last keys before anything else. - * They need to be already saved if the the function returns for any reason*/ - lv_indev_state_t last_state = i->proc.types.keypad.last_state; - i->proc.types.keypad.last_state = data->state; - i->proc.types.keypad.last_key = data->key; - - lv_group_t * g = i->group; - if(g == NULL) return; - - indev_obj_act = lv_group_get_focused(g); - if(indev_obj_act == NULL) return; - - /*Process the steps first. They are valid only with released button*/ - if(data->state == LV_INDEV_STATE_REL) { - /*In edit mode send LEFT/RIGHT keys*/ - if(lv_group_get_editing(g)) { - int32_t s; - if(data->enc_diff < 0) { - for(s = 0; s < -data->enc_diff; s++) lv_group_send_data(g, LV_KEY_LEFT); - } else if(data->enc_diff > 0) { - for(s = 0; s < data->enc_diff; s++) lv_group_send_data(g, LV_KEY_RIGHT); - } - } - /*In navigate mode focus on the next/prev objects*/ - else { - int32_t s; - if(data->enc_diff < 0) { - for(s = 0; s < -data->enc_diff; s++) lv_group_focus_prev(g); - } else if(data->enc_diff > 0) { - for(s = 0; s < data->enc_diff; s++) lv_group_focus_next(g); - } - } - } - - /*Refresh the focused object. It might change due to lv_group_focus_prev/next*/ - indev_obj_act = lv_group_get_focused(g); - if(indev_obj_act == NULL) return; - - /*Button press happened*/ - if(data->state == LV_INDEV_STATE_PR && last_state == LV_INDEV_STATE_REL) { - bool editable = false; - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_GET_EDITABLE, &editable); - - i->proc.pr_timestamp = lv_tick_get(); - if(lv_group_get_editing(g) == true || editable == false) { - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_PRESSED, NULL); - if(indev_reset_check(&i->proc)) return; - - lv_event_send(indev_obj_act, LV_EVENT_PRESSED, NULL); - if(indev_reset_check(&i->proc)) return; - } - } - /*Pressing*/ - else if(data->state == LV_INDEV_STATE_PR && last_state == LV_INDEV_STATE_PR) { - if(i->proc.long_pr_sent == 0 && lv_tick_elaps(i->proc.pr_timestamp) > i->driver.long_press_time) { - bool editable = false; - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_GET_EDITABLE, &editable); - - /*On enter long press toggle edit mode.*/ - if(editable) { - /*Don't leave edit mode if there is only one object (nowhere to navigate)*/ - if(lv_ll_is_empty(&g->obj_ll) == false) { - lv_group_set_editing(g, lv_group_get_editing(g) ? false : true); /*Toggle edit mode on long press*/ - } - } - /*If not editable then just send a long press signal*/ - else { - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_LONG_PRESS, NULL); - if(indev_reset_check(&i->proc)) return; - lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED, NULL); - if(indev_reset_check(&i->proc)) return; - } - i->proc.long_pr_sent = 1; - } - } - /*Release happened*/ - else if(data->state == LV_INDEV_STATE_REL && last_state == LV_INDEV_STATE_PR) { - - bool editable = false; - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_GET_EDITABLE, &editable); - - /*The button was released on a non-editable object. Just send enter*/ - if(editable == false) { - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_RELEASED, NULL); - if(indev_reset_check(&i->proc)) return; - - if(i->proc.long_pr_sent == 0) lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, NULL); - if(indev_reset_check(&i->proc)) return; - - lv_event_send(indev_obj_act, LV_EVENT_CLICKED, NULL); - if(indev_reset_check(&i->proc)) return; - - lv_event_send(indev_obj_act, LV_EVENT_RELEASED, NULL); - if(indev_reset_check(&i->proc)) return; - } - /*An object is being edited and the button is released. */ - else if(g->editing) { - /*Ignore long pressed enter release because it comes from mode switch*/ - if(!i->proc.long_pr_sent || lv_ll_is_empty(&g->obj_ll)) { - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_RELEASED, NULL); - if(indev_reset_check(&i->proc)) return; - - lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, NULL); - if(indev_reset_check(&i->proc)) return; - - lv_event_send(indev_obj_act, LV_EVENT_CLICKED, NULL); - if(indev_reset_check(&i->proc)) return; - - lv_event_send(indev_obj_act, LV_EVENT_RELEASED, NULL); - if(indev_reset_check(&i->proc)) return; - - lv_group_send_data(g, LV_KEY_ENTER); - } - } - /*If the focused object is editable and now in navigate mode then on enter switch edit - mode*/ - else if(editable && !g->editing && !i->proc.long_pr_sent) { - lv_group_set_editing(g, true); /*Set edit mode*/ - } - - i->proc.pr_timestamp = 0; - i->proc.long_pr_sent = 0; - } - indev_obj_act = NULL; -#else - (void)data; /*Unused*/ - (void)i; /*Unused*/ -#endif -} - -/** - * Process new points from a input device. indev->state.pressed has to be set - * @param indev pointer to an input device state - * @param x x coordinate of the next point - * @param y y coordinate of the next point - */ -static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data) -{ - i->proc.types.pointer.act_point.x = i->btn_points[data->btn_id].x; - i->proc.types.pointer.act_point.y = i->btn_points[data->btn_id].y; - - /*Still the same point is pressed*/ - if(i->proc.types.pointer.last_point.x == i->proc.types.pointer.act_point.x && - i->proc.types.pointer.last_point.y == i->proc.types.pointer.act_point.y && data->state == LV_INDEV_STATE_PR) { - indev_proc_press(&i->proc); - } else { - /*If a new point comes always make a release*/ - indev_proc_release(&i->proc); - } - - i->proc.types.pointer.last_point.x = i->proc.types.pointer.act_point.x; - i->proc.types.pointer.last_point.y = i->proc.types.pointer.act_point.y; -} - -/** - * Process the pressed state of LV_INDEV_TYPE_POINER input devices - * @param indev pointer to an input device 'proc' - * @return LV_RES_OK: no indev reset required; LV_RES_INV: indev reset is required - */ -static void indev_proc_press(lv_indev_proc_t * proc) -{ - indev_obj_act = proc->types.pointer.act_obj; - - if(proc->wait_until_release != 0) return; - - lv_disp_t * disp = indev_act->driver.disp; - bool new_obj_searched = false; - - /*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)); - 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)); - new_obj_searched = true; - } - /*If a dragable or a protected object was the last then keep it*/ - else { - } - - /*The last object might have drag throw. Stop it manually*/ - if(new_obj_searched && proc->types.pointer.last_obj) { - proc->types.pointer.drag_throw_vect.x = 0; - proc->types.pointer.drag_throw_vect.y = 0; - indev_drag_throw(proc); - } - - /*If a new object was found reset some variables and send a pressed signal*/ - if(indev_obj_act != proc->types.pointer.act_obj) { - proc->types.pointer.last_point.x = proc->types.pointer.act_point.x; - proc->types.pointer.last_point.y = proc->types.pointer.act_point.y; - - /*If a new object found the previous was lost, so send a signal*/ - if(proc->types.pointer.act_obj != NULL) { - /*Save the obj because in special cases `act_obj` can change in the signal function*/ - lv_obj_t * last_obj = proc->types.pointer.act_obj; - - last_obj->signal_cb(last_obj, LV_SIGNAL_PRESS_LOST, indev_act); - if(indev_reset_check(proc)) return; - lv_event_send(last_obj, LV_EVENT_PRESS_LOST, NULL); - if(indev_reset_check(proc)) return; - - } - - proc->types.pointer.act_obj = indev_obj_act; /*Save the pressed object*/ - 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.*/ - 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.vect.x = 0; - proc->types.pointer.vect.y = 0; - - /*Search for 'top' attribute*/ - lv_obj_t * i = indev_obj_act; - lv_obj_t * last_top = NULL; - while(i != NULL) { - if(i->top) last_top = i; - i = lv_obj_get_parent(i); - } - - if(last_top != NULL) { - /*Move the last_top object to the foreground*/ - lv_obj_move_foreground(last_top); - } - - /*Send a signal about the press*/ - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_PRESSED, indev_act); - if(indev_reset_check(proc)) return; - - lv_event_send(indev_obj_act, LV_EVENT_PRESSED, NULL); - if(indev_reset_check(proc)) return; - } - } - - /*Calculate the types.pointer.vector*/ - proc->types.pointer.vect.x = proc->types.pointer.act_point.x - proc->types.pointer.last_point.x; - proc->types.pointer.vect.y = proc->types.pointer.act_point.y - proc->types.pointer.last_point.y; - - proc->types.pointer.drag_throw_vect.x = (proc->types.pointer.drag_throw_vect.x * 5) >> 3; - proc->types.pointer.drag_throw_vect.y = (proc->types.pointer.drag_throw_vect.y * 5) >> 3; - - if(proc->types.pointer.drag_throw_vect.x < 0) - proc->types.pointer.drag_throw_vect.x++; - else if(proc->types.pointer.drag_throw_vect.x > 0) - proc->types.pointer.drag_throw_vect.x--; - - if(proc->types.pointer.drag_throw_vect.y < 0) - proc->types.pointer.drag_throw_vect.y++; - else if(proc->types.pointer.drag_throw_vect.y > 0) - proc->types.pointer.drag_throw_vect.y--; - - proc->types.pointer.drag_throw_vect.x += (proc->types.pointer.vect.x * 4) >> 3; - proc->types.pointer.drag_throw_vect.y += (proc->types.pointer.vect.y * 4) >> 3; - - /*If there is active object and it can be dragged run the drag*/ - if(indev_obj_act != NULL) { - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_PRESSING, indev_act); - if(indev_reset_check(proc)) return; - lv_event_send(indev_obj_act, LV_EVENT_PRESSING, NULL); - if(indev_reset_check(proc)) return; - - indev_drag(proc); - if(indev_reset_check(proc)) return; - - /*If there is no drag then check for long press time*/ - if(proc->types.pointer.drag_in_prog == 0 && proc->long_pr_sent == 0) { - /*Send a signal about the long press if enough time elapsed*/ - if(lv_tick_elaps(proc->pr_timestamp) > indev_act->driver.long_press_time) { - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_LONG_PRESS, indev_act); - if(indev_reset_check(proc)) return; - lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED, NULL); - if(indev_reset_check(proc)) return; - - /*Mark the signal sending to do not send it again*/ - proc->long_pr_sent = 1; - - /*Save the long press time stamp for the long press repeat handler*/ - proc->longpr_rep_timestamp = lv_tick_get(); - } - } - /*Send long press repeated signal*/ - if(proc->types.pointer.drag_in_prog == 0 && proc->long_pr_sent == 1) { - /*Send a signal about the long press repeat if enough time elapsed*/ - if(lv_tick_elaps(proc->longpr_rep_timestamp) > indev_act->driver.long_press_rep_time) { - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_LONG_PRESS_REP, indev_act); - if(indev_reset_check(proc)) return; - lv_event_send(indev_obj_act, LV_EVENT_LONG_PRESSED_REPEAT, NULL); - if(indev_reset_check(proc)) return; - proc->longpr_rep_timestamp = lv_tick_get(); - } - } - } -} - -/** - * Process the released state of LV_INDEV_TYPE_POINER input devices - * @param proc pointer to an input device 'proc' - */ -static void indev_proc_release(lv_indev_proc_t * proc) -{ - if(proc->wait_until_release != 0) { - proc->types.pointer.act_obj = NULL; - proc->types.pointer.last_obj = NULL; - proc->pr_timestamp = 0; - proc->longpr_rep_timestamp = 0; - proc->wait_until_release = 0; - } - indev_obj_act = proc->types.pointer.act_obj; - - /*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 - * the indev is ON the `types.pointer.act_obj` */ - if(lv_obj_is_protected(indev_obj_act, LV_PROTECT_PRESS_LOST)) { - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_RELEASED, indev_act); - if(indev_reset_check(proc)) return; - - if(proc->types.pointer.drag_in_prog == 0) { - if(proc->long_pr_sent == 0) { - lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, NULL); - if(indev_reset_check(proc)) return; - } - - lv_event_send(indev_obj_act, LV_EVENT_CLICKED, NULL); - if(indev_reset_check(proc)) return; - } - - lv_event_send(indev_obj_act, LV_EVENT_RELEASED, NULL); - if(indev_reset_check(proc)) return; - } - /* The simple case: `act_obj` was not protected against press lost. - * If it is already not pressed then `indev_proc_press` would set `indev_obj_act = NULL`*/ - else { - indev_obj_act->signal_cb(indev_obj_act, LV_SIGNAL_RELEASED, indev_act); - if(indev_reset_check(proc)) return; - - if(proc->long_pr_sent == 0 && proc->types.pointer.drag_in_prog == 0) { - lv_event_send(indev_obj_act, LV_EVENT_SHORT_CLICKED, NULL); - if(indev_reset_check(proc)) return; - } - - if(proc->types.pointer.drag_in_prog == 0) { - lv_event_send(indev_obj_act, LV_EVENT_CLICKED, NULL); - if(indev_reset_check(proc)) return; - } - - lv_event_send(indev_obj_act, LV_EVENT_RELEASED, NULL); - if(indev_reset_check(proc)) return; - } - - if(indev_reset_check(proc)) return; - - /*Handle click focus*/ - bool click_focus_sent = false; -#if LV_USE_GROUP - lv_group_t * g = lv_obj_get_group(indev_obj_act); - - /*Check, if the parent is in a group and focus on it.*/ - /*Respect the click focus protection*/ - if(lv_obj_is_protected(indev_obj_act, LV_PROTECT_CLICK_FOCUS) == false) { - lv_obj_t * parent = indev_obj_act; - - while(g == NULL) { - parent = lv_obj_get_parent(parent); - if(parent == NULL) break; - - /*Ignore is the protected against click focus*/ - if(lv_obj_is_protected(parent, LV_PROTECT_CLICK_FOCUS)) { - parent = NULL; - break; - } - g = lv_obj_get_group(parent); - } - - /* If a parent is in a group make it focused. - * `LV_EVENT_FOCUSED/DEFOCUSED` will be sent by `lv_group_focus_obj`*/ - if(g && parent) { - if(lv_group_get_click_focus(g)) { - click_focus_sent = true; - lv_group_focus_obj(parent); - } - } - } -#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*/ - 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; - - lv_event_send(proc->types.pointer.act_obj, LV_EVENT_FOCUSED, NULL); - if(indev_reset_check(proc)) return; - - proc->types.pointer.last_pressed = indev_obj_act; - } - - if(indev_reset_check(proc)) return; - - /*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); - } - - if(drag_obj) { - if(lv_obj_get_drag_throw(drag_obj) && proc->types.pointer.drag_in_prog) { - lv_event_send(drag_obj, LV_EVENT_DRAG_THROW_BEGIN, NULL); - if(indev_reset_check(proc)) return; - } - } - - proc->types.pointer.act_obj = NULL; - proc->pr_timestamp = 0; - proc->longpr_rep_timestamp = 0; - } - - /*The reset can be set in the signal function. - * In case of reset query ignore the remaining parts.*/ - if(proc->types.pointer.last_obj != NULL && proc->reset_query == 0) { - indev_drag_throw(proc); - if(indev_reset_check(proc)) return; - } -} - -/** - * Process a new point from LV_INDEV_TYPE_BUTTON input device - * @param i pointer to an input device - * @param data pointer to the data read from the input device - * Reset input device if a reset query has been sent to it - * @param indev pointer to an input device - */ -static void indev_proc_reset_query_handler(lv_indev_t * indev) -{ - if(indev->proc.reset_query) { - indev->proc.types.pointer.act_obj = NULL; - indev->proc.types.pointer.last_obj = NULL; - indev->proc.types.pointer.last_pressed = NULL; - indev->proc.types.pointer.drag_limit_out = 0; - indev->proc.types.pointer.drag_in_prog = 0; - indev->proc.long_pr_sent = 0; - indev->proc.pr_timestamp = 0; - 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_throw_vect.x = 0; - indev->proc.types.pointer.drag_throw_vect.y = 0; - indev->proc.reset_query = 0; - indev_obj_act = NULL; - } -} -/** - * 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 - * @param obj pointer to a start object, typically the screen - * @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 * found_p = NULL; - - /*If the point is on this object check its children too*/ -#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY - lv_area_t ext_area; - ext_area.x1 = obj->coords.x1 - obj->ext_click_pad_hor; - ext_area.x2 = obj->coords.x2 + obj->ext_click_pad_hor; - 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)) { -#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; - ext_area.x2 = obj->coords.x2 + obj->ext_click_pad.x2; - 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)) { -#else - if(lv_area_is_point_on(&obj->coords, &proc->types.pointer.act_point)) { -#endif - lv_obj_t * i; - - LV_LL_READ(obj->child_ll, i) - { - found_p = indev_search_obj(proc, i); - - /*If a child was found then break*/ - if(found_p != NULL) { - break; - } - } - - /*If then the children was not ok, and this obj is clickable - * and it or its parent is not hidden then save this object*/ - if(found_p == NULL && lv_obj_get_click(obj) != false) { - lv_obj_t * hidden_i = obj; - while(hidden_i != NULL) { - if(lv_obj_get_hidden(hidden_i) == true) break; - hidden_i = lv_obj_get_parent(hidden_i); - } - /*No parent found with hidden == true*/ - if(hidden_i == NULL) found_p = obj; - } - } - - return found_p; -} - -/** - * 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) -{ - lv_obj_t * drag_obj = state->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; - - /*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; - drag_just_started = true; - } - } - - /*If the drag limit is exceeded handle the dragging*/ - if(state->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) { - - uint16_t inv_buf_size = - lv_disp_get_inv_buf_size(indev_act->driver.disp); /*Get the number of currently invalidated areas*/ - - lv_coord_t prev_x = drag_obj->coords.x1; - lv_coord_t prev_y = drag_obj->coords.y1; - lv_coord_t prev_par_w = lv_obj_get_width(lv_obj_get_parent(drag_obj)); - lv_coord_t prev_par_h = lv_obj_get_height(lv_obj_get_parent(drag_obj)); - - /*Get the coordinates of the object and modify them*/ - 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(drag_just_started) { - act_x += state->types.pointer.drag_sum.x; - act_y += state->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) { - if(drag_just_started) { - act_x += state->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) { - if(drag_just_started) { - act_y += state->types.pointer.drag_sum.y; - } - lv_obj_set_y(drag_obj, act_y + state->types.pointer.vect.y); - } - - /*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 */ - lv_coord_t act_par_w = lv_obj_get_width(lv_obj_get_parent(drag_obj)); - lv_coord_t act_par_h = lv_obj_get_height(lv_obj_get_parent(drag_obj)); - if(act_par_w == prev_par_w && act_par_h == prev_par_h) { - 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; - } - } - } - } -} - -/** - * Handle throwing by drag if the drag is ended - * @param indev pointer to an input device state - */ -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; - - /*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; - } - - /*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); - return; - } - - lv_drag_dir_t allowed_dirs = lv_obj_get_drag_dir(drag_obj); - - /*Reduce the vectors*/ - proc->types.pointer.drag_throw_vect.x = - proc->types.pointer.drag_throw_vect.x * (100 - indev_act->driver.drag_throw) / 100; - proc->types.pointer.drag_throw_vect.y = - proc->types.pointer.drag_throw_vect.y * (100 - indev_act->driver.drag_throw) / 100; - - if(proc->types.pointer.drag_throw_vect.x != 0 || proc->types.pointer.drag_throw_vect.y != 0) { - /*Get the coordinates and modify them*/ - lv_area_t coords_ori; - lv_obj_get_coords(drag_obj, &coords_ori); - 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); - - lv_area_t coord_new; - lv_obj_get_coords(drag_obj, &coord_new); - - /*If non of the coordinates are changed then do not continue throwing*/ - if((coords_ori.x1 == coord_new.x1 || proc->types.pointer.drag_throw_vect.x == 0) && - (coords_ori.y1 == coord_new.y1 || proc->types.pointer.drag_throw_vect.y == 0)) { - proc->types.pointer.drag_in_prog = 0; - proc->types.pointer.vect.x = 0; - proc->types.pointer.vect.y = 0; - proc->types.pointer.drag_throw_vect.x = 0; - 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; - } - } - /*If the types.pointer.vectors become 0 -> types.pointer.drag_in_prog = 0 and send a drag end - signal*/ - else { - proc->types.pointer.drag_in_prog = 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; - } -} - -/** - * 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' - * return true if indev query should be immediately truncated. - */ -static bool indev_reset_check(lv_indev_proc_t * proc) -{ - if(proc->reset_query) { - indev_obj_act = NULL; - } - - return proc->reset_query ? true : false; -} diff --git a/src/libs/lvgl/src/lv_core/lv_indev.h b/src/libs/lvgl/src/lv_core/lv_indev.h deleted file mode 100644 index 69ab5a41..00000000 --- a/src/libs/lvgl/src/lv_core/lv_indev.h +++ /dev/null @@ -1,159 +0,0 @@ -/** - * @file lv_indev.h - * - */ - -#ifndef LV_INDEV_H -#define LV_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_obj.h" -#include "../lv_hal/lv_hal_indev.h" -#include "../lv_core/lv_group.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the display input device subsystem - */ -void lv_indev_init(void); - -/** - * Called periodically to read the input devices - * @param task pointer to the task itself - */ -void lv_indev_read_task(lv_task_t * task); - -/** - * Get the currently processed input device. Can be used in action functions too. - * @return pointer to the currently processed input device or NULL if no input device processing - * right now - */ -lv_indev_t * lv_indev_get_act(void); - -/** - * Get the type of an input device - * @param indev pointer to an input device - * @return the type of the input device from `lv_hal_indev_type_t` (`LV_INDEV_TYPE_...`) - */ -lv_indev_type_t lv_indev_get_type(const lv_indev_t * indev); - -/** - * Reset one or all input devices - * @param indev pointer to an input device to reset or NULL to reset all of them - */ -void lv_indev_reset(lv_indev_t * indev); - -/** - * Reset the long press state of an input device - * @param indev_proc pointer to an input device - */ -void lv_indev_reset_long_press(lv_indev_t * indev); - -/** - * Enable or disable an input devices - * @param indev pointer to an input device - * @param en true: enable; false: disable - */ -void lv_indev_enable(lv_indev_t * indev, bool en); - -/** - * Set a cursor for a pointer input device (for LV_INPUT_TYPE_POINTER and LV_INPUT_TYPE_BUTTON) - * @param indev pointer to an input device - * @param cur_obj pointer to an object to be used as cursor - */ -void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj); - -#if LV_USE_GROUP -/** - * Set a destination group for a keypad input device (for LV_INDEV_TYPE_KEYPAD) - * @param indev pointer to an input device - * @param group point to a group - */ -void lv_indev_set_group(lv_indev_t * indev, lv_group_t * group); -#endif - -/** - * Set the an array of points for LV_INDEV_TYPE_BUTTON. - * These points will be assigned to the buttons to press a specific point on the screen - * @param indev pointer to an input device - * @param group point to a group - */ -void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t * points); - -/** - * Get the last point of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON) - * @param indev pointer to an input device - * @param point pointer to a point to store the result - */ -void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point); - -/** - * Get the last pressed key of an input device (for LV_INDEV_TYPE_KEYPAD) - * @param indev pointer to an input device - * @return the last pressed key (0 on error) - */ -uint32_t lv_indev_get_key(const lv_indev_t * indev); - -/** - * Check if there is dragging with an input device or not (for LV_INDEV_TYPE_POINTER and - * LV_INDEV_TYPE_BUTTON) - * @param indev pointer to an input device - * @return true: drag is in progress - */ -bool lv_indev_is_dragging(const lv_indev_t * indev); - -/** - * Get the vector of dragging of an input device (for LV_INDEV_TYPE_POINTER and - * LV_INDEV_TYPE_BUTTON) - * @param indev pointer to an input device - * @param point pointer to a point to store the vector - */ -void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point); - -/** - * Do nothing until the next release - * @param indev pointer to an input device - */ -void lv_indev_wait_release(lv_indev_t * indev); - -/** - * Get a pointer to the indev read task to - * modify its parameters with `lv_task_...` functions. - * @param indev pointer to an inout device - * @return pointer to the indev read refresher task. (NULL on error) - */ -lv_task_t * lv_indev_get_read_task(lv_disp_t * indev); - -/** - * Gets a pointer to the currently active object in indev proc functions. - * NULL if no object is currently being handled or if groups aren't used. - * @return pointer to currently active object - */ -lv_obj_t * lv_indev_get_obj_act(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_INDEV_H*/ diff --git a/src/libs/lvgl/src/lv_core/lv_obj.c b/src/libs/lvgl/src/lv_core/lv_obj.c deleted file mode 100644 index 511e72db..00000000 --- a/src/libs/lvgl/src/lv_core/lv_obj.c +++ /dev/null @@ -1,2649 +0,0 @@ -/** - * @file lv_base_obj.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_obj.h" -#include "lv_indev.h" -#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_hal/lv_hal.h" -#include <stdint.h> -#include <string.h> -#include "../lv_misc/lv_gc.h" -#include "../lv_misc/lv_math.h" - -#if defined(LV_GC_INCLUDE) -#include LV_GC_INCLUDE -#endif /* LV_ENABLE_GC */ - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_obj" -#define LV_OBJ_DEF_WIDTH (LV_DPI) -#define LV_OBJ_DEF_HEIGHT (2 * LV_DPI / 3) - -/********************** - * TYPEDEFS - **********************/ -typedef struct _lv_event_temp_data -{ - lv_obj_t * obj; - bool deleted; - struct _lv_event_temp_data * prev; -} lv_event_temp_data_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static void refresh_children_position(lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_diff); -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_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param); - -/********************** - * STATIC VARIABLES - **********************/ -static bool lv_initialized = false; -static lv_event_temp_data_t * event_temp_data_head; -static const void * event_act_data; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Init. the 'lv' library. - */ -void lv_init(void) -{ - /* Do nothing if already initialized */ - if(lv_initialized) { - LV_LOG_WARN("lv_init: already inited"); - return; - } - - LV_LOG_TRACE("lv_init started"); - - /*Initialize the lv_misc modules*/ - lv_mem_init(); - lv_task_core_init(); - -#if LV_USE_FILESYSTEM - lv_fs_init(); -#endif - -#if LV_USE_ANIMATION - lv_anim_core_init(); -#endif - -#if LV_USE_GROUP - lv_group_init(); -#endif - - /*Init. the sstyles*/ - lv_style_init(); - - /*Initialize the screen refresh system*/ - lv_refr_init(); - - lv_ll_init(&LV_GC_ROOT(_lv_disp_ll), sizeof(lv_disp_t)); - lv_ll_init(&LV_GC_ROOT(_lv_indev_ll), sizeof(lv_indev_t)); - - /*Init the input device handling*/ - lv_indev_init(); - - lv_img_decoder_init(); - lv_img_cache_set_size(LV_IMG_CACHE_DEF_SIZE); - - lv_initialized = true; - LV_LOG_INFO("lv_init ready"); -} - -#if LV_ENABLE_GC || !LV_MEM_CUSTOM -void lv_deinit(void) -{ - lv_gc_clear_roots(); -#if LV_USE_LOG - lv_log_register_print_cb(NULL); -#endif - lv_disp_set_default(NULL); - lv_mem_deinit(); - lv_initialized = false; - LV_LOG_INFO("lv_deinit done"); -} -#endif - -/*-------------------- - * Create and delete - *-------------------*/ - -/** - * Create a basic object - * @param parent pointer to a parent object. - * If NULL then a screen will be created - * @param copy pointer to a base object, if not NULL then the new object will be copied from it - * @return pointer to the new object - */ -lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) -{ - - lv_obj_t * new_obj = NULL; - /*Create a screen if the parent is NULL*/ - if(parent == NULL) { - LV_LOG_TRACE("Screen create started"); - lv_disp_t * disp = lv_disp_get_default(); - if(!disp) { - LV_LOG_WARN("lv_obj_create: not display created to so far. No place to assign the new screen"); - return NULL; - } - - new_obj = lv_ll_ins_head(&disp->scr_ll); - 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; - new_obj->coords.x2 = lv_disp_get_hor_res(NULL) - 1; - new_obj->coords.y2 = lv_disp_get_ver_res(NULL) - 1; - new_obj->ext_draw_pad = 0; - -#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 - -#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY - new_obj->ext_click_pad_hor = 0; - new_obj->ext_click_pad_ver = 0; -#endif - - /*Init realign*/ -#if LV_USE_OBJ_REALIGN - new_obj->realign.align = LV_ALIGN_CENTER; - new_obj->realign.xofs = 0; - new_obj->realign.yofs = 0; - new_obj->realign.base = NULL; - new_obj->realign.auto_realign = 0; -#endif - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - new_obj->style_p = th->style.scr; - } else { - new_obj->style_p = &lv_style_scr; - } - - /*Init. user date*/ -#if LV_USE_USER_DATA - memset(&new_obj->user_data, 0, sizeof(lv_obj_user_data_t)); -#endif - -#if LV_USE_GROUP - new_obj->group_p = NULL; -#endif - /*Set attributes*/ - new_obj->click = 0; - new_obj->drag = 0; - new_obj->drag_throw = 0; - new_obj->drag_parent = 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; - - LV_LOG_INFO("Screen create ready"); - } - /*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_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.y1 = parent->coords.y1; - 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 - memset(&new_obj->ext_click_pad, 0, sizeof(new_obj->ext_click_pad)); -#endif - -#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY - new_obj->ext_click_pad_hor = 0; - new_obj->ext_click_pad_ver = 0; -#endif - - /*Init realign*/ -#if LV_USE_OBJ_REALIGN - new_obj->realign.align = LV_ALIGN_CENTER; - new_obj->realign.xofs = 0; - new_obj->realign.yofs = 0; - new_obj->realign.base = NULL; - new_obj->realign.auto_realign = 0; -#endif - /*Set appearance*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - new_obj->style_p = th->style.panel; - } else { - new_obj->style_p = &lv_style_plain_color; - } - -#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 - -#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY - new_obj->ext_click_pad_hor = 0; - new_obj->ext_click_pad_ver = 0; -#endif - - /*Init. user date*/ -#if LV_USE_USER_DATA - memset(&new_obj->user_data, 0, sizeof(lv_obj_user_data_t)); -#endif - -#if LV_USE_GROUP - new_obj->group_p = NULL; -#endif - - /*Set attributes*/ - new_obj->click = 1; - new_obj->drag = 0; - new_obj->drag_dir = LV_DRAG_DIR_ALL; - new_obj->drag_throw = 0; - new_obj->drag_parent = 0; - new_obj->hidden = 0; - new_obj->top = 0; - new_obj->protect = LV_PROTECT_NONE; - 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; - -#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL - lv_area_copy(&new_obj->ext_click_pad, ©->ext_click_pad); -#endif - -#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY - new_obj->ext_click_pad_hor = copy->ext_click_pad_hor; - new_obj->ext_click_pad_ver = copy->ext_click_pad_ver; -#endif - - /*Set free data*/ -#if LV_USE_USER_DATA - memcpy(&new_obj->user_data, ©->user_data, sizeof(lv_obj_user_data_t)); -#endif - /*Copy realign*/ -#if LV_USE_OBJ_REALIGN - new_obj->realign.align = copy->realign.align; - new_obj->realign.xofs = copy->realign.xofs; - new_obj->realign.yofs = copy->realign.yofs; - new_obj->realign.base = copy->realign.base; - new_obj->realign.auto_realign = copy->realign.auto_realign; -#endif - - /*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; - - /*Copy attributes*/ - new_obj->click = copy->click; - new_obj->drag = copy->drag; - new_obj->drag_dir = copy->drag_dir; - new_obj->drag_throw = copy->drag_throw; - new_obj->drag_parent = copy->drag_parent; - new_obj->hidden = copy->hidden; - new_obj->top = copy->top; - new_obj->parent_event = copy->parent_event; - - new_obj->opa_scale_en = copy->opa_scale_en; - new_obj->protect = copy->protect; - new_obj->opa_scale = copy->opa_scale; - - new_obj->style_p = copy->style_p; - -#if LV_USE_GROUP - /*Add to the same group*/ - if(copy->group_p != NULL) { - lv_group_add_obj(copy->group_p, new_obj); - } -#endif - - /*Set the same coordinates for non screen objects*/ - if(lv_obj_get_parent(copy) != NULL && parent != NULL) { - lv_obj_set_pos(new_obj, lv_obj_get_x(copy), lv_obj_get_y(copy)); - } else { - lv_obj_set_pos(new_obj, 0, 0); - } - - LV_LOG_INFO("Object create ready"); - } - - /*Send a signal to the parent to notify it about the new child*/ - if(parent != NULL) { - parent->signal_cb(parent, LV_SIGNAL_CHILD_CHG, new_obj); - - /*Invalidate the area if not screen created*/ - lv_obj_invalidate(new_obj); - } - - return new_obj; -} - -/** - * Delete 'obj' and all of its children - * @param obj pointer to an object to delete - * @return LV_RES_INV because the object is deleted - */ -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*/ -#if LV_USE_GROUP - lv_group_t * group = lv_obj_get_group(obj); - if(group) lv_group_remove_obj(obj); -#endif - - /*Remove the animations from this object*/ -#if LV_USE_ANIMATION - lv_anim_del(obj, NULL); -#endif - - /*Recursively delete the children*/ - lv_obj_t * i; - lv_obj_t * i_next; - i = lv_ll_get_head(&(obj->child_ll)); - while(i != NULL) { - /*Get the next object before delete this*/ - i_next = lv_ll_get_next(&(obj->child_ll), i); - - /*Call the recursive del to the child too*/ - delete_children(i); - - /*Set i to the next node*/ - i = i_next; - } - - /*Let the user free the resources used in `LV_EVENT_DELETE`*/ - lv_event_send(obj, LV_EVENT_DELETE, NULL); - - lv_event_mark_deleted(obj); - - /* Reset all input devices if the object to delete is used*/ - lv_indev_t * indev = lv_indev_get_next(NULL); - while(indev) { - if(indev->proc.types.pointer.act_obj == obj || indev->proc.types.pointer.last_obj == obj) { - lv_indev_reset(indev); - } - if(indev->proc.types.pointer.last_pressed == obj) { - indev->proc.types.pointer.last_pressed = NULL; - } - -#if LV_USE_GROUP - if(indev->group == group && obj == lv_indev_get_obj_act()) { - lv_indev_reset(indev); - } -#endif - indev = lv_indev_get_next(indev); - } - - /* All children deleted. - * 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_rem(&d->scr_ll, obj); - } else { - lv_ll_rem(&(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*/ - - /*Send a signal to the parent to notify it about the child delete*/ - if(par != NULL) { - par->signal_cb(par, LV_SIGNAL_CHILD_CHG, NULL); - } - - return LV_RES_INV; -} - -/** - * Helper function for asynchronously deleting objects. - * Useful for cases where you can't delete an object directly in an `LV_EVENT_DELETE` handler (i.e. parent). - * @param obj object to delete - * @see lv_async_call - */ -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); -} - -/** - * Delete all children of an object - * @param obj pointer to an object - */ -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) { - /* Read the next child before deleting the current - * because the next couldn't be read from a deleted (invalid) node*/ - child_next = lv_obj_get_child(obj, child); - lv_obj_del(child); - child = child_next; - } -} - -/** - * Mark an area of an object as invalid. - * This area will be redrawn by 'lv_refr_task' - * @param obj pointer to an object - * @param area the area to redraw - */ -void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - if(lv_obj_get_hidden(obj)) return; - - /*Invalidate the object only if it belongs to the 'LV_GC_ROOT(_lv_act_scr)'*/ - lv_obj_t * obj_scr = lv_obj_get_screen(obj); - lv_disp_t * disp = lv_obj_get_disp(obj_scr); - if(obj_scr == lv_disp_get_scr_act(disp) || obj_scr == lv_disp_get_layer_top(disp) || - obj_scr == lv_disp_get_layer_sys(disp)) { - - /*Truncate the area to the object*/ - lv_area_t obj_coords; - lv_coord_t ext_size = obj->ext_draw_pad; - lv_area_copy(&obj_coords, &obj->coords); - obj_coords.x1 -= ext_size; - obj_coords.y1 -= ext_size; - obj_coords.x2 += ext_size; - obj_coords.y2 += ext_size; - - bool is_common; - lv_area_t area_trunc; - - is_common = lv_area_intersect(&area_trunc, area, &obj_coords); - if(is_common == false) return; /*The area is not on the object*/ - - /*Truncate recursively to the parents*/ - lv_obj_t * par = lv_obj_get_parent(obj); - while(par != NULL) { - is_common = lv_area_intersect(&area_trunc, &area_trunc, &par->coords); - if(is_common == false) break; /*If no common parts with parent break;*/ - if(lv_obj_get_hidden(par)) return; /*If the parent is hidden then the child is hidden and won't be drawn*/ - - par = lv_obj_get_parent(par); - } - - if(is_common) lv_inv_area(disp, &area_trunc); - } -} - -/** - * Mark the object as invalid therefore its current position will be redrawn by 'lv_refr_task' - * @param obj pointer to an object - */ -void lv_obj_invalidate(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - /*Truncate the area to the object*/ - lv_area_t obj_coords; - lv_coord_t ext_size = obj->ext_draw_pad; - lv_area_copy(&obj_coords, &obj->coords); - obj_coords.x1 -= ext_size; - obj_coords.y1 -= ext_size; - obj_coords.x2 += ext_size; - obj_coords.y2 += ext_size; - - lv_obj_invalidate_area(obj, &obj_coords); - -} -/*===================== - * Setter functions - *====================*/ - -/*-------------------- - * Parent/children set - *--------------------*/ - -/** - * Set a new parent for an object. Its relative position will be the same. - * @param obj pointer to an object. Can't be a screen. - * @param parent pointer to the new parent object. (Can't be NULL) - */ -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; - } - - if(parent == NULL) { - LV_LOG_WARN("Can't set parent == NULL to an object"); - return; - } - - lv_obj_invalidate(obj); - - 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_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); - - /*Notify the original parent because one of its children is lost*/ - old_par->signal_cb(old_par, LV_SIGNAL_CHILD_CHG, NULL); - - /*Notify the new parent about the child*/ - parent->signal_cb(parent, LV_SIGNAL_CHILD_CHG, obj); - - lv_obj_invalidate(obj); -} - -/** - * Move and object to the foreground - * @param obj pointer to an object - */ -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*/ - if(lv_ll_get_head(&parent->child_ll) == obj) return; - - lv_obj_invalidate(parent); - - lv_ll_chg_list(&parent->child_ll, &parent->child_ll, obj, true); - - /*Notify the new parent about the child*/ - parent->signal_cb(parent, LV_SIGNAL_CHILD_CHG, obj); - - lv_obj_invalidate(parent); -} - -/** - * Move and object to the background - * @param obj pointer to an object - */ -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*/ - if(lv_ll_get_tail(&parent->child_ll) == obj) return; - - lv_obj_invalidate(parent); - - lv_ll_chg_list(&parent->child_ll, &parent->child_ll, obj, false); - - /*Notify the new parent about the child*/ - parent->signal_cb(parent, LV_SIGNAL_CHILD_CHG, obj); - - lv_obj_invalidate(parent); -} - -/*-------------------- - * Coordinate set - * ------------------*/ - -/** - * Set relative the position of an object (relative to the parent) - * @param obj pointer to an object - * @param x new distance from the left side of the parent - * @param y new distance from the top of the parent - */ -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; - - x = x + par->coords.x1; - y = y + par->coords.y1; - - /*Calculate and set the movement*/ - lv_point_t diff; - diff.x = x - obj->coords.x1; - diff.y = y - obj->coords.y1; - - /* Do nothing if the position is not changed */ - /* It is very important else recursive positioning can - * occur without position change*/ - if(diff.x == 0 && diff.y == 0) return; - - /*Invalidate the original area*/ - lv_obj_invalidate(obj); - - /*Save the original coordinates*/ - lv_area_t ori; - lv_obj_get_coords(obj, &ori); - - obj->coords.x1 += diff.x; - obj->coords.y1 += diff.y; - obj->coords.x2 += diff.x; - obj->coords.y2 += diff.y; - - refresh_children_position(obj, diff.x, diff.y); - - /*Inform the object about its new coordinates*/ - obj->signal_cb(obj, LV_SIGNAL_CORD_CHG, &ori); - - /*Send a signal to the parent too*/ - par->signal_cb(par, LV_SIGNAL_CHILD_CHG, obj); - - /*Invalidate the new area*/ - lv_obj_invalidate(obj); -} - -/** - * Set the x coordinate of a object - * @param obj pointer to an object - * @param x new distance from the left side from the parent - */ -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)); -} - -/** - * Set the y coordinate of a object - * @param obj pointer to an object - * @param y new distance from the top of the parent - */ -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); -} - -/** - * Set the size of an object - * @param obj pointer to an object - * @param w new width - * @param h new height - */ -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 - * occur without size change*/ - if(lv_obj_get_width(obj) == w && lv_obj_get_height(obj) == h) { - return; - } - - /*Invalidate the original area*/ - lv_obj_invalidate(obj); - - /*Save the original coordinates*/ - lv_area_t ori; - lv_obj_get_coords(obj, &ori); - - /*Set the length and height*/ - 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); - - /*Send a signal to the parent too*/ - lv_obj_t * par = lv_obj_get_parent(obj); - if(par != NULL) par->signal_cb(par, LV_SIGNAL_CHILD_CHG, obj); - - /*Tell the children the parent's size has changed*/ - lv_obj_t * i; - LV_LL_READ(obj->child_ll, i) - { - i->signal_cb(i, LV_SIGNAL_PARENT_SIZE_CHG, NULL); - } - - /*Invalidate the new area*/ - lv_obj_invalidate(obj); - - /*Automatically realign the object if required*/ -#if LV_USE_OBJ_REALIGN - if(obj->realign.auto_realign) lv_obj_realign(obj); -#endif -} - -/** - * Set the width of an object - * @param obj pointer to an object - * @param w new width - */ -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)); -} - -/** - * Set the height of an object - * @param obj pointer to an object - * @param h new height - */ -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); -} - -/** - * Align an object to an other object. - * @param obj pointer to an object to align - * @param base pointer to an object (if NULL the parent is used). 'obj' will be aligned to it. - * @param align type of alignment (see 'lv_align_t' enum) - * @param x_mod x coordinate shift after alignment - * @param y_mod y coordinate shift after alignment - */ -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); - - if(base == NULL) { - 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; - new_y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; - break; - - case LV_ALIGN_IN_TOP_LEFT: - new_x = 0; - new_y = 0; - break; - case LV_ALIGN_IN_TOP_MID: - new_x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; - new_y = 0; - break; - - case LV_ALIGN_IN_TOP_RIGHT: - new_x = lv_obj_get_width(base) - lv_obj_get_width(obj); - new_y = 0; - break; - - case LV_ALIGN_IN_BOTTOM_LEFT: - new_x = 0; - new_y = lv_obj_get_height(base) - lv_obj_get_height(obj); - break; - case LV_ALIGN_IN_BOTTOM_MID: - new_x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; - new_y = lv_obj_get_height(base) - lv_obj_get_height(obj); - break; - - case LV_ALIGN_IN_BOTTOM_RIGHT: - new_x = lv_obj_get_width(base) - lv_obj_get_width(obj); - new_y = lv_obj_get_height(base) - lv_obj_get_height(obj); - break; - - case LV_ALIGN_IN_LEFT_MID: - new_x = 0; - new_y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; - break; - - case LV_ALIGN_IN_RIGHT_MID: - new_x = lv_obj_get_width(base) - lv_obj_get_width(obj); - new_y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; - break; - - case LV_ALIGN_OUT_TOP_LEFT: - new_x = 0; - new_y = -lv_obj_get_height(obj); - break; - - case LV_ALIGN_OUT_TOP_MID: - new_x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; - new_y = -lv_obj_get_height(obj); - break; - - case LV_ALIGN_OUT_TOP_RIGHT: - new_x = lv_obj_get_width(base) - lv_obj_get_width(obj); - new_y = -lv_obj_get_height(obj); - break; - - case LV_ALIGN_OUT_BOTTOM_LEFT: - new_x = 0; - new_y = lv_obj_get_height(base); - break; - - case LV_ALIGN_OUT_BOTTOM_MID: - new_x = lv_obj_get_width(base) / 2 - lv_obj_get_width(obj) / 2; - new_y = lv_obj_get_height(base); - break; - - case LV_ALIGN_OUT_BOTTOM_RIGHT: - new_x = lv_obj_get_width(base) - lv_obj_get_width(obj); - new_y = lv_obj_get_height(base); - break; - - case LV_ALIGN_OUT_LEFT_TOP: - new_x = -lv_obj_get_width(obj); - new_y = 0; - break; - - case LV_ALIGN_OUT_LEFT_MID: - new_x = -lv_obj_get_width(obj); - new_y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; - break; - - case LV_ALIGN_OUT_LEFT_BOTTOM: - new_x = -lv_obj_get_width(obj); - new_y = lv_obj_get_height(base) - lv_obj_get_height(obj); - break; - - case LV_ALIGN_OUT_RIGHT_TOP: - new_x = lv_obj_get_width(base); - new_y = 0; - break; - - case LV_ALIGN_OUT_RIGHT_MID: - new_x = lv_obj_get_width(base); - new_y = lv_obj_get_height(base) / 2 - lv_obj_get_height(obj) / 2; - break; - - case LV_ALIGN_OUT_RIGHT_BOTTOM: - new_x = lv_obj_get_width(base); - new_y = lv_obj_get_height(base) - lv_obj_get_height(obj); - break; - } - - /*Bring together the coordination system of base and obj*/ - lv_obj_t * par = lv_obj_get_parent(obj); - lv_coord_t base_abs_x = base->coords.x1; - lv_coord_t base_abs_y = base->coords.y1; - lv_coord_t par_abs_x = par->coords.x1; - lv_coord_t par_abs_y = par->coords.y1; - new_x += x_mod + base_abs_x; - new_y += y_mod + base_abs_y; - new_x -= par_abs_x; - new_y -= par_abs_y; - - lv_obj_set_pos(obj, new_x, new_y); - -#if LV_USE_OBJ_REALIGN - /*Save the last align parameters to use them in `lv_obj_realign`*/ - obj->realign.align = align; - obj->realign.xofs = x_mod; - obj->realign.yofs = y_mod; - obj->realign.base = base; - obj->realign.origo_align = 0; -#endif -} - -/** - * Align an object's middle point to an other object. - * @param obj pointer to an object to align - * @param base pointer to an object (if NULL the parent is used). 'obj' will be aligned to it. - * @param align type of alignment (see 'lv_align_t' enum) - * @param x_mod x coordinate shift after alignment - * @param y_mod y coordinate shift after alignment - */ -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); - - lv_coord_t obj_w_half = lv_obj_get_width(obj) / 2; - lv_coord_t obj_h_half = lv_obj_get_height(obj) / 2; - - if(base == NULL) { - 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; - new_y = lv_obj_get_height(base) / 2 - obj_h_half; - break; - - case LV_ALIGN_IN_TOP_LEFT: - new_x = -obj_w_half; - new_y = -obj_h_half; - break; - case LV_ALIGN_IN_TOP_MID: - new_x = lv_obj_get_width(base) / 2 - obj_w_half; - new_y = -obj_h_half; - break; - - case LV_ALIGN_IN_TOP_RIGHT: - new_x = lv_obj_get_width(base) - obj_w_half; - new_y = -obj_h_half; - break; - - case LV_ALIGN_IN_BOTTOM_LEFT: - new_x = -obj_w_half; - new_y = lv_obj_get_height(base) - obj_h_half; - break; - case LV_ALIGN_IN_BOTTOM_MID: - new_x = lv_obj_get_width(base) / 2 - obj_w_half; - new_y = lv_obj_get_height(base) - obj_h_half; - break; - - case LV_ALIGN_IN_BOTTOM_RIGHT: - new_x = lv_obj_get_width(base) - obj_w_half; - new_y = lv_obj_get_height(base) - obj_h_half; - break; - - case LV_ALIGN_IN_LEFT_MID: - new_x = -obj_w_half; - new_y = lv_obj_get_height(base) / 2 - obj_h_half; - break; - - case LV_ALIGN_IN_RIGHT_MID: - new_x = lv_obj_get_width(base) - obj_w_half; - new_y = lv_obj_get_height(base) / 2 - obj_h_half; - break; - - case LV_ALIGN_OUT_TOP_LEFT: - new_x = -obj_w_half; - new_y = -obj_h_half; - break; - - case LV_ALIGN_OUT_TOP_MID: - new_x = lv_obj_get_width(base) / 2 - obj_w_half; - new_y = -obj_h_half; - break; - - case LV_ALIGN_OUT_TOP_RIGHT: - new_x = lv_obj_get_width(base) - obj_w_half; - new_y = -obj_h_half; - break; - - case LV_ALIGN_OUT_BOTTOM_LEFT: - new_x = -obj_w_half; - new_y = lv_obj_get_height(base) - obj_h_half; - break; - - case LV_ALIGN_OUT_BOTTOM_MID: - new_x = lv_obj_get_width(base) / 2 - obj_w_half; - new_y = lv_obj_get_height(base) - obj_h_half; - break; - - case LV_ALIGN_OUT_BOTTOM_RIGHT: - new_x = lv_obj_get_width(base) - obj_w_half; - new_y = lv_obj_get_height(base) - obj_h_half; - break; - - case LV_ALIGN_OUT_LEFT_TOP: - new_x = -obj_w_half; - new_y = -obj_h_half; - break; - - case LV_ALIGN_OUT_LEFT_MID: - new_x = -obj_w_half; - new_y = lv_obj_get_height(base) / 2 - obj_h_half; - break; - - case LV_ALIGN_OUT_LEFT_BOTTOM: - new_x = -obj_w_half; - new_y = lv_obj_get_height(base) - obj_h_half; - break; - - case LV_ALIGN_OUT_RIGHT_TOP: - new_x = lv_obj_get_width(base) - obj_w_half; - new_y = -obj_h_half; - break; - - case LV_ALIGN_OUT_RIGHT_MID: - new_x = lv_obj_get_width(base) - obj_w_half; - new_y = lv_obj_get_height(base) / 2 - obj_h_half; - break; - - case LV_ALIGN_OUT_RIGHT_BOTTOM: - new_x = lv_obj_get_width(base) - obj_w_half; - new_y = lv_obj_get_height(base) - obj_h_half; - break; - } - - /*Bring together the coordination system of base and obj*/ - lv_obj_t * par = lv_obj_get_parent(obj); - lv_coord_t base_abs_x = base->coords.x1; - lv_coord_t base_abs_y = base->coords.y1; - lv_coord_t par_abs_x = par->coords.x1; - lv_coord_t par_abs_y = par->coords.y1; - new_x += x_mod + base_abs_x; - new_y += y_mod + base_abs_y; - new_x -= par_abs_x; - new_y -= par_abs_y; - - lv_obj_set_pos(obj, new_x, new_y); - -#if LV_USE_OBJ_REALIGN - /*Save the last align parameters to use them in `lv_obj_realign`*/ - obj->realign.align = align; - obj->realign.xofs = x_mod; - obj->realign.yofs = y_mod; - obj->realign.base = base; - obj->realign.origo_align = 1; -#endif -} - -/** - * Realign the object based on the last `lv_obj_align` parameters. - * @param obj pointer to an object - */ -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); - else - lv_obj_align(obj, obj->realign.base, obj->realign.align, obj->realign.xofs, obj->realign.yofs); -#else - (void)obj; - LV_LOG_WARN("lv_obj_realaign: no effect because LV_USE_OBJ_REALIGN = 0"); -#endif -} - -/** - * Enable the automatic realign of the object when its size has changed based on the last - * `lv_obj_align` parameters. - * @param obj pointer to an object - * @param en true: enable auto realign; false: disable auto realign - */ -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 - (void)obj; - (void)en; - LV_LOG_WARN("lv_obj_set_auto_realign: no effect because LV_USE_OBJ_REALIGN = 0"); -#endif -} - - -/** - * Set the size of an extended clickable area - * If TINY mode is used, only the largest of the horizontal and vertical padding - * values are considered. - * @param obj pointer to an object - * @param left extended clickable are on the left [px] - * @param right extended clickable are on the right [px] - * @param top extended clickable are on the top [px] - * @param bottom extended clickable are on the bottom [px] - */ -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; - obj->ext_click_pad.y1 = top; - obj->ext_click_pad.y2 = bottom; -#elif LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY - obj->ext_click_pad_hor = LV_MATH_MAX(left, right); - obj->ext_click_pad_ver = LV_MATH_MAX(top, bottom); -#else - (void)obj; /*Unused*/ - (void)left; /*Unused*/ - (void)right; /*Unused*/ - (void)top; /*Unused*/ - (void)bottom; /*Unused*/ -#endif -} - -/*--------------------- - * Appearance set - *--------------------*/ - -/** - * Set a new style for an object - * @param obj pointer to an object - * @param style_p pointer to the new style - */ -void lv_obj_set_style(lv_obj_t * obj, const lv_style_t * style) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - LV_ASSERT_STYLE(style); - - obj->style_p = style; - - /*Send a signal about style change to every children with NULL style*/ - refresh_children_style(obj); - - /*Notify the object about the style change too*/ - lv_obj_refresh_style(obj); -} - -/** - * Notify an object about its style is modified - * @param obj pointer to an object - */ -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); -} - -/** - * Notify all object if a style is modified - * @param style pointer to a style. Only the objects with this style will be notified - * (NULL to notify all objects) - */ -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) { - lv_obj_t * i; - LV_LL_READ(d->scr_ll, i) - { - if(i->style_p == style || style == NULL) { - lv_obj_refresh_style(i); - } - - report_style_mod_core(style, i); - } - d = lv_disp_get_next(d); - } -} - -/*----------------- - * Attribute set - *----------------*/ - -/** - * Hide an object. It won't be visible and clickable. - * @param obj pointer to an object - * @param en true: hide the object - */ -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; - - if(!obj->hidden) lv_obj_invalidate(obj); /*Invalidate when not hidden (hidden objects are ignored) */ - - lv_obj_t * par = lv_obj_get_parent(obj); - par->signal_cb(par, LV_SIGNAL_CHILD_CHG, obj); -} - -/** - * Enable or disable the clicking of an object - * @param obj pointer to an object - * @param en true: make the object clickable - */ -void lv_obj_set_click(lv_obj_t * obj, bool en) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - obj->click = (en == true ? 1 : 0); -} - -/** - * Enable to bring this object to the foreground if it - * or any of its children is clicked - * @param obj pointer to an object - * @param en true: enable the auto top feature - */ -void lv_obj_set_top(lv_obj_t * obj, bool en) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - obj->top = (en == true ? 1 : 0); -} - -/** - * Enable the dragging of an object - * @param obj pointer to an object - * @param en true: make the object dragable - */ -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); -} - -/** - * Set the directions an object can be dragged in - * @param obj pointer to an object - * @param drag_dir bitwise OR of allowed directions an object can be dragged in - */ -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*/ -} - -/** - * Enable the throwing of an object after is is dragged - * @param obj pointer to an object - * @param en true: enable the drag throw - */ -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); -} - -/** - * Enable to use parent for drag related operations. - * If trying to drag the object the parent will be moved instead - * @param obj pointer to an object - * @param en true: enable the 'drag parent' for the object - */ -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); -} - -/** - * Propagate the events to the parent too - * @param obj pointer to an object - * @param en true: enable the event propagation - */ -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 - * @param en true: opa scaling is enabled for this object and all children; false: no opa scaling - */ -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; -} - -/** - * Set the opa scale of an object. - * The opacity of this object and all it's children will be scaled down with this factor. - * `lv_obj_set_opa_scale_enable(obj, true)` needs to be called to enable it. - * (not for all children just for the parent where to start the opa scaling) - * @param obj pointer to an object - * @param opa_scale a factor to scale down opacity [0..255] - */ -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); -} - -/** - * Set a bit or bits in the protect filed - * @param obj pointer to an object - * @param prot 'OR'-ed values from `lv_protect_t` - */ -void lv_obj_set_protect(lv_obj_t * obj, uint8_t prot) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - obj->protect |= prot; -} - -/** - * Clear a bit or bits in the protect filed - * @param obj pointer to an object - * @param prot 'OR'-ed values from `lv_protect_t` - */ -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; -} - -/** - * Set a an event handler function for an object. - * Used by the user to react on event which happens with the object. - * @param obj pointer to an object - * @param event_cb the new event function - */ -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; -} - -/** - * Send an event to the object - * @param obj pointer to an object - * @param event the type of the event from `lv_event_t` - * @param data arbitrary data depending on the object type and the event. (Usually `NULL`) - * @return LV_RES_OK: `obj` was not deleted in the event; LV_RES_INV: `obj` was deleted in the event - */ -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; -} - -/** - * Call an event function with an object, event, and data. - * @param event_xcb an event callback function. If `NULL` `LV_RES_OK` will return without any actions. - * (the 'x' in the argument name indicates that its not a fully generic function because it not follows - * the `func_name(object, callback, ...)` convention) - * @param obj pointer to an object to associate with the event (can be `NULL` to simply call the `event_cb`) - * @param event an event - * @param data pointer to a custom data - * @return LV_RES_OK: `obj` was not deleted in the event; LV_RES_INV: `obj` was deleted in the event - */ -lv_res_t lv_event_send_func(lv_event_cb_t event_xcb, lv_obj_t * obj, lv_event_t event, const void * data) -{ - if(obj != NULL) { - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - } - - /* Build a simple linked list from the objects used in the events - * It's important to know if an this object was deleted by a nested event - * called from this `even_cb`. */ - lv_event_temp_data_t event_temp_data; - event_temp_data.obj = obj; - event_temp_data.deleted = false; - event_temp_data.prev = NULL; - - if(event_temp_data_head) { - event_temp_data.prev = event_temp_data_head; - } - event_temp_data_head = &event_temp_data; - - const void * event_act_data_save = event_act_data; - event_act_data = data; - - /*Call the input device's feedback callback if set*/ - lv_indev_t * indev_act = lv_indev_get_act(); - if(indev_act) { - if(indev_act->driver.feedback_cb) indev_act->driver.feedback_cb(&indev_act->driver, event); - } - - /*Call the event callback itself*/ - if(event_xcb) event_xcb(obj, event); - - /*Restore the event data*/ - event_act_data = event_act_data_save; - - /*Remove this element from the list*/ - event_temp_data_head = event_temp_data_head->prev; - - if(event_temp_data.deleted) { - return LV_RES_INV; - } - - if(obj) { - if(obj->parent_event && obj->par) { - lv_res_t res = lv_event_send(obj->par, event, data); - if(res != LV_RES_OK) { - return LV_RES_INV; - } - } - } - - return LV_RES_OK; -} - -/** - * Get the `data` parameter of the current event - * @return the `data` parameter - */ -const void * lv_event_get_data(void) -{ - return event_act_data; -} - -/** - * Set the a signal function of an object. Used internally by the library. - * Always call the previous signal function in the new. - * @param obj pointer to an object - * @param cb the new signal function - */ -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; -} - -/** - * Send an event to the object - * @param obj pointer to an object - * @param event the type of the event from `lv_event_t`. - */ -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); -} - -/** - * Set a new design function for an object - * @param obj pointer to an object - * @param design_cb the new design function - */ -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; -} - -/*---------------- - * Other set - *--------------*/ - -/** - * 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 - */ -void * lv_obj_allocate_ext_attr(lv_obj_t * obj, uint16_t ext_size) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - obj->ext_attr = lv_mem_realloc(obj->ext_attr, ext_size); - - return (void *)obj->ext_attr; -} - -/** - * Send a 'LV_SIGNAL_REFR_EXT_SIZE' signal to the object - * @param obj pointer to an object - */ -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); - - lv_obj_invalidate(obj); -} - -/*======================= - * Getter functions - *======================*/ - -/** - * Return with the screen of an object - * @param obj pointer to an object - * @return pointer to a screen - */ -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; - - do { - act_p = par; - par = lv_obj_get_parent(act_p); - } while(par != NULL); - - return (lv_obj_t *)act_p; -} - -/** - * Get the display of an object - * @param scr pointer to an object - * @return pointer the object's display - */ -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) - scr = obj; /*`obj` is a screen*/ - else - scr = lv_obj_get_screen(obj); /*get the screen of `obj`*/ - - lv_disp_t * d; - LV_LL_READ(LV_GC_ROOT(_lv_disp_ll), d) - { - lv_obj_t * s; - LV_LL_READ(d->scr_ll, s) - { - if(s == scr) return d; - } - } - - LV_LOG_WARN("lv_scr_get_disp: screen not found") - return NULL; -} - -/*--------------------- - * Parent/children get - *--------------------*/ - -/** - * Returns with the parent of an object - * @param obj pointer to an object - * @return pointer to the parent of 'obj' - */ -lv_obj_t * lv_obj_get_parent(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - return obj->par; -} - -/** - * Iterate through the children of an object (start from the "youngest") - * @param obj pointer to an object - * @param child NULL at first call to get the next children - * and the previous return value later - * @return the child after 'act_child' or NULL if no more child - */ -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) { - result = lv_ll_get_head(&obj->child_ll); - } else { - result = lv_ll_get_next(&obj->child_ll, child); - } - - return result; -} - -/** - * Iterate through the children of an object (start from the "oldest") - * @param obj pointer to an object - * @param child NULL at first call to get the next children - * and the previous return value later - * @return the child after 'act_child' or NULL if no more 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) { - result = lv_ll_get_tail(&obj->child_ll); - } else { - result = lv_ll_get_prev(&obj->child_ll, child); - } - - return result; -} - -/** - * Count the children of an object (only children directly on 'obj') - * @param obj pointer to an object - * @return children number of 'obj' - */ -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; - - LV_LL_READ(obj->child_ll, i) cnt++; - - return cnt; -} - -/** Recursively count the children of an object - * @param obj pointer to an object - * @return children number of '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; - - LV_LL_READ(obj->child_ll, i) - { - cnt++; /*Count the child*/ - cnt += lv_obj_count_children_recursive(i); /*recursively count children's children*/ - } - - return cnt; -} - -/*--------------------- - * Coordinate get - *--------------------*/ - -/** - * Copy the coordinates of an object to an area - * @param obj pointer to an object - * @param cords_p pointer to an area to store the coordinates - */ -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); -} - -/** - * Reduce area retried by `lv_obj_get_coords()` the get graphically usable area of an object. - * (Without the size of the border or other extra graphical elements) - * @param coords_p store the result area here - */ -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_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_BOTTOM) coords_p->y2 -= style->body.border.width; -} - -/** - * Get the x coordinate of object - * @param obj pointer to an object - * @return distance of 'obj' from the left side of its parent - */ -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); - if(parent) { - rel_x = obj->coords.x1 - parent->coords.x1; - } else { - rel_x = obj->coords.x1; - } - return rel_x; -} - -/** - * Get the y coordinate of object - * @param obj pointer to an object - * @return distance of 'obj' from the top of its parent - */ -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); - if(parent) { - rel_y = obj->coords.y1 - parent->coords.y1; - } else { - rel_y = obj->coords.y1; - } - return rel_y; -} - -/** - * Get the width of an object - * @param obj pointer to an object - * @return the width - */ -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); -} - -/** - * Get the height of an object - * @param obj pointer to an object - * @return the height - */ -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); -} - -/** - * Get that width reduced by the left and right padding. - * @param obj pointer to an object - * @return the width which still fits into the container - */ -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; -} - -/** - * Get that height reduced by the top an bottom padding. - * @param obj pointer to an object - * @return the height which still fits into the container - */ -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; -} - -/** - * Get the automatic realign property of the object. - * @param obj pointer to an object - * @return true: auto realign is enabled; false: auto realign is disabled - */ -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 - (void)obj; - return false; -#endif -} - -/** - * Get the left padding of extended clickable area - * @param obj pointer to an object - * @return the extended left padding - */ -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 - return obj->ext_click_pad.x1; -#else - (void)obj; /*Unused*/ - return 0; -#endif -} - -/** - * Get the right padding of extended clickable area - * @param obj pointer to an object - * @return the extended right padding - */ -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 - return obj->ext_click_pad.x2; -#else - (void)obj; /*Unused*/ - return 0; -#endif -} - -/** - * Get the top padding of extended clickable area - * @param obj pointer to an object - * @return the extended top padding - */ -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 - return obj->ext_click_pad.y1; -#else - (void)obj; /*Unused*/ - return 0; -#endif -} - -/** - * Get the bottom padding of extended clickable area - * @param obj pointer to an object - * @return the extended bottom padding - */ -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; -#elif LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL - return obj->ext_click_pad.y2; -#else - (void)obj; /*Unused*/ - return 0; -#endif -} - -/** - * Get the extended size attribute of an object - * @param obj pointer to an object - * @return the extended size attribute - */ -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; -} - -/*----------------- - * Appearance get - *---------------*/ - -/** - * Get the style pointer of an object (if NULL get style of the parent) - * @param obj pointer to an object - * @return pointer to a style - */ -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; - - while(par) { - if(par->style_p) { - if(par->style_p->glass == 0) { -#if LV_USE_GROUP == 0 - style_act = par->style_p; -#else - /*If a parent is focused then use then focused style*/ - lv_group_t * g = lv_obj_get_group(par); - if(lv_group_get_focused(g) == par) { - style_act = lv_group_mod_style(g, par->style_p); - } else { - style_act = par->style_p; - } -#endif - break; - } - } - par = par->par; - } - } -#if LV_USE_GROUP - if(obj->group_p) { - if(lv_group_get_focused(obj->group_p) == obj) { - style_act = lv_group_mod_style(obj->group_p, style_act); - } - } -#endif - - if(style_act == NULL) style_act = &lv_style_plain; - - return style_act; -} - -/*----------------- - * Attribute get - *----------------*/ - -/** - * Get the hidden attribute of an object - * @param obj pointer to an object - * @return true: the object is hidden - */ -bool lv_obj_get_hidden(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - return obj->hidden == 0 ? false : true; -} - -/** - * Get the click enable attribute of an object - * @param obj pointer to an object - * @return true: the object is clickable - */ -bool lv_obj_get_click(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - return obj->click == 0 ? false : true; -} - -/** - * Get the top enable attribute of an object - * @param obj pointer to an object - * @return true: the auto top feture is enabled - */ -bool lv_obj_get_top(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - return obj->top == 0 ? false : true; -} - -/** - * Get the drag enable attribute of an object - * @param obj pointer to an object - * @return true: the object is dragable - */ -bool lv_obj_get_drag(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - return obj->drag == 0 ? false : true; -} - -/** - * Get the directions an object can be dragged - * @param obj pointer to an object - * @return bitwise OR of allowed directions an object can be dragged in - */ -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; -} - -/** - * Get the drag throw enable attribute of an object - * @param obj pointer to an object - * @return true: drag throw is enabled - */ -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; -} - -/** - * Get the drag parent attribute of an object - * @param obj pointer to an object - * @return true: drag parent is enabled - */ -bool lv_obj_get_drag_parent(const lv_obj_t * obj) -{ - return obj->drag_parent == 0 ? false : true; -} - -/** - * Get the drag parent attribute of an object - * @param obj pointer to an object - * @return true: drag parent is enabled - */ -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 - * @return true: opa scaling is enabled for this object and all children; false: no opa scaling - */ -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; -} - -/** - * Get the opa scale parameter of an object - * @param obj pointer to an object - * @return opa scale [0..255] - */ -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) { - if(parent->opa_scale_en) return parent->opa_scale; - parent = lv_obj_get_parent(parent); - } - - return LV_OPA_COVER; -} - -/** - * Get the protect field of an object - * @param obj pointer to an object - * @return protect field ('OR'ed values of `lv_protect_t`) - */ -uint8_t lv_obj_get_protect(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - return obj->protect; -} - -/** - * Check at least one bit of a given protect bitfield is set - * @param obj pointer to an object - * @param prot protect bits to test ('OR'ed values of `lv_protect_t`) - * @return false: none of the given bits are set, true: at least one bit is set - */ -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; -} - -/** - * Get the signal function of an object - * @param obj pointer to an object - * @return the signal function - */ -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; -} - -/** - * Get the design function of an object - * @param obj pointer to an object - * @return the design function - */ -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; -} - -/** - * Get the event function of an object - * @param obj pointer to an object - * @return the event function - */ -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; -} - -/*------------------ - * Other get - *-----------------*/ - -/** - * Get the ext pointer - * @param obj pointer to an object - * @return the ext pointer but not the dynamic version - * Use it as ext->data1, and NOT da(ext)->data1 - */ -void * lv_obj_get_ext_attr(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - return obj->ext_attr; -} - -/** - * Get object's and its ancestors type. Put their name in `type_buf` starting with the current type. - * E.g. buf.type[0]="lv_btn", buf.type[1]="lv_cont", buf.type[2]="lv_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(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((lv_obj_t *)obj, LV_SIGNAL_GET_TYPE, &tmp); - - uint8_t cnt; - for(cnt = 0; cnt < LV_MAX_ANCESTOR_NUM; cnt++) { - if(tmp.type[cnt] == NULL) break; - } - - /*Swap the order. The real type comes first*/ - uint8_t i; - for(i = 0; i < cnt; i++) { - buf->type[i] = tmp.type[cnt - 1 - i]; - } -} - -#if LV_USE_USER_DATA - -/** - * Get the object's user data - * @param obj pointer to an object - * @return user data - */ -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; -} - -/** - * Get a pointer to the object's user data - * @param obj pointer to an object - * @return pointer to the user data - */ -lv_obj_user_data_t * lv_obj_get_user_data_ptr(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - return (lv_obj_user_data_t *)&obj->user_data; -} - -/** - * Set the object's user data. The data will be copied. - * @param obj pointer to an object - * @param data user data - */ -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 - -#if LV_USE_GROUP -/** - * Get the group of the object - * @param obj pointer to an object - * @return the pointer to group of the object - */ -void * lv_obj_get_group(const lv_obj_t * obj) -{ - LV_ASSERT_OBJ(obj, LV_OBJX_NAME); - - return obj->group_p; -} - -/** - * Tell whether the object is the focused object of a group or not. - * @param obj pointer to an object - * @return true: the object is focused, false: the object is not focused or not in a group - */ -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; - } - - return false; -} -#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 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' - */ -static bool lv_obj_design(lv_obj_t * obj, const lv_area_t * mask_p, 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; - - /*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; - - /* 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; - - lv_area_t area_tmp; - - /*Check horizontally without radius*/ - 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; - - /*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; - - } 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)); - } - - return true; -} - -/** - * Signal function of the basic object - * @param obj pointer to an object - * @param sign signal type - * @param param parameter for the signal (depends on signal type) - * @return LV_RES_OK: the object is not deleted in the function; LV_RES_INV: the object is deleted - */ -static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, 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; - - 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) { - const lv_style_t * style = lv_obj_get_style(obj); - if(style->body.shadow.width > obj->ext_draw_pad) obj->ext_draw_pad = style->body.shadow.width; - } else if(sign == LV_SIGNAL_STYLE_CHG) { - lv_obj_refresh_ext_draw_pad(obj); - } - return res; -} - -/** - * Reposition the children of an object. (Called recursively) - * @param obj pointer to an object which children will be repositioned - * @param x_diff x coordinate shift - * @param y_diff y coordinate shift - */ -static void refresh_children_position(lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_diff) -{ - lv_obj_t * i; - LV_LL_READ(obj->child_ll, i) - { - i->coords.x1 += x_diff; - i->coords.y1 += y_diff; - i->coords.x2 += x_diff; - i->coords.y2 += y_diff; - - refresh_children_position(i, x_diff, y_diff); - } -} - -/** - * Refresh the style of all children of an object. (Called recursively) - * @param style_p refresh objects only with this style. - * @param obj pointer to an object - */ -static void report_style_mod_core(void * style_p, lv_obj_t * obj) -{ - lv_obj_t * i; - LV_LL_READ(obj->child_ll, i) - { - if(i->style_p == style_p || style_p == NULL) { - refresh_children_style(i); - lv_obj_refresh_style(i); - } - - report_style_mod_core(style_p, i); - } -} - -/** - * Recursively refresh the style of the children. Go deeper until a not NULL style is found - * because the NULL styles are inherited from the parent - * @param obj pointer to an object - */ -static void refresh_children_style(lv_obj_t * obj) -{ - lv_obj_t * child = lv_obj_get_child(obj, NULL); - while(child != NULL) { - if(child->style_p == NULL) { - refresh_children_style(child); /*Check children too*/ - lv_obj_refresh_style(child); /*Notify the child about the style change*/ - } else if(child->style_p->glass) { - /*Children with 'glass' parent might be effected if their style == NULL*/ - refresh_children_style(child); - } - child = lv_obj_get_child(obj, child); - } -} - -/** - * Called by 'lv_obj_del' to delete the children objects - * @param obj pointer to an object (all of its children will be deleted) - */ -static void delete_children(lv_obj_t * obj) -{ - lv_obj_t * i; - lv_obj_t * i_next; - i = lv_ll_get_head(&(obj->child_ll)); - - /*Remove from the group; remove before transversing children so that - * the object still has access to all children during the - * LV_SIGNAL_DEFOCUS call*/ -#if LV_USE_GROUP - lv_group_t * group = lv_obj_get_group(obj); - if(group) lv_group_remove_obj(obj); -#endif - - while(i != NULL) { - /*Get the next object before delete this*/ - i_next = lv_ll_get_next(&(obj->child_ll), i); - - /*Call the recursive del to the child too*/ - delete_children(i); - - /*Set i to the next node*/ - i = i_next; - } - - /*Let the suer free the resources used in `LV_EVENT_DELETE`*/ - lv_event_send(obj, LV_EVENT_DELETE, NULL); - - lv_event_mark_deleted(obj); - - /*Remove the animations from this object*/ -#if LV_USE_ANIMATION - lv_anim_del(obj, NULL); -#endif - - /* Reset the input devices if - * the object to delete is used*/ - lv_indev_t * indev = lv_indev_get_next(NULL); - while(indev) { - if(indev->proc.types.pointer.act_obj == obj || indev->proc.types.pointer.last_obj == obj) { - lv_indev_reset(indev); - } - - if(indev->proc.types.pointer.last_pressed == obj) { - indev->proc.types.pointer.last_pressed = NULL; - } -#if LV_USE_GROUP - if(indev->group == group && obj == lv_indev_get_obj_act()) { - lv_indev_reset(indev); - } -#endif - indev = lv_indev_get_next(indev); - } - - /* 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_rem(&(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; - - while(t) { - if(t->obj == obj) t->deleted = true; - t = t->prev; - } -} diff --git a/src/libs/lvgl/src/lv_core/lv_obj.h b/src/libs/lvgl/src/lv_core/lv_obj.h deleted file mode 100644 index 24517241..00000000 --- a/src/libs/lvgl/src/lv_core/lv_obj.h +++ /dev/null @@ -1,1025 +0,0 @@ -/** - * @file lv_obj.h - * - */ - -#ifndef LV_OBJ_H -#define LV_OBJ_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include <stddef.h> -#include <stdbool.h> -#include "lv_style.h" -#include "../lv_misc/lv_types.h" -#include "../lv_misc/lv_area.h" -#include "../lv_misc/lv_mem.h" -#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" - -/********************* - * DEFINES - *********************/ - -/*Error check of lv_conf.h*/ -#if LV_HOR_RES_MAX == 0 || LV_VER_RES_MAX == 0 -#error "LittlevGL: LV_HOR_RES_MAX and LV_VER_RES_MAX must be greater than 0" -#endif - -#if LV_ANTIALIAS > 1 -#error "LittlevGL: LV_ANTIALIAS can be only 0 or 1" -#endif - -#define LV_MAX_ANCESTOR_NUM 8 - -#define LV_EXT_CLICK_AREA_OFF 0 -#define LV_EXT_CLICK_AREA_TINY 1 -#define LV_EXT_CLICK_AREA_FULL 2 - -/********************** - * TYPEDEFS - **********************/ - -struct _lv_obj_t; - - -/** Design modes */ -enum { - LV_DESIGN_DRAW_MAIN, /**< Draw the main portion of the object */ - LV_DESIGN_DRAW_POST, /**< Draw extras on the object */ - LV_DESIGN_COVER_CHK, /**< Check if the object fully covers the 'mask_p' area */ -}; -typedef uint8_t lv_design_mode_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); - -enum { - LV_EVENT_PRESSED, /**< The object has been pressed*/ - LV_EVENT_PRESSING, /**< The object is being pressed (called continuously while pressing)*/ - LV_EVENT_PRESS_LOST, /**< User is still pressing but slid cursor/finger off of the object */ - LV_EVENT_SHORT_CLICKED, /**< User pressed object for a short period of time, then released it. Not called if dragged. */ - LV_EVENT_LONG_PRESSED, /**< Object has been pressed for at least `LV_INDEV_LONG_PRESS_TIME`. Not called if dragged.*/ - LV_EVENT_LONG_PRESSED_REPEAT, /**< Called after `LV_INDEV_LONG_PRESS_TIME` in every - `LV_INDEV_LONG_PRESS_REP_TIME` ms. Not called if dragged.*/ - LV_EVENT_CLICKED, /**< Called on release if not dragged (regardless to long press)*/ - LV_EVENT_RELEASED, /**< Called in every cases when the object has been released*/ - LV_EVENT_DRAG_BEGIN, - LV_EVENT_DRAG_END, - LV_EVENT_DRAG_THROW_BEGIN, - LV_EVENT_KEY, - LV_EVENT_FOCUSED, - LV_EVENT_DEFOCUSED, - LV_EVENT_VALUE_CHANGED, /**< The object's value has changed (i.e. slider moved) */ - LV_EVENT_INSERT, - LV_EVENT_REFRESH, - LV_EVENT_APPLY, /**< "Ok", "Apply" or similar specific button has clicked*/ - LV_EVENT_CANCEL, /**< "Close", "Cancel" or similar specific button has clicked*/ - LV_EVENT_DELETE, /**< Object is being deleted */ -}; -typedef uint8_t lv_event_t; /**< Type of event being sent to the object. */ - -/** - * @brief Event callback. - * Events are used to notify the user of some action being taken on the object. - * For details, see ::lv_event_t. - */ -typedef void (*lv_event_cb_t)(struct _lv_obj_t * obj, lv_event_t event); - -/** Signals are for use by the object itself or to extend the object's functionality. - * Applications should use ::lv_obj_set_event_cb to be notified of events that occur - * on the object. */ -enum { - /*General signals*/ - LV_SIGNAL_CLEANUP, /**< Object is being deleted */ - 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_BASE_DIR_CHG, /**<The base dir has changed*/ - LV_SIGNAL_REFR_EXT_DRAW_PAD, /**< Object's extra padding has changed */ - LV_SIGNAL_GET_TYPE, /**< LittlevGL needs to retrieve the object's type */ - - /*Input device related*/ - LV_SIGNAL_PRESSED, /**< The object has been pressed*/ - LV_SIGNAL_PRESSING, /**< The object is being pressed (called continuously while pressing)*/ - LV_SIGNAL_PRESS_LOST, /**< User is still pressing but slid cursor/finger off of the object */ - LV_SIGNAL_RELEASED, /**< User pressed object for a short period of time, then released it. Not called if dragged. */ - LV_SIGNAL_LONG_PRESS, /**< Object has been pressed for at least `LV_INDEV_LONG_PRESS_TIME`. Not called if dragged.*/ - LV_SIGNAL_LONG_PRESS_REP, /**< Called after `LV_INDEV_LONG_PRESS_TIME` in every `LV_INDEV_LONG_PRESS_REP_TIME` ms. Not called if dragged.*/ - LV_SIGNAL_DRAG_BEGIN, - LV_SIGNAL_DRAG_END, - - /*Group related*/ - LV_SIGNAL_FOCUS, - LV_SIGNAL_DEFOCUS, - LV_SIGNAL_CONTROL, - LV_SIGNAL_GET_EDITABLE, -}; -typedef uint8_t lv_signal_t; - -typedef lv_res_t (*lv_signal_cb_t)(struct _lv_obj_t * obj, lv_signal_t sign, void * param); - -/** Object alignment. */ -enum { - LV_ALIGN_CENTER = 0, - LV_ALIGN_IN_TOP_LEFT, - LV_ALIGN_IN_TOP_MID, - LV_ALIGN_IN_TOP_RIGHT, - LV_ALIGN_IN_BOTTOM_LEFT, - LV_ALIGN_IN_BOTTOM_MID, - LV_ALIGN_IN_BOTTOM_RIGHT, - LV_ALIGN_IN_LEFT_MID, - LV_ALIGN_IN_RIGHT_MID, - LV_ALIGN_OUT_TOP_LEFT, - LV_ALIGN_OUT_TOP_MID, - LV_ALIGN_OUT_TOP_RIGHT, - LV_ALIGN_OUT_BOTTOM_LEFT, - LV_ALIGN_OUT_BOTTOM_MID, - LV_ALIGN_OUT_BOTTOM_RIGHT, - LV_ALIGN_OUT_LEFT_TOP, - LV_ALIGN_OUT_LEFT_MID, - LV_ALIGN_OUT_LEFT_BOTTOM, - LV_ALIGN_OUT_RIGHT_TOP, - LV_ALIGN_OUT_RIGHT_MID, - LV_ALIGN_OUT_RIGHT_BOTTOM, -}; -typedef uint8_t lv_align_t; - -#if LV_USE_OBJ_REALIGN -typedef struct -{ - const struct _lv_obj_t * base; - lv_coord_t xofs; - lv_coord_t yofs; - lv_align_t align; - uint8_t auto_realign : 1; - uint8_t origo_align : 1; /**< 1: the origo (center of the object) was aligned with - `lv_obj_align_origo`*/ -} lv_reailgn_t; -#endif - -enum { - LV_DRAG_DIR_HOR = 0x1, /**< Object can be dragged horizontally. */ - LV_DRAG_DIR_VER = 0x2, /**< Object can be dragged vertically. */ - LV_DRAG_DIR_ALL = 0x3, /**< Object can be dragged in all directions. */ -}; - -typedef uint8_t lv_drag_dir_t; - -typedef struct _lv_obj_t -{ - struct _lv_obj_t * par; /**< Pointer to the parent object*/ - lv_ll_t child_ll; /**< Linked list to store the children objects*/ - - lv_area_t coords; /**< Coordinates of the object (x1, y1, x2, y2)*/ - - lv_event_cb_t event_cb; /**< Event callback function */ - lv_signal_cb_t signal_cb; /**< Object type specific signal function*/ - lv_design_cb_t design_cb; /**< Object type specific design function*/ - - void * ext_attr; /**< Object type specific extended data*/ - const lv_style_t * style_p; /**< Pointer to the object's style*/ - -#if LV_USE_GROUP != 0 - void * group_p; /**< Pointer to the group of the object*/ -#endif - -#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_TINY - uint8_t ext_click_pad_hor; /**< Extra click padding in horizontal direction */ - uint8_t ext_click_pad_ver; /**< Extra click padding in vertical direction */ -#endif - -#if LV_USE_EXT_CLICK_AREA == LV_EXT_CLICK_AREA_FULL - lv_area_t ext_click_pad; /**< Extra click padding area. */ -#endif - - /*Attributes and states*/ - uint8_t click : 1; /**< 1: Can be pressed by an input device*/ - uint8_t drag : 1; /**< 1: Enable the dragging*/ - uint8_t drag_throw : 1; /**< 1: Enable throwing with drag*/ - uint8_t drag_parent : 1; /**< 1: Parent will be dragged instead*/ - uint8_t hidden : 1; /**< 1: Object is hidden*/ - uint8_t top : 1; /**< 1: If the object or its children is clicked it goes to the foreground*/ - uint8_t opa_scale_en : 1; /**< 1: opa_scale is set*/ - uint8_t parent_event : 1; /**< 1: Send the object's events to the parent too. */ - lv_drag_dir_t drag_dir : 2; /**< Which directions the object can be dragged in */ - lv_bidi_dir_t base_dir : 2; /**< Base direction of texts related to this object */ - uint8_t reserved : 3; /**< Reserved for future use*/ - uint8_t protect; /**< Automatically happening actions can be prevented. 'OR'ed values from - `lv_protect_t`*/ - lv_opa_t opa_scale; /**< Scale down the opacity by this factor. Effects all children as well*/ - - lv_coord_t ext_draw_pad; /**< EXTtend the size in every direction for drawing. */ - -#if LV_USE_OBJ_REALIGN - lv_reailgn_t realign; /**< Information about the last call to ::lv_obj_align. */ -#endif - -#if LV_USE_USER_DATA - lv_obj_user_data_t user_data; /**< Custom user data for object. */ -#endif - -} lv_obj_t; - -/*Protect some attributes (max. 8 bit)*/ -enum { - LV_PROTECT_NONE = 0x00, - LV_PROTECT_CHILD_CHG = 0x01, /**< Disable the child change signal. Used by the library*/ - LV_PROTECT_PARENT = 0x02, /**< Prevent automatic parent change (e.g. in lv_page)*/ - LV_PROTECT_POS = 0x04, /**< Prevent automatic positioning (e.g. in lv_cont layout)*/ - LV_PROTECT_FOLLOW = 0x08, /**< Prevent the object be followed in automatic ordering (e.g. in - lv_cont PRETTY layout)*/ - LV_PROTECT_PRESS_LOST = 0x10, /**< If the `indev` was pressing this object but swiped out while - pressing do not search other object.*/ - LV_PROTECT_CLICK_FOCUS = 0x20, /**< Prevent focusing the object by clicking on it*/ -}; -typedef uint8_t lv_protect_t; - -/** Used by `lv_obj_get_type()`. The object's and its ancestor types are stored here*/ -typedef struct -{ - const char * type[LV_MAX_ANCESTOR_NUM]; /**< [0]: the actual type, [1]: ancestor, [2] #1's ancestor - ... [x]: "lv_obj" */ -} lv_obj_type_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Init. the 'lv' library. - */ -void lv_init(void); - - -/** - * Deinit the 'lv' library - * Currently only implemented when not using custorm allocators, or GC is enabled. - */ -#if LV_ENABLE_GC || !LV_MEM_CUSTOM -void lv_deinit(void); -#endif - -/*-------------------- - * Create and delete - *-------------------*/ - -/** - * Create a basic object - * @param parent pointer to a parent object. - * If NULL then a screen will be created - * @param copy pointer to a base object, if not NULL then the new object will be copied from it - * @return pointer to the new object - */ -lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy); - -/** - * Delete 'obj' and all of its children - * @param obj pointer to an object to delete - * @return LV_RES_INV because the object is deleted - */ -lv_res_t lv_obj_del(lv_obj_t * obj); - -/** - * Helper function for asynchronously deleting objects. - * Useful for cases where you can't delete an object directly in an `LV_EVENT_DELETE` handler (i.e. parent). - * @param obj object to delete - * @see lv_async_call - */ -void lv_obj_del_async(struct _lv_obj_t *obj); - -/** - * Delete all children of an object - * @param obj pointer to an object - */ -void lv_obj_clean(lv_obj_t * obj); - - -/** - * Mark an area of an object as invalid. - * This area will be redrawn by 'lv_refr_task' - * @param obj pointer to an object - * @param area the area to redraw - */ -void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area); - -/** - * Mark the object as invalid therefore its current position will be redrawn by 'lv_refr_task' - * @param obj pointer to an object - */ -void lv_obj_invalidate(const lv_obj_t * obj); - -/*===================== - * Setter functions - *====================*/ - -/*-------------------- - * Parent/children set - *--------------------*/ - -/** - * Set a new parent for an object. Its relative position will be the same. - * @param obj pointer to an object. Can't be a screen. - * @param parent pointer to the new parent object. (Can't be NULL) - */ -void lv_obj_set_parent(lv_obj_t * obj, lv_obj_t * parent); - -/** - * Move and object to the foreground - * @param obj pointer to an object - */ -void lv_obj_move_foreground(lv_obj_t * obj); - -/** - * Move and object to the background - * @param obj pointer to an object - */ -void lv_obj_move_background(lv_obj_t * obj); - -/*-------------------- - * Coordinate set - * ------------------*/ - -/** - * Set relative the position of an object (relative to the parent) - * @param obj pointer to an object - * @param x new distance from the left side of the parent - * @param y new distance from the top of the parent - */ -void lv_obj_set_pos(lv_obj_t * obj, lv_coord_t x, lv_coord_t y); - -/** - * Set the x coordinate of a object - * @param obj pointer to an object - * @param x new distance from the left side from the parent - */ -void lv_obj_set_x(lv_obj_t * obj, lv_coord_t x); - -/** - * Set the y coordinate of a object - * @param obj pointer to an object - * @param y new distance from the top of the parent - */ -void lv_obj_set_y(lv_obj_t * obj, lv_coord_t y); - -/** - * Set the size of an object - * @param obj pointer to an object - * @param w new width - * @param h new height - */ -void lv_obj_set_size(lv_obj_t * obj, lv_coord_t w, lv_coord_t h); - -/** - * Set the width of an object - * @param obj pointer to an object - * @param w new width - */ -void lv_obj_set_width(lv_obj_t * obj, lv_coord_t w); - -/** - * Set the height of an object - * @param obj pointer to an object - * @param h new height - */ -void lv_obj_set_height(lv_obj_t * obj, lv_coord_t h); - -/** - * Align an object to an other object. - * @param obj pointer to an object to align - * @param base pointer to an object (if NULL the parent is used). 'obj' will be aligned to it. - * @param align type of alignment (see 'lv_align_t' enum) - * @param x_mod x coordinate shift after alignment - * @param y_mod y coordinate shift after alignment - */ -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); - -/** - * Align an object to an other object. - * @param obj pointer to an object to align - * @param base pointer to an object (if NULL the parent is used). 'obj' will be aligned to it. - * @param align type of alignment (see 'lv_align_t' enum) - * @param x_mod x coordinate shift after alignment - * @param y_mod y coordinate shift after alignment - */ -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); - -/** - * Realign the object based on the last `lv_obj_align` parameters. - * @param obj pointer to an object - */ -void lv_obj_realign(lv_obj_t * obj); - -/** - * Enable the automatic realign of the object when its size has changed based on the last - * `lv_obj_align` parameters. - * @param obj pointer to an object - * @param en true: enable auto realign; false: disable auto realign - */ -void lv_obj_set_auto_realign(lv_obj_t * obj, bool en); - -/** - * Set the size of an extended clickable area - * @param obj pointer to an object - * @param left extended clickable are on the left [px] - * @param right extended clickable are on the right [px] - * @param top extended clickable are on the top [px] - * @param bottom extended clickable are on the bottom [px] - */ -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); - -/*--------------------- - * Appearance set - *--------------------*/ - -/** - * Set a new style for an object - * @param obj pointer to an object - * @param style_p pointer to the new style - */ -void lv_obj_set_style(lv_obj_t * obj, const lv_style_t * style); - -/** - * Notify an object about its style is modified - * @param obj pointer to an object - */ -void lv_obj_refresh_style(lv_obj_t * obj); - -/** - * Notify all object if a style is modified - * @param style pointer to a style. Only the objects with this style will be notified - * (NULL to notify all objects) - */ -void lv_obj_report_style_mod(lv_style_t * style); - -/*----------------- - * Attribute set - *----------------*/ - -/** - * Hide an object. It won't be visible and clickable. - * @param obj pointer to an object - * @param en true: hide the object - */ -void lv_obj_set_hidden(lv_obj_t * obj, bool en); - -/** - * Enable or disable the clicking of an object - * @param obj pointer to an object - * @param en true: make the object clickable - */ -void lv_obj_set_click(lv_obj_t * obj, bool en); - -/** - * Enable to bring this object to the foreground if it - * or any of its children is clicked - * @param obj pointer to an object - * @param en true: enable the auto top feature - */ -void lv_obj_set_top(lv_obj_t * obj, bool en); - -/** - * Enable the dragging of an object - * @param obj pointer to an object - * @param en true: make the object dragable - */ -void lv_obj_set_drag(lv_obj_t * obj, bool en); - -/** - * Set the directions an object can be dragged in - * @param obj pointer to an object - * @param drag_dir bitwise OR of allowed drag directions - */ -void lv_obj_set_drag_dir(lv_obj_t * obj, lv_drag_dir_t drag_dir); - -/** - * Enable the throwing of an object after is is dragged - * @param obj pointer to an object - * @param en true: enable the drag throw - */ -void lv_obj_set_drag_throw(lv_obj_t * obj, bool en); - -/** - * Enable to use parent for drag related operations. - * If trying to drag the object the parent will be moved instead - * @param obj pointer to an object - * @param en true: enable the 'drag parent' for the object - */ -void lv_obj_set_drag_parent(lv_obj_t * obj, bool en); - -/** - * Propagate the events to the parent too - * @param obj pointer to an object - * @param en true: enable the event propagation - */ -void lv_obj_set_parent_event(lv_obj_t * obj, bool en); - -void lv_obj_set_base_dir(lv_obj_t * obj, lv_bidi_dir_t dir); -/** - * Set the opa scale enable parameter (required to set opa_scale with `lv_obj_set_opa_scale()`) - * @param obj pointer to an object - * @param en true: opa scaling is enabled for this object and all children; false: no opa scaling - */ -void lv_obj_set_opa_scale_enable(lv_obj_t * obj, bool en); - -/** - * Set the opa scale of an object. - * The opacity of this object and all it's children will be scaled down with this factor. - * `lv_obj_set_opa_scale_enable(obj, true)` needs to be called to enable it. - * (not for all children just for the parent where to start the opa scaling) - * @param obj pointer to an object - * @param opa_scale a factor to scale down opacity [0..255] - */ -void lv_obj_set_opa_scale(lv_obj_t * obj, lv_opa_t opa_scale); - -/** - * Set a bit or bits in the protect filed - * @param obj pointer to an object - * @param prot 'OR'-ed values from `lv_protect_t` - */ -void lv_obj_set_protect(lv_obj_t * obj, uint8_t prot); - -/** - * Clear a bit or bits in the protect filed - * @param obj pointer to an object - * @param prot 'OR'-ed values from `lv_protect_t` - */ -void lv_obj_clear_protect(lv_obj_t * obj, uint8_t prot); - -/** - * Set a an event handler function for an object. - * Used by the user to react on event which happens with the object. - * @param obj pointer to an object - * @param event_cb the new event function - */ -void lv_obj_set_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb); - -/** - * Send an event to the object - * @param obj pointer to an object - * @param event the type of the event from `lv_event_t`. - * @param data arbitrary data depending on the object type and the event. (Usually `NULL`) - * @return LV_RES_OK: `obj` was not deleted in the event; LV_RES_INV: `obj` was deleted in the event - */ -lv_res_t lv_event_send(lv_obj_t * obj, lv_event_t event, const void * data); - -/** - * Call an event function with an object, event, and data. - * @param event_xcb an event callback function. If `NULL` `LV_RES_OK` will return without any actions. - * (the 'x' in the argument name indicates that its not a fully generic function because it not follows - * the `func_name(object, callback, ...)` convention) - * @param obj pointer to an object to associate with the event (can be `NULL` to simply call the `event_cb`) - * @param event an event - * @param data pointer to a custom data - * @return LV_RES_OK: `obj` was not deleted in the event; LV_RES_INV: `obj` was deleted in the event - */ -lv_res_t lv_event_send_func(lv_event_cb_t event_xcb, lv_obj_t * obj, lv_event_t event, const void * data); - -/** - * Get the `data` parameter of the current event - * @return the `data` parameter - */ -const void * lv_event_get_data(void); - -/** - * Set the a signal function of an object. Used internally by the library. - * Always call the previous signal function in the new. - * @param obj pointer to an object - * @param signal_cb the new signal function - */ -void lv_obj_set_signal_cb(lv_obj_t * obj, lv_signal_cb_t signal_cb); - -/** - * Send an event to the object - * @param obj pointer to an object - * @param event the type of the event from `lv_event_t`. - */ -void lv_signal_send(lv_obj_t * obj, lv_signal_t signal, void * param); - -/** - * Set a new design function for an object - * @param obj pointer to an object - * @param design_cb the new design function - */ -void lv_obj_set_design_cb(lv_obj_t * obj, lv_design_cb_t design_cb); - -/*---------------- - * Other set - *--------------*/ - -/** - * 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 pointer to the allocated ext - */ -void * lv_obj_allocate_ext_attr(lv_obj_t * obj, uint16_t ext_size); - -/** - * Send a 'LV_SIGNAL_REFR_EXT_SIZE' signal to the object - * @param obj pointer to an object - */ -void lv_obj_refresh_ext_draw_pad(lv_obj_t * obj); - -/*======================= - * Getter functions - *======================*/ - -/** - * Return with the screen of an object - * @param obj pointer to an object - * @return pointer to a screen - */ -lv_obj_t * lv_obj_get_screen(const lv_obj_t * obj); - -/** - * Get the display of an object - * @param scr pointer to an object - * @return pointer the object's display - */ -lv_disp_t * lv_obj_get_disp(const lv_obj_t * obj); - -/*--------------------- - * Parent/children get - *--------------------*/ - -/** - * Returns with the parent of an object - * @param obj pointer to an object - * @return pointer to the parent of 'obj' - */ -lv_obj_t * lv_obj_get_parent(const lv_obj_t * obj); - -/** - * Iterate through the children of an object (start from the "youngest, lastly created") - * @param obj pointer to an object - * @param child NULL at first call to get the next children - * and the previous return value later - * @return the child after 'act_child' or NULL if no more child - */ -lv_obj_t * lv_obj_get_child(const lv_obj_t * obj, const lv_obj_t * child); - -/** - * Iterate through the children of an object (start from the "oldest", firstly created) - * @param obj pointer to an object - * @param child NULL at first call to get the next children - * and the previous return value later - * @return the child after 'act_child' or NULL if no more child - */ -lv_obj_t * lv_obj_get_child_back(const lv_obj_t * obj, const lv_obj_t * child); - -/** - * Count the children of an object (only children directly on 'obj') - * @param obj pointer to an object - * @return children number of 'obj' - */ -uint16_t lv_obj_count_children(const lv_obj_t * obj); - -/** Recursively count the children of an object - * @param obj pointer to an object - * @return children number of 'obj' - */ -uint16_t lv_obj_count_children_recursive(const lv_obj_t * obj); - -/*--------------------- - * Coordinate get - *--------------------*/ - -/** - * Copy the coordinates of an object to an area - * @param obj pointer to an object - * @param cords_p pointer to an area to store the coordinates - */ -void lv_obj_get_coords(const lv_obj_t * obj, lv_area_t * cords_p); - -/** - * Reduce area retried by `lv_obj_get_coords()` the get graphically usable area of an object. - * (Without the size of the border or other extra graphical elements) - * @param coords_p store the result area here - */ -void lv_obj_get_inner_coords(const lv_obj_t * obj, lv_area_t * coords_p); - -/** - * Get the x coordinate of object - * @param obj pointer to an object - * @return distance of 'obj' from the left side of its parent - */ -lv_coord_t lv_obj_get_x(const lv_obj_t * obj); - -/** - * Get the y coordinate of object - * @param obj pointer to an object - * @return distance of 'obj' from the top of its parent - */ -lv_coord_t lv_obj_get_y(const lv_obj_t * obj); - -/** - * Get the width of an object - * @param obj pointer to an object - * @return the width - */ -lv_coord_t lv_obj_get_width(const lv_obj_t * obj); - -/** - * Get the height of an object - * @param obj pointer to an object - * @return the height - */ -lv_coord_t lv_obj_get_height(const lv_obj_t * obj); - -/** - * Get that width reduced by the left and right padding. - * @param obj pointer to an object - * @return the width which still fits into the container - */ -lv_coord_t lv_obj_get_width_fit(const lv_obj_t * obj); - -/** - * Get that height reduced by the top an bottom padding. - * @param obj pointer to an object - * @return the height which still fits into the container - */ -lv_coord_t lv_obj_get_height_fit(const lv_obj_t * obj); - -/** - * Get the automatic realign property of the object. - * @param obj pointer to an object - * @return true: auto realign is enabled; false: auto realign is disabled - */ -bool lv_obj_get_auto_realign(const lv_obj_t * obj); - -/** - * Get the left padding of extended clickable area - * @param obj pointer to an object - * @return the extended left padding - */ -lv_coord_t lv_obj_get_ext_click_pad_left(const lv_obj_t * obj); - -/** - * Get the right padding of extended clickable area - * @param obj pointer to an object - * @return the extended right padding - */ -lv_coord_t lv_obj_get_ext_click_pad_right(const lv_obj_t * obj); - -/** - * Get the top padding of extended clickable area - * @param obj pointer to an object - * @return the extended top padding - */ -lv_coord_t lv_obj_get_ext_click_pad_top(const lv_obj_t * obj); - -/** - * Get the bottom padding of extended clickable area - * @param obj pointer to an object - * @return the extended bottom padding - */ -lv_coord_t lv_obj_get_ext_click_pad_bottom(const lv_obj_t * obj); - -/** - * Get the extended size attribute of an object - * @param obj pointer to an object - * @return the extended size attribute - */ -lv_coord_t lv_obj_get_ext_draw_pad(const lv_obj_t * obj); - -/*----------------- - * Appearance get - *---------------*/ - -/** - * Get the style pointer of an object (if NULL get style of the parent) - * @param obj pointer to an object - * @return pointer to a style - */ -const lv_style_t * lv_obj_get_style(const lv_obj_t * obj); - -/*----------------- - * Attribute get - *----------------*/ - -/** - * Get the hidden attribute of an object - * @param obj pointer to an object - * @return true: the object is hidden - */ -bool lv_obj_get_hidden(const lv_obj_t * obj); - -/** - * Get the click enable attribute of an object - * @param obj pointer to an object - * @return true: the object is clickable - */ -bool lv_obj_get_click(const lv_obj_t * obj); - -/** - * Get the top enable attribute of an object - * @param obj pointer to an object - * @return true: the auto top feature is enabled - */ -bool lv_obj_get_top(const lv_obj_t * obj); - -/** - * Get the drag enable attribute of an object - * @param obj pointer to an object - * @return true: the object is dragable - */ -bool lv_obj_get_drag(const lv_obj_t * obj); - -/** - * Get the directions an object can be dragged - * @param obj pointer to an object - * @return bitwise OR of allowed directions an object can be dragged in - */ -lv_drag_dir_t lv_obj_get_drag_dir(const lv_obj_t * obj); - -/** - * Get the drag throw enable attribute of an object - * @param obj pointer to an object - * @return true: drag throw is enabled - */ -bool lv_obj_get_drag_throw(const lv_obj_t * obj); - -/** - * Get the drag parent attribute of an object - * @param obj pointer to an object - * @return true: drag parent is enabled - */ -bool lv_obj_get_drag_parent(const lv_obj_t * obj); - -/** - * Get the drag parent attribute of an object - * @param obj pointer to an object - * @return true: drag parent is enabled - */ -bool lv_obj_get_parent_event(const lv_obj_t * obj); - - -lv_bidi_dir_t lv_obj_get_base_dir(const lv_obj_t * obj); - -/** - * Get the opa scale enable parameter - * @param obj pointer to an object - * @return true: opa scaling is enabled for this object and all children; false: no opa scaling - */ -lv_opa_t lv_obj_get_opa_scale_enable(const lv_obj_t * obj); - -/** - * Get the opa scale parameter of an object - * @param obj pointer to an object - * @return opa scale [0..255] - */ -lv_opa_t lv_obj_get_opa_scale(const lv_obj_t * obj); - -/** - * Get the protect field of an object - * @param obj pointer to an object - * @return protect field ('OR'ed values of `lv_protect_t`) - */ -uint8_t lv_obj_get_protect(const lv_obj_t * obj); - -/** - * Check at least one bit of a given protect bitfield is set - * @param obj pointer to an object - * @param prot protect bits to test ('OR'ed values of `lv_protect_t`) - * @return false: none of the given bits are set, true: at least one bit is set - */ -bool lv_obj_is_protected(const lv_obj_t * obj, uint8_t prot); - -/** - * Get the signal function of an object - * @param obj pointer to an object - * @return the signal function - */ -lv_signal_cb_t lv_obj_get_signal_cb(const lv_obj_t * obj); - -/** - * Get the design function of an object - * @param obj pointer to an object - * @return the design function - */ -lv_design_cb_t lv_obj_get_design_cb(const lv_obj_t * obj); - -/** - * Get the event function of an object - * @param obj pointer to an object - * @return the event function - */ -lv_event_cb_t lv_obj_get_event_cb(const lv_obj_t * obj); - -/*------------------ - * Other get - *-----------------*/ - -/** - * Get the ext pointer - * @param obj pointer to an object - * @return the ext pointer but not the dynamic version - * Use it as ext->data1, and NOT da(ext)->data1 - */ -void * lv_obj_get_ext_attr(const lv_obj_t * obj); - -/** - * Get object's and its ancestors type. Put their name in `type_buf` starting with the current type. - * E.g. buf.type[0]="lv_btn", buf.type[1]="lv_cont", buf.type[2]="lv_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(const lv_obj_t * obj, lv_obj_type_t * buf); - -#if LV_USE_USER_DATA -/** - * Get the object's user data - * @param obj pointer to an object - * @return user data - */ -lv_obj_user_data_t lv_obj_get_user_data(const lv_obj_t * obj); - -/** - * Get a pointer to the object's user data - * @param obj pointer to an object - * @return pointer to the user data - */ -lv_obj_user_data_t * lv_obj_get_user_data_ptr(const lv_obj_t * obj); - -/** - * Set the object's user data. The data will be copied. - * @param obj pointer to an object - * @param data user data - */ -void lv_obj_set_user_data(lv_obj_t * obj, lv_obj_user_data_t data); - -#endif - -#if LV_USE_GROUP -/** - * Get the group of the object - * @param obj pointer to an object - * @return the pointer to group of the object - */ -void * lv_obj_get_group(const lv_obj_t * obj); - -/** - * Tell whether the object is the focused object of a group or not. - * @param obj pointer to an object - * @return true: the object is focused, false: the object is not focused or not in a group - */ -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 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); - -/********************** - * MACROS - **********************/ - -/** - * Helps to quickly declare an event callback function. - * Will be expanded to: `void <name> (lv_obj_t * obj, lv_event_t e)` - * - * Examples: - * static LV_EVENT_CB_DECLARE(my_event1); //Protoype declaration - * - * static LV_EVENT_CB_DECLARE(my_event1) - * { - * if(e == LV_EVENT_CLICKED) { - * lv_obj_set_hidden(obj ,true); - * } - * } - */ -#define LV_EVENT_CB_DECLARE(name) void name(lv_obj_t * obj, lv_event_t e) - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_OBJ_H*/ diff --git a/src/libs/lvgl/src/lv_core/lv_refr.c b/src/libs/lvgl/src/lv_core/lv_refr.c deleted file mode 100644 index e71e1629..00000000 --- a/src/libs/lvgl/src/lv_core/lv_refr.c +++ /dev/null @@ -1,612 +0,0 @@ -/** - * @file lv_refr.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include <stddef.h> -#include "lv_refr.h" -#include "lv_disp.h" -#include "../lv_hal/lv_hal_tick.h" -#include "../lv_hal/lv_hal_disp.h" -#include "../lv_misc/lv_task.h" -#include "../lv_misc/lv_mem.h" -#include "../lv_misc/lv_gc.h" -#include "../lv_draw/lv_draw.h" - -#if defined(LV_GC_INCLUDE) -#include LV_GC_INCLUDE -#endif /* LV_ENABLE_GC */ - -/********************* - * DEFINES - *********************/ -/* Draw translucent random colored areas on the invalidated (redrawn) areas*/ -#define MASK_AREA_DEBUG 0 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lv_refr_join_area(void); -static void lv_refr_areas(void); -static void lv_refr_area(const lv_area_t * area_p); -static void lv_refr_area_part(const lv_area_t * area_p); -static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj); -static void lv_refr_obj_and_children(lv_obj_t * top_p, const lv_area_t * mask_p); -static void lv_refr_obj(lv_obj_t * obj, const lv_area_t * mask_ori_p); -static void lv_refr_vdb_flush(void); - -/********************** - * STATIC VARIABLES - **********************/ -static uint32_t px_num; -static lv_disp_t * disp_refr; /*Display being refreshed*/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the screen refresh subsystem - */ -void lv_refr_init(void) -{ - /*Nothing to do*/ -} - -/** - * Redraw the invalidated areas now. - * Normally the redrawing is periodically executed in `lv_task_handler` but a long blocking process - * can prevent the call of `lv_task_handler`. In this case if the the GUI is updated in the process - * (e.g. progress bar) this function can be called when the screen should be updated. - * @param disp pointer to display to refresh. NULL to refresh all displays. - */ -void lv_refr_now(lv_disp_t * disp) -{ - if(disp) { - lv_disp_refr_task(disp->refr_task); - } else { - lv_disp_t * d; - d = lv_disp_get_next(NULL); - while(d) { - lv_disp_refr_task(d->refr_task); - d = lv_disp_get_next(d); - } - } -} - -/** - * Invalidate an area on display to redraw it - * @param area_p pointer to area which should be invalidated (NULL: delete the invalidated areas) - * @param disp pointer to display where the area should be invalidated (NULL can be used if there is - * only one display) - */ -void lv_inv_area(lv_disp_t * disp, const lv_area_t * area_p) -{ - if(!disp) disp = lv_disp_get_default(); - if(!disp) return; - - /*Clear the invalidate buffer if the parameter is NULL*/ - if(area_p == NULL) { - disp->inv_p = 0; - return; - } - - lv_area_t scr_area; - scr_area.x1 = 0; - scr_area.y1 = 0; - scr_area.x2 = lv_disp_get_hor_res(disp) - 1; - scr_area.y2 = lv_disp_get_ver_res(disp) - 1; - - lv_area_t com_area; - bool suc; - - suc = lv_area_intersect(&com_area, area_p, &scr_area); - - /*The area is truncated to the screen*/ - if(suc != false) { - if(disp->driver.rounder_cb) disp->driver.rounder_cb(&disp->driver, &com_area); - - /*Save only if this area is not in one of the saved areas*/ - uint16_t i; - for(i = 0; i < disp->inv_p; i++) { - if(lv_area_is_in(&com_area, &disp->inv_areas[i]) != false) return; - } - - /*Save the area*/ - if(disp->inv_p < LV_INV_BUF_SIZE) { - lv_area_copy(&disp->inv_areas[disp->inv_p], &com_area); - } else { /*If no place for the area add the screen*/ - disp->inv_p = 0; - lv_area_copy(&disp->inv_areas[disp->inv_p], &scr_area); - } - disp->inv_p++; - } -} - -/** - * Get the display which is being refreshed - * @return the display being refreshed - */ -lv_disp_t * lv_refr_get_disp_refreshing(void) -{ - return disp_refr; -} - -/** - * Set the display which is being refreshed. - * It shouldn1t be used directly by the user. - * It can be used to trick the drawing functions about there is an active display. - * @param the display being refreshed - */ -void lv_refr_set_disp_refreshing(lv_disp_t * disp) -{ - disp_refr = disp; -} - -/** - * Called periodically to handle the refreshing - * @param task pointer to the task itself - */ -void lv_disp_refr_task(lv_task_t * task) -{ - LV_LOG_TRACE("lv_refr_task: started"); - - uint32_t start = lv_tick_get(); - - disp_refr = task->user_data; - - lv_refr_join_area(); - - lv_refr_areas(); - - /*If refresh happened ...*/ - if(disp_refr->inv_p != 0) { - /*In true double buffered mode copy the refreshed areas to the new VDB to keep it up to - * date*/ - if(lv_disp_is_true_double_buf(disp_refr)) { - lv_disp_buf_t * vdb = lv_disp_get_buf(disp_refr); - - /*Flush the content of the VDB*/ - lv_refr_vdb_flush(); - - /* With true double buffering the flushing should be only the address change of the - * current frame buffer. Wait until the address change is ready and copy the changed - * content to the other frame buffer (new active VDB) to keep the buffers synchronized*/ - while(vdb->flushing) - ; - - uint8_t * buf_act = (uint8_t *)vdb->buf_act; - uint8_t * buf_ina = (uint8_t *)vdb->buf_act == vdb->buf1 ? vdb->buf2 : vdb->buf1; - - lv_coord_t hres = lv_disp_get_hor_res(disp_refr); - uint16_t a; - for(a = 0; a < disp_refr->inv_p; a++) { - if(disp_refr->inv_area_joined[a] == 0) { - lv_coord_t y; - uint32_t start_offs = - (hres * disp_refr->inv_areas[a].y1 + disp_refr->inv_areas[a].x1) * sizeof(lv_color_t); - uint32_t line_length = lv_area_get_width(&disp_refr->inv_areas[a]) * sizeof(lv_color_t); - - for(y = disp_refr->inv_areas[a].y1; y <= disp_refr->inv_areas[a].y2; y++) { - memcpy(buf_act + start_offs, buf_ina + start_offs, line_length); - start_offs += hres * sizeof(lv_color_t); - } - } - } - } /*End of true double buffer handling*/ - - /*Clean up*/ - memset(disp_refr->inv_areas, 0, sizeof(disp_refr->inv_areas)); - memset(disp_refr->inv_area_joined, 0, sizeof(disp_refr->inv_area_joined)); - disp_refr->inv_p = 0; - - /*Call monitor cb if present*/ - if(disp_refr->driver.monitor_cb) { - disp_refr->driver.monitor_cb(&disp_refr->driver, lv_tick_elaps(start), px_num); - } - } - - lv_draw_free_buf(); - - LV_LOG_TRACE("lv_refr_task: ready"); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Join the areas which has got common parts - */ -static void lv_refr_join_area(void) -{ - uint32_t join_from; - uint32_t join_in; - lv_area_t joined_area; - for(join_in = 0; join_in < disp_refr->inv_p; join_in++) { - if(disp_refr->inv_area_joined[join_in] != 0) continue; - - /*Check all areas to join them in 'join_in'*/ - for(join_from = 0; join_from < disp_refr->inv_p; join_from++) { - /*Handle only unjoined areas and ignore itself*/ - if(disp_refr->inv_area_joined[join_from] != 0 || join_in == join_from) { - continue; - } - - /*Check if the areas are on each other*/ - if(lv_area_is_on(&disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]) == false) { - continue; - } - - lv_area_join(&joined_area, &disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]); - - /*Join two area only if the joined area size is smaller*/ - if(lv_area_get_size(&joined_area) < (lv_area_get_size(&disp_refr->inv_areas[join_in]) + - lv_area_get_size(&disp_refr->inv_areas[join_from]))) { - lv_area_copy(&disp_refr->inv_areas[join_in], &joined_area); - - /*Mark 'join_form' is joined into 'join_in'*/ - disp_refr->inv_area_joined[join_from] = 1; - } - } - } -} - -/** - * Refresh the joined areas - */ -static void lv_refr_areas(void) -{ - px_num = 0; - uint32_t i; - - for(i = 0; i < disp_refr->inv_p; i++) { - /*Refresh the unjoined areas*/ - if(disp_refr->inv_area_joined[i] == 0) { - - lv_refr_area(&disp_refr->inv_areas[i]); - - if(disp_refr->driver.monitor_cb) px_num += lv_area_get_size(&disp_refr->inv_areas[i]); - } - } -} - -/** - * Refresh an area if there is Virtual Display Buffer - * @param area_p pointer to an area to refresh - */ -static void lv_refr_area(const lv_area_t * area_p) -{ - /*True double buffering: there are two screen sized buffers. Just redraw directly into a - * buffer*/ - if(lv_disp_is_true_double_buf(disp_refr)) { - lv_disp_buf_t * vdb = lv_disp_get_buf(disp_refr); - vdb->area.x1 = 0; - vdb->area.x2 = lv_disp_get_hor_res(disp_refr) - 1; - vdb->area.y1 = 0; - vdb->area.y2 = lv_disp_get_ver_res(disp_refr) - 1; - lv_refr_area_part(area_p); - } - /*The buffer is smaller: refresh the area in parts*/ - else { - lv_disp_buf_t * vdb = lv_disp_get_buf(disp_refr); - /*Calculate the max row num*/ - lv_coord_t w = lv_area_get_width(area_p); - lv_coord_t h = lv_area_get_height(area_p); - lv_coord_t y2 = - area_p->y2 >= lv_disp_get_ver_res(disp_refr) ? y2 = lv_disp_get_ver_res(disp_refr) - 1 : area_p->y2; - - int32_t max_row = (uint32_t)vdb->size / w; - - if(max_row > h) max_row = h; - - /*Round down the lines of VDB if rounding is added*/ - if(disp_refr->driver.rounder_cb) { - lv_area_t tmp; - tmp.x1 = 0; - tmp.x2 = 0; - tmp.y1 = 0; - - lv_coord_t h_tmp = max_row; - do { - tmp.y2 = h_tmp - 1; - disp_refr->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*/ - h_tmp--; - } while(h_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; - } else { - max_row = tmp.y2 + 1; - } - } - - if (disp_refr->render_direction) { - /*Always use the full row*/ - lv_coord_t row; - lv_coord_t row_last = y2; - for(row = area_p->y2; row > max_row - 1 + area_p->y1; row -= max_row) { - /*Calc. the next y coordinates of VDB*/ - vdb->area.x1 = area_p->x1; - vdb->area.x2 = area_p->x2; - vdb->area.y1 = row - max_row + 1; - vdb->area.y2 = row; - if(vdb->area.y2 > y2) vdb->area.y2 = y2; - row_last = vdb->area.y1; - lv_refr_area_part(area_p); - } - - /*If the last (first) y coordinates are not handled yet ...*/ - if(area_p->y1 != row_last) { - /*Calc. the next y coordinates of VDB*/ - vdb->area.x1 = area_p->x1; - vdb->area.x2 = area_p->x2; - vdb->area.y1 = area_p->y1; - vdb->area.y2 = row; - - /*Refresh this part too*/ - lv_refr_area_part(area_p); - } - } - else { - /*Always use the full row*/ - lv_coord_t row; - lv_coord_t row_last = 0; - for(row = area_p->y1; row + max_row - 1 <= y2; row += max_row) { - /*Calc. the next y coordinates of VDB*/ - vdb->area.x1 = area_p->x1; - vdb->area.x2 = area_p->x2; - vdb->area.y1 = row; - vdb->area.y2 = row + max_row - 1; - if(vdb->area.y2 > y2) vdb->area.y2 = y2; - row_last = vdb->area.y2; - lv_refr_area_part(area_p); - } - - /*If the last y coordinates are not handled yet ...*/ - if(y2 != row_last) { - /*Calc. the next y coordinates of VDB*/ - vdb->area.x1 = area_p->x1; - vdb->area.x2 = area_p->x2; - vdb->area.y1 = row; - vdb->area.y2 = y2; - - /*Refresh this part too*/ - lv_refr_area_part(area_p); - } - } - } -} - -/** - * Refresh a part of an area which is on the actual Virtual Display Buffer - * @param area_p pointer to an area to refresh - */ -static void lv_refr_area_part(const lv_area_t * area_p) -{ - - lv_disp_buf_t * vdb = lv_disp_get_buf(disp_refr); - - /*In non double buffered mode, before rendering the next part wait until the previous image is - * flushed*/ - if(lv_disp_is_double_buf(disp_refr) == false) { - while(vdb->flushing) - ; - } - - lv_obj_t * top_p; - - /*Get the new mask from the original area and the act. VDB - It will be a part of 'area_p'*/ - lv_area_t start_mask; - lv_area_intersect(&start_mask, area_p, &vdb->area); - - /*Get the most top object which is not covered by others*/ - top_p = lv_refr_get_top_obj(&start_mask, lv_disp_get_scr_act(disp_refr)); - - /*Do the refreshing from the top object*/ - lv_refr_obj_and_children(top_p, &start_mask); - - /*Also refresh top and sys layer unconditionally*/ - lv_refr_obj_and_children(lv_disp_get_layer_top(disp_refr), &start_mask); - lv_refr_obj_and_children(lv_disp_get_layer_sys(disp_refr), &start_mask); - - /* In true double buffered mode flush only once when all areas were rendered. - * In normal mode flush after every area */ - if(lv_disp_is_true_double_buf(disp_refr) == false) { - lv_refr_vdb_flush(); - } -} - -/** - * Search the most top object which fully covers an area - * @param area_p pointer to an area - * @param obj the first object to start the searching (typically a screen) - * @return - */ -static lv_obj_t * lv_refr_get_top_obj(const lv_area_t * area_p, lv_obj_t * obj) -{ - lv_obj_t * found_p = NULL; - - /*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_obj_t * i; - LV_LL_READ(obj->child_ll, i) - { - found_p = lv_refr_get_top_obj(area_p, i); - - /*If a children is ok then break*/ - if(found_p != NULL) { - break; - } - } - - /*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) { - found_p = obj; - } - } - } - - return found_p; -} - -/** - * Make the refreshing from an object. Draw all its children and the youngers too. - * @param top_p pointer to an objects. Start the drawing from it. - * @param mask_p pointer to an area, the objects will be drawn only here - */ -static void lv_refr_obj_and_children(lv_obj_t * top_p, const lv_area_t * mask_p) -{ - /* Normally always will be a top_obj (at least the screen) - * but in special cases (e.g. if the screen has alpha) it won't. - * In this case use the screen directly */ - if(top_p == NULL) top_p = lv_disp_get_scr_act(disp_refr); - - /*Refresh the top object and its children*/ - lv_refr_obj(top_p, mask_p); - - /*Draw the 'younger' sibling objects because they can be on top_obj */ - lv_obj_t * par; - lv_obj_t * border_p = top_p; - - par = lv_obj_get_parent(top_p); - - /*Do until not reach the screen*/ - while(par != NULL) { - /*object before border_p has to be redrawn*/ - lv_obj_t * i = lv_ll_get_prev(&(par->child_ll), border_p); - - while(i != NULL) { - /*Refresh the objects*/ - lv_refr_obj(i, mask_p); - i = lv_ll_get_prev(&(par->child_ll), i); - } - - /*Call the post draw design function of the parents of the to object*/ - par->design_cb(par, mask_p, LV_DESIGN_DRAW_POST); - - /*The new border will be there last parents, - *so the 'younger' brothers of parent will be refreshed*/ - border_p = par; - /*Go a level deeper*/ - par = lv_obj_get_parent(par); - } -} - -/** - * Refresh an object an all of its children. (Called recursively) - * @param obj pointer to an object to refresh - * @param mask_ori_p pointer to an area, the objects will be drawn only here - */ -static void lv_refr_obj(lv_obj_t * obj, const lv_area_t * mask_ori_p) -{ - /*Do not refresh hidden objects*/ - if(obj->hidden != 0) return; - - bool union_ok; /* Store the return value of area_union */ - /* Truncate the original mask to the coordinates of the parent - * because the parent and its children are visible only here */ - lv_area_t obj_mask; - lv_area_t obj_ext_mask; - lv_area_t obj_area; - lv_coord_t ext_size = obj->ext_draw_pad; - lv_obj_get_coords(obj, &obj_area); - obj_area.x1 -= ext_size; - obj_area.y1 -= ext_size; - obj_area.x2 += ext_size; - obj_area.y2 += ext_size; - union_ok = lv_area_intersect(&obj_ext_mask, mask_ori_p, &obj_area); - - /*Draw the parent and its children only if they ore on 'mask_parent'*/ - if(union_ok != false) { - - /* Redraw the object */ - obj->design_cb(obj, &obj_ext_mask, LV_DESIGN_DRAW_MAIN); - -#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); - debug_color.full *= 17; - debug_color.full += 0xA1; -#endif - /*Create a new 'obj_mask' without 'ext_size' because the children can't be visible there*/ - lv_obj_get_coords(obj, &obj_area); - union_ok = lv_area_intersect(&obj_mask, mask_ori_p, &obj_area); - if(union_ok != false) { - lv_area_t mask_child; /*Mask from obj and its child*/ - lv_obj_t * child_p; - lv_area_t child_area; - LV_LL_READ_BACK(obj->child_ll, child_p) - { - lv_obj_get_coords(child_p, &child_area); - ext_size = child_p->ext_draw_pad; - child_area.x1 -= ext_size; - child_area.y1 -= ext_size; - child_area.x2 += ext_size; - child_area.y2 += ext_size; - /* Get the union (common parts) of original mask (from obj) - * and its child */ - union_ok = lv_area_intersect(&mask_child, &obj_mask, &child_area); - - /*If the parent and the child has common area then refresh the child */ - if(union_ok) { - /*Refresh the next children*/ - lv_refr_obj(child_p, &mask_child); - } - } - } - - /* If all the children are redrawn make 'post draw' design */ - obj->design_cb(obj, &obj_ext_mask, LV_DESIGN_DRAW_POST); - } -} - -/** - * Flush the content of the VDB - */ -static void lv_refr_vdb_flush(void) -{ - lv_disp_buf_t * vdb = lv_disp_get_buf(disp_refr); - - /*In double buffered mode wait until the other buffer is flushed before flushing the current - * one*/ - if(lv_disp_is_double_buf(disp_refr)) { - while(vdb->flushing) - ; - } - - vdb->flushing = 1; - - /*Flush the rendered content to the display*/ - lv_disp_t * disp = lv_refr_get_disp_refreshing(); - if(disp->driver.flush_cb) disp->driver.flush_cb(&disp->driver, &vdb->area, vdb->buf_act); - - if(vdb->buf1 && vdb->buf2) { - if(vdb->buf_act == vdb->buf1) - vdb->buf_act = vdb->buf2; - else - vdb->buf_act = vdb->buf1; - } -} diff --git a/src/libs/lvgl/src/lv_core/lv_refr.h b/src/libs/lvgl/src/lv_core/lv_refr.h deleted file mode 100644 index 8c0ed03e..00000000 --- a/src/libs/lvgl/src/lv_core/lv_refr.h +++ /dev/null @@ -1,93 +0,0 @@ -/** - * @file lv_refr.h - * - */ - -#ifndef LV_REFR_H -#define LV_REFR_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_obj.h" -#include <stdbool.h> - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the screen refresh subsystem - */ -void lv_refr_init(void); - -/** - * Redraw the invalidated areas now. - * Normally the redrawing is periodically executed in `lv_task_handler` but a long blocking process - * can prevent the call of `lv_task_handler`. In this case if the the GUI is updated in the process - * (e.g. progress bar) this function can be called when the screen should be updated. - * @param disp pointer to display to refresh. NULL to refresh all displays. - */ -void lv_refr_now(lv_disp_t * disp); - -/** - * Invalidate an area on display to redraw it - * @param area_p pointer to area which should be invalidated (NULL: delete the invalidated areas) - * @param disp pointer to display where the area should be invalidated (NULL can be used if there is - * only one display) - */ -void lv_inv_area(lv_disp_t * disp, const lv_area_t * area_p); - -/** - * Get the display which is being refreshed - * @return the display being refreshed - */ -lv_disp_t * lv_refr_get_disp_refreshing(void); - -/** - * Set the display which is being refreshed. - * It shouldn1t be used directly by the user. - * It can be used to trick the drawing functions about there is an active display. - * @param the display being refreshed - */ -void lv_refr_set_disp_refreshing(lv_disp_t * disp); - -/** - * Called periodically to handle the refreshing - * @param task pointer to the task itself - */ -void lv_disp_refr_task(lv_task_t * task); - -/********************** - * STATIC FUNCTIONS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_REFR_H*/ diff --git a/src/libs/lvgl/src/lv_core/lv_style.c b/src/libs/lvgl/src/lv_core/lv_style.c deleted file mode 100644 index 718fa6b3..00000000 --- a/src/libs/lvgl/src/lv_core/lv_style.c +++ /dev/null @@ -1,353 +0,0 @@ -/** - * @file lv_style.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_obj.h" -#include "../lv_core/lv_debug.h" -#include "../lv_misc/lv_mem.h" -#include "../lv_misc/lv_anim.h" - -/********************* - * DEFINES - *********************/ -#define STYLE_MIX_MAX 256 -#define STYLE_MIX_SHIFT 8 /*log2(STYLE_MIX_MAX)*/ - -#define VAL_PROP(v1, v2, r) v1 + (((v2 - v1) * r) >> STYLE_MIX_SHIFT) -#define STYLE_ATTR_MIX(attr, r) \ - if(start->attr != end->attr) { \ - res->attr = VAL_PROP(start->attr, end->attr, r); \ - } else { \ - res->attr = start->attr; \ - } - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -#if LV_USE_ANIMATION -static void style_animator(lv_style_anim_dsc_t * dsc, lv_anim_value_t val); -static void style_animation_common_end_cb(lv_anim_t * a); -#endif - -/********************** - * STATIC VARIABLES - **********************/ -lv_style_t lv_style_scr; -lv_style_t lv_style_transp; -lv_style_t lv_style_transp_fit; -lv_style_t lv_style_transp_tight; -lv_style_t lv_style_plain; -lv_style_t lv_style_plain_color; -lv_style_t lv_style_pretty; -lv_style_t lv_style_pretty_color; -lv_style_t lv_style_btn_rel; -lv_style_t lv_style_btn_pr; -lv_style_t lv_style_btn_tgl_rel; -lv_style_t lv_style_btn_tgl_pr; -lv_style_t lv_style_btn_ina; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Init the basic styles - */ -void lv_style_init(void) -{ - /* Not White/Black/Gray colors are created by HSV model with - * HUE = 210*/ - - /*Screen style*/ - lv_style_scr.glass = 0; - 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.radius = 0; - lv_style_scr.body.padding.left = 0; - lv_style_scr.body.padding.right = 0; - lv_style_scr.body.padding.top = 0; - lv_style_scr.body.padding.bottom = 0; - lv_style_scr.body.padding.inner = LV_DPI / 20; - - 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.shadow.color = LV_COLOR_GRAY; - lv_style_scr.body.shadow.type = LV_SHADOW_FULL; - lv_style_scr.body.shadow.width = 0; - - lv_style_scr.text.opa = LV_OPA_COVER; - lv_style_scr.text.color = lv_color_make(0x30, 0x30, 0x30); - lv_style_scr.text.sel_color = lv_color_make(0x55, 0x96, 0xd8); - 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.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.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; - -#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.padding.left = LV_DPI / 20; - lv_style_plain.body.padding.right = LV_DPI / 20; - lv_style_plain.body.padding.top = LV_DPI / 20; - lv_style_plain.body.padding.bottom = LV_DPI / 20; - - /*Plain color style*/ - lv_style_copy(&lv_style_plain_color, &lv_style_plain); - lv_style_plain_color.text.color = lv_color_make(0xf0, 0xf0, 0xf0); - lv_style_plain_color.image.color = lv_color_make(0xf0, 0xf0, 0xf0); - lv_style_plain_color.line.color = lv_color_make(0xf0, 0xf0, 0xf0); - lv_style_plain_color.body.main_color = lv_color_make(0x55, 0x96, 0xd8); - lv_style_plain_color.body.grad_color = lv_style_plain_color.body.main_color; - - /*Pretty style */ - lv_style_copy(&lv_style_pretty, &lv_style_plain); - lv_style_pretty.text.color = lv_color_make(0x20, 0x20, 0x20); - lv_style_pretty.image.color = lv_color_make(0x20, 0x20, 0x20); - lv_style_pretty.line.color = lv_color_make(0x20, 0x20, 0x20); - lv_style_pretty.body.main_color = LV_COLOR_WHITE; - lv_style_pretty.body.grad_color = LV_COLOR_SILVER; - lv_style_pretty.body.radius = LV_DPI / 15; - lv_style_pretty.body.border.color = lv_color_make(0x40, 0x40, 0x40); - lv_style_pretty.body.border.width = LV_DPI / 50 >= 1 ? LV_DPI / 50 : 1; - lv_style_pretty.body.border.opa = LV_OPA_30; - - /*Pretty color style*/ - lv_style_copy(&lv_style_pretty_color, &lv_style_pretty); - lv_style_pretty_color.text.color = lv_color_make(0xe0, 0xe0, 0xe0); - lv_style_pretty_color.image.color = lv_color_make(0xe0, 0xe0, 0xe0); - lv_style_pretty_color.line.color = lv_color_make(0xc0, 0xc0, 0xc0); - lv_style_pretty_color.body.main_color = lv_color_make(0x6b, 0x9a, 0xc7); - lv_style_pretty_color.body.grad_color = lv_color_make(0x2b, 0x59, 0x8b); - lv_style_pretty_color.body.border.color = lv_color_make(0x15, 0x2c, 0x42); - - /*Transparent style*/ - lv_style_copy(&lv_style_transp, &lv_style_plain); - lv_style_transp.glass = 1; - lv_style_transp.body.border.width = 0; - lv_style_transp.body.opa = LV_OPA_TRANSP; - - /*Transparent fitting size*/ - lv_style_copy(&lv_style_transp_fit, &lv_style_transp); - lv_style_transp_fit.body.padding.left = 0; - lv_style_transp_fit.body.padding.right = 0; - lv_style_transp_fit.body.padding.top = 0; - lv_style_transp_fit.body.padding.bottom = 0; - - /*Transparent tight style*/ - lv_style_copy(&lv_style_transp_tight, &lv_style_transp_fit); - lv_style_transp_tight.body.padding.inner = 0; - - /*Button released style*/ - 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.radius = LV_DPI / 15; - 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; - lv_style_btn_rel.body.padding.bottom = LV_DPI / 6; - lv_style_btn_rel.body.padding.inner = LV_DPI / 10; - 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.width = 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); - - /*Button pressed style*/ - lv_style_copy(&lv_style_btn_pr, &lv_style_btn_rel); - lv_style_btn_pr.body.main_color = lv_color_make(0x33, 0x62, 0x94); - lv_style_btn_pr.body.grad_color = lv_color_make(0x10, 0x26, 0x3c); - lv_style_btn_pr.text.color = lv_color_make(0xa4, 0xb5, 0xc6); - lv_style_btn_pr.image.color = lv_color_make(0xa4, 0xb5, 0xc6); - lv_style_btn_pr.line.color = lv_color_make(0xa4, 0xb5, 0xc6); - - /*Button toggle released style*/ - lv_style_copy(&lv_style_btn_tgl_rel, &lv_style_btn_rel); - lv_style_btn_tgl_rel.body.main_color = lv_color_make(0x0a, 0x11, 0x22); - lv_style_btn_tgl_rel.body.grad_color = lv_color_make(0x37, 0x62, 0x90); - lv_style_btn_tgl_rel.body.border.color = lv_color_make(0x01, 0x07, 0x0d); - lv_style_btn_tgl_rel.text.color = lv_color_make(0xc8, 0xdd, 0xf4); - lv_style_btn_tgl_rel.image.color = lv_color_make(0xc8, 0xdd, 0xf4); - lv_style_btn_tgl_rel.line.color = lv_color_make(0xc8, 0xdd, 0xf4); - - /*Button toggle pressed style*/ - lv_style_copy(&lv_style_btn_tgl_pr, &lv_style_btn_tgl_rel); - lv_style_btn_tgl_pr.body.main_color = lv_color_make(0x02, 0x14, 0x27); - lv_style_btn_tgl_pr.body.grad_color = lv_color_make(0x2b, 0x4c, 0x70); - lv_style_btn_tgl_pr.text.color = lv_color_make(0xa4, 0xb5, 0xc6); - lv_style_btn_tgl_pr.image.color = lv_color_make(0xa4, 0xb5, 0xc6); - lv_style_btn_tgl_pr.line.color = lv_color_make(0xa4, 0xb5, 0xc6); - - /*Button inactive style*/ - lv_style_copy(&lv_style_btn_ina, &lv_style_btn_rel); - lv_style_btn_ina.body.main_color = lv_color_make(0xd8, 0xd8, 0xd8); - lv_style_btn_ina.body.grad_color = lv_color_make(0xd8, 0xd8, 0xd8); - lv_style_btn_ina.body.border.color = lv_color_make(0x90, 0x90, 0x90); - lv_style_btn_ina.text.color = lv_color_make(0x70, 0x70, 0x70); - lv_style_btn_ina.image.color = lv_color_make(0x70, 0x70, 0x70); - lv_style_btn_ina.line.color = lv_color_make(0x70, 0x70, 0x70); -} - -/** - * Copy a style to an other - * @param dest pointer to the destination style - * @param src pointer to the source style - */ -void lv_style_copy(lv_style_t * dest, const lv_style_t * src) -{ - memcpy(dest, src, sizeof(lv_style_t)); -} - -/** - * Mix two styles according to a given ratio - * @param start start style - * @param end end style - * @param res store the result style here - * @param ratio the ratio of mix [0..256]; 0: `start` style; 256: `end` style - */ -void lv_style_mix(const lv_style_t * start, const lv_style_t * end, lv_style_t * res, uint16_t ratio) -{ - STYLE_ATTR_MIX(body.opa, ratio); - STYLE_ATTR_MIX(body.radius, ratio); - 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.padding.left, ratio); - STYLE_ATTR_MIX(body.padding.right, ratio); - STYLE_ATTR_MIX(body.padding.top, ratio); - STYLE_ATTR_MIX(body.padding.bottom, ratio); - STYLE_ATTR_MIX(body.padding.inner, ratio); - STYLE_ATTR_MIX(text.line_space, ratio); - STYLE_ATTR_MIX(text.letter_space, ratio); - STYLE_ATTR_MIX(text.opa, ratio); - STYLE_ATTR_MIX(line.width, ratio); - STYLE_ATTR_MIX(line.opa, ratio); - STYLE_ATTR_MIX(image.intense, ratio); - STYLE_ATTR_MIX(image.opa, ratio); - - lv_opa_t opa = ratio == STYLE_MIX_MAX ? LV_OPA_COVER : ratio; - - res->body.main_color = lv_color_mix(end->body.main_color, start->body.main_color, opa); - res->body.grad_color = lv_color_mix(end->body.grad_color, start->body.grad_color, opa); - res->body.border.color = lv_color_mix(end->body.border.color, start->body.border.color, opa); - res->body.shadow.color = lv_color_mix(end->body.shadow.color, start->body.shadow.color, opa); - res->text.color = lv_color_mix(end->text.color, start->text.color, opa); - res->image.color = lv_color_mix(end->image.color, start->image.color, opa); - res->line.color = lv_color_mix(end->line.color, start->line.color, opa); - - if(ratio < (STYLE_MIX_MAX >> 1)) { - 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; - } -} - -#if LV_USE_ANIMATION - -void lv_style_anim_init(lv_anim_t * a) -{ - lv_anim_init(a); - a->start = 0; - a->end = STYLE_MIX_MAX; - a->exec_cb = (lv_anim_exec_xcb_t)style_animator; - a->path_cb = lv_anim_path_linear; - a->ready_cb = style_animation_common_end_cb; - - lv_style_anim_dsc_t * dsc; - dsc = lv_mem_alloc(sizeof(lv_style_anim_dsc_t)); - LV_ASSERT_MEM(dsc); - if(dsc == NULL) return; - dsc->ready_cb = NULL; - dsc->style_anim = NULL; - lv_style_copy(&dsc->style_start, &lv_style_plain); - lv_style_copy(&dsc->style_end, &lv_style_plain); - - a->var = (void *)dsc; -} - -void lv_style_anim_set_styles(lv_anim_t * a, lv_style_t * to_anim, const lv_style_t * start, const lv_style_t * end) -{ - - lv_style_anim_dsc_t * dsc = a->var; - dsc->style_anim = to_anim; - memcpy(&dsc->style_start, start, sizeof(lv_style_t)); - memcpy(&dsc->style_end, end, sizeof(lv_style_t)); - memcpy(dsc->style_anim, start, sizeof(lv_style_t)); -} -#endif -/********************** - * STATIC FUNCTIONS - **********************/ -#if LV_USE_ANIMATION -/** - * Used by the style animations to set the values of a style according to start and end style. - * @param dsc the 'animated variable' set by lv_style_anim_create() - * @param val the current state of the animation between 0 and LV_ANIM_RESOLUTION - */ -static void style_animator(lv_style_anim_dsc_t * dsc, lv_anim_value_t val) -{ - const lv_style_t * start = &dsc->style_start; - const lv_style_t * end = &dsc->style_end; - lv_style_t * act = dsc->style_anim; - - lv_style_mix(start, end, act, val); - - lv_obj_report_style_mod(dsc->style_anim); -} - -/** - * Called when a style animation is ready - * It called the user defined call back and free the allocated memories - * @param a pointer to the animation - */ -static void style_animation_common_end_cb(lv_anim_t * a) -{ - - (void)a; /*Unused*/ - lv_style_anim_dsc_t * dsc = a->var; /*To avoid casting*/ - - if(dsc->ready_cb) dsc->ready_cb(a); - - lv_mem_free(dsc); -} - -#endif diff --git a/src/libs/lvgl/src/lv_core/lv_style.h b/src/libs/lvgl/src/lv_core/lv_style.h deleted file mode 100644 index e002b2ea..00000000 --- a/src/libs/lvgl/src/lv_core/lv_style.h +++ /dev/null @@ -1,301 +0,0 @@ -/** - * @file lv_style.h - * - */ - -#ifndef LV_STYLE_H -#define LV_STYLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include <stdbool.h> -#include "../lv_font/lv_font.h" -#include "../lv_misc/lv_color.h" -#include "../lv_misc/lv_area.h" -#include "../lv_misc/lv_anim.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 - **********************/ - -/*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)*/ -}; -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 */ -}; -typedef uint8_t lv_shadow_type_t; - -/** - * Objects in LittlevGL can be assigned a style - which holds information about - * how the object should be drawn. - * - * This allows for easy customization without having to modify the object's design - * function. - */ -typedef struct -{ - uint8_t glass : 1; /**< 1: Do not inherit this style*/ - - /** Object background. */ - struct - { - lv_color_t main_color; /**< Object's main background color. */ - 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). */ - - struct - { - lv_color_t color; /**< Border color */ - lv_coord_t width; /**< Border width */ - lv_border_part_t part; /**< Which borders to draw */ - lv_opa_t opa; /**< Border opacity. */ - } border; - - - struct - { - lv_color_t color; - lv_coord_t width; - lv_shadow_type_t type; /**< Which parts of the shadow to draw */ - } shadow; - - struct - { - lv_coord_t top; - lv_coord_t bottom; - lv_coord_t left; - lv_coord_t right; - lv_coord_t inner; - } padding; - } body; - - /** Style for text drawn by this object. */ - struct - { - lv_color_t color; /**< Text color */ - lv_color_t sel_color; /**< Text selection background color. */ - const lv_font_t * font; - lv_coord_t letter_space; /**< Space between letters */ - lv_coord_t line_space; /**< Space between lines (vertical) */ - lv_opa_t opa; /**< Text opacity */ - } text; - - /**< Style of images. */ - 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 */ - } image; - - /**< Style of lines (not borders). */ - struct - { - lv_color_t color; - lv_coord_t width; - lv_opa_t opa; - uint8_t rounded : 1; /**< 1: rounded line endings*/ - } line; - -#if LV_USE_DEBUG -#if LV_USE_ASSERT_STYLE - uint32_t debug_sentinel; /**<Should `LV_STYLE_DEGUG_SENTINEL_VALUE` to indicate that the style is valid*/ -#endif -#endif - -} lv_style_t; - -#if LV_USE_ANIMATION -/** Data structure for style animations. */ -typedef struct -{ - lv_style_t style_start; /*Save not only pointers because can be same as 'style_anim' then it - will be modified too*/ - lv_style_t style_end; - lv_style_t * style_anim; - lv_anim_ready_cb_t ready_cb; -} lv_style_anim_dsc_t; -#endif - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Init the basic styles - */ -void lv_style_init(void); - -/** - * Copy a style to an other - * @param dest pointer to the destination style - * @param src pointer to the source style - */ -void lv_style_copy(lv_style_t * dest, const lv_style_t * src); - -/** - * Mix two styles according to a given ratio - * @param start start style - * @param end end style - * @param res store the result style here - * @param ratio the ratio of mix [0..256]; 0: `start` style; 256: `end` style - */ -void lv_style_mix(const lv_style_t * start, const lv_style_t * end, lv_style_t * res, uint16_t ratio); - -#if LV_USE_ANIMATION - -/** - * Initialize an animation variable. - * E.g.: - * lv_anim_t a; - * lv_style_anim__init(&a); - * lv_style_anim_set_...(&a); - * lv_style_anim_create(&a); - * @param a pointer to an `lv_anim_t` variable to initialize - */ -void lv_style_anim_init(lv_anim_t * a); - -/** - * - * @param a pointer to an initialized `lv_anim_t` variable - * @param to_anim pointer to the style to animate - * @param start pointer to a style to animate from (start value) - * @param end pointer to a style to animate to (end value) - */ -void lv_style_anim_set_styles(lv_anim_t * a, lv_style_t * to_anim, const lv_style_t * start, const lv_style_t * end); - -/** - * Set the duration and delay of an animation - * @param a pointer to an initialized `lv_anim_t` variable - * @param duration duration of the animation in milliseconds - * @param delay delay before the animation in milliseconds - */ -static inline void lv_style_anim_set_time(lv_anim_t * a, uint16_t duration, int16_t delay) -{ - lv_anim_set_time(a, duration, delay); -} - -/** - * Set a function call when the animation is ready - * @param a pointer to an initialized `lv_anim_t` variable - * @param ready_cb a function call when the animation is ready - */ -static inline void lv_style_anim_set_ready_cb(lv_anim_t * a, lv_anim_ready_cb_t ready_cb) -{ - lv_style_anim_dsc_t * dsc = (lv_style_anim_dsc_t *)a->var; - dsc->ready_cb = ready_cb; -} - -/** - * Make the animation to play back to when the forward direction is ready - * @param a pointer to an initialized `lv_anim_t` variable - * @param wait_time time in milliseconds to wait before starting the back direction - */ -static inline void lv_style_anim_set_playback(lv_anim_t * a, uint16_t wait_time) -{ - lv_anim_set_playback(a, wait_time); -} - -/** - * Disable playback. (Disabled after `lv_anim_init()`) - * @param a pointer to an initialized `lv_anim_t` variable - */ -static inline void lv_style_anim_clear_playback(lv_anim_t * a) -{ - lv_anim_clear_playback(a); -} - -/** - * Make the animation to start again when ready. - * @param a pointer to an initialized `lv_anim_t` variable - * @param wait_time time in milliseconds to wait before starting the animation again - */ -static inline void lv_style_anim_set_repeat(lv_anim_t * a, uint16_t wait_time) -{ - lv_anim_set_repeat(a, wait_time); -} - -/** - * Disable repeat. (Disabled after `lv_anim_init()`) - * @param a pointer to an initialized `lv_anim_t` variable - */ -static inline void lv_style_anim_clear_repeat(lv_anim_t * a) -{ - lv_anim_clear_repeat(a); -} - -/** - * Create an animation - * @param a an initialized 'anim_t' variable. Not required after call. - */ -static inline void lv_style_anim_create(lv_anim_t * a) -{ - lv_anim_create(a); -} - -#endif - -/************************* - * GLOBAL VARIABLES - *************************/ -extern lv_style_t lv_style_scr; -extern lv_style_t lv_style_transp; -extern lv_style_t lv_style_transp_fit; -extern lv_style_t lv_style_transp_tight; -extern lv_style_t lv_style_plain; -extern lv_style_t lv_style_plain_color; -extern lv_style_t lv_style_pretty; -extern lv_style_t lv_style_pretty_color; -extern lv_style_t lv_style_btn_rel; -extern lv_style_t lv_style_btn_pr; -extern lv_style_t lv_style_btn_tgl_rel; -extern lv_style_t lv_style_btn_tgl_pr; -extern lv_style_t lv_style_btn_ina; - -/********************** - * MACROS - **********************/ - -/** - * Create and initialize a `static` style - * Example: - * LV_STYLE_CREATE(my_style, &lv_style_plain); - * is equivalent to - * static lv_style_t my_style; - * lv_style_copy(my_style, &lv_style_plain); - * - * If the style to copy is `NULL` `lv_style_plain` will be used. - */ -#define LV_STYLE_CREATE(name, copy_p) static lv_style_t name; lv_style_copy(&name, copy_p == NULL ? &lv_style_plain : copy_p); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_STYLE_H*/ diff --git a/src/libs/lvgl/src/lv_draw/lv_draw.c b/src/libs/lvgl/src/lv_draw/lv_draw.c deleted file mode 100644 index 45eaff65..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw.c +++ /dev/null @@ -1,191 +0,0 @@ -/** - * @file lv_draw.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include <stdio.h> -#include <stdbool.h> -#include "lv_draw.h" -#include "../lv_core/lv_debug.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_ASSERT_MEM(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_ASSERT_MEM(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/libs/lvgl/src/lv_draw/lv_draw.h b/src/libs/lvgl/src/lv_draw/lv_draw.h deleted file mode 100644 index a9fa58d9..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw.h +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @file lv_draw.h - * - */ - -#ifndef LV_DRAW_H -#define LV_DRAW_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include "../lv_core/lv_style.h" -#include "../lv_misc/lv_txt.h" -#include "lv_img_decoder.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * 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 - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * 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" */ -#endif - -#endif /*LV_DRAW_H*/ diff --git a/src/libs/lvgl/src/lv_draw/lv_draw.mk b/src/libs/lvgl/src/lv_draw/lv_draw.mk deleted file mode 100644 index c879ebe6..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw.mk +++ /dev/null @@ -1,15 +0,0 @@ -CSRCS += lv_draw_basic.c -CSRCS += lv_draw.c -CSRCS += lv_draw_rect.c -CSRCS += lv_draw_label.c -CSRCS += lv_draw_line.c -CSRCS += lv_draw_img.c -CSRCS += lv_draw_arc.c -CSRCS += lv_draw_triangle.c -CSRCS += lv_img_decoder.c -CSRCS += lv_img_cache.c - -DEPPATH += --dep-path $(LVGL_DIR)/lvgl/src/lv_draw -VPATH += :$(LVGL_DIR)/lvgl/src/lv_draw - -CFLAGS += "-I$(LVGL_DIR)lvgl/src/lv_draw" diff --git a/src/libs/lvgl/src/lv_draw/lv_draw_arc.c b/src/libs/lvgl/src/lv_draw/lv_draw_arc.c deleted file mode 100644 index 5b19a127..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_arc.c +++ /dev/null @@ -1,251 +0,0 @@ -/** - * @file lv_draw_arc.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_arc.h" -#include "../lv_misc/lv_math.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -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 VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Draw an arc. (Can draw pie too with great thickness.) - * @param center_x the x coordinate of the center of the arc - * @param center_y the y coordinate of the center of the arc - * @param radius the radius of the arc - * @param mask the arc will be drawn only in this mask - * @param start_angle the start angle of the arc (0 deg on the bottom, 90 deg on the right) - * @param end_angle the end angle of the arc - * @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) -{ - lv_coord_t thickness = style->line.width; - if(thickness > radius) thickness = radius; - -#if LV_ANTIALIAS - thickness--; - radius--; -#endif - - 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_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; - - 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; - - int middle_r_out = r_out; -#if !LV_ANTIALIAS - thickness--; - middle_r_out = r_out - 1; -#endif - if(deg_test(270, start_angle, end_angle)) - hor_line(center_x - middle_r_out, center_y, mask, thickness, color, opa); /*Left Middle*/ - if(deg_test(90, start_angle, end_angle)) - hor_line(center_x + r_in, center_y, mask, thickness, color, opa); /*Right Middle*/ - if(deg_test(180, start_angle, end_angle)) - ver_line(center_x, center_y - middle_r_out, mask, thickness, color, opa); /*Top Middle*/ - if(deg_test(0, start_angle, end_angle)) - ver_line(center_x, center_y + r_in, mask, thickness, color, opa); /*Bottom middle*/ - - uint32_t r_out_sqr = r_out * r_out; - uint32_t r_in_sqr = r_in * r_in; -#if LV_ANTIALIAS - uint32_t r_out_aa_sqr = (r_out + 1) * (r_out + 1); - uint32_t r_in_aa_sqr = (r_in - 1) * (r_in - 1); -#endif - 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; - int xe = 0; - for(xi = -r_out; xi < 0; xi++) { - - uint32_t r_act_sqr = xi * xi + yi * yi; -#if LV_ANTIALIAS - if(r_act_sqr > r_out_aa_sqr) { - continue; - } -#else - if(r_act_sqr > r_out_sqr) continue; -#endif - - deg_base = lv_atan2(xi, yi) - 180; - -#if LV_ANTIALIAS - int opa2 = -1; - if(r_act_sqr > r_out_sqr) { - opa2 = LV_OPA_100 * (r_out + 1) - lv_sqrt(LV_OPA_100 * LV_OPA_100 * r_act_sqr); - if(opa2 < LV_OPA_0) - opa2 = LV_OPA_0; - else if(opa2 > LV_OPA_100) - opa2 = LV_OPA_100; - } else if(r_act_sqr < r_in_sqr) { - if(xe == 0) xe = xi; - opa2 = lv_sqrt(LV_OPA_100 * LV_OPA_100 * r_act_sqr) - LV_OPA_100 * (r_in - 1); - if(opa2 < LV_OPA_0) - opa2 = LV_OPA_0; - else if(opa2 > LV_OPA_100) - opa2 = LV_OPA_100; - if(r_act_sqr < r_in_aa_sqr) - break; /*No need to continue the iteration in x once we found the inner edge of the - arc*/ - } - if(opa2 != -1) { - if(deg_test(180 + deg_base, start_angle, end_angle)) { - lv_draw_px(center_x + xi, center_y + yi, mask, color, opa2); - } - if(deg_test(360 - deg_base, start_angle, end_angle)) { - lv_draw_px(center_x + xi, center_y - yi, mask, color, opa2); - } - if(deg_test(180 - deg_base, start_angle, end_angle)) { - lv_draw_px(center_x - xi, center_y + yi, mask, color, opa2); - } - if(deg_test(deg_base, start_angle, end_angle)) { - lv_draw_px(center_x - xi, center_y - yi, mask, color, opa2); - } - continue; - } -#endif - - 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; - } - - 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; - } - - 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) { - xe = xi; - 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] = xe - 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] = xe - 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] = xe - 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] = xe - 1; - hor_line(center_x - x_end[3], center_y - yi, mask, LV_MATH_ABS(x_end[3] - x_start[3]), color, opa); - } - } -} - -/********************** - * 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) -{ - lv_area_t area; - lv_area_set(&area, x, y, x, y + len); - - 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; -} diff --git a/src/libs/lvgl/src/lv_draw/lv_draw_arc.h b/src/libs/lvgl/src/lv_draw/lv_draw_arc.h deleted file mode 100644 index 98d0f0bc..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_arc.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @file lv_draw_arc.h - * - */ - -#ifndef LV_DRAW_ARC_H -#define LV_DRAW_ARC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_draw.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Draw an arc. (Can draw pie too with great thickness.) - * @param center_x the x coordinate of the center of the arc - * @param center_y the y coordinate of the center of the arc - * @param radius the radius of the arc - * @param mask the arc will be drawn only in this mask - * @param start_angle the start angle of the arc (0 deg on the bottom, 90 deg on the right) - * @param end_angle the end angle of the arc - * @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); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_DRAW_ARC*/ diff --git a/src/libs/lvgl/src/lv_draw/lv_draw_basic.c b/src/libs/lvgl/src/lv_draw/lv_draw_basic.c deleted file mode 100644 index 462e1522..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_basic.c +++ /dev/null @@ -1,783 +0,0 @@ -/** - * @file lv_draw_basic.c - * - */ - -#include "lv_draw_basic.h" - -#include <stdbool.h> -#include <stdint.h> -#include <string.h> - -#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 <stddef.h> -#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; - - /*bpp = 3 should be converted to bpp = 4 in lv_font_get_glyph_bitmap */ - 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: 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*/ - - bool subpx = font_p->subpx == LV_FONT_SUBPX_NONE ? false : true; - - /* Calculate the col/row start/end on the map*/ - lv_coord_t col_start; - lv_coord_t col_end; - lv_coord_t row_start; - lv_coord_t row_end; - - if(subpx == false) { - col_start = pos_x >= mask_p->x1 ? 0 : mask_p->x1 - pos_x; - col_end = pos_x + g.box_w <= mask_p->x2 ? g.box_w : mask_p->x2 - pos_x + 1; - row_start = pos_y >= mask_p->y1 ? 0 : mask_p->y1 - pos_y; - row_end = pos_y + g.box_h <= mask_p->y2 ? g.box_h : mask_p->y2 - pos_y + 1; - } else { - col_start = pos_x >= mask_p->x1 ? 0 : (mask_p->x1 - pos_x) * 3; - col_end = pos_x + g.box_w / 3 <= mask_p->x2 ? g.box_w : (mask_p->x2 - pos_x + 1) * 3; - row_start = pos_y >= mask_p->y1 ? 0 : mask_p->y1 - pos_y; - 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*/ - if(subpx) vdb_buf_tmp += (row_start * vdb_width) + col_start / 3; - else 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 = 0; - 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 - - uint8_t font_rgb[3]; - uint8_t txt_rgb[3] = {LV_COLOR_GET_R(color), LV_COLOR_GET_G(color), LV_COLOR_GET_B(color)}; - - for(row = row_start; row < row_end; row++) { - bitmask = bitmask_init >> col_bit; - uint8_t sub_px_cnt = 0; - for(col = col_start; col < col_end; col++) { - letter_px = (*map_p & bitmask) >> (8 - col_bit - g.bpp); - - /*subpx == 0*/ - if(subpx == false) { - 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++; - } - /*Handle subpx drawing*/ - else { - 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; - } - - font_rgb[sub_px_cnt] = px_opa; - } else { - font_rgb[sub_px_cnt] = 0; - } - sub_px_cnt ++; - - if(sub_px_cnt == 3) { - lv_color_t res_color; - - if(font_rgb[0] == 0 && font_rgb[1] == 0 && font_rgb[2] == 0) { - res_color = *vdb_buf_tmp; - } else { - - uint8_t bg_rgb[3] = {LV_COLOR_GET_R(*vdb_buf_tmp), LV_COLOR_GET_G(*vdb_buf_tmp), LV_COLOR_GET_B(*vdb_buf_tmp)}; - -#if LV_FONT_SUBPX_BGR - LV_COLOR_SET_B(res_color, (uint16_t)((uint16_t)txt_rgb[0] * font_rgb[0] + (bg_rgb[2] * (255 - font_rgb[0]))) >> 8); - LV_COLOR_SET_R(res_color, (uint16_t)((uint16_t)txt_rgb[2] * font_rgb[2] + (bg_rgb[0] * (255 - font_rgb[2]))) >> 8); -#else - LV_COLOR_SET_R(res_color, (uint16_t)((uint16_t)txt_rgb[0] * font_rgb[0] + (bg_rgb[0] * (255 - font_rgb[0]))) >> 8); - LV_COLOR_SET_B(res_color, (uint16_t)((uint16_t)txt_rgb[2] * font_rgb[2] + (bg_rgb[2] * (255 - font_rgb[2]))) >> 8); -#endif - LV_COLOR_SET_G(res_color, (uint16_t)((uint16_t)txt_rgb[1] * font_rgb[1] + (bg_rgb[1] * (255 - font_rgb[1]))) >> 8); - } - if(scr_transp == false) { - vdb_buf_tmp->full = res_color.full; -#if LV_COLOR_DEPTH == 32 && LV_COLOR_SCREEN_TRANSP - } else { - *vdb_buf_tmp = color_mix_2_alpha(*vdb_buf_tmp, (*vdb_buf_tmp).ch.alpha, color, px_opa); -#endif - } - sub_px_cnt = 0; - 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; - - /*Next row in VDB*/ - if(subpx) vdb_buf_tmp += vdb_width - (col_end - col_start) / 3; - else vdb_buf_tmp += vdb_width - (col_end - col_start); - } -} - -/** - * 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/libs/lvgl/src/lv_draw/lv_draw_basic.h b/src/libs/lvgl/src/lv_draw/lv_draw_basic.h deleted file mode 100644 index 266b0c6c..00000000 --- a/src/libs/lvgl/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/libs/lvgl/src/lv_draw/lv_draw_img.c b/src/libs/lvgl/src/lv_draw/lv_draw_img.c deleted file mode 100644 index e19ba015..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_img.c +++ /dev/null @@ -1,601 +0,0 @@ -/** - * @file lv_draw_img.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_img.h" -#include "lv_img_cache.h" -#include "../lv_misc/lv_log.h" -#include "../lv_misc/lv_mem.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * 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); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Draw an image - * @param coords the coordinates of the image - * @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 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) -{ - 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, NULL, NULL, LV_BIDI_DIR_LTR); - return; - } - - lv_res_t res; - res = lv_img_draw_core(coords, mask, src, style, 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, 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 >= (lv_coord_t)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 >= (lv_coord_t)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 >= (lv_coord_t)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 >= (lv_coord_t)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 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; - } - - return px_size; -} - -/** - * 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 is_chroma_keyed = false; - - switch(cf) { - 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; -} - -/** - * 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 has_alpha = false; - - switch(cf) { - 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; -} - -/** - * Get the type of an image source - * @param src pointer to an image source: - * - pointer to an 'lv_img_t' variable (image stored internally and compiled into the code) - * - a path to a file (e.g. "S:/folder/image.bin") - * - or a symbol (e.g. LV_SYMBOL_CLOSE) - * @return type of the image source LV_IMG_SRC_VARIABLE/FILE/SYMBOL/UNKNOWN - */ -lv_img_src_t lv_img_src_get_type(const void * src) -{ - lv_img_src_t img_src_type = LV_IMG_SRC_UNKNOWN; - - if(src == NULL) return img_src_type; - const uint8_t * u8_p = src; - - /*The first byte shows the type of the image source*/ - if(u8_p[0] >= 0x20 && u8_p[0] <= 0x7F) { - img_src_type = LV_IMG_SRC_FILE; /*If it's an ASCII character then it's file name*/ - } else if(u8_p[0] >= 0x80) { - img_src_type = LV_IMG_SRC_SYMBOL; /*Symbols begins after 0x7F*/ - } else { - img_src_type = LV_IMG_SRC_VARIABLE; /*`lv_img_dsc_t` is design to the first byte < 0x20*/ - } - - if(LV_IMG_SRC_UNKNOWN == img_src_type) { - LV_LOG_WARN("lv_img_src_get_type: unknown image type"); - } - - return img_src_type; -} - -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; -} - -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); - } -} - -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; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -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) -{ - - 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; - - 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); - - 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, 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); - } - /* The whole uncompressed image is not available. Try to read it line-by-line*/ - else { - lv_coord_t width = lv_area_get_width(&mask_com); - - uint8_t * buf = lv_draw_get_buf(lv_area_get_width(&mask_com) * LV_IMG_PX_SIZE_ALPHA_BYTE); /*space for the possible alpha byte*/ - - lv_area_t line; - lv_area_copy(&line, &mask_com); - lv_area_set_height(&line, 1); - lv_coord_t x = mask_com.x1 - coords->x1; - lv_coord_t y = mask_com.y1 - coords->y1; - lv_coord_t row; - lv_res_t read_res; - for(row = mask_com.y1; row <= mask_com.y2; row++) { - 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"); - return LV_RES_INV; - } - lv_draw_map(&line, mask, buf, opa, chroma_keyed, alpha_byte, style->image.color, style->image.intense); - line.y1++; - line.y2++; - y++; - } - } - - return LV_RES_OK; -} diff --git a/src/libs/lvgl/src/lv_draw/lv_draw_img.h b/src/libs/lvgl/src/lv_draw/lv_draw_img.h deleted file mode 100644 index 794dd79e..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_img.h +++ /dev/null @@ -1,172 +0,0 @@ -/** - * @file lv_draw_img.h - * - */ - -#ifndef LV_DRAW_IMG_H -#define LV_DRAW_IMG_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_draw.h" -#include "lv_img_decoder.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * MACROS - **********************/ - -#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) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Draw an image - * @param coords the coordinates of the image - * @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 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); - -/** - * Get the type of an image source - * @param src pointer to an image source: - * - pointer to an 'lv_img_t' variable (image stored internally and compiled into the code) - * - a path to a file (e.g. "S:/folder/image.bin") - * - or a symbol (e.g. LV_SYMBOL_CLOSE) - * @return type of the image source LV_IMG_SRC_VARIABLE/FILE/SYMBOL/UNKNOWN - */ -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); - -/** - * 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); - -/** - * 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); - -/** - * 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); - -/** - * 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); - - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_TEMPL_H*/ diff --git a/src/libs/lvgl/src/lv_draw/lv_draw_label.c b/src/libs/lvgl/src/lv_draw/lv_draw_label.c deleted file mode 100644 index bf75411d..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_label.c +++ /dev/null @@ -1,319 +0,0 @@ -/** - * @file lv_draw_label.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_label.h" -#include "../lv_misc/lv_math.h" -#include "../lv_misc/lv_bidi.h" - -/********************* - * DEFINES - *********************/ -#define LABEL_RECOLOR_PAR_LENGTH 6 -#define LV_LABEL_HINT_UPDATE_TH 1024 /*Update the "hint" if the label's y coordinates have changed more then this*/ - -/********************** - * TYPEDEFS - **********************/ -enum { - CMD_STATE_WAIT, - CMD_STATE_PAR, - CMD_STATE_IN, -}; -typedef uint8_t cmd_state_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static uint8_t hex_char_to_num(char hex); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Write a text - * @param coords coordinates of the label - * @param mask the label will be drawn only in this area - * @param style pointer to a style - * @param opa_scale scale down all opacities by the factor - * @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 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, 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); - } else { - /*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); - w = p.x; - } - - lv_coord_t line_height = lv_font_get_line_height(font) + style->text.line_space; - - /*Init variables for the first line*/ - lv_coord_t line_width = 0; - lv_point_t pos; - pos.x = coords->x1; - pos.y = coords->y1; - - lv_coord_t x_ofs = 0; - lv_coord_t y_ofs = 0; - if(offset != NULL) { - x_ofs = offset->x; - y_ofs = offset->y; - pos.y += y_ofs; - } - - uint32_t line_start = 0; - int32_t last_line_start = -1; - - /*Check the hint to use the cached info*/ - if(hint && y_ofs == 0 && coords->y1 < 0) { - /*If the label changed too much recalculate the hint.*/ - if(LV_MATH_ABS(hint->coord_y - coords->y1) > LV_LABEL_HINT_UPDATE_TH - 2 * line_height) { - hint->line_start = -1; - } - last_line_start = hint->line_start; - } - - /*Use the hint if it's valid*/ - if(hint && last_line_start >= 0) { - line_start = last_line_start; - 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*/ - while(pos.y + line_height < mask->y1) { - /*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); - pos.y += line_height; - - /*Save at the threshold coordinate*/ - if(hint && pos.y >= -LV_LABEL_HINT_UPDATE_TH && hint->line_start < 0) { - hint->line_start = line_start; - hint->y = pos.y - coords->y1; - hint->coord_y = coords->y1; - } - - if(txt[line_start] == '\0') return; - } - - /*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); - - pos.x += (lv_area_get_width(coords) - line_width) / 2; - - } - /*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); - pos.x += lv_area_get_width(coords) - line_width; - } - - 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; - } - } - - cmd_state_t cmd_state = CMD_STATE_WAIT; - uint32_t i; - uint16_t par_start = 0; - lv_color_t recolor; - lv_coord_t letter_w; - 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; - - /*Write out all lines*/ - while(txt[line_start] != '\0') { - if(offset != NULL) { - pos.x += x_ofs; - } - /*Write all letter of a line*/ - cmd_state = CMD_STATE_WAIT; - i = 0; - uint32_t letter; - uint32_t letter_next; -#if LV_USE_BIDI - char *bidi_txt = lv_draw_get_buf(line_end - line_start + 1); - lv_bidi_process_paragraph(txt + line_start, bidi_txt, line_end - line_start, bidi_dir, NULL, 0); -#else - (void)bidi_dir; - 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) { - if(letter == (uint32_t)LV_TXT_COLOR_CMD[0]) { - if(cmd_state == CMD_STATE_WAIT) { /*Start char*/ - par_start = i; - cmd_state = CMD_STATE_PAR; - continue; - } else if(cmd_state == CMD_STATE_PAR) { /*Other start char in parameter escaped cmd. char */ - cmd_state = CMD_STATE_WAIT; - } else if(cmd_state == CMD_STATE_IN) { /*Command end */ - cmd_state = CMD_STATE_WAIT; - continue; - } - } - - /*Skip the color parameter and wait the space after it*/ - if(cmd_state == CMD_STATE_PAR) { - if(letter == ' ') { - /*Get the parameter*/ - if(i - par_start == LABEL_RECOLOR_PAR_LENGTH + 1) { - char buf[LABEL_RECOLOR_PAR_LENGTH + 1]; - 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]); - g = (hex_char_to_num(buf[2]) << 4) + hex_char_to_num(buf[3]); - b = (hex_char_to_num(buf[4]) << 4) + hex_char_to_num(buf[5]); - recolor = lv_color_make(r, g, b); - } else { - recolor.full = style->text.color.full; - } - cmd_state = CMD_STATE_IN; /*After the parameter the text is in the command*/ - } - continue; - } - } - - lv_color_t color = style->text.color; - - if(cmd_state == CMD_STATE_IN) color = recolor; - - letter_w = lv_font_get_glyph_width(font, letter, letter_next); - - if(sel_start != 0xFFFF && sel_end != 0xFFFF) { - 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; - sel_coords.x2 = pos.x + letter_w + style->text.letter_space - 1; - sel_coords.y2 = pos.y + line_height - 1; - 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; - } - } - /*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); - - pos.x = coords->x1; - /*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); - - pos.x += (lv_area_get_width(coords) - line_width) / 2; - - } - /*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); - pos.x += lv_area_get_width(coords) - line_width; - } - - /*Go the next line position*/ - pos.y += line_height; - - if(pos.y > mask->y2) return; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Convert a hexadecimal characters to a number (0..15) - * @param hex Pointer to a hexadecimal character (0..9, A..F) - * @return the numerical value of `hex` or 0 on error - */ -static uint8_t hex_char_to_num(char hex) -{ - uint8_t result = 0; - - if(hex >= '0' && hex <= '9') { - result = hex - '0'; - } else { - 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; - } - } - - return result; -} diff --git a/src/libs/lvgl/src/lv_draw/lv_draw_label.h b/src/libs/lvgl/src/lv_draw/lv_draw_label.h deleted file mode 100644 index 6dc4d646..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_label.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * @file lv_draw_label.h - * - */ - -#ifndef LV_DRAW_LABEL_H -#define LV_DRAW_LABEL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * 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. - * This structure stores an earlier (e.g. at -1000 px) coordinate and the index of that line. - * Therefore the calculations can start from here.*/ -typedef struct { - /** Index of the line at `y` coordinate*/ - int32_t line_start; - - /** Give the `y` coordinate of the first letter at `line start` index. Relative to the label's coordinates*/ - int32_t y; - - /** The 'y1' coordinate of the label when the hint was saved. - * Used to invalidate the hint if the label has moved too much. */ - int32_t coord_y; -}lv_draw_label_hint_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Write a text - * @param coords coordinates of the label - * @param mask the label will be drawn only in this area - * @param style pointer to a style - * @param opa_scale scale down all opacities by the factor - * @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 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, lv_draw_label_txt_sel_t * sel, - lv_draw_label_hint_t * hint, lv_bidi_dir_t bidi_dir); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_DRAW_LABEL_H*/ diff --git a/src/libs/lvgl/src/lv_draw/lv_draw_line.c b/src/libs/lvgl/src/lv_draw/lv_draw_line.c deleted file mode 100644 index a522a4b5..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_line.c +++ /dev/null @@ -1,637 +0,0 @@ -/** - * @file lv_draw_line.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include <stdio.h> -#include <stdbool.h> -#include "lv_draw.h" -#include "../lv_core/lv_refr.h" -#include "../lv_misc/lv_math.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * 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 VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Draw a line - * @param point1 first point of the line - * @param point2 second point of the line - * @param mask the line will be drawn only on this area - * @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) -{ - - 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; - - line_draw_t main_line; - lv_point_t p1; - lv_point_t p2; - - /*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); - } -} - -/********************** - * 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) -{ - 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; - 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_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_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; - } - } - - /* 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*/ - else { - - 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; - - lv_draw_fill(&draw_area, mask, style->line.color, opa); - - /* 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); - } - } - -#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 - - first_run = false; - - 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 - } -} - -static void line_init(line_draw_t * line, const lv_point_t * p1, const lv_point_t * p2) -{ - line->p1.x = p1->x; - line->p1.y = p1->y; - line->p2.x = p2->x; - line->p2.y = p2->y; - - 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*/ - - line->p_act.x = line->p1.x; - line->p_act.y = line->p1.y; -} - -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; - } - if(line->e2 < line->dy) { - line->err += line->dx; - line->p_act.y += line->sy; - } - return true; -} - -/** - * Iterate until step one in y direction. - * @param line - * @return - */ -static bool line_next_y(line_draw_t * line) -{ - lv_coord_t last_y = line->p_act.y; - - do { - if(!line_next(line)) return false; - } while(last_y == line->p_act.y); - - 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; -} diff --git a/src/libs/lvgl/src/lv_draw/lv_draw_line.h b/src/libs/lvgl/src/lv_draw/lv_draw_line.h deleted file mode 100644 index 208bd051..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_line.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @file lv_draw_line.h - * - */ - -#ifndef LV_DRAW_LINE_H -#define LV_DRAW_LINE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Draw a line - * @param point1 first point of the line - * @param point2 second point of the line - * @param mask the line will be drawn only on this area - * @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); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_DRAW_LINE_H*/ diff --git a/src/libs/lvgl/src/lv_draw/lv_draw_rect.c b/src/libs/lvgl/src/lv_draw/lv_draw_rect.c deleted file mode 100644 index 0964a46a..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_rect.c +++ /dev/null @@ -1,1521 +0,0 @@ -/** - * @file lv_draw_rect.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_rect.h" -#include "../lv_misc/lv_circ.h" -#include "../lv_misc/lv_math.h" -#include "../lv_core/lv_refr.h" - -/********************* - * 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 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * 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 VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Draw a rectangle - * @param coords the coordinates of the rectangle - * @param mask the rectangle will be drawn only in this mask - * @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) -{ - 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 - - /* 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; - - if(style->body.opa > LV_OPA_MIN) { - lv_draw_rect_main_mid(coords, mask, style, opa_scale); - - if(style->body.radius != 0) { - lv_draw_rect_main_corner(coords, mask, style, opa_scale); - } - } - - 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); - - if(style->body.radius != 0) { - lv_draw_rect_border_corner(coords, mask, style, opa_scale); - } - } -} - -/********************** - * 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) -{ - 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; - 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); - } - } -} -/** - * 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); - - 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_area_t edge_top_area; - lv_area_t mid_top_area; - lv_area_t mid_bot_area; - lv_area_t edge_bot_area; - - lv_point_t cir; - lv_coord_t cir_tmp; - lv_circ_init(&cir, &cir_tmp, radius); - - /*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)); - - 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)); -#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_color_t aa_color_hor_top; - lv_color_t aa_color_hor_bottom; - lv_color_t aa_color_ver; -#endif - - 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_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); - } - - 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); - } - - out_x_last = cir.x; - out_y_seg_start = out_y_seg_end; - } - } -#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(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); - } - - 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(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) -{ - uint16_t radius = style->body.radius; - bool aa = lv_disp_get_antialiasing(lv_refr_get_disp_refreshing()); - - 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; - - /*the 0 px border width drawn as 1 px, so decrement the b_width*/ - bwidth--; - - radius = lv_draw_cont_radius_corr(radius, width, height); - - if(radius < bwidth) { - length_corr = bwidth - radius - aa; - corner_size = bwidth; - } else { - corner_size = radius + aa; - } - - /*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); - } - - /*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); - } - - /*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); - } - - /*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); - } - return; - } - - /* Modify the corner_size if corner is drawn */ - corner_size++; - - /*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; - - if(part & LV_BORDER_BOTTOM) - work_area.y2 = coords->y2 - corner_size; - else - work_area.y2 = coords->y2 - radius; - - /*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); - } - - /*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); - } - - work_area.x1 = coords->x1 + corner_size - length_corr; - work_area.x2 = coords->x2 - corner_size + length_corr; - - /*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); - } - - /*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); - } - - /*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); - } - - /*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); - } - - /*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); - } - } - } - } -#endif -} - -#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); - } - - uint16_t col; - - 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; - - ofs_rt.x = coords->x2 - radius - aa; - ofs_rt.y = coords->y1 + radius + aa; - - ofs_lb.x = coords->x1 + radius + aa; - ofs_lb.y = coords->y2 - radius - aa; - - 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))*/ - - /*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; - } - - /*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)*/ - } - - 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; - } - } - - /*Flush the line*/ - point_rt.x = curve_x[line] + ofs_rt.x + 1; - point_rt.y = ofs_rt.y - line; - - point_rb.x = curve_x[line] + ofs_rb.x + 1; - point_rb.y = ofs_rb.y + line; - - point_lt.x = ofs_lt.x - curve_x[line] - 1; - point_lt.y = ofs_lt.y - line; - - 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++) { - - 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(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]); - } - - 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--; - } - - /* 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); - } -} - -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]; - } 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); - } - point_r.y++; - } - } - - 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; - - 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++; - } -} - -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) -{ - 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; - - 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; - - 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++; - } -} - -#endif - -static uint16_t lv_draw_cont_radius_corr(uint16_t r, lv_coord_t w, lv_coord_t h) -{ - bool aa = lv_disp_get_antialiasing(lv_refr_get_disp_refreshing()); - - if(r >= (w >> 1)) { - r = (w >> 1); - if(r != 0) r--; - } - if(r >= (h >> 1)) { - r = (h >> 1); - if(r != 0) r--; - } - - if(r > 0) r -= aa; - - return r; -} - -#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/libs/lvgl/src/lv_draw/lv_draw_rect.h b/src/libs/lvgl/src/lv_draw/lv_draw_rect.h deleted file mode 100644 index 852b7291..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_rect.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * @file lv_draw_rect.h - * - */ - -#ifndef LV_DRAW_RECT_H -#define LV_DRAW_RECT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_draw.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Draw a rectangle - * @param coords the coordinates of the rectangle - * @param mask the rectangle will be drawn only in this mask - * @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); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_DRAW_RECT_H*/ diff --git a/src/libs/lvgl/src/lv_draw/lv_draw_triangle.c b/src/libs/lvgl/src/lv_draw/lv_draw_triangle.c deleted file mode 100644 index 1c8939ad..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_triangle.c +++ /dev/null @@ -1,343 +0,0 @@ -/** - * @file lv_draw_triangle.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_triangle.h" -#include "../lv_misc/lv_math.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * 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 - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * - * @param points pointer to an array with 3 points - * @param mask the triangle will be drawn only in this mask - * @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) -{ - /*Return if 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); - } -} - -/** - * Draw a polygon from triangles. 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 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, - 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); - } -} - -/********************** - * 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/libs/lvgl/src/lv_draw/lv_draw_triangle.h b/src/libs/lvgl/src/lv_draw/lv_draw_triangle.h deleted file mode 100644 index b6b230d9..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_draw_triangle.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * @file lv_draw_triangle.h - * - */ - -#ifndef LV_DRAW_TRIANGLE_H -#define LV_DRAW_TRIANGLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_draw.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * - * @param points pointer to an array with 3 points - * @param mask the triangle will be drawn only in this mask - * @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); - -/** - * Draw a polygon from triangles. 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 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, - lv_opa_t opa_scale); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_DRAW_TRIANGLE_H*/ diff --git a/src/libs/lvgl/src/lv_draw/lv_img_cache.c b/src/libs/lvgl/src/lv_draw/lv_img_cache.c deleted file mode 100644 index 841e1169..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_img_cache.c +++ /dev/null @@ -1,206 +0,0 @@ -/** - * @file lv_img_cache.c - * - */ - -/********************* - * 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" - -#if defined(LV_GC_INCLUDE) -#include LV_GC_INCLUDE -#endif /* LV_ENABLE_GC */ -/********************* - * DEFINES - *********************/ -/*Decrement life with this value in every open*/ -#define LV_IMG_CACHE_AGING 1 - -/*Boost life by this factor (multiply time_to_open with this value)*/ -#define LV_IMG_CACHE_LIFE_GAIN 1 - -/*Don't let life to be greater than this limit because it would require a lot of time to - * "die" from very high values */ -#define LV_IMG_CACHE_LIFE_LIMIT 1000 - -#if LV_IMG_CACHE_DEF_SIZE < 1 -#error "LV_IMG_CACHE_DEF_SIZE must be >= 1. See lv_conf.h" -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static uint16_t entry_cnt; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Open an image using the image decoder interface and cache it. - * The image will be left open meaning if the image decoder open callback allocated memory then it will remain. - * The image is closed if a new image is opened and the new image takes its place in the cache. - * @param src source of the image. Path to file or pointer to an `lv_img_dsc_t` variable - * @param style style of the image - * @return pointer to the cache entry or NULL if can open the image - */ -lv_img_cache_entry_t * lv_img_cache_open(const void * src, const lv_style_t * style) -{ - if(entry_cnt == 0) { - LV_LOG_WARN("lv_img_cache_open: the cache size is 0"); - return NULL; - } - - lv_img_cache_entry_t * cache = LV_GC_ROOT(_lv_img_cache_array); - - /*Decrement all lifes. Make the entries older*/ - uint16_t i; - for(i = 0; i < entry_cnt; i++) { - if(cache[i].life > INT32_MIN + LV_IMG_CACHE_AGING) { - cache[i].life -= LV_IMG_CACHE_AGING; - } - } - - /*Is the image cached?*/ - lv_img_cache_entry_t * cached_src = NULL; - for(i = 0; i < entry_cnt; i++) { - 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 && cache[i].dec_dsc.style == style) 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`*/ - cached_src = &cache[i]; - cached_src->life += cached_src->dec_dsc.time_to_open * LV_IMG_CACHE_LIFE_GAIN; - if(cached_src->life > LV_IMG_CACHE_LIFE_LIMIT) cached_src->life = LV_IMG_CACHE_LIFE_LIMIT; - LV_LOG_TRACE("image draw: image found in the cache"); - break; - } - } - - /*The image is not cached then cache it now*/ - if(cached_src == NULL) { - /*Find an entry to reuse. Select the entry with the least life*/ - cached_src = &cache[0]; - for(i = 1; i < entry_cnt; i++) { - if(cache[i].life < cached_src->life) { - cached_src = &cache[i]; - } - } - - /*Close the decoder to reuse if it was opened (has a valid source)*/ - if(cached_src->dec_dsc.src) { - lv_img_decoder_close(&cached_src->dec_dsc); - LV_LOG_INFO("image draw: cache miss, close and reuse an entry"); - } else { - LV_LOG_INFO("image draw: cache miss, cached to an empty entry"); - } - - /*Open the image and measure the time to open*/ - uint32_t t_start; - t_start = lv_tick_get(); - cached_src->dec_dsc.time_to_open = 0; - lv_res_t open_res = lv_img_decoder_open(&cached_src->dec_dsc, src, style); - if(open_res == LV_RES_INV) { - LV_LOG_WARN("Image draw cannot open the image resource"); - lv_img_decoder_close(&cached_src->dec_dsc); - memset(&cached_src->dec_dsc, 0, sizeof(lv_img_decoder_dsc_t)); - memset(cached_src, 0, sizeof(lv_img_cache_entry_t)); - cached_src->life = INT32_MIN; /*Make the empty entry very "weak" to force its use */ - return NULL; - } - - cached_src->life = 0; - - /*If `time_to_open` was not set in the open function set it here*/ - if(cached_src->dec_dsc.time_to_open == 0) { - cached_src->dec_dsc.time_to_open = lv_tick_elaps(t_start); - } - - if(cached_src->dec_dsc.time_to_open == 0) cached_src->dec_dsc.time_to_open = 1; - } - - return cached_src; -} - -/** - * Set the number of images to be cached. - * More cached images mean more opened image at same time which might mean more memory usage. - * E.g. if 20 PNG or JPG images are open in the RAM they consume memory while opened in the cache. - * @param new_entry_cnt number of image to cache - */ -void lv_img_cache_set_size(uint16_t new_entry_cnt) -{ - if(LV_GC_ROOT(_lv_img_cache_array) != NULL) { - /*Clean the cache before free it*/ - lv_img_cache_invalidate_src(NULL); - lv_mem_free(LV_GC_ROOT(_lv_img_cache_array)); - } - - /*Reallocate the cache*/ - LV_GC_ROOT(_lv_img_cache_array) = lv_mem_alloc(sizeof(lv_img_cache_entry_t) * new_entry_cnt); - LV_ASSERT_MEM(LV_GC_ROOT(_lv_img_cache_array)); - if(LV_GC_ROOT(_lv_img_cache_array) == NULL) { - entry_cnt = 0; - return; - } - entry_cnt = new_entry_cnt; - - /*Clean the cache*/ - uint16_t i; - for(i = 0; i < entry_cnt; i++) { - memset(&LV_GC_ROOT(_lv_img_cache_array)[i].dec_dsc, 0, sizeof(lv_img_decoder_dsc_t)); - memset(&LV_GC_ROOT(_lv_img_cache_array)[i], 0, sizeof(lv_img_cache_entry_t)); - } -} - -/** - * Invalidate an image source in the cache. - * Useful if the image source is updated therefore it needs to be cached again. - * @param src an image source path to a file or pointer to an `lv_img_dsc_t` variable. - */ -void lv_img_cache_invalidate_src(const void * src) -{ - - lv_img_cache_entry_t * cache = LV_GC_ROOT(_lv_img_cache_array); - - uint16_t i; - for(i = 0; i < entry_cnt; i++) { - if(cache[i].dec_dsc.src == src || src == NULL) { - if(cache[i].dec_dsc.src != NULL) { - lv_img_decoder_close(&cache[i].dec_dsc); - } - - memset(&cache[i].dec_dsc, 0, sizeof(lv_img_decoder_dsc_t)); - memset(&cache[i], 0, sizeof(lv_img_cache_entry_t)); - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/libs/lvgl/src/lv_draw/lv_img_cache.h b/src/libs/lvgl/src/lv_draw/lv_img_cache.h deleted file mode 100644 index 859b4b8d..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_img_cache.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @file lv_img_cache.h - * - */ - -#ifndef LV_IMG_CACHE_H -#define LV_IMG_CACHE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_img_decoder.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * When loading images from the network it can take a long time to download and decode the image. - * - * To avoid repeating this heavy load images can be cached. - */ -typedef struct -{ - lv_img_decoder_dsc_t dec_dsc; /**< Image information */ - - /** Count the cache entries's life. Add `time_tio_open` to `life` when the entry is used. - * Decrement all lifes by one every in every ::lv_img_cache_open. - * If life == 0 the entry can be reused */ - int32_t life; -} lv_img_cache_entry_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Open an image using the image decoder interface and cache it. - * The image will be left open meaning if the image decoder open callback allocated memory then it will remain. - * The image is closed if a new image is opened and the new image takes its place in the cache. - * @param src source of the image. Path to file or pointer to an `lv_img_dsc_t` variable - * @param style style of the image - * @return pointer to the cache entry or NULL if can open the image - */ -lv_img_cache_entry_t * lv_img_cache_open(const void * src, const lv_style_t * style); - -/** - * Set the number of images to be cached. - * More cached images mean more opened image at same time which might mean more memory usage. - * E.g. if 20 PNG or JPG images are open in the RAM they consume memory while opened in the cache. - * @param new_entry_cnt number of image to cache - */ -void lv_img_cache_set_size(uint16_t new_slot_num); - -/** - * Invalidate an image source in the cache. - * Useful if the image source is updated therefore it needs to be cached again. - * @param src an image source path to a file or pointer to an `lv_img_dsc_t` variable. - */ -void lv_img_cache_invalidate_src(const void * src); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_IMG_CACHE_H*/ diff --git a/src/libs/lvgl/src/lv_draw/lv_img_decoder.c b/src/libs/lvgl/src/lv_draw/lv_img_decoder.c deleted file mode 100644 index b3c9d9c8..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_img_decoder.c +++ /dev/null @@ -1,756 +0,0 @@ -/** - * @file lv_img_decoder.c - * - */ - -/********************* - * 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" -#include "../lv_misc/lv_gc.h" - -#if defined(LV_GC_INCLUDE) -#include LV_GC_INCLUDE -#endif /* LV_ENABLE_GC */ - -/********************* - * DEFINES - *********************/ -#define CF_BUILT_IN_FIRST LV_IMG_CF_TRUE_COLOR -#define CF_BUILT_IN_LAST LV_IMG_CF_ALPHA_8BIT - -/********************** - * TYPEDEFS - **********************/ -typedef struct -{ -#if LV_USE_FILESYSTEM - lv_fs_file_t * f; -#endif - lv_color_t * palette; - lv_opa_t * opa; -} lv_img_decoder_built_in_data_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_res_t lv_img_decoder_built_in_line_true_color(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, - lv_coord_t len, uint8_t * buf); -static lv_res_t lv_img_decoder_built_in_line_alpha(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, - lv_coord_t len, uint8_t * buf); -static lv_res_t lv_img_decoder_built_in_line_indexed(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, - lv_coord_t len, uint8_t * buf); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the image decoder module - * */ -void lv_img_decoder_init(void) -{ - lv_ll_init(&LV_GC_ROOT(_lv_img_defoder_ll), sizeof(lv_img_decoder_t)); - - lv_img_decoder_t * decoder; - - /*Create a decoder for the built in color format*/ - decoder = lv_img_decoder_create(); - if(decoder == NULL) { - LV_LOG_WARN("lv_img_decoder_init: out of memory"); - LV_ASSERT_MEM(decoder); - return; - } - - lv_img_decoder_set_info_cb(decoder, lv_img_decoder_built_in_info); - lv_img_decoder_set_open_cb(decoder, lv_img_decoder_built_in_open); - lv_img_decoder_set_read_line_cb(decoder, lv_img_decoder_built_in_read_line); - lv_img_decoder_set_close_cb(decoder, lv_img_decoder_built_in_close); -} - -/** - * Get information about an image. - * Try the created image decoder one by one. Once one is able to get info that info will be used. - * @param src the image source. E.g. file name or variable. - * @param header the image info will be stored here - * @return LV_RES_OK: success; LV_RES_INV: wasn't able to get info about the image - */ -lv_res_t lv_img_decoder_get_info(const char * src, lv_img_header_t * header) -{ - header->always_zero = 0; - - lv_res_t res = LV_RES_INV; - lv_img_decoder_t * d; - LV_LL_READ(LV_GC_ROOT(_lv_img_defoder_ll), d) - { - res = LV_RES_INV; - if(d->info_cb) { - res = d->info_cb(d, src, header); - if(res == LV_RES_OK) break; - } - } - - return res; -} - -/** - * Open an image. - * Try the created image decoder one by one. Once one is able to open the image that decoder is save in `dsc` - * @param dsc describe a decoding session. Simply a pointer to an `lv_img_decoder_dsc_t` variable. - * @param src the image source. Can be - * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_add_drv()`) - * 2) Variable: Pointer to an `lv_img_dsc_t` variable - * 3) Symbol: E.g. `LV_SYMBOL_OK` - * @param style the style of the image - * @return LV_RES_OK: opened the image. `dsc->img_data` and `dsc->header` are set. - * LV_RES_INV: none of the registered image decoders were able to open the image. - */ -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_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; - LV_LL_READ(LV_GC_ROOT(_lv_img_defoder_ll), d) - { - /*Info an Open callbacks are required*/ - if(d->info_cb == NULL || d->open_cb == NULL) continue; - - res = d->info_cb(d, src, &dsc->header); - if(res != LV_RES_OK) continue; - - dsc->error_msg = NULL; - dsc->img_data = NULL; - dsc->decoder = d; - - res = d->open_cb(d, dsc); - - /*Opened successfully. It is a good decoder to for this image source*/ - if(res == LV_RES_OK) break; - } - - if(res == LV_RES_INV) { - memset(dsc, 0, sizeof(lv_img_decoder_dsc_t)); - } - - return res; -} - -/** - * Read a line from an opened image - * @param dsc pointer to `lv_img_decoder_dsc_t` used in `lv_img_decoder_open` - * @param x start X coordinate (from left) - * @param y start Y coordinate (from top) - * @param len number of pixels to read - * @param buf store the data here - * @return LV_RES_OK: success; LV_RES_INV: an error occurred - */ -lv_res_t lv_img_decoder_read_line(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_coord_t len, uint8_t * buf) -{ - lv_res_t res = LV_RES_INV; - if(dsc->decoder->read_line_cb) res = dsc->decoder->read_line_cb(dsc->decoder, dsc, x, y, len, buf); - - return res; -} - -/** - * Close a decoding session - * @param dsc pointer to `lv_img_decoder_dsc_t` used in `lv_img_decoder_open` - */ -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; - } - } -} - -/** - * Create a new image decoder - * @return pointer to the new image decoder - */ -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_ASSERT_MEM(decoder); - if(decoder == NULL) return NULL; - - memset(decoder, 0, sizeof(lv_img_decoder_t)); - - return decoder; -} - -/** - * Delete an image decoder - * @param decoder pointer to an image decoder - */ -void lv_img_decoder_delete(lv_img_decoder_t * decoder) -{ - lv_ll_rem(&LV_GC_ROOT(_lv_img_defoder_ll), decoder); - lv_mem_free(decoder); -} - -/** - * Set a callback to get information about the image - * @param decoder pointer to an image decoder - * @param info_cb a function to collect info about an image (fill an `lv_img_header_t` struct) - */ -void lv_img_decoder_set_info_cb(lv_img_decoder_t * decoder, lv_img_decoder_info_f_t info_cb) -{ - decoder->info_cb = info_cb; -} - -/** - * Set a callback to open an image - * @param decoder pointer to an image decoder - * @param open_cb a function to open an image - */ -void lv_img_decoder_set_open_cb(lv_img_decoder_t * decoder, lv_img_decoder_open_f_t open_cb) -{ - decoder->open_cb = open_cb; -} - -/** - * Set a callback to a decoded line of an image - * @param decoder pointer to an image decoder - * @param read_line_cb a function to read a line of an image - */ -void lv_img_decoder_set_read_line_cb(lv_img_decoder_t * decoder, lv_img_decoder_read_line_f_t read_line_cb) -{ - decoder->read_line_cb = read_line_cb; -} - -/** - * Set a callback to close a decoding session. E.g. close files and free other resources. - * @param decoder pointer to an image decoder - * @param close_cb a function to close a decoding session - */ -void lv_img_decoder_set_close_cb(lv_img_decoder_t * decoder, lv_img_decoder_close_f_t close_cb) -{ - decoder->close_cb = close_cb; -} - -/** - * Get info about a built-in image - * @param decoder the decoder where this function belongs - * @param src the image source: pointer to an `lv_img_dsc_t` variable, a file path or a symbol - * @param header store the image data here - * @return LV_RES_OK: the info is successfully stored in `header`; LV_RES_INV: unknown format or other error. - */ -lv_res_t lv_img_decoder_built_in_info(lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header) -{ - (void)decoder; /*Unused*/ - - lv_img_src_t src_type = lv_img_src_get_type(src); - if(src_type == LV_IMG_SRC_VARIABLE) { - lv_img_cf_t cf = ((lv_img_dsc_t *)src)->header.cf; - if(cf < CF_BUILT_IN_FIRST || cf > CF_BUILT_IN_LAST) return LV_RES_INV; - - header->w = ((lv_img_dsc_t *)src)->header.w; - header->h = ((lv_img_dsc_t *)src)->header.h; - header->cf = ((lv_img_dsc_t *)src)->header.cf; - } -#if LV_USE_FILESYSTEM - else if(src_type == LV_IMG_SRC_FILE) { - lv_fs_file_t file; - lv_fs_res_t res; - uint32_t rn; - res = lv_fs_open(&file, src, LV_FS_MODE_RD); - if(res == LV_FS_RES_OK) { - res = lv_fs_read(&file, header, sizeof(lv_img_header_t), &rn); - lv_fs_close(&file); - } - - if(header->cf < CF_BUILT_IN_FIRST || header->cf > CF_BUILT_IN_LAST) return LV_RES_INV; - - } -#endif - else if(src_type == LV_IMG_SRC_SYMBOL) { - /*The size depend on the font but it is unknown here. It should be handled outside of the - * function*/ - header->w = 1; - header->h = 1; - /* Symbols always have transparent parts. Important because of cover check in the design - * function. The actual value doesn't matter because lv_draw_label will draw it*/ - header->cf = LV_IMG_CF_ALPHA_1BIT; - } else { - LV_LOG_WARN("Image get info found unknown src type"); - return LV_RES_INV; - } - return LV_RES_OK; -} - -/** - * Open a built in image - * @param decoder the decoder where this function belongs - * @param dsc pointer to decoder descriptor. `src`, `style` are already initialized in it. - * @return LV_RES_OK: the info is successfully stored in `header`; LV_RES_INV: unknown format or other error. - */ -lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc) -{ - /*Open the file if it's a file*/ - if(dsc->src_type == LV_IMG_SRC_FILE) { -#if LV_USE_FILESYSTEM - - /*Support only "*.bin" files*/ - if(strcmp(lv_fs_get_ext(dsc->src), "bin")) return LV_RES_INV; - - lv_fs_file_t f; - lv_fs_res_t res = lv_fs_open(&f, dsc->src, LV_FS_MODE_RD); - if(res != LV_FS_RES_OK) { - LV_LOG_WARN("Built-in image decoder can't open the file"); - return LV_RES_INV; - } - - /*If the file was open successfully save the file descriptor*/ - if(dsc->user_data == NULL) { - 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_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->f = lv_mem_alloc(sizeof(f)); - if(user_data->f == NULL) { - LV_LOG_ERROR("img_decoder_built_in_open: out of memory"); - LV_ASSERT_MEM(user_data->f); - } - - memcpy(user_data->f, &f, sizeof(f)); - -#else - LV_LOG_WARN("Image built-in decoder cannot read file because LV_USE_FILESYSTEM = 0"); - return LV_RES_INV; -#endif - } - - lv_img_cf_t cf = dsc->header.cf; - /*Process true color formats*/ - if(cf == LV_IMG_CF_TRUE_COLOR || cf == LV_IMG_CF_TRUE_COLOR_ALPHA || cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { - if(dsc->src_type == LV_IMG_SRC_VARIABLE) { - /* In case of uncompressed formats the image stored in the ROM/RAM. - * So simply give its pointer*/ - dsc->img_data = ((lv_img_dsc_t *)dsc->src)->data; - return LV_RES_OK; - } else { - /*If it's a file it need to be read line by line later*/ - dsc->img_data = NULL; - return LV_RES_OK; - } - } - /*Process indexed images. Build a palette*/ - else if(cf == LV_IMG_CF_INDEXED_1BIT || cf == LV_IMG_CF_INDEXED_2BIT || cf == LV_IMG_CF_INDEXED_4BIT || - cf == LV_IMG_CF_INDEXED_8BIT) { - -#if LV_IMG_CF_INDEXED - uint8_t px_size = lv_img_color_format_get_px_size(cf); - uint32_t palette_size = 1 << px_size; - - /*Allocate the palette*/ - if(dsc->user_data == NULL) { - 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_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)); - 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_ASSERT_MEM(user_data->f); -#endif - } - - if(dsc->src_type == LV_IMG_SRC_FILE) { - /*Read the palette from file*/ -#if LV_USE_FILESYSTEM - lv_fs_seek(user_data->f, 4); /*Skip the header*/ - 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; -#endif - } else { - /*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; - } - } - - dsc->img_data = NULL; - return LV_RES_OK; -#else - LV_LOG_WARN("Indexed (palette) images are not enabled in lv_conf.h. See LV_IMG_CF_INDEXED"); - return LV_RES_INV; -#endif - } - /*Alpha indexed images. */ - else if(cf == LV_IMG_CF_ALPHA_1BIT || cf == LV_IMG_CF_ALPHA_2BIT || cf == LV_IMG_CF_ALPHA_4BIT || - cf == LV_IMG_CF_ALPHA_8BIT) { -#if LV_IMG_CF_ALPHA - dsc->img_data = NULL; - return LV_RES_OK; /*Nothing to process*/ -#else - LV_LOG_WARN("Alpha indexed images are not enabled in lv_conf.h. See LV_IMG_CF_ALPHA"); - return LV_RES_INV; -#endif - } - /*Unknown format. Can't decode it.*/ - else { - /*Free the potentially allocated memories*/ - lv_img_decoder_built_in_close(decoder, dsc); - - LV_LOG_WARN("Image decoder open: unknown color format") - return LV_RES_INV; - } -} - -/** - * Decode `len` pixels starting from the given `x`, `y` coordinates and store them in `buf`. - * Required only if the "open" function can't return with the whole decoded pixel array. - * @param decoder pointer to the decoder the function associated with - * @param dsc pointer to decoder descriptor - * @param x start x coordinate - * @param y start y coordinate - * @param len number of pixels to decode - * @param buf a buffer to store the decoded pixels - * @return LV_RES_OK: ok; LV_RES_INV: failed - */ -lv_res_t lv_img_decoder_built_in_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc, lv_coord_t x, - lv_coord_t y, lv_coord_t len, uint8_t * buf) -{ - (void)decoder; /*Unused*/ - - lv_res_t res = LV_RES_INV; - - if(dsc->header.cf == LV_IMG_CF_TRUE_COLOR || dsc->header.cf == LV_IMG_CF_TRUE_COLOR_ALPHA || - dsc->header.cf == LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED) { - /* For TRUE_COLOR images read line required only for files. - * For variables the image data was returned in `open`*/ - if(dsc->src_type == LV_IMG_SRC_FILE) { - res = lv_img_decoder_built_in_line_true_color(dsc, x, y, len, buf); - } - } 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) { - - res = lv_img_decoder_built_in_line_alpha(dsc, x, y, len, buf); - } else if(dsc->header.cf == LV_IMG_CF_INDEXED_1BIT || dsc->header.cf == LV_IMG_CF_INDEXED_2BIT || - dsc->header.cf == LV_IMG_CF_INDEXED_4BIT || dsc->header.cf == LV_IMG_CF_INDEXED_8BIT) { - res = lv_img_decoder_built_in_line_indexed(dsc, x, y, len, buf); - } else { - LV_LOG_WARN("Built-in image decoder read not supports the color format"); - return LV_RES_INV; - } - - return res; -} - -/** - * Close the pending decoding. Free resources etc. - * @param decoder pointer to the decoder the function associated with - * @param dsc pointer to decoder descriptor - */ -void lv_img_decoder_built_in_close(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc) -{ - (void)decoder; /*Unused*/ - - lv_img_decoder_built_in_data_t * user_data = dsc->user_data; - if(user_data) { -#if LV_USE_FILESYSTEM - if(user_data->f) { - lv_fs_close(user_data->f); - lv_mem_free(user_data->f); - } -#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); - - dsc->user_data = NULL; - } -} - - -/********************** - * STATIC FUNCTIONS - **********************/ - -static lv_res_t lv_img_decoder_built_in_line_true_color(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, - lv_coord_t len, uint8_t * buf) -{ -#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); - - uint32_t pos = ((y * dsc->header.w + x) * px_size) >> 3; - pos += 4; /*Skip the header*/ - res = lv_fs_seek(user_data->f, pos); - if(res != LV_FS_RES_OK) { - LV_LOG_WARN("Built-in image decoder seek failed"); - return LV_RES_INV; - } - uint32_t btr = len * (px_size >> 3); - uint32_t br = 0; - lv_fs_read(user_data->f, buf, btr, &br); - if(res != LV_FS_RES_OK || btr != br) { - LV_LOG_WARN("Built-in image decoder read failed"); - return LV_RES_INV; - } - - return LV_RES_OK; -#else - LV_LOG_WARN("Image built-in decoder cannot read file because LV_USE_FILESYSTEM = 0"); - return LV_RES_INV; -#endif -} - -static lv_res_t lv_img_decoder_built_in_line_alpha(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, - lv_coord_t len, uint8_t * buf) -{ - -#if LV_IMG_CF_ALPHA - const lv_opa_t alpha1_opa_table[2] = {0, 255}; /*Opacity mapping with bpp = 1 (Just for compatibility)*/ - const lv_opa_t alpha2_opa_table[4] = {0, 85, 170, 255}; /*Opacity mapping with bpp = 2*/ - const lv_opa_t alpha4_opa_table[16] = {0, 17, 34, 51, /*Opacity mapping with bpp = 4*/ - 68, 85, 102, 119, 136, 153, 170, 187, 204, 221, 238, 255}; - - /*Simply fill the buffer with the color. Later only the alpha value will be modified.*/ - lv_color_t bg_color = dsc->style->image.color; - lv_coord_t i; - for(i = 0; i < len; i++) { -#if LV_COLOR_DEPTH == 8 || LV_COLOR_DEPTH == 1 - buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE] = bg_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] = bg_color.full & 0xFF; - buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE + 1] = (bg_color.full >> 8) & 0xFF; -#elif LV_COLOR_DEPTH == 32 - *((uint32_t *)&buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE]) = bg_color.full; -#else -#error "Invalid LV_COLOR_DEPTH. Check it in lv_conf.h" -#endif - } - - const lv_opa_t * opa_table = NULL; - uint8_t px_size = lv_img_color_format_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; - uint32_t ofs = 0; - int8_t pos = 0; - switch(dsc->header.cf) { - case LV_IMG_CF_ALPHA_1BIT: - w = (dsc->header.w >> 3); /*E.g. w = 20 -> w = 2 + 1*/ - if(dsc->header.w & 0x7) w++; - ofs += w * y + (x >> 3); /*First pixel*/ - pos = 7 - (x & 0x7); - opa_table = alpha1_opa_table; - break; - case LV_IMG_CF_ALPHA_2BIT: - w = (dsc->header.w >> 2); /*E.g. w = 13 -> w = 3 + 1 (bytes)*/ - if(dsc->header.w & 0x3) w++; - ofs += w * y + (x >> 2); /*First pixel*/ - pos = 6 - ((x & 0x3) * 2); - opa_table = alpha2_opa_table; - break; - case LV_IMG_CF_ALPHA_4BIT: - w = (dsc->header.w >> 1); /*E.g. w = 13 -> w = 6 + 1 (bytes)*/ - if(dsc->header.w & 0x1) w++; - ofs += w * y + (x >> 1); /*First pixel*/ - pos = 4 - ((x & 0x1) * 4); - opa_table = alpha4_opa_table; - break; - case LV_IMG_CF_ALPHA_8BIT: - w = dsc->header.w; /*E.g. x = 7 -> w = 7 (bytes)*/ - ofs += w * y + x; /*First pixel*/ - pos = 0; - break; - } - -#if LV_USE_FILESYSTEM - lv_img_decoder_built_in_data_t * user_data = dsc->user_data; - uint8_t fs_buf[LV_HOR_RES_MAX]; -#endif - - const uint8_t * data_tmp = NULL; - if(dsc->src_type == LV_IMG_SRC_VARIABLE) { - const lv_img_dsc_t * img_dsc = dsc->src; - - data_tmp = img_dsc->data + ofs; - } else { -#if LV_USE_FILESYSTEM - lv_fs_seek(user_data->f, ofs + 4); /*+4 to skip the header*/ - lv_fs_read(user_data->f, fs_buf, w, NULL); - data_tmp = fs_buf; -#else - LV_LOG_WARN("Image built-in alpha line reader can't read file because LV_USE_FILESYSTEM = 0"); - data_tmp = NULL; /*To avoid warnings*/ - return LV_RES_INV; -#endif - } - - uint8_t byte_act = 0; - uint8_t val_act; - for(i = 0; i < len; i++) { - val_act = (data_tmp[byte_act] & (mask << pos)) >> pos; - - buf[i * LV_IMG_PX_SIZE_ALPHA_BYTE + LV_IMG_PX_SIZE_ALPHA_BYTE - 1] = - dsc->header.cf == LV_IMG_CF_ALPHA_8BIT ? val_act : opa_table[val_act]; - - pos -= px_size; - if(pos < 0) { - pos = 8 - px_size; - data_tmp++; - } - } - - return LV_RES_OK; - -#else - LV_LOG_WARN("Image built-in alpha line reader failed because LV_IMG_CF_ALPHA is 0 in lv_conf.h"); - return LV_RES_INV; -#endif -} - -static lv_res_t lv_img_decoder_built_in_line_indexed(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, - lv_coord_t len, uint8_t * buf) -{ - -#if LV_IMG_CF_INDEXED - uint8_t px_size = lv_img_color_format_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; - int8_t pos = 0; - uint32_t ofs = 0; - switch(dsc->header.cf) { - case LV_IMG_CF_INDEXED_1BIT: - w = (dsc->header.w >> 3); /*E.g. w = 20 -> w = 2 + 1*/ - if(dsc->header.w & 0x7) w++; - ofs += w * y + (x >> 3); /*First pixel*/ - ofs += 8; /*Skip the palette*/ - pos = 7 - (x & 0x7); - break; - case LV_IMG_CF_INDEXED_2BIT: - w = (dsc->header.w >> 2); /*E.g. w = 13 -> w = 3 + 1 (bytes)*/ - if(dsc->header.w & 0x3) w++; - ofs += w * y + (x >> 2); /*First pixel*/ - ofs += 16; /*Skip the palette*/ - pos = 6 - ((x & 0x3) * 2); - break; - case LV_IMG_CF_INDEXED_4BIT: - w = (dsc->header.w >> 1); /*E.g. w = 13 -> w = 6 + 1 (bytes)*/ - if(dsc->header.w & 0x1) w++; - ofs += w * y + (x >> 1); /*First pixel*/ - ofs += 64; /*Skip the palette*/ - pos = 4 - ((x & 0x1) * 4); - break; - case LV_IMG_CF_INDEXED_8BIT: - w = dsc->header.w; /*E.g. x = 7 -> w = 7 (bytes)*/ - ofs += w * y + x; /*First pixel*/ - ofs += 1024; /*Skip the palette*/ - pos = 0; - break; - } - - lv_img_decoder_built_in_data_t * user_data = dsc->user_data; - -#if LV_USE_FILESYSTEM - uint8_t fs_buf[LV_HOR_RES_MAX]; -#endif - const uint8_t * data_tmp = NULL; - if(dsc->src_type == LV_IMG_SRC_VARIABLE) { - const lv_img_dsc_t * img_dsc = dsc->src; - data_tmp = img_dsc->data + ofs; - } else { -#if LV_USE_FILESYSTEM - lv_fs_seek(user_data->f, ofs + 4); /*+4 to skip the header*/ - lv_fs_read(user_data->f, fs_buf, w, NULL); - data_tmp = fs_buf; -#else - LV_LOG_WARN("Image built-in indexed line reader can't read file because LV_USE_FILESYSTEM = 0"); - data_tmp = NULL; /*To avoid warnings*/ - return LV_RES_INV; -#endif - } - - uint8_t val_act; - lv_coord_t i; - for(i = 0; i < len; i++) { - 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) { - pos = 8 - px_size; - data_tmp++; - } - } - - 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"); - return LV_RES_INV; -#endif -} diff --git a/src/libs/lvgl/src/lv_draw/lv_img_decoder.h b/src/libs/lvgl/src/lv_draw/lv_img_decoder.h deleted file mode 100644 index fb7af832..00000000 --- a/src/libs/lvgl/src/lv_draw/lv_img_decoder.h +++ /dev/null @@ -1,357 +0,0 @@ -/** - * @file lv_img_decoder.h - * - */ - -#ifndef LV_IMG_DEOCER_H -#define LV_IMG_DEOCER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include <stdint.h> -#include "../lv_misc/lv_fs.h" -#include "../lv_misc/lv_types.h" -#include "../lv_misc/lv_area.h" -#include "../lv_core/lv_style.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 - -/********************** - * TYPEDEFS - **********************/ - -/** - * Source of image. */ -enum { - LV_IMG_SRC_VARIABLE, /** Binary/C variable */ - LV_IMG_SRC_FILE, /** File in filesystem */ - LV_IMG_SRC_SYMBOL, /** Symbol (@ref lv_symbol_def.h) */ - LV_IMG_SRC_UNKNOWN, /** Unknown source */ -}; - -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 */ - -struct _lv_img_decoder; -struct _lv_img_decoder_dsc; - -/** - * Get info from an image and store in the `header` - * @param src the image source. Can be a pointer to a C array or a file name (Use - * `lv_img_src_get_type` to determine the type) - * @param header store the info here - * @return LV_RES_OK: info written correctly; LV_RES_INV: failed - */ -typedef lv_res_t (*lv_img_decoder_info_f_t)(struct _lv_img_decoder * decoder, const void * src, - lv_img_header_t * header); - -/** - * Open an image for decoding. Prepare it as it is required to read it later - * @param decoder pointer to the decoder the function associated with - * @param dsc pointer to decoder descriptor. `src`, `style` are already initialized in it. - */ -typedef lv_res_t (*lv_img_decoder_open_f_t)(struct _lv_img_decoder * decoder, struct _lv_img_decoder_dsc * dsc); - -/** - * Decode `len` pixels starting from the given `x`, `y` coordinates and store them in `buf`. - * Required only if the "open" function can't return with the whole decoded pixel array. - * @param decoder pointer to the decoder the function associated with - * @param dsc pointer to decoder descriptor - * @param x start x coordinate - * @param y start y coordinate - * @param len number of pixels to decode - * @param buf a buffer to store the decoded pixels - * @return LV_RES_OK: ok; LV_RES_INV: failed - */ -typedef lv_res_t (*lv_img_decoder_read_line_f_t)(struct _lv_img_decoder * decoder, struct _lv_img_decoder_dsc * dsc, - lv_coord_t x, lv_coord_t y, lv_coord_t len, uint8_t * buf); - -/** - * Close the pending decoding. Free resources etc. - * @param decoder pointer to the decoder the function associated with - * @param dsc pointer to decoder descriptor - */ -typedef void (*lv_img_decoder_close_f_t)(struct _lv_img_decoder * decoder, struct _lv_img_decoder_dsc * dsc); - -typedef struct _lv_img_decoder -{ - lv_img_decoder_info_f_t info_cb; - lv_img_decoder_open_f_t open_cb; - lv_img_decoder_read_line_f_t read_line_cb; - lv_img_decoder_close_f_t close_cb; - -#if LV_USE_USER_DATA - lv_img_decoder_user_data_t user_data; -#endif -} lv_img_decoder_t; - -/**Describe an image decoding session. Stores data about the decoding*/ -typedef struct _lv_img_decoder_dsc -{ - /**The decoder which was able to open the image source*/ - lv_img_decoder_t * decoder; - - /**The image source. A file path like "S:my_img.png" or pointer to an `lv_img_dsc_t` variable*/ - const void * src; - - /**Style to draw the image.*/ - const lv_style_t * style; - - /**Type of the source: file or variable. Can be set in `open` function if required*/ - lv_img_src_t src_type; - - /**Info about the opened image: color format, size, etc. MUST be set in `open` function*/ - lv_img_header_t header; - - /** Pointer to a buffer where the image's data (pixels) are stored in a decoded, plain format. - * MUST be set in `open` function*/ - const uint8_t * img_data; - - /** How much time did it take to open the image. [ms] - * If not set `lv_img_cache` will measure and set the time to open*/ - uint32_t time_to_open; - - /**A text to display instead of the image when the image can't be opened. - * Can be set in `open` function or set NULL. */ - const char * error_msg; - - /**Store any custom data here is required*/ - void * user_data; -} lv_img_decoder_dsc_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the image decoder module - */ -void lv_img_decoder_init(void); - -/** - * Get information about an image. - * Try the created image decoder one by one. Once one is able to get info that info will be used. - * @param src the image source. Can be - * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_add_drv()`) - * 2) Variable: Pointer to an `lv_img_dsc_t` variable - * 3) Symbol: E.g. `LV_SYMBOL_OK` - * @param header the image info will be stored here - * @return LV_RES_OK: success; LV_RES_INV: wasn't able to get info about the image - */ -lv_res_t lv_img_decoder_get_info(const char * src, lv_img_header_t * header); - -/** - * Open an image. - * Try the created image decoder one by one. Once one is able to open the image that decoder is save in `dsc` - * @param dsc describe a decoding session. Simply a pointer to an `lv_img_decoder_dsc_t` variable. - * @param src the image source. Can be - * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_add_drv()`) - * 2) Variable: Pointer to an `lv_img_dsc_t` variable - * 3) Symbol: E.g. `LV_SYMBOL_OK` - * @param style the style of the image - * @return LV_RES_OK: opened the image. `dsc->img_data` and `dsc->header` are set. - * LV_RES_INV: none of the registered image decoders were able to open the image. - */ -lv_res_t lv_img_decoder_open(lv_img_decoder_dsc_t * dsc, const void * src, const lv_style_t * style); - -/** - * Read a line from an opened image - * @param dsc pointer to `lv_img_decoder_dsc_t` used in `lv_img_decoder_open` - * @param x start X coordinate (from left) - * @param y start Y coordinate (from top) - * @param len number of pixels to read - * @param buf store the data here - * @return LV_RES_OK: success; LV_RES_INV: an error occurred - */ -lv_res_t lv_img_decoder_read_line(lv_img_decoder_dsc_t * dsc, lv_coord_t x, lv_coord_t y, lv_coord_t len, - uint8_t * buf); - -/** - * Close a decoding session - * @param dsc pointer to `lv_img_decoder_dsc_t` used in `lv_img_decoder_open` - */ -void lv_img_decoder_close(lv_img_decoder_dsc_t * dsc); - -/** - * Create a new image decoder - * @return pointer to the new image decoder - */ -lv_img_decoder_t * lv_img_decoder_create(void); - -/** - * Delete an image decoder - * @param decoder pointer to an image decoder - */ -void lv_img_decoder_delete(lv_img_decoder_t * decoder); - -/** - * Set a callback to get information about the image - * @param decoder pointer to an image decoder - * @param info_cb a function to collect info about an image (fill an `lv_img_header_t` struct) - */ -void lv_img_decoder_set_info_cb(lv_img_decoder_t * decoder, lv_img_decoder_info_f_t info_cb); - -/** - * Set a callback to open an image - * @param decoder pointer to an image decoder - * @param open_cb a function to open an image - */ -void lv_img_decoder_set_open_cb(lv_img_decoder_t * decoder, lv_img_decoder_open_f_t open_cb); - -/** - * Set a callback to a decoded line of an image - * @param decoder pointer to an image decoder - * @param read_line_cb a function to read a line of an image - */ -void lv_img_decoder_set_read_line_cb(lv_img_decoder_t * decoder, lv_img_decoder_read_line_f_t read_line_cb); - -/** - * Set a callback to close a decoding session. E.g. close files and free other resources. - * @param decoder pointer to an image decoder - * @param close_cb a function to close a decoding session - */ -void lv_img_decoder_set_close_cb(lv_img_decoder_t * decoder, lv_img_decoder_close_f_t close_cb); - - - -/** - * Get info about a built-in image - * @param decoder the decoder where this function belongs - * @param src the image source: pointer to an `lv_img_dsc_t` variable, a file path or a symbol - * @param header store the image data here - * @return LV_RES_OK: the info is successfully stored in `header`; LV_RES_INV: unknown format or other error. - */ -lv_res_t lv_img_decoder_built_in_info(lv_img_decoder_t * decoder, const void * src, lv_img_header_t * header); - -/** - * Open a built in image - * @param decoder the decoder where this function belongs - * @param dsc pointer to decoder descriptor. `src`, `style` are already initialized in it. - * @return LV_RES_OK: the info is successfully stored in `header`; LV_RES_INV: unknown format or other error. - */ -lv_res_t lv_img_decoder_built_in_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc); - -/** - * Decode `len` pixels starting from the given `x`, `y` coordinates and store them in `buf`. - * Required only if the "open" function can't return with the whole decoded pixel array. - * @param decoder pointer to the decoder the function associated with - * @param dsc pointer to decoder descriptor - * @param x start x coordinate - * @param y start y coordinate - * @param len number of pixels to decode - * @param buf a buffer to store the decoded pixels - * @return LV_RES_OK: ok; LV_RES_INV: failed - */ -lv_res_t lv_img_decoder_built_in_read_line(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc, lv_coord_t x, - lv_coord_t y, lv_coord_t len, uint8_t * buf); - -/** - * Close the pending decoding. Free resources etc. - * @param decoder pointer to the decoder the function associated with - * @param dsc pointer to decoder descriptor - */ -void lv_img_decoder_built_in_close(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * dsc); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_TEMPL_H*/ diff --git a/src/libs/lvgl/src/lv_font/lv_font.c b/src/libs/lvgl/src/lv_font/lv_font.c deleted file mode 100644 index c2d6eac8..00000000 --- a/src/libs/lvgl/src/lv_font/lv_font.c +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @file lv_font.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_font.h" -#include "../lv_misc/lv_utils.h" -#include "../lv_misc/lv_log.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Return with the bitmap of a font. - * @param font_p pointer to a font - * @param letter an UNICODE character code - * @return pointer to the bitmap of the letter - */ -const uint8_t * lv_font_get_glyph_bitmap(const lv_font_t * font_p, uint32_t letter) -{ - return font_p->get_glyph_bitmap(font_p, letter); -} - -/** - * Get the descriptor of a glyph - * @param font_p pointer to font - * @param dsc_out store the result descriptor here - * @param letter an UNICODE letter code - * @return true: descriptor is successfully loaded into `dsc_out`. - * false: the letter was not found, no data is loaded to `dsc_out` - */ -bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_out, uint32_t letter, uint32_t letter_next) -{ - return font_p->get_glyph_dsc(font_p, dsc_out, letter, letter_next); -} - -/** - * Get the width of a glyph with kerning - * @param font pointer to a font - * @param letter an UNICODE letter - * @param letter_next the next letter after `letter`. Used for kerning - * @return the width of the glyph - */ -uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32_t letter_next) -{ - lv_font_glyph_dsc_t g; - bool ret; - ret = lv_font_get_glyph_dsc(font, &g, letter, letter_next); - if(ret) return g.adv_w; - else return 0; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/libs/lvgl/src/lv_font/lv_font.h b/src/libs/lvgl/src/lv_font/lv_font.h deleted file mode 100644 index ee3300b8..00000000 --- a/src/libs/lvgl/src/lv_font/lv_font.h +++ /dev/null @@ -1,164 +0,0 @@ -/** - * @file lv_font.h - * - */ - -#ifndef LV_FONT_H -#define LV_FONT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include <stdint.h> -#include <stddef.h> -#include <stdbool.h> - -#include "lv_symbol_def.h" - -/********************* - * DEFINES - *********************/ -/*Number of fractional digits in the advanced width (`adv_w`) field of `lv_font_glyph_dsc_t`*/ -#define LV_FONT_WIDTH_FRACT_DIGIT 4 - -#define LV_FONT_KERN_POSITIVE 0 -#define LV_FONT_KERN_NEGATIVE 1 - -/********************** - * TYPEDEFS - **********************/ - -/*------------------ - * General types - *-----------------*/ - -/** Describes the properties of a glyph. */ -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*/ - uint8_t bpp; /**< Bit-per-pixel: 1, 2, 4, 8*/ -}lv_font_glyph_dsc_t; - - -/** 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*/ - bool (*get_glyph_dsc)(const struct _lv_font_struct *, lv_font_glyph_dsc_t *, uint32_t letter, uint32_t letter_next); - - /** Get a glyph's bitmap from a font*/ - 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*/ - int8_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; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Return with the bitmap of a font. - * @param font_p pointer to a font - * @param letter an UNICODE character code - * @return pointer to the bitmap of the letter - */ -const uint8_t * lv_font_get_glyph_bitmap(const lv_font_t * font_p, uint32_t letter); - -/** - * Get the descriptor of a glyph - * @param font_p pointer to font - * @param dsc_out store the result descriptor here - * @param letter an UNICODE letter code - * @return true: descriptor is successfully loaded into `dsc_out`. - * false: the letter was not found, no data is loaded to `dsc_out` - */ -bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_out, uint32_t letter, uint32_t letter_next); - -/** - * Get the width of a glyph with kerning - * @param font pointer to a font - * @param letter an UNICODE letter - * @param letter_next the next letter after `letter`. Used for kerning - * @return the width of the glyph - */ -uint16_t lv_font_get_glyph_width(const lv_font_t * font, uint32_t letter, uint32_t letter_next); - -/** - * Get the line height of a font. All characters fit into this height - * @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) -{ - return font_p->line_height; -} - -/********************** - * MACROS - **********************/ - -#define LV_FONT_DECLARE(font_name) extern lv_font_t font_name; - -#if LV_FONT_ROBOTO_12 -LV_FONT_DECLARE(lv_font_roboto_12) -#endif - -#if LV_FONT_ROBOTO_16 -LV_FONT_DECLARE(lv_font_roboto_16) -#endif - -#if LV_FONT_ROBOTO_22 -LV_FONT_DECLARE(lv_font_roboto_22) -#endif - -#if LV_FONT_ROBOTO_28 -LV_FONT_DECLARE(lv_font_roboto_28) -#endif - -#if LV_FONT_UNSCII_8 -LV_FONT_DECLARE(lv_font_unscii_8) -#endif - -/*Declare the custom (user defined) fonts*/ -#ifdef LV_FONT_CUSTOM_DECLARE -LV_FONT_CUSTOM_DECLARE -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*USE_FONT*/ diff --git a/src/libs/lvgl/src/lv_font/lv_font.mk b/src/libs/lvgl/src/lv_font/lv_font.mk deleted file mode 100644 index 836d86a6..00000000 --- a/src/libs/lvgl/src/lv_font/lv_font.mk +++ /dev/null @@ -1,12 +0,0 @@ -CSRCS += lv_font.c -CSRCS += lv_font_fmt_txt.c -CSRCS += lv_font_roboto_12.c -CSRCS += lv_font_roboto_16.c -CSRCS += lv_font_roboto_22.c -CSRCS += lv_font_roboto_28.c -CSRCS += lv_font_unscii_8.c - -DEPPATH += --dep-path $(LVGL_DIR)/lvgl/src/lv_font -VPATH += :$(LVGL_DIR)/lvgl/src/lv_font - -CFLAGS += "-I$(LVGL_DIR)/lvgl/src/lv_font" diff --git a/src/libs/lvgl/src/lv_font/lv_font_fmt_txt.c b/src/libs/lvgl/src/lv_font/lv_font_fmt_txt.c deleted file mode 100644 index 78fcccdd..00000000 --- a/src/libs/lvgl/src/lv_font/lv_font_fmt_txt.c +++ /dev/null @@ -1,479 +0,0 @@ -/** - * @file lv_font.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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 - *********************/ - -/********************** - * TYPEDEFS - **********************/ -typedef enum { - RLE_STATE_SINGLE = 0, - RLE_STATE_REPEATE, - RLE_STATE_COUNTER, -}rle_state_t; - -/********************** - * STATIC PROTOTYPES - **********************/ -static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter); -static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t gid_right); -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 - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Used as `get_glyph_bitmap` callback in LittelvGL's native font format if the font is uncompressed. - * @param font pointer to font - * @param unicode_letter an unicode letter which bitmap should be get - * @return pointer to the bitmap or NULL if not found - */ -const uint8_t * lv_font_get_bitmap_fmt_txt(const lv_font_t * font, uint32_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 NULL; - - const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; - - 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; -} - -/** - * Used as `get_glyph_dsc` callback in LittelvGL's native font format if the font is uncompressed. - * @param font_p pointer to font - * @param dsc_out store the result descriptor here - * @param letter an UNICODE letter code - * @return true: descriptor is successfully loaded into `dsc_out`. - * false: the letter was not found, no data is loaded to `dsc_out` - */ -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) -{ - 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; - - int8_t kvalue = 0; - if(fdsc->kern_dsc) { - uint32_t gid_next = get_glyph_dsc_id(font, unicode_letter_next); - if(gid_next) { - kvalue = get_kern_value(font, gid, gid_next); - } - } - - /*Put together a glyph dsc*/ - const lv_font_fmt_txt_glyph_dsc_t * gdsc = &fdsc->glyph_dsc[gid]; - - int32_t kv = ((int32_t)((int32_t)kvalue * fdsc->kern_scale) >> 4); - - uint32_t adv_w = gdsc->adv_w + kv; - adv_w = (adv_w + (1 << 3)) >> 4; - - dsc_out->adv_w = adv_w; - dsc_out->box_h = gdsc->box_h; - dsc_out->box_w = gdsc->box_w; - dsc_out->ofs_x = gdsc->ofs_x; - dsc_out->ofs_y = gdsc->ofs_y; - dsc_out->bpp = (uint8_t)fdsc->bpp; - - return true; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter) -{ - if(letter == '\0') return 0; - - lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *) font->dsc; - - /*Check the cache first*/ - if(letter == fdsc->last_letter) return fdsc->last_glyph_id; - - uint16_t i; - for(i = 0; i < fdsc->cmap_num; i++) { - - /*Relative code point*/ - uint32_t rcp = letter - fdsc->cmaps[i].range_start; - if(rcp > fdsc->cmaps[i].range_length) continue; - uint32_t glyph_id = 0; - if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY) { - glyph_id = fdsc->cmaps[i].glyph_id_start + rcp; - } - else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL) { - const uint8_t * gid_ofs_8 = fdsc->cmaps[i].glyph_id_ofs_list; - glyph_id = fdsc->cmaps[i].glyph_id_start + gid_ofs_8[rcp]; - } - else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_TINY) { - 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) { - lv_uintptr_t ofs = (lv_uintptr_t)(p - (uint8_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; - } - } - else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) { - 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) { - lv_uintptr_t ofs = (lv_uintptr_t)(p - (uint8_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]; - } - } - - /*Update the cache*/ - fdsc->last_letter = letter; - fdsc->last_glyph_id = glyph_id; - return glyph_id; - } - - fdsc->last_letter = letter; - fdsc->last_glyph_id = 0; - return 0; - -} - -static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t gid_right) -{ - lv_font_fmt_txt_dsc_t * fdsc = (lv_font_fmt_txt_dsc_t *) font->dsc; - - int8_t value = 0; - - if(fdsc->kern_classes == 0) { - /*Kern pairs*/ - const lv_font_fmt_txt_kern_pair_t * kdsc = fdsc->kern_dsc; - if(kdsc->glyph_ids_size == 0) { - /* Use binary search to find the kern value. - * The pairs are ordered left_id first, then right_id secondly. */ - const uint8_t * g_ids = kdsc->glyph_ids; - uint16_t g_id_both = (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, 2, kern_pair_8_compare); - - /*If the `g_id_both` were found get its index from the pointer*/ - if(kid_p) { - lv_uintptr_t ofs = (lv_uintptr_t)(kid_p - g_ids); - ofs = ofs >> 1; /*ofs is for pair, divide by 2 to refer as a single value*/ - value = kdsc->values[ofs]; - } - } else if(kdsc->glyph_ids_size == 1) { - /* 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; - 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) { - lv_uintptr_t ofs = (lv_uintptr_t) (kid_p - (const uint8_t *)g_ids); - ofs = ofs >> 4; /*ofs is 4 byte pairs, divide by 4 to refer as a single value*/ - value = kdsc->values[ofs]; - } - - } else { - /*Invalid value*/ - } - } else { - /*Kern classes*/ - const lv_font_fmt_txt_kern_classes_t * kdsc = fdsc->kern_dsc; - uint8_t left_class = kdsc->left_class_mapping[gid_left]; - uint8_t right_class = kdsc->right_class_mapping[gid_right]; - - /* If class = 0, kerning not exist for that glyph - * else got the value form `class_pair_values` 2D array*/ - if(left_class > 0 && right_class > 0) { - value = kdsc->class_pair_values[(left_class-1)* kdsc->right_class_cnt + (right_class-1)]; - } - - } - return value; -} - -static int32_t kern_pair_8_compare(const void * ref, const void * element) -{ - const uint8_t * ref8_p = ref; - const uint8_t * element8_p = element; - - /*If the MSB is different it will matter. If not return the diff. of the LSB*/ - if(ref8_p[0] != element8_p[0]) return (int32_t)ref8_p[0] - element8_p[0]; - else return (int32_t) ref8_p[1] - element8_p[1]; - -} - -static int32_t kern_pair_16_compare(const void * ref, const void * element) -{ - const uint16_t * ref16_p = ref; - const uint16_t * element16_p = element; - - /*If the MSB is different it will matter. If not return the diff. of the LSB*/ - if(ref16_p[0] != element16_p[0]) return (int32_t)ref16_p[0] - element16_p[0]; - 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_buf = lv_draw_get_buf(w * 2); - uint8_t * line_buf1 = line_buf; - uint8_t * line_buf2 = line_buf + 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; - } - } -} - -/** - * 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. - * - * @param[in] pRef Pointer to the reference. - * @param[in] pElement Pointer to the element to compare. - * - * @return Result of comparison. - * @retval < 0 Reference is greater than element. - * @retval = 0 Reference is equal to element. - * @retval > 0 Reference is less than element. - * - */ -static int32_t unicode_list_compare(const void * ref, const void * element) -{ - return ((int32_t)(*(uint16_t *)ref)) - ((int32_t)(*(uint16_t *)element)); -} diff --git a/src/libs/lvgl/src/lv_font/lv_font_fmt_txt.h b/src/libs/lvgl/src/lv_font/lv_font_fmt_txt.h deleted file mode 100644 index 58c8b592..00000000 --- a/src/libs/lvgl/src/lv_font/lv_font_fmt_txt.h +++ /dev/null @@ -1,235 +0,0 @@ -/** - * @file lv_font.h - * - */ - -#ifndef LV_FONT_FMT_TXT_H -#define LV_FONT_FMT_TXT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include <stdint.h> -#include <stddef.h> -#include <stdbool.h> -#include "lv_font.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** This describes a glyph. */ -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*/ - int8_t ofs_y; /**< y offset of the bounding box. Measured from the top of the line*/ -}lv_font_fmt_txt_glyph_dsc_t; - - -/** Format of font character map. */ -enum { - LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY, - LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL, - LV_FONT_FMT_TXT_CMAP_SPARSE_TINY, - LV_FONT_FMT_TXT_CMAP_SPARSE_FULL, -}; - -typedef uint8_t lv_font_fmt_txt_cmap_type_t; - - -/* Map codepoints to a `glyph_dsc`s - * Several formats are supported to optimize memory usage - * See https://github.com/littlevgl/lv_font_conv/blob/master/doc/font_spec.md - */ -typedef struct { - /** First Unicode character for this range */ - uint32_t range_start; - - /** Number of Unicode characters related to this range. - * Last Unicode character = range_start + range_length - 1*/ - uint16_t range_length; - - /** First glyph ID (array index of `glyph_dsc`) for this range */ - uint16_t glyph_id_start; - - /* - According the specification there are 4 formats: - https://github.com/littlevgl/lv_font_conv/blob/master/doc/font_spec.md - - For simplicity introduce "relative code point": - rcp = codepoint - range_start - - and a search function: - search a "value" in an "array" and returns the index of "value". - - Format 0 tiny - unicode_list == NULL && glyph_id_ofs_list == NULL - glyph_id = glyph_id_start + rcp - - Format 0 full - unicode_list == NULL && glyph_id_ofs_list != NULL - glyph_id = glyph_id_start + glyph_id_ofs_list[rcp] - - Sparse tiny - unicode_list != NULL && glyph_id_ofs_list == NULL - glyph_id = glyph_id_start + search(unicode_list, rcp) - - Sparse full - unicode_list != NULL && glyph_id_ofs_list != NULL - glyph_id = glyph_id_start + glyph_id_ofs_list[search(unicode_list, rcp)] - */ - - const uint16_t * unicode_list; - - /** if(type == LV_FONT_FMT_TXT_CMAP_FORMAT0_...) it's `uint8_t *` - * if(type == LV_FONT_FMT_TXT_CMAP_SPARSE_...) it's `uint16_t *` - */ - const void * glyph_id_ofs_list; - - /** Length of `unicode_list` and/or `glyph_id_ofs_list`*/ - uint16_t list_length; - - /** Type of this character map*/ - lv_font_fmt_txt_cmap_type_t type; -}lv_font_fmt_txt_cmap_t; - -/** A simple mapping of kern values from pairs*/ -typedef struct { - /*To get a kern value of two code points: - 1. Get the `glyph_id_left` and `glyph_id_right` from `lv_font_fmt_txt_cmap_t - 2 for(i = 0; i < pair_cnt * 2; i+2) - if(gylph_ids[i] == glyph_id_left && - gylph_ids[i+1] == glyph_id_right) - return values[i / 2]; - */ - const void * glyph_ids; - const int8_t * values; - uint32_t pair_cnt :24; - uint32_t glyph_ids_size :2; /*0: `glyph_ids` is stored as `uint8_t`; 1: as `uint16_t`*/ -}lv_font_fmt_txt_kern_pair_t; - -/** More complex but more optimal class based kern value storage*/ -typedef struct { - /*To get a kern value of two code points: - 1. Get the `glyph_id_left` and `glyph_id_right` from `lv_font_fmt_txt_cmap_t - 2 Get the class of the left and right glyphs as `left_class` and `right_class` - left_class = left_class_mapping[glyph_id_left]; - right_class = right_class_mapping[glyph_id_right]; - 3. value = class_pair_values[(left_class-1)*right_class_cnt + (righ_class-1)] - */ - - 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; - uint8_t right_class_cnt; -}lv_font_fmt_txt_kern_classes_t; - - -/** Bitmap formats*/ -typedef enum { - LV_FONT_FMT_TXT_PLAIN = 0, - LV_FONT_FMT_TXT_COMPRESSED = 1, -}lv_font_fmt_txt_bitmap_format_t; - - -/*Describe store additional data for fonts */ -typedef struct { - /*The bitmaps os all glyphs*/ - const uint8_t * glyph_bitmap; - - /*Describe the glyphs*/ - const lv_font_fmt_txt_glyph_dsc_t * glyph_dsc; - - /* Map the glyphs to Unicode characters. - * Array of `lv_font_cmap_fmt_txt_t` variables*/ - const lv_font_fmt_txt_cmap_t * cmaps; - - /* Store kerning values. - * Can be `lv_font_fmt_txt_kern_pair_t * or `lv_font_kern_classes_fmt_txt_t *` - * depending on `kern_classes` - */ - const void * kern_dsc; - - /*Scale kern values in 12.4 format*/ - uint16_t kern_scale; - - /*Number of cmap tables*/ - uint16_t cmap_num :10; - - /*Bit per pixel: 1, 2, 3, 4*/ - uint16_t bpp :3; - - /*Type of `kern_dsc`*/ - uint16_t kern_classes :1; - - /* - * storage format of the bitmap - * from `lv_font_fmt_txt_bitmap_format_t` - */ - uint16_t bitmap_format :2; - - /*Cache the last letter and is glyph id*/ - uint32_t last_letter; - uint32_t last_glyph_id; - -}lv_font_fmt_txt_dsc_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Used as `get_glyph_bitmap` callback in LittelvGL's native font format if the font is uncompressed. - * @param font pointer to font - * @param unicode_letter an unicode letter which bitmap should be get - * @return pointer to the bitmap or NULL if not found - */ -const uint8_t * lv_font_get_bitmap_fmt_txt(const lv_font_t * font, uint32_t letter); - -/** - * Used as `get_glyph_dsc` callback in LittelvGL's native font format if the font is uncompressed. - * @param font_p pointer to font - * @param dsc_out store the result descriptor here - * @param letter an UNICODE letter code - * @return true: descriptor is successfully loaded into `dsc_out`. - * false: the letter was not found, no data is loaded to `dsc_out` - */ -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); - -/********************** - * MACROS - **********************/ - -/********************** - * ADD BUILT IN FONTS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_FONT_FMT_TXT_H*/ diff --git a/src/libs/lvgl/src/lv_font/lv_font_roboto_12.c b/src/libs/lvgl/src/lv_font/lv_font_roboto_12.c deleted file mode 100644 index 3da8e899..00000000 --- a/src/libs/lvgl/src/lv_font/lv_font_roboto_12.c +++ /dev/null @@ -1,1628 +0,0 @@ -#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.c --force-fast-kern-format - ******************************************************************************/ - -#ifndef LV_FONT_ROBOTO_12 -#define LV_FONT_ROBOTO_12 1 -#endif - -#if LV_FONT_ROBOTO_12 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { - /* U+20 " " */ - - /* U+21 "!" */ - 0xf, 0x10, 0xf1, 0xf, 0x10, 0xf1, 0xf, 0x0, - 0xf0, 0x9, 0x0, 0x30, 0xe, 0x10, - - /* U+22 "\"" */ - 0x39, 0x93, 0x39, 0x92, 0x38, 0x91, 0x1, 0x10, - - /* U+23 "#" */ - 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, 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 "%" */ - 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 "&" */ - 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 "'" */ - 0x67, 0x67, 0x66, 0x0, - - /* U+28 "(" */ - 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 ")" */ - 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, 0xd0, 0x4, 0x1c, 0x4, 0x7d, 0xfe, 0x90, - 0x6e, 0x80, 0x1d, 0x1d, 0x20, 0x10, 0x10, - - /* U+2B "+" */ - 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 "," */ - 0x4c, 0x5b, 0xa5, 0x0, - - /* U+2D "-" */ - 0xbf, 0xf1, - - /* U+2E "." */ - 0x4, 0x1, 0xe1, - - /* U+2F "/" */ - 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" */ - 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" */ - 0x5, 0xc4, 0xea, 0xe4, 0x10, 0xd4, 0x0, 0xd4, - 0x0, 0xd4, 0x0, 0xd4, 0x0, 0xd4, 0x0, 0xd4, - 0x0, 0xd4, - - /* U+32 "2" */ - 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" */ - 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, 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" */ - 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, 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" */ - 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" */ - 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" */ - 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 ":" */ - 0x1e, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x40, 0x1e, 0x0, - - /* U+3B ";" */ - 0x3d, 0x4, 0x0, 0x0, 0x0, 0x18, 0x3d, 0x79, - 0x51, - - /* U+3C "<" */ - 0x0, 0x2, 0x93, 0x2, 0x9f, 0x91, 0x6e, 0x71, - 0x0, 0x4d, 0xa3, 0x0, 0x0, 0x6e, 0xc1, 0x0, - 0x0, 0x62, - - /* U+3D "=" */ - 0x1e, 0xee, 0xeb, 0x1, 0x11, 0x11, 0x0, 0x0, - 0x0, 0x1e, 0xee, 0xeb, 0x1, 0x11, 0x11, - - /* U+3E ">" */ - 0x3a, 0x20, 0x0, 0x8, 0xea, 0x30, 0x0, 0x6, - 0xd9, 0x0, 0x3a, 0xe6, 0x1c, 0xe7, 0x0, 0x26, - 0x0, 0x0, - - /* U+3F "?" */ - 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, 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, 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" */ - 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, 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" */ - 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" */ - 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" */ - 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, 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" */ - 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" */ - 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, - 0xe3, - - /* U+4A "J" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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, 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" */ - 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, 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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 "[" */ - 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 "\\" */ - 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 "]" */ - 0xef, 0x40, 0xd4, 0xd, 0x40, 0xd4, 0xd, 0x40, - 0xd4, 0xd, 0x40, 0xd4, 0xd, 0x40, 0xd4, 0xd, - 0x40, 0xd4, 0xef, 0x40, - - /* U+5E "^" */ - 0x0, 0x70, 0x0, 0x4f, 0x40, 0xa, 0x9a, 0x1, - 0xe0, 0xe1, 0x69, 0x9, 0x60, - - /* U+5F "_" */ - 0xef, 0xff, 0xf5, - - /* U+60 "`" */ - 0x4e, 0x0, 0x87, - - /* U+61 "a" */ - 0x4, 0xde, 0xb0, 0x1f, 0x30, 0xb7, 0x2, 0x0, - 0x7a, 0x5, 0xcd, 0xea, 0x3e, 0x10, 0x7a, 0x4e, - 0x12, 0xca, 0x9, 0xfd, 0x9b, - - /* U+62 "b" */ - 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" */ - 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, 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" */ - 0x3, 0xcf, 0xa0, 0xe, 0x50, 0xa8, 0x4c, 0x0, - 0x3d, 0x6f, 0xff, 0xfe, 0x5b, 0x0, 0x0, 0x1e, - 0x40, 0x47, 0x3, 0xcf, 0xc3, - - /* U+66 "f" */ - 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" */ - 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" */ - 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" */ - 0x1e, 0x0, 0x30, 0x1f, 0x1, 0xf0, 0x1f, 0x1, - 0xf0, 0x1f, 0x1, 0xf0, 0x1f, 0x0, - - /* U+6A "j" */ - 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" */ - 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" */ - 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, - 0x1f, 0x1f, - - /* U+6D "m" */ - 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" */ - 0x2d, 0x8f, 0xd2, 0x2f, 0x60, 0x9a, 0x2e, 0x0, - 0x4c, 0x2e, 0x0, 0x4d, 0x2e, 0x0, 0x4d, 0x2e, - 0x0, 0x4d, 0x2e, 0x0, 0x4d, - - /* U+6F "o" */ - 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" */ - 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" */ - 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" */ - 0x2e, 0xbd, 0x2f, 0x50, 0x2e, 0x0, 0x2e, 0x0, - 0x2e, 0x0, 0x2e, 0x0, 0x2e, 0x0, - - /* U+73 "s" */ - 0x6, 0xee, 0x90, 0x1f, 0x21, 0xc6, 0x1f, 0x40, - 0x0, 0x4, 0xbe, 0x80, 0x12, 0x1, 0xb7, 0x4e, - 0x10, 0xa7, 0x7, 0xee, 0xa0, - - /* U+74 "t" */ - 0x6, 0x20, 0xc, 0x40, 0xdf, 0xe6, 0xc, 0x40, - 0xc, 0x40, 0xc, 0x40, 0xc, 0x40, 0xc, 0x60, - 0x5, 0xf7, - - /* U+75 "u" */ - 0x3e, 0x0, 0x4c, 0x3e, 0x0, 0x4c, 0x3e, 0x0, - 0x4c, 0x3e, 0x0, 0x4c, 0x2e, 0x0, 0x4c, 0x1f, - 0x31, 0xbc, 0x7, 0xee, 0x9c, - - /* U+76 "v" */ - 0xa7, 0x0, 0xa6, 0x5c, 0x0, 0xf1, 0xf, 0x14, - 0xc0, 0xa, 0x59, 0x70, 0x5, 0xad, 0x20, 0x0, - 0xfc, 0x0, 0x0, 0xa7, 0x0, - - /* U+77 "w" */ - 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" */ - 0x6d, 0x0, 0xe5, 0xc, 0x67, 0xb0, 0x3, 0xee, - 0x20, 0x0, 0xcb, 0x0, 0x4, 0xde, 0x20, 0xd, - 0x56, 0xc0, 0x7c, 0x0, 0xd6, - - /* U+79 "y" */ - 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" */ - 0x6f, 0xff, 0xf5, 0x0, 0x5, 0xd0, 0x0, 0x1e, - 0x40, 0x0, 0xb9, 0x0, 0x6, 0xd0, 0x0, 0x1e, - 0x30, 0x0, 0x7f, 0xff, 0xf8, - - /* U+7B "{" */ - 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 "|" */ - 0xee, 0xee, 0xee, 0xee, 0xee, 0xe0, - - /* U+7D "}" */ - 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, 0xd9, 0x0, 0x85, 0xe, 0x3a, 0x90, 0xc2, - 0x2a, 0x0, 0xbf, 0x90, 0x0, 0x0, 0x0, 0x0, - - /* U+F001 "" */ - 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 "" */ - 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 "" */ - 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, 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, 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 "" */ - 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, 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, 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, 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, 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 "" */ - 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, 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, 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, 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, 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 "" */ - 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 "" */ - 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 "" */ - 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 "" */ - 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 "" */ - 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 "" */ - 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, 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, 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 "" */ - 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, 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 "" */ - 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, 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, 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, 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 "" */ - 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, 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 "" */ - 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, 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 "" */ - 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 "" */ - 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, 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 "" */ - 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 "" */ - 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, 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 "" */ - 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, 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 "" */ - 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, 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 "" */ - 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 "" */ - 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 "" */ - 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 "" */ - 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 "" */ - 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, 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 -}; - - -/*--------------------- - * 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 = 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} -}; - -/*--------------------- - * 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 = { - .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/libs/lvgl/src/lv_font/lv_font_roboto_12_subpx.c b/src/libs/lvgl/src/lv_font/lv_font_roboto_12_subpx.c deleted file mode 100644 index 4565b99c..00000000 --- a/src/libs/lvgl/src/lv_font/lv_font_roboto_12_subpx.c +++ /dev/null @@ -1,3419 +0,0 @@ -#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/libs/lvgl/src/lv_font/lv_font_roboto_16.c b/src/libs/lvgl/src/lv_font/lv_font_roboto_16.c deleted file mode 100644 index a52b2c0d..00000000 --- a/src/libs/lvgl/src/lv_font/lv_font_roboto_16.c +++ /dev/null @@ -1,2116 +0,0 @@ -#include "../../lvgl.h" - -/******************************************************************************* - * Size: 16 px - * Bpp: 4 - * 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 -#define LV_FONT_ROBOTO_16 1 -#endif - -#if LV_FONT_ROBOTO_16 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { - /* U+20 " " */ - - /* U+21 "!" */ - 0xad, 0xac, 0xac, 0xac, 0xac, 0xac, 0x9b, 0x9b, - 0x56, 0x0, 0x57, 0x8c, - - /* U+22 "\"" */ - 0xe2, 0xd4, 0xe2, 0xd3, 0xe0, 0xd2, 0xe0, 0xd1, - 0x0, 0x0, - - /* U+23 "#" */ - 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, 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 "%" */ - 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, 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 "'" */ - 0x3f, 0x3f, 0x3e, 0x2c, - - /* U+28 "(" */ - 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 ")" */ - 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, 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, 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 "," */ - 0xf, 0x60, 0xf5, 0x4f, 0x28, 0x90, 0x0, 0x0, - - /* U+2D "-" */ - 0x0, 0x0, 0xb, 0xff, 0xf1, 0x23, 0x33, 0x0, - - /* U+2E "." */ - 0x88, 0xab, - - /* U+2F "/" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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, 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" */ - 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, 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" */ - 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, 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, 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 ":" */ - 0xba, 0x87, 0x0, 0x0, 0x0, 0x0, 0x0, 0x97, - 0xba, - - /* U+3B ";" */ - 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, 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 "=" */ - 0x1, 0x11, 0x11, 0xd, 0xff, 0xff, 0xfb, 0x34, - 0x44, 0x44, 0x20, 0x11, 0x11, 0x10, 0xdf, 0xff, - 0xff, 0xb3, 0x33, 0x33, 0x32, - - /* U+3E ">" */ - 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 "?" */ - 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, 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, 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" */ - 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, 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" */ - 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" */ - 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" */ - 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, 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" */ - 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" */ - 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, - 0x9f, 0x9f, 0x9f, 0x9f, - - /* U+4A "J" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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, 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" */ - 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, 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" */ - 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, 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" */ - 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, - 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x0, 0xf8, - 0x0, 0x0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, - 0x0, 0xf8, 0x0, 0x0, - - /* U+55 "U" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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 "[" */ - 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 "\\" */ - 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 "]" */ - 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, 0x5f, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x2, - 0xfa, 0xc0, 0x0, 0x8c, 0x2f, 0x20, 0xe, 0x60, - 0xb9, 0x4, 0xf1, 0x5, 0xe0, - - /* U+5F "_" */ - 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf3, - 0x33, 0x33, 0x33, 0x30, - - /* U+60 "`" */ - 0x28, 0x20, 0xb, 0xc0, 0x1, 0xd6, - - /* U+61 "a" */ - 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" */ - 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, 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, 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, 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, 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, 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" */ - 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" */ - 0xb9, 0x76, 0x0, 0xca, 0xca, 0xca, 0xca, 0xca, - 0xca, 0xca, 0xca, 0xca, - - /* U+6A "j" */ - 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" */ - 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" */ - 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, - 0xca, 0xca, 0xca, 0xca, - - /* U+6D "m" */ - 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" */ - 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, 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" */ - 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, 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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, 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 "|" */ - 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, - 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, 0xa8, - - /* U+7D "}" */ - 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 "~" */ - 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, 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 "" */ - 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 "" */ - 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, - 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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 "" */ - 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 "" */ - 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 "" */ - 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 "" */ - 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 "" */ - 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 "" */ - 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, 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, 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 "" */ - 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, 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 "" */ - 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, 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, 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, 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 "" */ - 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, 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 "" */ - 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, 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 "" */ - 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 "" */ - 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, 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 "" */ - 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 "" */ - 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, 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 "" */ - 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, 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 "" */ - 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, 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 "" */ - 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 "" */ - 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 "" */ - 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 "" */ - 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 "" */ - 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, 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 -}; - - -/*--------------------- - * 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 = 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} -}; - -/*--------------------- - * 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, -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, -}; - -/*-------------------- - * 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_16 = { - .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 = 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/libs/lvgl/src/lv_font/lv_font_roboto_22.c b/src/libs/lvgl/src/lv_font/lv_font_roboto_22.c deleted file mode 100644 index f7bdac05..00000000 --- a/src/libs/lvgl/src/lv_font/lv_font_roboto_22.c +++ /dev/null @@ -1,3224 +0,0 @@ -#include "../../lvgl.h" - -/******************************************************************************* - * Size: 22 px - * Bpp: 4 - * 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 -#define LV_FONT_ROBOTO_22 1 -#endif - -#if LV_FONT_ROBOTO_22 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { - /* U+20 " " */ - - /* U+21 "!" */ - 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 "\"" */ - 0x8f, 0xa, 0xe8, 0xf0, 0xad, 0x8e, 0xa, 0xc8, - 0xc0, 0xab, 0x8b, 0xa, 0x93, 0x40, 0x33, - - /* U+23 "#" */ - 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, 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 "%" */ - 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, 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 "'" */ - 0xeb, 0xeb, 0xea, 0xe9, 0xe8, 0x31, - - /* U+28 "(" */ - 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 ")" */ - 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, 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, 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 "," */ - 0xa, 0xf5, 0xa, 0xf4, 0xb, 0xf3, 0x1f, 0xd0, - 0x7f, 0x50, 0x5, 0x0, - - /* U+2D "-" */ - 0x6a, 0xaa, 0xa6, 0x9f, 0xff, 0xfa, - - /* U+2E "." */ - 0x5, 0x20, 0x5f, 0xe0, 0x3e, 0xb0, - - /* U+2F "/" */ - 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, 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" */ - 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, 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, 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, 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" */ - 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, 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" */ - 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, 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, 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 ":" */ - 0x4f, 0x97, 0xfd, 0x5, 0x20, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x7f, - 0xd4, 0xf9, - - /* U+3B ";" */ - 0x8, 0xf5, 0xb, 0xf9, 0x1, 0x50, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x4, 0x94, 0x8, 0xf7, 0x8, 0xf6, - 0xb, 0xf2, 0x3f, 0xb0, 0x3b, 0x10, - - /* U+3C "<" */ - 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 "=" */ - 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 ">" */ - 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, 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, 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, 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" */ - 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, 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" */ - 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" */ - 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" */ - 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, 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" */ - 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" */ - 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, 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" */ - 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" */ - 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" */ - 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" */ - 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, 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" */ - 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, 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" */ - 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, 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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 "[" */ - 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 "\\" */ - 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 "]" */ - 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, 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 "_" */ - 0x9a, 0xaa, 0xaa, 0xaa, 0xa9, 0xff, 0xff, 0xff, - 0xff, 0xfe, - - /* U+60 "`" */ - 0x1d, 0xf5, 0x0, 0x1, 0xef, 0x10, 0x0, 0x2e, - 0xb0, - - /* U+61 "a" */ - 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" */ - 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, 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, 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, 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, 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, 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" */ - 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" */ - 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, 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" */ - 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" */ - 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" */ - 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" */ - 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, 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" */ - 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, 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" */ - 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, 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, 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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, 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, 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, 0xc, 0xf3, 0x0, 0x0, 0x6, 0xfa, 0x0, - 0x0, 0x0, 0xaf, 0xb1, 0x0, 0x0, 0x5, 0xb0, - - /* U+7C "|" */ - 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 "}" */ - 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 "~" */ - 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, - 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 "" */ - 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 "" */ - 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, 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, - 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, 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 "" */ - 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, 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, 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, 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+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, 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, 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, - 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, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 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, 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 "" */ - 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, 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 "" */ - 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, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 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+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, - 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, - 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, - 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+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, 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, - 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, 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 "" */ - 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, 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 "" */ - 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, 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 "" */ - 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, 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 "" */ - 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, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 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, 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, 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, 0x27, 0x9f, 0xff, 0xf7, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, - - /* U+F293 "" */ - 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 -}; - - -/*--------------------- - * 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 = 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} -}; - -/*--------------------- - * 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, -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, -}; - -/*-------------------- - * 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_22 = { - .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 = 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/libs/lvgl/src/lv_font/lv_font_roboto_28.c b/src/libs/lvgl/src/lv_font/lv_font_roboto_28.c deleted file mode 100644 index f3e58bb3..00000000 --- a/src/libs/lvgl/src/lv_font/lv_font_roboto_28.c +++ /dev/null @@ -1,4609 +0,0 @@ -#include "../../lvgl.h" - -/******************************************************************************* - * Size: 28 px - * Bpp: 4 - * 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 -#define LV_FONT_ROBOTO_28 1 -#endif - -#if LV_FONT_ROBOTO_28 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { - /* U+20 " " */ - - /* U+21 "!" */ - 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 "\"" */ - 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, 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, 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, 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, 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 "'" */ - 0x9f, 0x79, 0xf7, 0x9f, 0x69, 0xf5, 0x9f, 0x49, - 0xf3, 0x48, 0x10, - - /* U+28 "(" */ - 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 ")" */ - 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, 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, 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 "," */ - 0x4, 0xff, 0x30, 0x4f, 0xf3, 0x4, 0xff, 0x20, - 0x7f, 0xf0, 0xc, 0xf9, 0x5, 0xff, 0x10, 0x1b, - 0x40, 0x0, - - /* U+2D "-" */ - 0x1, 0x11, 0x11, 0x10, 0x8f, 0xff, 0xff, 0xf2, - 0x8f, 0xff, 0xff, 0xf2, - - /* U+2E "." */ - 0x9, 0xfa, 0x0, 0xff, 0xf1, 0x9, 0xfa, 0x0, - - /* U+2F "/" */ - 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, 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, 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, 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, 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, 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" */ - 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, 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" */ - 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, 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, 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, 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 ":" */ - 0xb, 0xf8, 0x1f, 0xff, 0xb, 0xf8, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0xb, 0xf8, 0x2f, 0xff, 0xb, 0xf8, - - /* U+3B ";" */ - 0x2, 0xde, 0x40, 0x7f, 0xf9, 0x2, 0xde, 0x40, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 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, 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 "=" */ - 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 ">" */ - 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, 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, 0x0, 0x0, - 0xac, 0x40, 0x0, 0x0, 0x0, 0x3, 0xff, 0xb0, - 0x0, 0x0, 0x0, 0x0, 0xcf, 0x60, 0x0, 0x0, - - /* U+40 "@" */ - 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, 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, - 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" */ - 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, 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" */ - 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" */ - 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" */ - 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, 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" */ - 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" */ - 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, 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" */ - 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" */ - 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" */ - 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" */ - 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, 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" */ - 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, 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" */ - 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, 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" */ - 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, - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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 "[" */ - 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 "\\" */ - 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 "]" */ - 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, 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 "_" */ - 0x1, 0x11, 0x11, 0x11, 0x11, 0x11, 0xf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0x90, - - /* U+60 "`" */ - 0xc, 0xff, 0x20, 0x0, 0x1d, 0xfc, 0x0, 0x0, - 0x1e, 0xf7, 0x0, 0x0, 0x2f, 0xf2, - - /* U+61 "a" */ - 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" */ - 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, 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, 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, - 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, 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, 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, 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" */ - 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" */ - 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, 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" */ - 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" */ - 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" */ - 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" */ - 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, 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, 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" */ - 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, 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, 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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" */ - 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, 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 "|" */ - 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 "}" */ - 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, 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, 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, - 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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 "" */ - 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 "" */ - 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, - 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, 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, - 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, - 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, - 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, 0x0, 0x0, 0x5, 0xe9, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 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, 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, 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, 0x0, 0x69, 0x96, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x20, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 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, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 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, 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, 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, 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, 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, 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, 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, - 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, 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, 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, - 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, 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, 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, - 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, 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, 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, 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, - 0x0, 0x0, 0x0, 0x18, 0x50, 0x0, 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, 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, 0xb1, 0xbf, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0x93, 0x27, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, - 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, - 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 "" */ - 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+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, 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, 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, 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, - 0x8f, 0xff, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x2f, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 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, - 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, 0xff, 0xff, 0xff, 0xf7, 0xe, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, 0x6, 0xa2, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 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, 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, - 0x0, 0x0, 0x6, 0xa2, 0x0, 0x0, - - /* U+F077 "" */ - 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xb2, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 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 "" */ - 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, 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 "" */ - 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, 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, 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, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 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, 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, 0x0, 0x3, 0x10, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x7f, 0xe2, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 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, - 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, 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, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 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 "" */ - 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, 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 "" */ - 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, - 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, 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, - 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 "" */ - 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, 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, 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, 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, 0x0, 0x0, 0x0, 0x5, 0x72, 0x0, 0x0, - 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, - 0x0, 0x0, 0x6, 0xef, 0xff, 0x40, 0x0, 0x0, - 0x0, 0x0, 0x0, 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 "" */ - 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, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 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, 0xff, 0xfd, 0x14, 0x44, - 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, - 0x10, - - /* 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, 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 "" */ - 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, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, 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, 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, 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+F241 "" */ - 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, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, 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, 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, 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+F242 "" */ - 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, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, 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, 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 "" */ - 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, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, 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, 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 "" */ - 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, - 0xff, 0xf9, 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 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, 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, 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, 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 -}; - - -/*--------------------- - * 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 = 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} -}; - -/*--------------------- - * 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 = 4, - .kern_classes = 1, - .bitmap_format = 0 -}; - - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -lv_font_t lv_font_roboto_28 = { - .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*/ - diff --git a/src/libs/lvgl/src/lv_font/lv_font_roboto_28_compressed.c b/src/libs/lvgl/src/lv_font/lv_font_roboto_28_compressed.c deleted file mode 100644 index 92e71479..00000000 --- a/src/libs/lvgl/src/lv_font/lv_font_roboto_28_compressed.c +++ /dev/null @@ -1,2451 +0,0 @@ -#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/libs/lvgl/src/lv_font/lv_font_unscii_8.c b/src/libs/lvgl/src/lv_font/lv_font_unscii_8.c deleted file mode 100644 index 1b96823e..00000000 --- a/src/libs/lvgl/src/lv_font/lv_font_unscii_8.c +++ /dev/null @@ -1,462 +0,0 @@ -#include "../../lvgl.h" - -/******************************************************************************* - * Size: 8 px - * Bpp: 1 - * Opts: - ******************************************************************************/ - -#ifndef LV_FONT_UNSCII_8 -#define LV_FONT_UNSCII_8 1 -#endif - -#if LV_FONT_UNSCII_8 - -/*----------------- - * BITMAPS - *----------------*/ - -/*Store the image of the glyphs*/ -static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { - /* U+20 " " */ - - /* U+21 "!" */ - 0xf2, - - /* U+22 "\"" */ - 0x99, 0x90, - - /* U+23 "#" */ - 0x49, 0x2f, 0xd2, 0xfd, 0x24, 0x80, - - /* U+24 "$" */ - 0x23, 0xe8, 0xe2, 0xf8, 0x80, - - /* U+25 "%" */ - 0xc7, 0x21, 0x8, 0x4e, 0x30, - - /* U+26 "&" */ - 0x62, 0x49, 0x18, 0x96, 0x27, 0x40, - - /* U+27 "'" */ - 0x2a, 0x0, - - /* U+28 "(" */ - 0x2a, 0x48, 0x88, - - /* U+29 ")" */ - 0x88, 0x92, 0xa0, - - /* U+2A "*" */ - 0x25, 0x5c, 0x47, 0x54, 0x80, - - /* U+2B "+" */ - 0x21, 0x3e, 0x42, 0x0, - - /* U+2C "," */ - 0x58, - - /* U+2D "-" */ - 0xf8, - - /* U+2E "." */ - 0x80, - - /* U+2F "/" */ - 0x2, 0x8, 0x20, 0x82, 0x8, 0x20, 0x0, - - /* U+30 "0" */ - 0x74, 0x67, 0x5c, 0xc5, 0xc0, - - /* U+31 "1" */ - 0x23, 0x28, 0x42, 0x13, 0xe0, - - /* U+32 "2" */ - 0x74, 0x42, 0x26, 0x43, 0xe0, - - /* U+33 "3" */ - 0x74, 0x42, 0x60, 0xc5, 0xc0, - - /* U+34 "4" */ - 0x11, 0x95, 0x2f, 0x88, 0x40, - - /* U+35 "5" */ - 0xfc, 0x3c, 0x10, 0xc5, 0xc0, - - /* U+36 "6" */ - 0x3a, 0x21, 0xe8, 0xc5, 0xc0, - - /* U+37 "7" */ - 0xf8, 0x44, 0x44, 0x21, 0x0, - - /* U+38 "8" */ - 0x74, 0x62, 0xe8, 0xc5, 0xc0, - - /* U+39 "9" */ - 0x74, 0x62, 0xf0, 0x8b, 0x80, - - /* U+3A ":" */ - 0x90, - - /* U+3B ";" */ - 0x41, 0x60, - - /* U+3C "<" */ - 0x12, 0x48, 0x42, 0x10, - - /* U+3D "=" */ - 0xf8, 0x3e, - - /* U+3E ">" */ - 0x84, 0x21, 0x24, 0x80, - - /* U+3F "?" */ - 0x7a, 0x10, 0x84, 0x10, 0x1, 0x0, - - /* U+40 "@" */ - 0x7a, 0x19, 0x6b, 0x9a, 0x7, 0x80, - - /* U+41 "A" */ - 0x31, 0x28, 0x7f, 0x86, 0x18, 0x40, - - /* U+42 "B" */ - 0xfa, 0x18, 0x7e, 0x86, 0x1f, 0x80, - - /* U+43 "C" */ - 0x7a, 0x18, 0x20, 0x82, 0x17, 0x80, - - /* U+44 "D" */ - 0xf2, 0x28, 0x61, 0x86, 0x2f, 0x0, - - /* U+45 "E" */ - 0xfe, 0x8, 0x3c, 0x82, 0xf, 0xc0, - - /* U+46 "F" */ - 0xfe, 0x8, 0x3c, 0x82, 0x8, 0x0, - - /* U+47 "G" */ - 0x7a, 0x18, 0x27, 0x86, 0x17, 0x80, - - /* U+48 "H" */ - 0x86, 0x18, 0x7f, 0x86, 0x18, 0x40, - - /* U+49 "I" */ - 0xe9, 0x24, 0xb8, - - /* U+4A "J" */ - 0x8, 0x42, 0x10, 0xc5, 0xc0, - - /* U+4B "K" */ - 0x86, 0x29, 0x38, 0x92, 0x28, 0x40, - - /* U+4C "L" */ - 0x82, 0x8, 0x20, 0x82, 0xf, 0xc0, - - /* U+4D "M" */ - 0x87, 0x3b, 0x61, 0x86, 0x18, 0x40, - - /* U+4E "N" */ - 0x87, 0x1a, 0x65, 0x8e, 0x18, 0x40, - - /* U+4F "O" */ - 0x7a, 0x18, 0x61, 0x86, 0x17, 0x80, - - /* U+50 "P" */ - 0xfa, 0x18, 0x7e, 0x82, 0x8, 0x0, - - /* U+51 "Q" */ - 0x7a, 0x18, 0x61, 0x96, 0x27, 0x40, - - /* U+52 "R" */ - 0xfa, 0x18, 0x7e, 0x92, 0x28, 0x40, - - /* U+53 "S" */ - 0x7a, 0x18, 0x1e, 0x6, 0x17, 0x80, - - /* U+54 "T" */ - 0xf9, 0x8, 0x42, 0x10, 0x80, - - /* U+55 "U" */ - 0x86, 0x18, 0x61, 0x86, 0x17, 0x80, - - /* U+56 "V" */ - 0x86, 0x18, 0x61, 0x85, 0x23, 0x0, - - /* U+57 "W" */ - 0x86, 0x18, 0x61, 0xb7, 0x38, 0x40, - - /* U+58 "X" */ - 0x86, 0x14, 0x8c, 0x4a, 0x18, 0x40, - - /* U+59 "Y" */ - 0x8c, 0x62, 0xe2, 0x10, 0x80, - - /* U+5A "Z" */ - 0xf8, 0x44, 0x44, 0x43, 0xe0, - - /* U+5B "[" */ - 0xf2, 0x49, 0x38, - - /* U+5C "\\" */ - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - - /* U+5D "]" */ - 0xe4, 0x92, 0x78, - - /* U+5E "^" */ - 0x22, 0xa2, - - /* U+5F "_" */ - 0xf8, - - /* U+60 "`" */ - 0x88, 0x80, - - /* U+61 "a" */ - 0x70, 0x5f, 0x17, 0x80, - - /* U+62 "b" */ - 0x84, 0x3d, 0x18, 0xc7, 0xc0, - - /* U+63 "c" */ - 0x74, 0x61, 0x17, 0x0, - - /* U+64 "d" */ - 0x8, 0x5f, 0x18, 0xc5, 0xe0, - - /* U+65 "e" */ - 0x74, 0x7f, 0x7, 0x0, - - /* U+66 "f" */ - 0x18, 0x92, 0x3e, 0x20, 0x82, 0x0, - - /* U+67 "g" */ - 0x7c, 0x62, 0xf0, 0xb8, - - /* U+68 "h" */ - 0x84, 0x3d, 0x18, 0xc6, 0x20, - - /* U+69 "i" */ - 0x43, 0x24, 0xb8, - - /* U+6A "j" */ - 0x10, 0x31, 0x11, 0x96, - - /* U+6B "k" */ - 0x84, 0x23, 0x2e, 0x4a, 0x20, - - /* U+6C "l" */ - 0xc9, 0x24, 0xb8, - - /* U+6D "m" */ - 0xd5, 0x6b, 0x5a, 0x80, - - /* U+6E "n" */ - 0xf4, 0x63, 0x18, 0x80, - - /* U+6F "o" */ - 0x74, 0x63, 0x17, 0x0, - - /* U+70 "p" */ - 0xf4, 0x63, 0xe8, 0x40, - - /* U+71 "q" */ - 0x7c, 0x62, 0xf0, 0x84, - - /* U+72 "r" */ - 0xbe, 0x21, 0x8, 0x0, - - /* U+73 "s" */ - 0x7c, 0x1c, 0x1f, 0x0, - - /* U+74 "t" */ - 0x42, 0x3c, 0x84, 0x24, 0xc0, - - /* U+75 "u" */ - 0x8c, 0x63, 0x17, 0x0, - - /* U+76 "v" */ - 0x8c, 0x62, 0xa2, 0x0, - - /* U+77 "w" */ - 0x8d, 0x6b, 0x55, 0x0, - - /* U+78 "x" */ - 0x8a, 0x88, 0xa8, 0x80, - - /* U+79 "y" */ - 0x8c, 0x62, 0xf0, 0xb8, - - /* U+7A "z" */ - 0xf8, 0x88, 0x8f, 0x80, - - /* U+7B "{" */ - 0x34, 0x48, 0x44, 0x30, - - /* U+7C "|" */ - 0xff, - - /* U+7D "}" */ - 0xc2, 0x21, 0x22, 0xc0, - - /* U+7E "~" */ - 0x45, 0x44, - - /* U+7F "" */ - 0xc1, 0x42, 0xbd, 0x2c, 0x40, 0x81, 0x0 -}; - - -/*--------------------- - * GLYPH DESCRIPTION - *--------------------*/ - -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}, - {.bitmap_index = 1, .adv_w = 128, .box_h = 3, .box_w = 4, .ofs_x = 2, .ofs_y = 3}, - {.bitmap_index = 3, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 9, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 14, .adv_w = 128, .box_h = 6, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 19, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 25, .adv_w = 128, .box_h = 3, .box_w = 3, .ofs_x = 2, .ofs_y = 3}, - {.bitmap_index = 27, .adv_w = 128, .box_h = 7, .box_w = 3, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 30, .adv_w = 128, .box_h = 7, .box_w = 3, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 33, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 38, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 42, .adv_w = 128, .box_h = 3, .box_w = 2, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 43, .adv_w = 128, .box_h = 1, .box_w = 5, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 44, .adv_w = 128, .box_h = 1, .box_w = 1, .ofs_x = 3, .ofs_y = -1}, - {.bitmap_index = 45, .adv_w = 128, .box_h = 7, .box_w = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 52, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 57, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 62, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 67, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 72, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 77, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 82, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 87, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 92, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 97, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 102, .adv_w = 128, .box_h = 4, .box_w = 1, .ofs_x = 3, .ofs_y = 0}, - {.bitmap_index = 103, .adv_w = 128, .box_h = 6, .box_w = 2, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 105, .adv_w = 128, .box_h = 7, .box_w = 4, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 109, .adv_w = 128, .box_h = 3, .box_w = 5, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 111, .adv_w = 128, .box_h = 7, .box_w = 4, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 115, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 121, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 127, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 133, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 139, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 145, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 151, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 157, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 163, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 169, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 175, .adv_w = 128, .box_h = 7, .box_w = 3, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 178, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 183, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 189, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 195, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 201, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 207, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 213, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 219, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 225, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 231, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 237, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 242, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 248, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 254, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 260, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 266, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 271, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 276, .adv_w = 128, .box_h = 7, .box_w = 3, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 279, .adv_w = 128, .box_h = 7, .box_w = 7, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 286, .adv_w = 128, .box_h = 7, .box_w = 3, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 289, .adv_w = 128, .box_h = 3, .box_w = 5, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 291, .adv_w = 128, .box_h = 1, .box_w = 5, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 292, .adv_w = 128, .box_h = 3, .box_w = 3, .ofs_x = 2, .ofs_y = 3}, - {.bitmap_index = 294, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 298, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 303, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 307, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 312, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 316, .adv_w = 128, .box_h = 7, .box_w = 6, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 322, .adv_w = 128, .box_h = 6, .box_w = 5, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 326, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 331, .adv_w = 128, .box_h = 7, .box_w = 3, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 334, .adv_w = 128, .box_h = 8, .box_w = 4, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 338, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 343, .adv_w = 128, .box_h = 7, .box_w = 3, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 346, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 350, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 354, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 358, .adv_w = 128, .box_h = 6, .box_w = 5, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 362, .adv_w = 128, .box_h = 6, .box_w = 5, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 366, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 370, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 374, .adv_w = 128, .box_h = 7, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 379, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 383, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 387, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 391, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 395, .adv_w = 128, .box_h = 6, .box_w = 5, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 399, .adv_w = 128, .box_h = 5, .box_w = 5, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 403, .adv_w = 128, .box_h = 7, .box_w = 4, .ofs_x = 1, .ofs_y = -1}, - {.bitmap_index = 407, .adv_w = 128, .box_h = 8, .box_w = 1, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 408, .adv_w = 128, .box_h = 7, .box_w = 4, .ofs_x = 2, .ofs_y = -1}, - {.bitmap_index = 412, .adv_w = 128, .box_h = 3, .box_w = 5, .ofs_x = 1, .ofs_y = 3}, - {.bitmap_index = 414, .adv_w = 128, .box_h = 7, .box_w = 7, .ofs_x = 0, .ofs_y = -1} -}; - -/*--------------------- - * CHARACTER MAPPING - *--------------------*/ - - - -/*Collect the unicode lists and glyph_id offsets*/ -static const lv_font_fmt_txt_cmap_t cmaps[] = -{ - { - .range_start = 32, .range_length = 96, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY, - .glyph_id_start = 1, .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0 - } -}; - - - -/*-------------------- - * 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, - .cmap_num = 1, - .bpp = 1, - - .kern_scale = 0, - .kern_dsc = NULL, - .kern_classes = 0, -}; - - -/*----------------- - * PUBLIC FONT - *----------------*/ - -/*Initialize a public general font descriptor*/ -lv_font_t lv_font_unscii_8 = { - .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 = 8, /*The maximum line height required by the font*/ - .base_line = 2, /*Baseline measured from the bottom of the line*/ -}; - -#endif /*#if LV_FONT_UNSCII_8*/ diff --git a/src/libs/lvgl/src/lv_font/lv_symbol_def.h b/src/libs/lvgl/src/lv_font/lv_symbol_def.h deleted file mode 100644 index 026f4a60..00000000 --- a/src/libs/lvgl/src/lv_font/lv_symbol_def.h +++ /dev/null @@ -1,159 +0,0 @@ -#ifndef LV_SYMBOL_DEF_H -#define LV_SYMBOL_DEF_H -/* clang-format off */ - -#ifdef __cplusplus -extern "C" { -#endif -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -/* In the font converter use this list as range: - 61441, 61448, 61451, 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" /*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" - -/* - * The following list is generated using - * cat src/lv_misc/lv_symbol_def.h | sed -E -n 's/^#define\s+(LV_SYMBOL_\w+).*"$/ _LV_STR_\1,/p' - */ -enum { - _LV_STR_SYMBOL_AUDIO, - _LV_STR_SYMBOL_VIDEO, - _LV_STR_SYMBOL_LIST, - _LV_STR_SYMBOL_OK, - _LV_STR_SYMBOL_CLOSE, - _LV_STR_SYMBOL_POWER, - _LV_STR_SYMBOL_SETTINGS, - _LV_STR_SYMBOL_HOME, - _LV_STR_SYMBOL_DOWNLOAD, - _LV_STR_SYMBOL_DRIVE, - _LV_STR_SYMBOL_REFRESH, - _LV_STR_SYMBOL_MUTE, - _LV_STR_SYMBOL_VOLUME_MID, - _LV_STR_SYMBOL_VOLUME_MAX, - _LV_STR_SYMBOL_IMAGE, - _LV_STR_SYMBOL_EDIT, - _LV_STR_SYMBOL_PREV, - _LV_STR_SYMBOL_PLAY, - _LV_STR_SYMBOL_PAUSE, - _LV_STR_SYMBOL_STOP, - _LV_STR_SYMBOL_NEXT, - _LV_STR_SYMBOL_EJECT, - _LV_STR_SYMBOL_LEFT, - _LV_STR_SYMBOL_RIGHT, - _LV_STR_SYMBOL_PLUS, - _LV_STR_SYMBOL_MINUS, - _LV_STR_SYMBOL_EYE_OPEN, - _LV_STR_SYMBOL_EYE_CLOSE, - _LV_STR_SYMBOL_WARNING, - _LV_STR_SYMBOL_SHUFFLE, - _LV_STR_SYMBOL_UP, - _LV_STR_SYMBOL_DOWN, - _LV_STR_SYMBOL_LOOP, - _LV_STR_SYMBOL_DIRECTORY, - _LV_STR_SYMBOL_UPLOAD, - _LV_STR_SYMBOL_CALL, - _LV_STR_SYMBOL_CUT, - _LV_STR_SYMBOL_COPY, - _LV_STR_SYMBOL_SAVE, - _LV_STR_SYMBOL_CHARGE, - _LV_STR_SYMBOL_PASTE, - _LV_STR_SYMBOL_BELL, - _LV_STR_SYMBOL_KEYBOARD, - _LV_STR_SYMBOL_GPS, - _LV_STR_SYMBOL_FILE, - _LV_STR_SYMBOL_WIFI, - _LV_STR_SYMBOL_BATTERY_FULL, - _LV_STR_SYMBOL_BATTERY_3, - _LV_STR_SYMBOL_BATTERY_2, - _LV_STR_SYMBOL_BATTERY_1, - _LV_STR_SYMBOL_BATTERY_EMPTY, - _LV_STR_SYMBOL_USB, - _LV_STR_SYMBOL_BLUETOOTH, - _LV_STR_SYMBOL_TRASH, - _LV_STR_SYMBOL_BACKSPACE, - _LV_STR_SYMBOL_SD_CARD, - _LV_STR_SYMBOL_NEW_LINE, - _LV_STR_SYMBOL_DUMMY, -}; - -#ifdef __cplusplus -} /* extern "C" */ -#endif - - -#endif /*LV_SYMBOL_DEF_H*/ - - - - - diff --git a/src/libs/lvgl/src/lv_hal/lv_hal.h b/src/libs/lvgl/src/lv_hal/lv_hal.h deleted file mode 100644 index a5e0a1dd..00000000 --- a/src/libs/lvgl/src/lv_hal/lv_hal.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @file lv_hal.h - * - */ - -#ifndef LV_HAL_H -#define LV_HAL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_hal_disp.h" -#include "lv_hal_indev.h" -#include "lv_hal_tick.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/src/libs/lvgl/src/lv_hal/lv_hal.mk b/src/libs/lvgl/src/lv_hal/lv_hal.mk deleted file mode 100644 index 05af078c..00000000 --- a/src/libs/lvgl/src/lv_hal/lv_hal.mk +++ /dev/null @@ -1,8 +0,0 @@ -CSRCS += lv_hal_disp.c -CSRCS += lv_hal_indev.c -CSRCS += lv_hal_tick.c - -DEPPATH += --dep-path $(LVGL_DIR)/lvgl/src/lv_hal -VPATH += :$(LVGL_DIR)/lvgl/src/lv_hal - -CFLAGS += "-I$(LVGL_DIR)/lvgl/src/lv_hal" diff --git a/src/libs/lvgl/src/lv_hal/lv_hal_disp.c b/src/libs/lvgl/src/lv_hal/lv_hal_disp.c deleted file mode 100644 index e3a275a0..00000000 --- a/src/libs/lvgl/src/lv_hal/lv_hal_disp.c +++ /dev/null @@ -1,359 +0,0 @@ - -/** - * @file hal_disp.c - * - * @description HAL layer for display driver - * - */ - -/********************* - * INCLUDES - *********************/ -#include <stdint.h> -#include <stddef.h> -#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" -#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 lv_disp_t * disp_def; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize a display driver with default values. - * It is used to surly have known values in the fields ant not memory junk. - * After it you can set the fields. - * @param driver pointer to driver variable to initialize - */ -void lv_disp_drv_init(lv_disp_drv_t * driver) -{ - memset(driver, 0, sizeof(lv_disp_drv_t)); - - driver->flush_cb = NULL; - driver->hor_res = LV_HOR_RES_MAX; - driver->ver_res = LV_VER_RES_MAX; - driver->buffer = NULL; - driver->rotated = 0; - driver->color_chroma_key = LV_COLOR_TRANSP; - -#if LV_ANTIALIAS - driver->antialiasing = true; -#endif - -#if LV_COLOR_SCREEN_TRANSP - driver->screen_transp = 1; -#endif - -#if LV_USE_GPU - driver->gpu_blend_cb = NULL; - driver->gpu_fill_cb = NULL; -#endif - -#if LV_USE_USER_DATA - driver->user_data = NULL; -#endif - - driver->set_px_cb = NULL; -} - -/** - * Initialize a display buffer - * @param disp_buf pointer `lv_disp_buf_t` variable to initialize - * @param buf1 A buffer to be used by LittlevGL to draw the image. - * Always has to specified and can't be NULL. - * Can be an array allocated by the user. E.g. `static lv_color_t disp_buf1[1024 * 10]` - * Or a memory address e.g. in external SRAM - * @param buf2 Optionally specify a second buffer to make image rendering and image flushing - * (sending to the display) parallel. - * In the `disp_drv->flush` you should use DMA or similar hardware to send - * the image to the display in the background. - * It lets LittlevGL to render next frame into the other buffer while previous is being - * sent. Set to `NULL` if unused. - * @param size_in_px_cnt size of the `buf1` and `buf2` in pixel count. - */ -void lv_disp_buf_init(lv_disp_buf_t * disp_buf, void * buf1, void * buf2, uint32_t size_in_px_cnt) -{ - memset(disp_buf, 0, sizeof(lv_disp_buf_t)); - - disp_buf->buf1 = buf1; - disp_buf->buf2 = buf2; - disp_buf->buf_act = disp_buf->buf1; - disp_buf->size = size_in_px_cnt; -} - -/** - * Register an initialized display driver. - * Automatically set the first display as active. - * @param driver pointer to an initialized 'lv_disp_drv_t' variable (can be local variable) - * @return pointer to the new display or NULL on error - */ -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_ASSERT_MEM(disp); - return NULL; - } - - memcpy(&disp->driver, driver, sizeof(lv_disp_drv_t)); - memset(&disp->inv_area_joined, 0, sizeof(disp->inv_area_joined)); - memset(&disp->inv_areas, 0, sizeof(disp->inv_areas)); - lv_ll_init(&disp->scr_ll, sizeof(lv_obj_t)); - disp->last_activity_time = 0; - - if(disp_def == NULL) disp_def = disp; - - lv_disp_t * disp_def_tmp = disp_def; - disp_def = disp; /*Temporarily change the default screen to create the default screens on the - new display*/ - - disp->inv_p = 0; - - 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 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); - - lv_obj_invalidate(disp->act_scr); - - disp_def = disp_def_tmp; /*Revert the default display*/ - - /*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_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*/ - - return disp; -} - -/** - * Update the driver in run time. - * @param disp pointer to a display. (return value of `lv_disp_drv_register`) - * @param new_drv pointer to the new driver - */ -void lv_disp_drv_update(lv_disp_t * disp, lv_disp_drv_t * new_drv) -{ - memcpy(&disp->driver, new_drv, sizeof(lv_disp_drv_t)); - - lv_obj_t * scr; - LV_LL_READ(disp->scr_ll, scr) - { - lv_obj_set_size(scr, lv_disp_get_hor_res(disp), lv_disp_get_ver_res(disp)); - } -} - -/** - * Remove a display - * @param disp pointer to display - */ -void lv_disp_remove(lv_disp_t * disp) -{ - bool was_default = false; - if(disp == lv_disp_get_default()) was_default = true; - - /*Detach the input devices */ - lv_indev_t * indev; - indev = lv_indev_get_next(NULL); - while(indev) { - if(indev->driver.disp == disp) { - indev->driver.disp = NULL; - } - indev = lv_indev_get_next(indev); - } - - lv_ll_rem(&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))); -} - -/** - * Set a default screen. The new screens will be created on it by default. - * @param disp pointer to a display - */ -void lv_disp_set_default(lv_disp_t * disp) -{ - disp_def = disp; -} - -/** - * Get the default display - * @return pointer to the default display - */ -lv_disp_t * lv_disp_get_default(void) -{ - return disp_def; -} - -/** - * Get the horizontal resolution of a display - * @param disp pointer to a display (NULL to use the default display) - * @return the horizontal resolution of the display - */ -lv_coord_t lv_disp_get_hor_res(lv_disp_t * disp) -{ - if(disp == NULL) disp = lv_disp_get_default(); - - if(disp == NULL) - return LV_HOR_RES_MAX; - else - return disp->driver.rotated == 0 ? disp->driver.hor_res : disp->driver.ver_res; -} - -/** - * Get the vertical resolution of a display - * @param disp pointer to a display (NULL to use the default display) - * @return the vertical resolution of the display - */ -lv_coord_t lv_disp_get_ver_res(lv_disp_t * disp) -{ - if(disp == NULL) disp = lv_disp_get_default(); - - if(disp == NULL) - return LV_VER_RES_MAX; - else - return disp->driver.rotated == 0 ? disp->driver.ver_res : disp->driver.hor_res; -} - -/** - * Get if anti-aliasing is enabled for a display or not - * @param disp pointer to a display (NULL to use the default display) - * @return true: anti-aliasing is enabled; false: disabled - */ -bool lv_disp_get_antialiasing(lv_disp_t * disp) -{ -#if LV_ANTIALIAS == 0 - return false; -#else - if(disp == NULL) disp = lv_disp_get_default(); - if(disp == NULL) return false; - - return disp->driver.antialiasing ? true : false; -#endif -} - -/** - * Call in the display driver's `flush_cb` function when the flushing is finished - * @param disp_drv pointer to display driver in `flush_cb` where this function is called - */ -LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv) -{ - /*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; -} - -/** - * Get the next display. - * @param disp pointer to the current display. NULL to initialize. - * @return the next display or NULL if no more. Give the first display when the parameter is NULL - */ -lv_disp_t * lv_disp_get_next(lv_disp_t * disp) -{ - if(disp == NULL) - return lv_ll_get_head(&LV_GC_ROOT(_lv_disp_ll)); - else - return lv_ll_get_next(&LV_GC_ROOT(_lv_disp_ll), disp); -} - -/** - * Get the internal buffer of a display - * @param disp pointer to a display - * @return pointer to the internal buffers - */ -lv_disp_buf_t * lv_disp_get_buf(lv_disp_t * disp) -{ - return disp->driver.buffer; -} - -/** - * Get the number of areas in the buffer - * @return number of invalid areas - */ -uint16_t lv_disp_get_inv_buf_size(lv_disp_t * disp) -{ - return disp->inv_p; -} - -/** - * Pop (delete) the last 'num' invalidated areas from the buffer - * @param num number of areas to delete - */ -void lv_disp_pop_from_inv_buf(lv_disp_t * disp, uint16_t num) -{ - - if(disp->inv_p < num) - disp->inv_p = 0; - else - disp->inv_p -= num; -} - -/** - * Check the driver configuration if it's double buffered (both `buf1` and `buf2` are set) - * @param disp pointer to to display to check - * @return true: double buffered; false: not double buffered - */ -bool lv_disp_is_double_buf(lv_disp_t * disp) -{ - if(disp->driver.buffer->buf1 && disp->driver.buffer->buf2) - return true; - else - return false; -} - -/** - * Check the driver configuration if it's TRUE double buffered (both `buf1` and `buf2` are set and - * `size` is screen sized) - * @param disp pointer to to display to check - * @return true: double buffered; false: not double buffered - */ -bool lv_disp_is_true_double_buf(lv_disp_t * disp) -{ - uint32_t scr_size = disp->driver.hor_res * disp->driver.ver_res; - - if(lv_disp_is_double_buf(disp) && disp->driver.buffer->size == scr_size) { - return true; - } else { - return false; - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/libs/lvgl/src/lv_hal/lv_hal_disp.h b/src/libs/lvgl/src/lv_hal/lv_hal_disp.h deleted file mode 100644 index eef22d98..00000000 --- a/src/libs/lvgl/src/lv_hal/lv_hal_disp.h +++ /dev/null @@ -1,298 +0,0 @@ -/** - * @file lv_hal_disp.h - * - * @description Display Driver HAL interface header file - * - */ - -#ifndef LV_HAL_DISP_H -#define LV_HAL_DISP_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include <stdint.h> -#include <stdbool.h> -#include "lv_hal.h" -#include "../lv_misc/lv_color.h" -#include "../lv_misc/lv_area.h" -#include "../lv_misc/lv_ll.h" -#include "../lv_misc/lv_task.h" - -/********************* - * DEFINES - *********************/ -#ifndef LV_INV_BUF_SIZE -#define LV_INV_BUF_SIZE 32 /*Buffer size for invalid areas */ -#endif - -#ifndef LV_ATTRIBUTE_FLUSH_READY -#define LV_ATTRIBUTE_FLUSH_READY -#endif - -/********************** - * TYPEDEFS - **********************/ - -struct _disp_t; -struct _disp_drv_t; - -/** - * Structure for holding display buffer information. - */ -typedef struct -{ - void * buf1; /**< First display buffer. */ - void * buf2; /**< Second display buffer. */ - - /*Internal, used by the library*/ - void * buf_act; - uint32_t size; /*In pixel count*/ - lv_area_t area; - volatile uint32_t flushing : 1; -} lv_disp_buf_t; - -/** - * Display Driver structure to be registered by HAL - */ -typedef struct _disp_drv_t -{ - - lv_coord_t hor_res; /**< Horizontal resolution. */ - lv_coord_t ver_res; /**< Vertical resolution. */ - - /** Pointer to a buffer initialized with `lv_disp_buf_init()`. - * LittlevGL will use this buffer(s) to draw the screens contents */ - lv_disp_buf_t * buffer; - -#if LV_ANTIALIAS - uint32_t antialiasing : 1; /**< 1: antialiasing is enabled on this display. */ -#endif - uint32_t rotated : 1; /**< 1: turn the display by 90 degree. @warning Does not update coordinates for you!*/ - -#if LV_COLOR_SCREEN_TRANSP - /**Handle if the the screen doesn't have a solid (opa == LV_OPA_COVER) background. - * Use only if required because it's slower.*/ - uint32_t screen_transp : 1; -#endif - - /** MANDATORY: Write the internal buffer (VDB) to the display. 'lv_disp_flush_ready()' has to be - * called when finished */ - void (*flush_cb)(struct _disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p); - - /** OPTIONAL: Extend the invalidated areas to match with the display drivers requirements - * E.g. round `y` to, 8, 16 ..) on a monochrome display*/ - void (*rounder_cb)(struct _disp_drv_t * disp_drv, lv_area_t * area); - - /** OPTIONAL: Set a pixel in a buffer according to the special requirements of the display - * Can be used for color format not supported in LittelvGL. E.g. 2 bit -> 4 gray scales - * @note Much slower then drawing with supported color formats. */ - void (*set_px_cb)(struct _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); - - /** OPTIONAL: Called after every refresh cycle to tell the rendering and flushing time + the - * number of flushed pixels */ - void (*monitor_cb)(struct _disp_drv_t * disp_drv, uint32_t time, uint32_t px); - -#if LV_USE_GPU - /** OPTIONAL: Blend two memories using opacity (GPU only)*/ - void (*gpu_blend_cb)(struct _disp_drv_t * disp_drv, lv_color_t * dest, const lv_color_t * src, uint32_t length, - lv_opa_t opa); - - /** OPTIONAL: Fill a memory with a color (GPU only)*/ - void (*gpu_fill_cb)(struct _disp_drv_t * disp_drv, lv_color_t * dest_buf, lv_coord_t dest_width, - const lv_area_t * fill_area, lv_color_t color); -#endif - - /** On CHROMA_KEYED images this color will be transparent. - * `LV_COLOR_TRANSP` by default. (lv_conf.h)*/ - lv_color_t color_chroma_key; - -#if LV_USE_USER_DATA - lv_disp_drv_user_data_t user_data; /**< Custom display driver user data */ -#endif - -} lv_disp_drv_t; - -struct _lv_obj_t; - -/** - * Display structure. - * ::lv_disp_drv_t is the first member of the structure. - */ -typedef struct _disp_t -{ - /**< Driver to the display*/ - lv_disp_drv_t driver; - - /**< A task which periodically checks the dirty areas and refreshes them*/ - lv_task_t * refr_task; - - /** Screens of the display*/ - lv_ll_t scr_ll; - struct _lv_obj_t * act_scr; /**< Currently active screen on this display */ - struct _lv_obj_t * top_layer; /**< @see lv_disp_get_layer_top */ - struct _lv_obj_t * sys_layer; /**< @see lv_disp_get_layer_sys */ - - /** Invalidated (marked to redraw) areas*/ - lv_area_t inv_areas[LV_INV_BUF_SIZE]; - uint8_t inv_area_joined[LV_INV_BUF_SIZE]; - uint32_t inv_p : 10; - - int render_direction; /**< 0 when rendering down, 1 when rendering up */ - /*Miscellaneous data*/ - uint32_t last_activity_time; /**< Last time there was activity on this display */ -} lv_disp_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize a display driver with default values. - * It is used to have known values in the fields and not junk in memory. - * After it you can safely set only the fields you need. - * @param driver pointer to driver variable to initialize - */ -void lv_disp_drv_init(lv_disp_drv_t * driver); - -/** - * Initialize a display buffer - * @param disp_buf pointer `lv_disp_buf_t` variable to initialize - * @param buf1 A buffer to be used by LittlevGL to draw the image. - * Always has to specified and can't be NULL. - * Can be an array allocated by the user. E.g. `static lv_color_t disp_buf1[1024 * 10]` - * Or a memory address e.g. in external SRAM - * @param buf2 Optionally specify a second buffer to make image rendering and image flushing - * (sending to the display) parallel. - * In the `disp_drv->flush` you should use DMA or similar hardware to send - * the image to the display in the background. - * It lets LittlevGL to render next frame into the other buffer while previous is being - * sent. Set to `NULL` if unused. - * @param size_in_px_cnt size of the `buf1` and `buf2` in pixel count. - */ -void lv_disp_buf_init(lv_disp_buf_t * disp_buf, void * buf1, void * buf2, uint32_t size_in_px_cnt); - -/** - * Register an initialized display driver. - * Automatically set the first display as active. - * @param driver pointer to an initialized 'lv_disp_drv_t' variable (can be local variable) - * @return pointer to the new display or NULL on error - */ -lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver); - -/** - * Update the driver in run time. - * @param disp pointer to a display. (return value of `lv_disp_drv_register`) - * @param new_drv pointer to the new driver - */ -void lv_disp_drv_update(lv_disp_t * disp, lv_disp_drv_t * new_drv); - -/** - * Remove a display - * @param disp pointer to display - */ -void lv_disp_remove(lv_disp_t * disp); - -/** - * Set a default screen. The new screens will be created on it by default. - * @param disp pointer to a display - */ -void lv_disp_set_default(lv_disp_t * disp); - -/** - * Get the default display - * @return pointer to the default display - */ -lv_disp_t * lv_disp_get_default(void); - -/** - * Get the horizontal resolution of a display - * @param disp pointer to a display (NULL to use the default display) - * @return the horizontal resolution of the display - */ -lv_coord_t lv_disp_get_hor_res(lv_disp_t * disp); - -/** - * Get the vertical resolution of a display - * @param disp pointer to a display (NULL to use the default display) - * @return the vertical resolution of the display - */ -lv_coord_t lv_disp_get_ver_res(lv_disp_t * disp); - -/** - * Get if anti-aliasing is enabled for a display or not - * @param disp pointer to a display (NULL to use the default display) - * @return true: anti-aliasing is enabled; false: disabled - */ -bool lv_disp_get_antialiasing(lv_disp_t * disp); - -static inline void lv_disp_set_direction(lv_disp_t * disp, int direction) -{ - disp->render_direction = direction; -} - -//! @cond Doxygen_Suppress - -/** - * Call in the display driver's `flush_cb` function when the flushing is finished - * @param disp_drv pointer to display driver in `flush_cb` where this function is called - */ -LV_ATTRIBUTE_FLUSH_READY void lv_disp_flush_ready(lv_disp_drv_t * disp_drv); - -//! @endcond - -/** - * Get the next display. - * @param disp pointer to the current display. NULL to initialize. - * @return the next display or NULL if no more. Give the first display when the parameter is NULL - */ -lv_disp_t * lv_disp_get_next(lv_disp_t * disp); - -/** - * Get the internal buffer of a display - * @param disp pointer to a display - * @return pointer to the internal buffers - */ -lv_disp_buf_t * lv_disp_get_buf(lv_disp_t * disp); - -/** - * Get the number of areas in the buffer - * @return number of invalid areas - */ -uint16_t lv_disp_get_inv_buf_size(lv_disp_t * disp); - -/** - * Pop (delete) the last 'num' invalidated areas from the buffer - * @param num number of areas to delete - */ -void lv_disp_pop_from_inv_buf(lv_disp_t * disp, uint16_t num); - -/** - * Check the driver configuration if it's double buffered (both `buf1` and `buf2` are set) - * @param disp pointer to to display to check - * @return true: double buffered; false: not double buffered - */ -bool lv_disp_is_double_buf(lv_disp_t * disp); - -/** - * Check the driver configuration if it's TRUE double buffered (both `buf1` and `buf2` are set and - * `size` is screen sized) - * @param disp pointer to to display to check - * @return true: double buffered; false: not double buffered - */ -bool lv_disp_is_true_double_buf(lv_disp_t * disp); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/src/libs/lvgl/src/lv_hal/lv_hal_indev.c b/src/libs/lvgl/src/lv_hal/lv_hal_indev.c deleted file mode 100644 index 35ff1b31..00000000 --- a/src/libs/lvgl/src/lv_hal/lv_hal_indev.c +++ /dev/null @@ -1,158 +0,0 @@ -/** - * @file hal_indev.c - * - * @description Input device HAL interface - * - */ - -/********************* - * 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" -#include "../lv_misc/lv_gc.h" -#include "lv_hal_disp.h" - -#if defined(LV_GC_INCLUDE) -#include LV_GC_INCLUDE -#endif /* LV_ENABLE_GC */ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize an input device driver with default values. - * It is used to surly have known values in the fields ant not memory junk. - * After it you can set the fields. - * @param driver pointer to driver variable to initialize - */ -void lv_indev_drv_init(lv_indev_drv_t * driver) -{ - memset(driver, 0, sizeof(lv_indev_drv_t)); - - driver->type = LV_INDEV_TYPE_NONE; - driver->drag_limit = LV_INDEV_DEF_DRAG_LIMIT; - driver->drag_throw = LV_INDEV_DEF_DRAG_THROW; - driver->long_press_time = LV_INDEV_DEF_LONG_PRESS_TIME; - driver->long_press_rep_time = LV_INDEV_DEF_LONG_PRESS_REP_TIME; -} - -/** - * Register an initialized input device driver. - * @param driver pointer to an initialized 'lv_indev_drv_t' variable (can be local variable) - * @return pointer to the new input device or NULL on error - */ -lv_indev_t * lv_indev_drv_register(lv_indev_drv_t * driver) -{ - - if(driver->disp == NULL) driver->disp = lv_disp_get_default(); - - if(driver->disp == NULL) { - LV_LOG_WARN("lv_indev_drv_register: no display registered hence can't attache the indev to " - "a display"); - return NULL; - } - - lv_indev_t * indev = lv_ll_ins_head(&LV_GC_ROOT(_lv_indev_ll)); - if(!indev) { - LV_ASSERT_MEM(indev); - return NULL; - } - - memset(indev, 0, sizeof(lv_indev_t)); - memcpy(&indev->driver, driver, sizeof(lv_indev_drv_t)); - - indev->proc.reset_query = 1; - indev->cursor = NULL; - indev->group = NULL; - indev->btn_points = NULL; - - indev->driver.read_task = lv_task_create(lv_indev_read_task, LV_INDEV_DEF_READ_PERIOD, LV_TASK_PRIO_MID, indev); - - return indev; -} - -/** - * Update the driver in run time. - * @param indev pointer to a input device. (return value of `lv_indev_drv_register`) - * @param new_drv pointer to the new driver - */ -void lv_indev_drv_update(lv_indev_t * indev, lv_indev_drv_t * new_drv) -{ - memcpy(&indev->driver, new_drv, sizeof(lv_indev_drv_t)); -} - -/** - * Get the next input device. - * @param indev pointer to the current input device. NULL to initialize. - * @return the next input devise or NULL if no more. Give the first input device when the parameter - * is NULL - */ -lv_indev_t * lv_indev_get_next(lv_indev_t * indev) -{ - if(indev == NULL) - return lv_ll_get_head(&LV_GC_ROOT(_lv_indev_ll)); - else - return lv_ll_get_next(&LV_GC_ROOT(_lv_indev_ll), indev); -} - -/** - * Read data from an input device. - * @param indev pointer to an input device - * @param data input device will write its data here - * @return false: no more data; true: there more data to read (buffered) - */ -bool lv_indev_read(lv_indev_t * indev, lv_indev_data_t * data) -{ - bool cont = false; - - memset(data, 0, sizeof(lv_indev_data_t)); - - /* For touchpad sometimes users don't the last pressed coordinate on release. - * So be sure a coordinates are initialized to the last point */ - if(indev->driver.type == LV_INDEV_TYPE_POINTER) { - data->point.x = indev->proc.types.pointer.act_point.x; - data->point.y = indev->proc.types.pointer.act_point.y; - } - /*Similarly set at least the last key in case of the the user doesn't set it on release*/ - else if(indev->driver.type == LV_INDEV_TYPE_KEYPAD) { - data->key = indev->proc.types.keypad.last_key; - } - - if(indev->driver.read_cb) { - LV_LOG_TRACE("idnev read started"); - cont = indev->driver.read_cb(&indev->driver, data); - LV_LOG_TRACE("idnev read finished"); - } else { - LV_LOG_WARN("indev function registered"); - } - - return cont; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/libs/lvgl/src/lv_hal/lv_hal_indev.h b/src/libs/lvgl/src/lv_hal/lv_hal_indev.h deleted file mode 100644 index ef1a5559..00000000 --- a/src/libs/lvgl/src/lv_hal/lv_hal_indev.h +++ /dev/null @@ -1,213 +0,0 @@ -/** - * @file lv_hal_indev.h - * - * @description Input Device HAL interface layer header file - * - */ - -#ifndef LV_HAL_INDEV_H -#define LV_HAL_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include <stdbool.h> -#include <stdint.h> -#include "../lv_misc/lv_area.h" -#include "../lv_misc/lv_task.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -struct _lv_obj_t; -struct _disp_t; -struct _lv_indev_t; -struct _lv_indev_drv_t; - -/** Possible input device types*/ -enum { - LV_INDEV_TYPE_NONE, /**< Uninitialized state*/ - LV_INDEV_TYPE_POINTER, /**< Touch pad, mouse, external button*/ - LV_INDEV_TYPE_KEYPAD, /**< Keypad or keyboard*/ - LV_INDEV_TYPE_BUTTON, /**< External (hardware button) which is assigned to a specific point of the - screen*/ - LV_INDEV_TYPE_ENCODER, /**< Encoder with only Left, Right turn and a Button*/ -}; -typedef uint8_t lv_indev_type_t; - -/** States for input devices*/ -enum { LV_INDEV_STATE_REL = 0, LV_INDEV_STATE_PR }; -typedef uint8_t lv_indev_state_t; - -/** Data structure passed to an input driver to fill */ -typedef struct -{ - lv_point_t point; /**< For LV_INDEV_TYPE_POINTER the currently pressed point*/ - uint32_t key; /**< For LV_INDEV_TYPE_KEYPAD the currently pressed key*/ - uint32_t btn_id; /**< For LV_INDEV_TYPE_BUTTON the currently pressed button*/ - int16_t enc_diff; /**< For LV_INDEV_TYPE_ENCODER number of steps since the previous read*/ - - 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 -{ - - /**< Input device type*/ - lv_indev_type_t type; - - /**< Function pointer to read input device data. - * Return 'true' if there is more data to be read (buffered). - * Most drivers can safely return 'false' */ - bool (*read_cb)(struct _lv_indev_drv_t * indev_drv, lv_indev_data_t * data); - - /** Called when an action happened on the input device. - * The second parameter is the event from `lv_event_t`*/ - void (*feedback_cb)(struct _lv_indev_drv_t *, uint8_t); - -#if LV_USE_USER_DATA - lv_indev_drv_user_data_t user_data; -#endif - - /**< Pointer to the assigned display*/ - struct _disp_t * disp; - - /**< Task to read the periodically read the input device*/ - lv_task_t * read_task; - - /**< Number of pixels to slide before actually drag the object*/ - uint8_t drag_limit; - - /**< Drag throw slow-down in [%]. Greater value means faster slow-down */ - uint8_t drag_throw; - - /**< Long press time in milliseconds*/ - uint16_t long_press_time; - - /**< Repeated trigger period in long press [ms] */ - uint16_t long_press_rep_time; -} lv_indev_drv_t; - -/** Run time data of input devices - * Internally used by the library, you should not need to touch it. - */ -typedef struct _lv_indev_proc_t -{ - lv_indev_state_t state; /**< Current state of the input device. */ - union - { - struct - { /*Pointer and button data*/ - lv_point_t act_point; /**< Current point of input device. */ - lv_point_t last_point; /**< Last point of input device. */ - lv_point_t vect; /**< Difference between `act_point` and `last_point`. */ - lv_point_t drag_sum; /*Count the dragged pixels to check LV_INDEV_DEF_DRAG_LIMIT*/ - lv_point_t drag_throw_vect; - struct _lv_obj_t * act_obj; /*The object being pressed*/ - struct _lv_obj_t * last_obj; /*The last obejct which was pressed (used by dragthrow and - other post-release event)*/ - struct _lv_obj_t * last_pressed; /*The lastly pressed object*/ - - /*Flags*/ - uint8_t drag_limit_out : 1; - uint8_t drag_in_prog : 1; - } pointer; - struct - { /*Keypad data*/ - lv_indev_state_t last_state; - uint32_t last_key; - } keypad; - } types; - - uint32_t pr_timestamp; /**< Pressed time stamp*/ - uint32_t longpr_rep_timestamp; /**< Long press repeat time stamp*/ - - /*Flags*/ - uint8_t long_pr_sent : 1; - uint8_t reset_query : 1; - uint8_t disabled : 1; - uint8_t wait_until_release : 1; -} lv_indev_proc_t; - -struct _lv_obj_t; -struct _lv_group_t; - -/** The main input device descriptor with driver, runtime data ('proc') and some additional - * information*/ -typedef struct _lv_indev_t -{ - lv_indev_drv_t driver; - lv_indev_proc_t proc; - struct _lv_obj_t * cursor; /**< Cursor for LV_INPUT_TYPE_POINTER*/ - struct _lv_group_t * group; /**< Keypad destination group*/ - const lv_point_t * btn_points; /**< Array points assigned to the button ()screen will be pressed - here by the buttons*/ -} lv_indev_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize an input device driver with default values. - * It is used to surly have known values in the fields ant not memory junk. - * After it you can set the fields. - * @param driver pointer to driver variable to initialize - */ -void lv_indev_drv_init(lv_indev_drv_t * driver); - -/** - * Register an initialized input device driver. - * @param driver pointer to an initialized 'lv_indev_drv_t' variable (can be local variable) - * @return pointer to the new input device or NULL on error - */ -lv_indev_t * lv_indev_drv_register(lv_indev_drv_t * driver); - -/** - * Update the driver in run time. - * @param indev pointer to a input device. (return value of `lv_indev_drv_register`) - * @param new_drv pointer to the new driver - */ -void lv_indev_drv_update(lv_indev_t * indev, lv_indev_drv_t * new_drv); - -/** - * Get the next input device. - * @param indev pointer to the current input device. NULL to initialize. - * @return the next input devise or NULL if no more. Give the first input device when the parameter - * is NULL - */ -lv_indev_t * lv_indev_get_next(lv_indev_t * indev); - -/** - * Read data from an input device. - * @param indev pointer to an input device - * @param data input device will write its data here - * @return false: no more data; true: there more data to read (buffered) - */ -bool lv_indev_read(lv_indev_t * indev, lv_indev_data_t * data); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/src/libs/lvgl/src/lv_hal/lv_hal_tick.c b/src/libs/lvgl/src/lv_hal/lv_hal_tick.c deleted file mode 100644 index cdfec32c..00000000 --- a/src/libs/lvgl/src/lv_hal/lv_hal_tick.c +++ /dev/null @@ -1,100 +0,0 @@ -/** - * @file systick.c - * Provide access to the system tick with 1 millisecond resolution - */ - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include "lv_hal_tick.h" -#include <stddef.h> - -#if LV_TICK_CUSTOM == 1 -#include LV_TICK_CUSTOM_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static uint32_t sys_time = 0; -static volatile uint8_t tick_irq_flag; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * You have to call this function periodically - * @param tick_period the call period of this function in milliseconds - */ -LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period) -{ - tick_irq_flag = 0; - sys_time += tick_period; -} - -/** - * Get the elapsed milliseconds since start up - * @return the elapsed milliseconds - */ -uint32_t lv_tick_get(void) -{ -#if LV_TICK_CUSTOM == 0 - uint32_t result; - do { - tick_irq_flag = 1; - result = sys_time; - } while(!tick_irq_flag); /*'lv_tick_inc()' clears this flag which can be in an interrupt. - Continue until make a non interrupted cycle */ - - return result; -#else - return LV_TICK_CUSTOM_SYS_TIME_EXPR; -#endif -} - -/** - * Get the elapsed milliseconds since a previous time stamp - * @param prev_tick a previous time stamp (return value of systick_get() ) - * @return the elapsed milliseconds since 'prev_tick' - */ -uint32_t lv_tick_elaps(uint32_t prev_tick) -{ - uint32_t act_time = lv_tick_get(); - - /*If there is no overflow in sys_time simple subtract*/ - if(act_time >= prev_tick) { - prev_tick = act_time - prev_tick; - } else { - prev_tick = UINT32_MAX - prev_tick + 1; - prev_tick += act_time; - } - - return prev_tick; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/libs/lvgl/src/lv_hal/lv_hal_tick.h b/src/libs/lvgl/src/lv_hal/lv_hal_tick.h deleted file mode 100644 index a4de881f..00000000 --- a/src/libs/lvgl/src/lv_hal/lv_hal_tick.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * @file lv_hal_tick.h - * Provide access to the system tick with 1 millisecond resolution - */ - -#ifndef LV_HAL_TICK_H -#define LV_HAL_TICK_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif -#include <stdint.h> -#include <stdbool.h> - -/********************* - * DEFINES - *********************/ -#ifndef LV_ATTRIBUTE_TICK_INC -#define LV_ATTRIBUTE_TICK_INC -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -//! @cond Doxygen_Suppress - -/** - * You have to call this function periodically - * @param tick_period the call period of this function in milliseconds - */ -LV_ATTRIBUTE_TICK_INC void lv_tick_inc(uint32_t tick_period); - -//! @endcond - -/** - * Get the elapsed milliseconds since start up - * @return the elapsed milliseconds - */ -uint32_t lv_tick_get(void); - -/** - * Get the elapsed milliseconds since a previous time stamp - * @param prev_tick a previous time stamp (return value of systick_get() ) - * @return the elapsed milliseconds since 'prev_tick' - */ -uint32_t lv_tick_elaps(uint32_t prev_tick); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_HAL_TICK_H*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_anim.c b/src/libs/lvgl/src/lv_misc/lv_anim.c deleted file mode 100644 index 77bd87b9..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_anim.c +++ /dev/null @@ -1,474 +0,0 @@ -/** - * @file anim.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_anim.h" - -#if LV_USE_ANIMATION -#include <stddef.h> -#include <string.h> -#include "../lv_core/lv_debug.h" -#include "../lv_hal/lv_hal_tick.h" -#include "lv_task.h" -#include "lv_math.h" -#include "lv_gc.h" - -#if defined(LV_GC_INCLUDE) -#include LV_GC_INCLUDE -#endif /* LV_ENABLE_GC */ - -/********************* - * DEFINES - *********************/ -#define LV_ANIM_RESOLUTION 1024 -#define LV_ANIM_RES_SHIFT 10 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void anim_task(lv_task_t * param); -static bool anim_ready_handler(lv_anim_t * a); - -/********************** - * STATIC VARIABLES - **********************/ -static uint32_t last_task_run; -static bool anim_list_changed; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Init. the animation module - */ -void lv_anim_core_init(void) -{ - lv_ll_init(&LV_GC_ROOT(_lv_anim_ll), sizeof(lv_anim_t)); - last_task_run = lv_tick_get(); - lv_task_create(anim_task, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, NULL); -} - -/** - * Initialize an animation variable. - * E.g.: - * lv_anim_t a; - * lv_anim_init(&a); - * lv_anim_set_...(&a); - * lv_anim_craete(&a); - * @param a pointer to an `lv_anim_t` variable to initialize - */ -void lv_anim_init(lv_anim_t * a) -{ - memset(a, 0, sizeof(lv_anim_t)); - a->time = 500; - a->start = 0; - a->end = 100; - a->path_cb = lv_anim_path_linear; -} -/** - * Create an animation - * @param a an initialized 'anim_t' variable. Not required after call. - */ -void lv_anim_create(lv_anim_t * a) -{ - LV_LOG_TRACE("animation create started") - /* Do not let two animations for the same 'var' with the same 'fp'*/ - if(a->exec_cb != NULL) lv_anim_del(a->var, a->exec_cb); /*fp == NULL would delete all animations of var*/ - - /*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_ASSERT_MEM(new_anim); - if(new_anim == NULL) return; - - /*Initialize the animation descriptor*/ - a->playback_now = 0; - memcpy(new_anim, a, sizeof(lv_anim_t)); - - /*Set the start value*/ - if(new_anim->exec_cb) new_anim->exec_cb(new_anim->var, new_anim->start); - - /* Creating an animation changed the linked list. - * It's important if it happens in a ready callback. (see `anim_task`)*/ - anim_list_changed = true; - - LV_LOG_TRACE("animation created") -} - -/** - * Delete an animation of a variable with a given animator function - * @param var pointer to variable - * @param exec_cb a function pointer which is animating 'var', - * or NULL to delete all the animations of 'var' - * @return true: at least 1 animation is deleted, false: no animation is deleted - */ -bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb) -{ - lv_anim_t * a; - lv_anim_t * a_next; - bool del = false; - a = lv_ll_get_head(&LV_GC_ROOT(_lv_anim_ll)); - while(a != NULL) { - /*'a' might be deleted, so get the next object while 'a' is valid*/ - 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_mem_free(a); - anim_list_changed = true; /*Read by `anim_task`. It need to know if a delete occurred in - the linked list*/ - del = true; - } - - a = a_next; - } - - return del; -} - -/** - * Get the number of currently running animations - * @return the number of running animations - */ -uint16_t lv_anim_count_running(void) -{ - uint16_t cnt = 0; - lv_anim_t * a; - LV_LL_READ(LV_GC_ROOT(_lv_anim_ll), a) cnt++; - - return cnt++; -} - -/** - * Calculate the time of an animation with a given speed and the start and end values - * @param speed speed of animation in unit/sec - * @param start start value of the animation - * @param end end value of the animation - * @return the required time [ms] for the animation with the given parameters - */ -uint32_t lv_anim_speed_to_time(uint16_t speed, lv_anim_value_t start, lv_anim_value_t end) -{ - int32_t d = LV_MATH_ABS((int32_t)start - end); - uint32_t time = (int32_t)((int32_t)(d * 1000) / speed); - - if(time > UINT32_MAX) time = UINT32_MAX; - - if(time == 0) { - time++; - } - - return time; -} - -/** - * Calculate the current value of an animation applying linear characteristic - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_linear(const lv_anim_t * a) -{ - /*Calculate the current step*/ - uint32_t step; - if(a->time == a->act_time) { - step = LV_ANIM_RESOLUTION; /*Use the last value if the time fully elapsed*/ - } else { - step = ((int32_t)a->act_time * LV_ANIM_RESOLUTION) / a->time; - } - - /* Get the new value which will be proportional to `step` - * and the `start` and `end` values*/ - int32_t new_value; - new_value = (int32_t)step * (a->end - a->start); - new_value = new_value >> LV_ANIM_RES_SHIFT; - new_value += a->start; - - return (lv_anim_value_t)new_value; -} - -/** - * Calculate the current value of an animation slowing down the start phase - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_ease_in(const lv_anim_t * a) -{ - /*Calculate the current step*/ - uint32_t t; - if(a->time == a->act_time) - t = 1024; - else - t = (uint32_t)((uint32_t)a->act_time * 1024) / a->time; - - int32_t step = lv_bezier3(t, 0, 1, 1, 1024); - - int32_t new_value; - new_value = (int32_t)step * (a->end - a->start); - new_value = new_value >> 10; - new_value += a->start; - - return (lv_anim_value_t)new_value; -} - -/** - * Calculate the current value of an animation slowing down the end phase - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_ease_out(const lv_anim_t * a) -{ - /*Calculate the current step*/ - - uint32_t t; - if(a->time == a->act_time) - t = 1024; - else - t = (uint32_t)((uint32_t)a->act_time * 1024) / a->time; - - int32_t step = lv_bezier3(t, 0, 1023, 1023, 1024); - - int32_t new_value; - new_value = (int32_t)step * (a->end - a->start); - new_value = new_value >> 10; - new_value += a->start; - - return (lv_anim_value_t)new_value; -} - -/** - * Calculate the current value of an animation applying an "S" characteristic (cosine) - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_ease_in_out(const lv_anim_t * a) -{ - /*Calculate the current step*/ - - uint32_t t; - if(a->time == a->act_time) - t = 1024; - else - t = (uint32_t)((uint32_t)a->act_time * 1024) / a->time; - - int32_t step = lv_bezier3(t, 0, 100, 924, 1024); - - int32_t new_value; - new_value = (int32_t)step * (a->end - a->start); - new_value = new_value >> 10; - new_value += a->start; - - return (lv_anim_value_t)new_value; -} - -/** - * Calculate the current value of an animation with overshoot at the end - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_overshoot(const lv_anim_t * a) -{ - /*Calculate the current step*/ - - uint32_t t; - if(a->time == a->act_time) - t = 1024; - else - t = (uint32_t)((uint32_t)a->act_time * 1024) / a->time; - - int32_t step = lv_bezier3(t, 0, 600, 1300, 1024); - - int32_t new_value; - new_value = (int32_t)step * (a->end - a->start); - new_value = new_value >> 10; - new_value += a->start; - - return (lv_anim_value_t)new_value; -} - -/** - * Calculate the current value of an animation with 3 bounces - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_bounce(const lv_anim_t * a) -{ - /*Calculate the current step*/ - uint32_t t; - if(a->time == a->act_time) - t = 1024; - else - t = (uint32_t)((uint32_t)a->act_time * 1024) / a->time; - - int32_t diff = (a->end - a->start); - - /*3 bounces has 5 parts: 3 down and 2 up. One part is t / 5 long*/ - - if(t < 408) { - /*Go down*/ - t = (t * 2500) >> 10; /*[0..1024] range*/ - } else if(t >= 408 && t < 614) { - /*First bounce back*/ - t -= 408; - t = t * 5; /*to [0..1024] range*/ - t = 1024 - t; - diff = diff / 6; - } else if(t >= 614 && t < 819) { - /*Fall back*/ - t -= 614; - t = t * 5; /*to [0..1024] range*/ - diff = diff / 6; - } else if(t >= 819 && t < 921) { - /*Second bounce back*/ - t -= 819; - t = t * 10; /*to [0..1024] range*/ - t = 1024 - t; - diff = diff / 16; - } else if(t >= 921 && t <= 1024) { - /*Fall back*/ - t -= 921; - t = t * 10; /*to [0..1024] range*/ - diff = diff / 16; - } - - if(t > 1024) t = 1024; - - int32_t step = lv_bezier3(t, 1024, 1024, 800, 0); - - int32_t new_value; - new_value = (int32_t)step * diff; - new_value = new_value >> 10; - new_value = a->end - new_value; - - return (lv_anim_value_t)new_value; -} - -/** - * Calculate the current value of an animation applying step characteristic. - * (Set end value on the end of the animation) - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_step(const lv_anim_t * a) -{ - if(a->act_time >= a->time) - return a->end; - else - return a->start; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Periodically handle the animations. - * @param param unused - */ -static void anim_task(lv_task_t * param) -{ - (void)param; - - lv_anim_t * a; - LV_LL_READ(LV_GC_ROOT(_lv_anim_ll), a) - { - a->has_run = 0; - } - - uint32_t elaps = lv_tick_elaps(last_task_run); - - a = lv_ll_get_head(&LV_GC_ROOT(_lv_anim_ll)); - - while(a != NULL) { - /*It can be set by `lv_anim_del()` typically in `end_cb`. If set then an animation delete - * happened in `anim_ready_handler` which could make this linked list reading corrupt - * because the list is changed meanwhile - */ - anim_list_changed = false; - - if(!a->has_run) { - a->has_run = 1; /*The list readying might be reseted so need to know which anim has run already*/ - a->act_time += elaps; - if(a->act_time >= 0) { - if(a->act_time > a->time) a->act_time = a->time; - - int32_t new_value; - new_value = a->path_cb(a); - - /*Apply the calculated value*/ - if(a->exec_cb) a->exec_cb(a->var, new_value); - - /*If the time is elapsed the animation is ready*/ - if(a->act_time >= a->time) { - anim_ready_handler(a); - } - } - } - - /* If the linked list changed due to anim. delete then it's not safe to continue - * the reading of the list from here -> start from the head*/ - if(anim_list_changed) - a = lv_ll_get_head(&LV_GC_ROOT(_lv_anim_ll)); - else - a = lv_ll_get_next(&LV_GC_ROOT(_lv_anim_ll), a); - } - - last_task_run = lv_tick_get(); -} - -/** - * Called when an animation is ready to do the necessary thinks - * e.g. repeat, play back, delete etc. - * @param a pointer to an animation descriptor - * @return true: animation delete occurred nnd the `LV_GC_ROOT(_lv_anim_ll)` has changed - * */ -static bool anim_ready_handler(lv_anim_t * a) -{ - - /*Delete the animation if - * - no repeat and no play back (simple one shot animation) - * - no repeat, play back is enabled and play back is ready */ - if((a->repeat == 0 && a->playback == 0) || (a->repeat == 0 && a->playback == 1 && a->playback_now == 1)) { - - /*Create copy from the animation and delete the animation from the list. - * 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_mem_free(a); - anim_list_changed = true; - - /* Call the callback function at the end*/ - if(a_tmp.ready_cb != NULL) a_tmp.ready_cb(&a_tmp); - } - /*If the animation is not deleted then restart it*/ - else { - a->act_time = -a->repeat_pause; /*Restart the animation*/ - /*Swap the start and end values in play back mode*/ - if(a->playback != 0) { - /*If now turning back use the 'playback_pause*/ - if(a->playback_now == 0) a->act_time = -a->playback_pause; - - /*Toggle the play back state*/ - a->playback_now = a->playback_now == 0 ? 1 : 0; - /*Swap the start and end values*/ - int32_t tmp; - tmp = a->start; - a->start = a->end; - a->end = tmp; - } - } - - return anim_list_changed; -} -#endif diff --git a/src/libs/lvgl/src/lv_misc/lv_anim.h b/src/libs/lvgl/src/lv_misc/lv_anim.h deleted file mode 100644 index b43035aa..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_anim.h +++ /dev/null @@ -1,331 +0,0 @@ -/** - * @file anim.h - * - */ - -#ifndef ANIM_H -#define ANIM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include <stdint.h> -#include <stdbool.h> -#include <string.h> - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Can be used to indicate if animations are enabled or disabled in a case*/ -enum { - LV_ANIM_OFF, - LV_ANIM_ON, -}; - -typedef uint8_t lv_anim_enable_t; - -/** Type of the animated value*/ -typedef lv_coord_t lv_anim_value_t; - -#if LV_USE_ANIMATION - -struct _lv_anim_t; - -/** Generic prototype of "animator" functions. - * First parameter is the variable to animate. - * Second parameter is the value to set. - * Compatible with `lv_xxx_set_yyy(obj, value)` functions - * The `x` in `_xcb_t` means its not a fully generic prototype because - * it doesn't receive `lv_anim_t *` as its first argument*/ -typedef void (*lv_anim_exec_xcb_t)(void *, lv_anim_value_t); - -/** Same as `lv_anim_exec_xcb_t` but receives `lv_anim_t *` as the first parameter. - * It's more consistent but less convenient. Might be used by binding generator functions.*/ -typedef void (*lv_anim_custom_exec_cb_t)(struct _lv_anim_t *, lv_anim_value_t); - -/** Get the current value during an animation*/ -typedef lv_anim_value_t (*lv_anim_path_cb_t)(const struct _lv_anim_t *); - -/** Callback to call when the animation is ready*/ -typedef void (*lv_anim_ready_cb_t)(struct _lv_anim_t *); - -/** Describes an animation*/ -typedef struct _lv_anim_t -{ - void * var; /**<Variable to animate*/ - lv_anim_exec_xcb_t exec_cb; /**< Function to execute to animate*/ - lv_anim_path_cb_t path_cb; /**< Function to get the steps of animations*/ - lv_anim_ready_cb_t ready_cb; /**< Call it when the animation is ready*/ - int32_t start; /**< Start value*/ - int32_t end; /**< End value*/ - uint32_t time; /**< Animation time in ms*/ - int32_t act_time; /**< Current time in animation. Set to negative to make delay.*/ - uint16_t playback_pause; /**< Wait before play back*/ - uint16_t repeat_pause; /**< Wait before repeat*/ -#if LV_USE_USER_DATA - lv_anim_user_data_t user_data; /**< Custom user data*/ -#endif - - uint8_t playback : 1; /**< When the animation is ready play it back*/ - uint8_t repeat : 1; /**< Repeat the animation infinitely*/ - /*Animation system use these - user shouldn't set*/ - uint8_t playback_now : 1; /**< Play back is in progress*/ - uint32_t has_run : 1; /**< Indicates the animation has run in this round*/ -} lv_anim_t; - - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Init. the animation module - */ -void lv_anim_core_init(void); - -/** - * Initialize an animation variable. - * E.g.: - * lv_anim_t a; - * lv_anim_init(&a); - * lv_anim_set_...(&a); - * lv_anim_create(&a); - * @param a pointer to an `lv_anim_t` variable to initialize - */ -void lv_anim_init(lv_anim_t * a); - -/** - * Set a variable to animate function to execute on `var` - * @param a pointer to an initialized `lv_anim_t` variable - * @param var pointer to a variable to animate - * @param exec_cb a function to execute. - * LittelvGL's built-in functions can be used. - * E.g. lv_obj_set_x - */ -static inline void lv_anim_set_exec_cb(lv_anim_t * a, void * var, lv_anim_exec_xcb_t exec_cb) -{ - a->var = var; - a->exec_cb = exec_cb; -} - -/** - * Set the duration and delay of an animation - * @param a pointer to an initialized `lv_anim_t` variable - * @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, int16_t delay) -{ - a->time = duration; - a->act_time = (int16_t)(-delay); -} - -/** - * Set the start and end values of an animation - * @param a pointer to an initialized `lv_anim_t` variable - * @param start the start value - * @param end the end value - */ -static inline void lv_anim_set_values(lv_anim_t * a, lv_anim_value_t start, lv_anim_value_t end) -{ - a->start = start; - a->end = end; -} - -/** - * Similar to `lv_anim_set_var_and_cb` but `lv_anim_custom_exec_cb_t` receives - * `lv_anim_t * ` as its first parameter instead of `void *`. - * This function might be used when LittlevGL is binded to other languages because - * it's more consistent to have `lv_anim_t *` as first parameter. - * @param a pointer to an initialized `lv_anim_t` variable - * @param exec_cb a function to execute. - */ -static inline void lv_anim_set_custom_exec_cb(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) -{ - a->var = a; - a->exec_cb = (lv_anim_exec_xcb_t)exec_cb; -} - -/** - * Set the path (curve) of the animation. - * @param a pointer to an initialized `lv_anim_t` variable - * @param path_cb a function the get the current value of the animation. - * The built in functions starts with `lv_anim_path_...` - */ -static inline void lv_anim_set_path_cb(lv_anim_t * a, lv_anim_path_cb_t path_cb) -{ - a->path_cb = path_cb; -} - -/** - * Set a function call when the animation is ready - * @param a pointer to an initialized `lv_anim_t` variable - * @param ready_cb a function call when the animation is ready - */ -static inline void lv_anim_set_ready_cb(lv_anim_t * a, lv_anim_ready_cb_t ready_cb) -{ - a->ready_cb = ready_cb; -} - -/** - * Make the animation to play back to when the forward direction is ready - * @param a pointer to an initialized `lv_anim_t` variable - * @param wait_time time in milliseconds to wait before starting the back direction - */ -static inline void lv_anim_set_playback(lv_anim_t * a, uint16_t wait_time) -{ - a->playback = 1; - a->playback_pause = wait_time; -} - -/** - * Disable playback. (Disabled after `lv_anim_init()`) - * @param a pointer to an initialized `lv_anim_t` variable - */ -static inline void lv_anim_clear_playback(lv_anim_t * a) -{ - a->playback = 0; -} - -/** - * Make the animation to start again when ready. - * @param a pointer to an initialized `lv_anim_t` variable - * @param wait_time time in milliseconds to wait before starting the animation again - */ -static inline void lv_anim_set_repeat(lv_anim_t * a, uint16_t wait_time) -{ - a->repeat = 1; - a->repeat_pause = wait_time; -} - -/** - * Disable repeat. (Disabled after `lv_anim_init()`) - * @param a pointer to an initialized `lv_anim_t` variable - */ -static inline void lv_anim_clear_repeat(lv_anim_t * a) -{ - a->repeat = 0; -} - -/** - * Create an animation - * @param a an initialized 'anim_t' variable. Not required after call. - */ -void lv_anim_create(lv_anim_t * a); - -/** - * Delete an animation of a variable with a given animator function - * @param var pointer to variable - * @param exec_cb a function pointer which is animating 'var', - * or NULL to ignore it and delete all the animations of 'var - * @return true: at least 1 animation is deleted, false: no animation is deleted - */ -bool lv_anim_del(void * var, lv_anim_exec_xcb_t exec_cb); - -/** - * Delete an aniamation by getting the animated variable from `a`. - * Only animations with `exec_cb` will be deleted. - * This function exist becasue it's logical that all anim functions receives an - * `lv_anim_t` as their first parameter. It's not practical in C but might makes - * the API more conequent and makes easier to genrate bindings. - * @param a pointer to an animation. - * @param exec_cb a function pointer which is animating 'var', - * or NULL to ignore it and delete all the animations of 'var - * @return true: at least 1 animation is deleted, false: no animation is deleted - */ -static inline bool lv_anim_custom_del(lv_anim_t * a, lv_anim_custom_exec_cb_t exec_cb) -{ - return lv_anim_del(a->var, (lv_anim_exec_xcb_t)exec_cb); -} - -/** - * Get the number of currently running animations - * @return the number of running animations - */ -uint16_t lv_anim_count_running(void); - -/** - * Calculate the time of an animation with a given speed and the start and end values - * @param speed speed of animation in unit/sec - * @param start start value of the animation - * @param end end value of the animation - * @return the required time [ms] for the animation with the given parameters - */ -uint32_t lv_anim_speed_to_time(uint16_t speed, lv_anim_value_t start, lv_anim_value_t end); - -/** - * Calculate the current value of an animation applying linear characteristic - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_linear(const lv_anim_t * a); - -/** - * Calculate the current value of an animation slowing down the start phase - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_ease_in(const lv_anim_t * a); - -/** - * Calculate the current value of an animation slowing down the end phase - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_ease_out(const lv_anim_t * a); - -/** - * Calculate the current value of an animation applying an "S" characteristic (cosine) - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_ease_in_out(const lv_anim_t * a); - -/** - * Calculate the current value of an animation with overshoot at the end - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_overshoot(const lv_anim_t * a); - -/** - * Calculate the current value of an animation with 3 bounces - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_bounce(const lv_anim_t * a); - -/** - * Calculate the current value of an animation applying step characteristic. - * (Set end value on the end of the animation) - * @param a pointer to an animation - * @return the current value to set - */ -lv_anim_value_t lv_anim_path_step(const lv_anim_t * a); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_ANIMATION == 0*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_ANIM_H*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_area.c b/src/libs/lvgl/src/lv_misc/lv_area.c deleted file mode 100644 index de649c5b..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_area.c +++ /dev/null @@ -1,210 +0,0 @@ -/** - * @file lv_area.c - * - */ - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include "lv_area.h" -#include "lv_math.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize an area - * @param area_p pointer to an area - * @param x1 left coordinate of the area - * @param y1 top coordinate of the area - * @param x2 right coordinate of the area - * @param y2 bottom coordinate of the area - */ -void lv_area_set(lv_area_t * area_p, lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2) -{ - area_p->x1 = x1; - area_p->y1 = y1; - area_p->x2 = x2; - area_p->y2 = y2; -} - -/** - * Set the width of an area - * @param area_p pointer to an area - * @param w the new width of the area (w == 1 makes x1 == x2) - */ -void lv_area_set_width(lv_area_t * area_p, lv_coord_t w) -{ - area_p->x2 = area_p->x1 + w - 1; -} - -/** - * Set the height of an area - * @param area_p pointer to an area - * @param h the new height of the area (h == 1 makes y1 == y2) - */ -void lv_area_set_height(lv_area_t * area_p, lv_coord_t h) -{ - area_p->y2 = area_p->y1 + h - 1; -} - -/** - * Set the position of an area (width and height will be kept) - * @param area_p pointer to an area - * @param x the new x coordinate of the area - * @param y the new y coordinate of the area - */ -void lv_area_set_pos(lv_area_t * area_p, lv_coord_t x, lv_coord_t y) -{ - lv_coord_t w = lv_area_get_width(area_p); - lv_coord_t h = lv_area_get_height(area_p); - area_p->x1 = x; - area_p->y1 = y; - lv_area_set_width(area_p, w); - lv_area_set_height(area_p, h); -} - -/** - * Return with area of an area (x * y) - * @param area_p pointer to an area - * @return size of area - */ -uint32_t lv_area_get_size(const lv_area_t * area_p) -{ - uint32_t size; - - size = (uint32_t)(area_p->x2 - area_p->x1 + 1) * (area_p->y2 - area_p->y1 + 1); - - return size; -} - -/** - * Get the common parts of two areas - * @param res_p pointer to an area, the result will be stored here - * @param a1_p pointer to the first area - * @param a2_p pointer to the second area - * @return false: the two area has NO common parts, res_p is invalid - */ -bool lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) -{ - /* Get the smaller area from 'a1_p' and 'a2_p' */ - res_p->x1 = LV_MATH_MAX(a1_p->x1, a2_p->x1); - res_p->y1 = LV_MATH_MAX(a1_p->y1, a2_p->y1); - res_p->x2 = LV_MATH_MIN(a1_p->x2, a2_p->x2); - res_p->y2 = LV_MATH_MIN(a1_p->y2, a2_p->y2); - - /*If x1 or y1 greater then x2 or y2 then the areas union is empty*/ - bool union_ok = true; - if((res_p->x1 > res_p->x2) || (res_p->y1 > res_p->y2)) { - union_ok = false; - } - - return union_ok; -} -/** - * Join two areas into a third which involves the other two - * @param res_p pointer to an area, the result will be stored here - * @param a1_p pointer to the first area - * @param a2_p pointer to the second area - */ -void lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p) -{ - a_res_p->x1 = LV_MATH_MIN(a1_p->x1, a2_p->x1); - a_res_p->y1 = LV_MATH_MIN(a1_p->y1, a2_p->y1); - a_res_p->x2 = LV_MATH_MAX(a1_p->x2, a2_p->x2); - a_res_p->y2 = LV_MATH_MAX(a1_p->y2, a2_p->y2); -} - -/** - * Check if a point is on an area - * @param a_p pointer to an area - * @param p_p pointer to a point - * @return false:the point is out of the area - */ -bool lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p) -{ - bool is_on = false; - - if((p_p->x >= a_p->x1 && p_p->x <= a_p->x2) && ((p_p->y >= a_p->y1 && p_p->y <= a_p->y2))) { - is_on = true; - } - - return is_on; -} - -/** - * Check if two area has common parts - * @param a1_p pointer to an area. - * @param a2_p pointer to an other area - * @return false: a1_p and a2_p has no common parts - */ -bool lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p) -{ - if((a1_p->x1 <= a2_p->x2) && (a1_p->x2 >= a2_p->x1) && (a1_p->y1 <= a2_p->y2) && (a1_p->y2 >= a2_p->y1)) { - return true; - } else { - return false; - } -} - -/** - * Check if an area is fully on an other - * @param ain_p pointer to an area which could be in 'aholder_p' - * @param aholder pointer to an area which could involve 'ain_p' - * @return - */ -bool lv_area_is_in(const lv_area_t * ain_p, const lv_area_t * aholder_p) -{ - bool is_in = false; - - if(ain_p->x1 >= aholder_p->x1 && ain_p->y1 >= aholder_p->y1 && ain_p->x2 <= aholder_p->x2 && - ain_p->y2 <= aholder_p->y2) { - is_in = true; - } - - 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/libs/lvgl/src/lv_misc/lv_area.h b/src/libs/lvgl/src/lv_misc/lv_area.h deleted file mode 100644 index 211bebd8..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_area.h +++ /dev/null @@ -1,186 +0,0 @@ -/** - * @file lv_area.h - * - */ - -#ifndef LV_AREA_H -#define LV_AREA_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include <string.h> -#include <stdbool.h> -#include <stdint.h> -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -/********************* - * DEFINES - *********************/ -/*To avoid overflow don't let the max ranges (reduce with 1000) */ -#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 - **********************/ - -/** - * Represents a point on the screen. - */ -typedef struct -{ - lv_coord_t x; - lv_coord_t y; -} lv_point_t; - -/** Represents an area of the screen. */ -typedef struct -{ - lv_coord_t x1; - lv_coord_t y1; - lv_coord_t x2; - lv_coord_t y2; -} lv_area_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize an area - * @param area_p pointer to an area - * @param x1 left coordinate of the area - * @param y1 top coordinate of the area - * @param x2 right coordinate of the area - * @param y2 bottom coordinate of the area - */ -void lv_area_set(lv_area_t * area_p, lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2); - -/** - * Copy an area - * @param dest pointer to the destination area - * @param src pointer to the source area - */ -inline static void lv_area_copy(lv_area_t * dest, const lv_area_t * src) -{ - memcpy(dest, src, sizeof(lv_area_t)); -} - -/** - * Get the width of an area - * @param area_p pointer to an area - * @return the width of the area (if x1 == x2 -> width = 1) - */ -static inline lv_coord_t lv_area_get_width(const lv_area_t * area_p) -{ - return (lv_coord_t)(area_p->x2 - area_p->x1 + 1); -} - -/** - * Get the height of an area - * @param area_p pointer to an area - * @return the height of the area (if y1 == y2 -> height = 1) - */ -static inline lv_coord_t lv_area_get_height(const lv_area_t * area_p) -{ - return (lv_coord_t)(area_p->y2 - area_p->y1 + 1); -} - -/** - * Set the width of an area - * @param area_p pointer to an area - * @param w the new width of the area (w == 1 makes x1 == x2) - */ -void lv_area_set_width(lv_area_t * area_p, lv_coord_t w); - -/** - * Set the height of an area - * @param area_p pointer to an area - * @param h the new height of the area (h == 1 makes y1 == y2) - */ -void lv_area_set_height(lv_area_t * area_p, lv_coord_t h); - -/** - * Set the position of an area (width and height will be kept) - * @param area_p pointer to an area - * @param x the new x coordinate of the area - * @param y the new y coordinate of the area - */ -void lv_area_set_pos(lv_area_t * area_p, lv_coord_t x, lv_coord_t y); - -/** - * Return with area of an area (x * y) - * @param area_p pointer to an area - * @return size of area - */ -uint32_t lv_area_get_size(const lv_area_t * area_p); - -/** - * Get the common parts of two areas - * @param res_p pointer to an area, the result will be stored her - * @param a1_p pointer to the first area - * @param a2_p pointer to the second area - * @return false: the two area has NO common parts, res_p is invalid - */ -bool lv_area_intersect(lv_area_t * res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); - -/** - * Join two areas into a third which involves the other two - * @param res_p pointer to an area, the result will be stored here - * @param a1_p pointer to the first area - * @param a2_p pointer to the second area - */ -void lv_area_join(lv_area_t * a_res_p, const lv_area_t * a1_p, const lv_area_t * a2_p); - -/** - * Check if a point is on an area - * @param a_p pointer to an area - * @param p_p pointer to a point - * @return false:the point is out of the area - */ -bool lv_area_is_point_on(const lv_area_t * a_p, const lv_point_t * p_p); - -/** - * Check if two area has common parts - * @param a1_p pointer to an area. - * @param a2_p pointer to an other area - * @return false: a1_p and a2_p has no common parts - */ -bool lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p); - -/** - * Check if an area is fully on an other - * @param ain_p pointer to an area which could be on aholder_p - * @param aholder pointer to an area which could involve ain_p - * @return - */ -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 - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/src/libs/lvgl/src/lv_misc/lv_async.c b/src/libs/lvgl/src/lv_misc/lv_async.c deleted file mode 100644 index 2a836432..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_async.c +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @file lv_async.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_async.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -static void lv_async_task_cb(lv_task_t *task); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -lv_res_t lv_async_call(lv_async_cb_t async_xcb, void * user_data) -{ - /*Allocate an info structure */ - lv_async_info_t *info = lv_mem_alloc(sizeof(lv_async_info_t)); - - if(info == NULL) - return LV_RES_INV; - - /* Create a new task */ - /* Use highest priority so that it will run before a refresh */ - lv_task_t *task = lv_task_create(lv_async_task_cb, 0, LV_TASK_PRIO_HIGHEST, info); - - if(task == NULL) { - lv_mem_free(info); - return LV_RES_INV; - } - - info->cb = async_xcb; - info->user_data = user_data; - - /* Set the task's user data */ - task->user_data = info; - lv_task_once(task); - return LV_RES_OK; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void lv_async_task_cb(lv_task_t *task) -{ - lv_async_info_t *info = (lv_async_info_t *)task->user_data; - - info->cb(info->user_data); - - lv_mem_free(info); -} diff --git a/src/libs/lvgl/src/lv_misc/lv_async.h b/src/libs/lvgl/src/lv_misc/lv_async.h deleted file mode 100644 index 9423cd8e..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_async.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * @file lv_async.h - * - */ - -#ifndef LV_ASYNC_H -#define LV_ASYNC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#include "lv_task.h" -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Type for async callback. - */ -typedef void (*lv_async_cb_t)(void *); - -typedef struct _lv_async_info_t { - lv_async_cb_t cb; - void *user_data; -} lv_async_info_t; - -struct _lv_obj_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Call an asynchronous function the next time lv_task_handler() is run. This function is likely to return - * **before** the call actually happens! - * @param task_xcb a callback which is the task itself. - * (the 'x' in the argument name indicates that its not a fully generic function because it not follows - * the `func_name(object, callback, ...)` convention) - * @param user_data custom parameter - */ -lv_res_t lv_async_call(lv_async_cb_t async_xcb, void * user_data); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_TEMPL_H*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_bidi.c b/src/libs/lvgl/src/lv_misc/lv_bidi.c deleted file mode 100644 index 6e50d926..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_bidi.c +++ /dev/null @@ -1,544 +0,0 @@ -/** - * @file lv_bidi.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include <stddef.h> -#include "lv_bidi.h" -#include "lv_txt.h" -#include "../lv_draw/lv_draw.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 - **********************/ - -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'; -} - -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; -} - -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; -} - -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; -} - -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*/ -// if(letter >= 'a' && letter <= 'z') return true; - - return 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; -} - -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); - uint32_t txt_buf_size = len + 1; - txt_buf_size = (txt_buf_size + 3) & (~0x3); - void *buf = lv_draw_get_buf(txt_buf_size + pos_conv_len * sizeof(uint16_t)); - if (bidi_txt) *bidi_txt = buf; - uint16_t *pos_conv_buf = (uint16_t*) ((char*)buf + txt_buf_size); - 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]); - return GET_POS(pos_conv_buf[visual_pos]); -} - -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); - uint32_t txt_buf_size = len + 1; - txt_buf_size = (txt_buf_size + 3) & (~0x3); - void *buf = lv_draw_get_buf(txt_buf_size + pos_conv_len * sizeof(uint16_t)); - if (bidi_txt) *bidi_txt = buf; - uint16_t *pos_conv_buf = (uint16_t*) ((char*)buf + txt_buf_size); - 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]); - return i; - } - } - return (uint16_t) -1; -} - -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; - } -} - -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/libs/lvgl/src/lv_misc/lv_bidi.h b/src/libs/lvgl/src/lv_misc/lv_bidi.h deleted file mode 100644 index 215727aa..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_bidi.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @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 <stdbool.h> -#include <stdint.h> - -/********************* - * 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 - -void lv_bidi_process(const char * str_in, char * str_out, lv_bidi_dir_t base_dir); -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 lv_bidi_get_next_paragraph(const char * txt); -lv_bidi_dir_t lv_bidi_detect_base_dir(const char * txt); -lv_bidi_dir_t lv_bidi_get_letter_dir(uint32_t letter); -bool lv_bidi_letter_is_weak(uint32_t letter); -bool lv_bidi_letter_is_rtl(uint32_t letter); -bool lv_bidi_letter_is_neutral(uint32_t letter); -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); -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); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_BIDI*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_BIDI_H*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_circ.c b/src/libs/lvgl/src/lv_misc/lv_circ.c deleted file mode 100644 index fc0e3e20..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_circ.c +++ /dev/null @@ -1,79 +0,0 @@ -/** - * @file lv_circ.c - * Circle drawing algorithm (with Bresenham) - * Only a 1/8 circle is calculated. Use CIRC_OCT1_X, CIRC_OCT1_Y macros to get - * the other octets. - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_circ.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the circle drawing - * @param c pointer to a point. The coordinates will be calculated here - * @param tmp point to a variable. It will store temporary data - * @param radius radius of the circle - */ -void lv_circ_init(lv_point_t * c, lv_coord_t * tmp, lv_coord_t radius) -{ - c->x = radius; - c->y = 0; - *tmp = 1 - radius; -} - -/** - * Test the circle drawing is ready or not - * @param c same as in circ_init - * @return true if the circle is not ready yet - */ -bool lv_circ_cont(lv_point_t * c) -{ - return c->y <= c->x ? true : false; -} - -/** - * Get the next point from the circle - * @param c same as in circ_init. The next point stored here. - * @param tmp same as in circ_init. - */ -void lv_circ_next(lv_point_t * c, lv_coord_t * tmp) -{ - c->y++; - - if(*tmp <= 0) { - (*tmp) += 2 * c->y + 1; /*Change in decision criterion for y -> y+1*/ - } else { - c->x--; - (*tmp) += 2 * (c->y - c->x) + 1; /*Change for y -> y+1, x -> x-1*/ - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/libs/lvgl/src/lv_misc/lv_circ.h b/src/libs/lvgl/src/lv_misc/lv_circ.h deleted file mode 100644 index 405a4b6c..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_circ.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @file lv_circ.h - * - */ - -#ifndef LV_CIRC_H -#define LV_CIRC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include <stddef.h> -#include "lv_area.h" - -/********************* - * DEFINES - *********************/ -#define LV_CIRC_OCT1_X(p) (p.x) -#define LV_CIRC_OCT1_Y(p) (p.y) -#define LV_CIRC_OCT2_X(p) (p.y) -#define LV_CIRC_OCT2_Y(p) (p.x) -#define LV_CIRC_OCT3_X(p) (-p.y) -#define LV_CIRC_OCT3_Y(p) (p.x) -#define LV_CIRC_OCT4_X(p) (-p.x) -#define LV_CIRC_OCT4_Y(p) (p.y) -#define LV_CIRC_OCT5_X(p) (-p.x) -#define LV_CIRC_OCT5_Y(p) (-p.y) -#define LV_CIRC_OCT6_X(p) (-p.y) -#define LV_CIRC_OCT6_Y(p) (-p.x) -#define LV_CIRC_OCT7_X(p) (p.y) -#define LV_CIRC_OCT7_Y(p) (-p.x) -#define LV_CIRC_OCT8_X(p) (p.x) -#define LV_CIRC_OCT8_Y(p) (-p.y) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the circle drawing - * @param c pointer to a point. The coordinates will be calculated here - * @param tmp point to a variable. It will store temporary data - * @param radius radius of the circle - */ -void lv_circ_init(lv_point_t * c, lv_coord_t * tmp, lv_coord_t radius); - -/** - * Test the circle drawing is ready or not - * @param c same as in circ_init - * @return true if the circle is not ready yet - */ -bool lv_circ_cont(lv_point_t * c); - -/** - * Get the next point from the circle - * @param c same as in circ_init. The next point stored here. - * @param tmp same as in circ_init. - */ -void lv_circ_next(lv_point_t * c, lv_coord_t * tmp); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/src/libs/lvgl/src/lv_misc/lv_color.c b/src/libs/lvgl/src/lv_misc/lv_color.c deleted file mode 100644 index cd4825df..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_color.c +++ /dev/null @@ -1,171 +0,0 @@ -/** - * @file lv_color.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_color.h" -#include "lv_math.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Convert a HSV color to RGB - * @param h hue [0..359] - * @param s saturation [0..100] - * @param v value [0..100] - * @return the given RGB color in RGB (with LV_COLOR_DEPTH depth) - */ -lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v) -{ - h = (uint32_t)((uint32_t)h * 255) / 360; - s = (uint16_t)((uint16_t)s * 255) / 100; - v = (uint16_t)((uint16_t)v * 255) / 100; - - uint8_t r, g, b; - - uint8_t region, remainder, p, q, t; - - if(s == 0) { - r = v; - g = v; - b = v; - return lv_color_make(v, v, v); - } - - region = h / 43; - remainder = (h - (region * 43)) * 6; - - p = (v * (255 - s)) >> 8; - q = (v * (255 - ((s * remainder) >> 8))) >> 8; - t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8; - - switch(region) { - case 0: - r = v; - g = t; - b = p; - break; - case 1: - r = q; - g = v; - b = p; - break; - case 2: - r = p; - g = v; - b = t; - break; - case 3: - r = p; - g = q; - b = v; - break; - case 4: - r = t; - g = p; - b = v; - break; - default: - r = v; - g = p; - b = q; - break; - } - - lv_color_t result = lv_color_make(r, g, b); - return result; -} - -/** - * 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 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; - - // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness - hsv.v = (100 * rgbMax) >> 10; - - int32_t delta = rgbMax - rgbMin; - if (LV_MATH_ABS(delta) < 3) { - hsv.h = 0; - hsv.s = 0; - return hsv; - } - - // 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) - h = (((g - b) << 10) / delta) + (g < b ? (6 << 10) : 0); // between yellow & magenta - else if(rgbMax == g) - 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 - 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/libs/lvgl/src/lv_misc/lv_color.h b/src/libs/lvgl/src/lv_misc/lv_color.h deleted file mode 100644 index 1febbdce..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_color.h +++ /dev/null @@ -1,526 +0,0 @@ -/** - * @file lv_color.h - * - */ - -#ifndef LV_COLOR_H -#define LV_COLOR_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -/*Error checking*/ -#if LV_COLOR_DEPTH == 24 -#error "LV_COLOR_DEPTH 24 is deprecated. Use LV_COLOR_DEPTH 32 instead (lv_conf.h)" -#endif - -#if LV_COLOR_DEPTH != 32 && LV_COLOR_SCREEN_TRANSP != 0 -#error "LV_COLOR_SCREEN_TRANSP requires LV_COLOR_DEPTH == 32. Set it in lv_conf.h" -#endif - -#if LV_COLOR_DEPTH != 16 && LV_COLOR_16_SWAP != 0 -#error "LV_COLOR_16_SWAP requires LV_COLOR_DEPTH == 16. Set it in lv_conf.h" -#endif - -#include <stdint.h> - -/********************* - * DEFINES - *********************/ -#define LV_COLOR_WHITE LV_COLOR_MAKE(0xFF, 0xFF, 0xFF) -#define LV_COLOR_SILVER LV_COLOR_MAKE(0xC0, 0xC0, 0xC0) -#define LV_COLOR_GRAY LV_COLOR_MAKE(0x80, 0x80, 0x80) -#define LV_COLOR_BLACK LV_COLOR_MAKE(0x00, 0x00, 0x00) -#define LV_COLOR_RED LV_COLOR_MAKE(0xFF, 0x00, 0x00) -#define LV_COLOR_MAROON LV_COLOR_MAKE(0x80, 0x00, 0x00) -#define LV_COLOR_YELLOW LV_COLOR_MAKE(0xFF, 0xFF, 0x00) -#define LV_COLOR_OLIVE LV_COLOR_MAKE(0x80, 0x80, 0x00) -#define LV_COLOR_LIME LV_COLOR_MAKE(0x00, 0xFF, 0x00) -#define LV_COLOR_GREEN LV_COLOR_MAKE(0x00, 0x80, 0x00) -#define LV_COLOR_CYAN LV_COLOR_MAKE(0x00, 0xFF, 0xFF) -#define LV_COLOR_AQUA LV_COLOR_CYAN -#define LV_COLOR_TEAL LV_COLOR_MAKE(0x00, 0x80, 0x80) -#define LV_COLOR_BLUE LV_COLOR_MAKE(0x00, 0x00, 0xFF) -#define LV_COLOR_NAVY LV_COLOR_MAKE(0x00, 0x00, 0x80) -#define LV_COLOR_MAGENTA LV_COLOR_MAKE(0xFF, 0x00, 0xFF) -#define LV_COLOR_PURPLE LV_COLOR_MAKE(0x80, 0x00, 0x80) -#define LV_COLOR_ORANGE LV_COLOR_MAKE(0xFF, 0xA5, 0x00) - -/** - * Opacity percentages. - */ -enum { - LV_OPA_TRANSP = 0, - LV_OPA_0 = 0, - LV_OPA_10 = 25, - LV_OPA_20 = 51, - LV_OPA_30 = 76, - LV_OPA_40 = 102, - LV_OPA_50 = 127, - LV_OPA_60 = 153, - LV_OPA_70 = 178, - LV_OPA_80 = 204, - LV_OPA_90 = 229, - LV_OPA_100 = 255, - 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*/ - -#if LV_COLOR_DEPTH == 1 -#define LV_COLOR_SIZE 8 -#elif LV_COLOR_DEPTH == 8 -#define LV_COLOR_SIZE 8 -#elif LV_COLOR_DEPTH == 16 -#define LV_COLOR_SIZE 16 -#elif LV_COLOR_DEPTH == 32 -#define LV_COLOR_SIZE 32 -#else -#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) & 0x7U; -# define LV_COLOR_SET_G8(c, v) (c).ch.green = (uint8_t)(v) & 0x7U; -# define LV_COLOR_SET_B8(c, v) (c).ch.blue = (uint8_t)(v) & 0x3U; -# 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)(v) & 0x1FU; -# define LV_COLOR_SET_G16(c, v) (c).ch.green = (uint8_t)(v) & 0x3FU; -# 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) & 0x1FU; -# 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 -{ - struct - { - uint8_t blue : 1; - uint8_t green : 1; - uint8_t red : 1; - } ch; - uint8_t full; -} lv_color1_t; - -typedef union -{ - struct - { - uint8_t blue : 2; - uint8_t green : 3; - uint8_t red : 3; - } ch; - uint8_t full; -} lv_color8_t; - -typedef union -{ - struct - { -#if LV_COLOR_16_SWAP == 0 - uint16_t blue : 5; - uint16_t green : 6; - uint16_t red : 5; -#else - uint16_t green_h : 3; - uint16_t red : 5; - uint16_t blue : 5; - uint16_t green_l : 3; -#endif - } ch; - uint16_t full; -} lv_color16_t; - -typedef union -{ - struct - { - uint8_t blue; - uint8_t green; - uint8_t red; - uint8_t alpha; - } ch; - uint32_t full; -} lv_color32_t; - -#if LV_COLOR_DEPTH == 1 -typedef uint8_t lv_color_int_t; -typedef lv_color1_t lv_color_t; -#elif LV_COLOR_DEPTH == 8 -typedef uint8_t lv_color_int_t; -typedef lv_color8_t lv_color_t; -#elif LV_COLOR_DEPTH == 16 -typedef uint16_t lv_color_int_t; -typedef lv_color16_t lv_color_t; -#elif LV_COLOR_DEPTH == 32 -typedef uint32_t lv_color_int_t; -typedef lv_color32_t lv_color_t; -#else -#error "Invalid LV_COLOR_DEPTH in lv_conf.h! Set it to 1, 8, 16 or 32!" -#endif - -typedef uint8_t lv_opa_t; - -typedef struct -{ - uint16_t h; - uint8_t s; - uint8_t v; -} lv_color_hsv_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/*In color conversations: - * - When converting to bigger color type the LSB weight of 1 LSB is calculated - * E.g. 16 bit Red has 5 bits - * 8 bit Red has 2 bits - * ---------------------- - * 8 bit red LSB = (2^5 - 1) / (2^2 - 1) = 31 / 3 = 10 - * - * - When calculating to smaller color type simply shift out the LSBs - * E.g. 8 bit Red has 2 bits - * 16 bit Red has 5 bits - * ---------------------- - * Shift right with 5 - 3 = 2 - */ - -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((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_GET_R(color) & 0x10) || (LV_COLOR_GET_G(color) & 0x20) || (LV_COLOR_GET_B(color) & 0x10)) { - return 1; - } else { - return 0; - } -#elif LV_COLOR_DEPTH == 32 - if((LV_COLOR_GET_R(color) & 0x80) || (LV_COLOR_GET_G(color) & 0x80) || (LV_COLOR_GET_B(color) & 0x80)) { - return 1; - } else { - return 0; - } -#endif -} - -static inline uint8_t lv_color_to8(lv_color_t color) -{ -#if LV_COLOR_DEPTH == 1 - if(color.full == 0) - return 0; - else - return 0xFF; -#elif LV_COLOR_DEPTH == 8 - return color.full; -#elif LV_COLOR_DEPTH == 16 - lv_color8_t ret; - 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; -#elif LV_COLOR_DEPTH == 32 - lv_color8_t ret; - 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; - else - 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 - LV_COLOR_SET_G16(ret, LV_COLOR_GET_G(color) * 9); /*(2^6 - 1)/(2^3 - 1) = 63/7 = 9*/ -#else - 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 - LV_COLOR_SET_G16(ret, LV_COLOR_GET_G(color) >> 2); /* 8 - 6 = 2*/ -#else - 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 -} - -static inline uint32_t lv_color_to32(lv_color_t color) -{ -#if LV_COLOR_DEPTH == 1 - if(color.full == 0) - return 0; - else - return 0xFFFFFFFF; -#elif LV_COLOR_DEPTH == 8 - lv_color32_t ret; - 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 - /** - * 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; - 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; -#elif LV_COLOR_DEPTH == 32 - return color.full; -#endif -} - -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*/ - 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; -#endif - - return ret; -} - -/** - * Get the brightness of a color - * @param color a color - * @return the brightness [0..255] - */ -static inline uint8_t lv_color_brightness(lv_color_t color) -{ - lv_color32_t c32; - c32.full = lv_color_to32(color); - 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){.full = (uint8_t)((b8 >> 7) | (g8 >> 7) | (r8 >> 7))}) -#elif LV_COLOR_DEPTH == 8 -#define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){{(uint8_t)((b8 >> 6) & 0x3U), (uint8_t)((g8 >> 5) & 0x7U), (uint8_t)((r8 >> 5) & 0x7U)}}) -#elif LV_COLOR_DEPTH == 16 -#if LV_COLOR_16_SWAP == 0 -#define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){{(uint16_t)((b8 >> 3) & 0x1FU), (uint16_t)((g8 >> 2) & 0x3FU), (uint16_t)((r8 >> 3) & 0x1FU)}}) -#else -#define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){{(uint16_t)((g8 >> 5) & 0x7U), (uint16_t)((r8 >> 3) & 0x1FU), (uint16_t)((b8 >> 3) & 0x1FU), (uint16_t)((g8 >> 2) & 0x7U)}}) -#endif -#elif LV_COLOR_DEPTH == 32 -#define LV_COLOR_MAKE(r8, g8, b8) ((lv_color_t){{b8, g8, r8, 0xff}}) /*Fix 0xff alpha*/ -#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)); -} - -static inline lv_color_t lv_color_hex3(uint32_t c) -{ - return lv_color_make((uint8_t)(((c >> 4) & 0xF0) | ((c >> 8) & 0xF)), (uint8_t)((c & 0xF0) | ((c & 0xF0) >> 4)), - (uint8_t)((c & 0xF) | ((c & 0xF) << 4))); -} - -/** - * Convert a HSV color to RGB - * @param h hue [0..359] - * @param s saturation [0..100] - * @param v value [0..100] - * @return the given RGB color in RGB (with LV_COLOR_DEPTH depth) - */ -lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v); - -/** - * 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 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 - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*USE_COLOR*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_fs.c b/src/libs/lvgl/src/lv_misc/lv_fs.c deleted file mode 100644 index a23081ce..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_fs.c +++ /dev/null @@ -1,642 +0,0 @@ -/** - * @file lv_fs.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_fs.h" -#if LV_USE_FILESYSTEM - -#include "../lv_core/lv_debug.h" -#include "lv_ll.h" -#include <string.h> -#include "lv_gc.h" - -#if defined(LV_GC_INCLUDE) -#include LV_GC_INCLUDE -#endif /* LV_ENABLE_GC */ - -/********************* - * DEFINES - *********************/ - -/* "free" is used as a function pointer (in lv_fs_drv_t). - * We must make sure "free" was not defined to a platform specific - * free function, otherwise compilation would fail. - */ -#ifdef free -#undef free -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static const char * lv_fs_get_real_path(const char * path); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the File system interface - */ -void lv_fs_init(void) -{ - lv_ll_init(&LV_GC_ROOT(_lv_drv_ll), sizeof(lv_fs_drv_t)); -} - -/** - * Test if a drive is rady or not. If the `ready` function was not initialized `true` will be - * returned. - * @param letter letter of the drive - * @return true: drive is ready; false: drive is not ready - */ -bool lv_fs_is_ready(char letter) -{ - lv_fs_drv_t * drv = lv_fs_get_drv(letter); - - if(drv == NULL) return false; /*An unknown driver in not ready*/ - - if(drv->ready_cb == NULL) return true; /*Assume the driver is always ready if no handler provided*/ - - return drv->ready_cb(drv); -} - -/** - * Open a file - * @param file_p pointer to a lv_fs_file_t variable - * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) - * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode) -{ - file_p->drv = NULL; - file_p->file_d = NULL; - - if(path == NULL) return LV_FS_RES_INV_PARAM; - - char letter = path[0]; - - file_p->drv = lv_fs_get_drv(letter); - - if(file_p->drv == NULL) { - file_p->file_d = NULL; - return LV_FS_RES_NOT_EX; - } - - if(file_p->drv->ready_cb != NULL) { - if(file_p->drv->ready_cb(file_p->drv) == false) { - file_p->drv = NULL; - file_p->file_d = NULL; - return LV_FS_RES_HW_ERR; - } - } - - file_p->file_d = lv_mem_alloc(file_p->drv->file_size); - 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 */ - } - - if(file_p->drv->open_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - const char * real_path = lv_fs_get_real_path(path); - lv_fs_res_t res = file_p->drv->open_cb(file_p->drv, file_p->file_d, real_path, mode); - - if(res != LV_FS_RES_OK) { - lv_mem_free(file_p->file_d); - file_p->file_d = NULL; - file_p->drv = NULL; - } - - return res; -} - -/** - * Close an already opened file - * @param file_p pointer to a lv_fs_file_t variable - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p) -{ - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->close_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - lv_fs_res_t res = file_p->drv->close_cb(file_p->drv, file_p->file_d); - - lv_mem_free(file_p->file_d); /*Clean up*/ - file_p->file_d = NULL; - file_p->drv = NULL; - file_p->file_d = NULL; - - return res; -} - -/** - * Delete a file - * @param path path of the file to delete - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_remove(const char * path) -{ - if(path == NULL) return LV_FS_RES_INV_PARAM; - lv_fs_drv_t * drv = NULL; - - char letter = path[0]; - - drv = lv_fs_get_drv(letter); - if(drv == NULL) return LV_FS_RES_NOT_EX; - if(drv->ready_cb != NULL) { - if(drv->ready_cb(drv) == false) return LV_FS_RES_HW_ERR; - } - - if(drv->remove_cb == NULL) return LV_FS_RES_NOT_IMP; - - const char * real_path = lv_fs_get_real_path(path); - lv_fs_res_t res = drv->remove_cb(drv, real_path); - - return res; -} - -/** - * Read from a file - * @param file_p pointer to a lv_fs_file_t variable - * @param buf pointer to a buffer where the read bytes are stored - * @param btr Bytes To Read - * @param br the number of real read bytes (Bytes Read). NULL if unused. - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_read(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br) -{ - if(br != NULL) *br = 0; - if(file_p->drv == NULL) return LV_FS_RES_INV_PARAM; - if(file_p->drv->read_cb == NULL) return LV_FS_RES_NOT_IMP; - - uint32_t br_tmp = 0; - lv_fs_res_t res = file_p->drv->read_cb(file_p->drv, file_p->file_d, buf, btr, &br_tmp); - if(br != NULL) *br = br_tmp; - - return res; -} - -/** - * Write into a file - * @param file_p pointer to a lv_fs_file_t variable - * @param buf pointer to a buffer with the bytes to write - * @param btr Bytes To Write - * @param br the number of real written bytes (Bytes Written). NULL if unused. - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_write(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw) -{ - if(bw != NULL) *bw = 0; - - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->write_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - uint32_t bw_tmp = 0; - lv_fs_res_t res = file_p->drv->write_cb(file_p->drv, file_p->file_d, buf, btw, &bw_tmp); - if(bw != NULL) *bw = bw_tmp; - - return res; -} - -/** - * Set the position of the 'cursor' (read write pointer) in a file - * @param file_p pointer to a lv_fs_file_t variable - * @param pos the new position expressed in bytes index (0: start of file) - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos) -{ - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->seek_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - lv_fs_res_t res = file_p->drv->seek_cb(file_p->drv, file_p->file_d, pos); - - return res; -} - -/** - * Give the position of the read write pointer - * @param file_p pointer to a lv_fs_file_t variable - * @param pos_p pointer to store the position of the read write pointer - * @return LV_FS_RES_OK or any error from 'fs_res_t' - */ -lv_fs_res_t lv_fs_tell(lv_fs_file_t * file_p, uint32_t * pos) -{ - if(file_p->drv == NULL) { - pos = 0; - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->tell_cb == NULL) { - pos = 0; - return LV_FS_RES_NOT_IMP; - } - - lv_fs_res_t res = file_p->drv->tell_cb(file_p->drv, file_p->file_d, pos); - - return res; -} - -/** - * Truncate the file size to the current position of the read write pointer - * @param file_p pointer to an 'ufs_file_t' variable. (opened with lv_fs_open ) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_trunc(lv_fs_file_t * file_p) -{ - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->tell_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - lv_fs_res_t res = file_p->drv->trunc_cb(file_p->drv, file_p->file_d); - - return res; -} -/** - * Give the size of a file bytes - * @param file_p pointer to a lv_fs_file_t variable - * @param size pointer to a variable to store the size - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_size(lv_fs_file_t * file_p, uint32_t * size) -{ - if(file_p->drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - if(file_p->drv->size_cb == NULL) return LV_FS_RES_NOT_IMP; - - if(size == NULL) return LV_FS_RES_INV_PARAM; - - lv_fs_res_t res = file_p->drv->size_cb(file_p->drv, file_p->file_d, size); - - return res; -} - -/** - * Rename a file - * @param oldname path to the file - * @param newname path with the new name - * @return LV_FS_RES_OK or any error from 'fs_res_t' - */ -lv_fs_res_t lv_fs_rename(const char * oldname, const char * newname) -{ - if(!oldname || !newname) return LV_FS_RES_INV_PARAM; - - char letter = oldname[0]; - - lv_fs_drv_t * drv = lv_fs_get_drv(letter); - - if(!drv) { - return LV_FS_RES_NOT_EX; - } - - if(drv->ready_cb != NULL) { - if(drv->ready_cb(drv) == false) { - return LV_FS_RES_HW_ERR; - } - } - - if(drv->rename_cb == NULL) return LV_FS_RES_NOT_IMP; - - const char * old_real = lv_fs_get_real_path(oldname); - const char * new_real = lv_fs_get_real_path(newname); - - lv_fs_res_t res = drv->rename_cb(drv, old_real, new_real); - - return res; -} - -/** - * Initialize a 'fs_read_dir_t' variable for directory reading - * @param rddir_p pointer to a 'fs_read_dir_t' variable - * @param path path to a directory - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path) -{ - if(path == NULL) return LV_FS_RES_INV_PARAM; - - char letter = path[0]; - - rddir_p->drv = lv_fs_get_drv(letter); - - if(rddir_p->drv == NULL) { - rddir_p->dir_d = NULL; - return LV_FS_RES_NOT_EX; - } - - rddir_p->dir_d = lv_mem_alloc(rddir_p->drv->rddir_size); - 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 */ - } - - if(rddir_p->drv->dir_open_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - const char * real_path = lv_fs_get_real_path(path); - - lv_fs_res_t res = rddir_p->drv->dir_open_cb(rddir_p->drv, rddir_p->dir_d, real_path); - - return res; -} - -/** - * Read the next filename form a directory. - * The name of the directories will begin with '/' - * @param rddir_p pointer to an initialized 'fs_read_dir_t' variable - * @param fn pointer to a buffer to store the filename - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn) -{ - if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { - fn[0] = '\0'; - return LV_FS_RES_INV_PARAM; - } - - if(rddir_p->drv->dir_read_cb == NULL) { - return LV_FS_RES_NOT_IMP; - } - - lv_fs_res_t res = rddir_p->drv->dir_read_cb(rddir_p->drv, rddir_p->dir_d, fn); - - return res; -} - -/** - * Close the directory reading - * @param rddir_p pointer to an initialized 'fs_read_dir_t' variable - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_dir_close(lv_fs_dir_t * rddir_p) -{ - if(rddir_p->drv == NULL || rddir_p->dir_d == NULL) { - return LV_FS_RES_INV_PARAM; - } - - lv_fs_res_t res; - - if(rddir_p->drv->dir_close_cb == NULL) { - res = LV_FS_RES_NOT_IMP; - } else { - res = rddir_p->drv->dir_close_cb(rddir_p->drv, rddir_p->dir_d); - } - - lv_mem_free(rddir_p->dir_d); /*Clean up*/ - rddir_p->dir_d = NULL; - rddir_p->drv = NULL; - rddir_p->dir_d = NULL; - - return res; -} - -/** - * Get the free and total size of a driver in kB - * @param letter the driver letter - * @param total_p pointer to store the total size [kB] - * @param free_p pointer to store the free size_cb [kB] - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_free_space(char letter, uint32_t * total_p, uint32_t * free_p) -{ - lv_fs_drv_t * drv = lv_fs_get_drv(letter); - - if(drv == NULL) { - return LV_FS_RES_INV_PARAM; - } - - lv_fs_res_t res; - - if(drv->free_space_cb == NULL) { - res = LV_FS_RES_NOT_IMP; - } else { - uint32_t total_tmp = 0; - uint32_t free_tmp = 0; - res = drv->free_space_cb(drv, &total_tmp, &free_tmp); - - if(total_p != NULL) *total_p = total_tmp; - if(free_p != NULL) *free_p = free_tmp; - } - - return res; -} - -/** - * Initialize a file system driver with default values. - * It is used to surly have known values in the fields ant not memory junk. - * After it you can set the fields. - * @param drv pointer to driver variable to initialize - */ -void lv_fs_drv_init(lv_fs_drv_t * drv) -{ - memset(drv, 0, sizeof(lv_fs_drv_t)); -} - -/** - * Add a new drive - * @param drv_p pointer to an lv_fs_drv_t structure which is inited with the - * corresponding function pointers. The data will be copied so the variable can be local. - */ -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_ASSERT_MEM(new_drv); - if(new_drv == NULL) return; - - memcpy(new_drv, drv_p, sizeof(lv_fs_drv_t)); -} - -/** - * Give a pointer to a driver from its letter - * @param letter the driver letter - * @return pointer to a driver or NULL if not found - */ -lv_fs_drv_t * lv_fs_get_drv(char letter) -{ - lv_fs_drv_t * drv; - - LV_LL_READ(LV_GC_ROOT(_lv_drv_ll), drv) - { - if(drv->letter == letter) { - return drv; - } - } - - return NULL; -} -/** - * Fill a buffer with the letters of existing drivers - * @param buf buffer to store the letters ('\0' added after the last letter) - * @return the buffer - */ -char * lv_fs_get_letters(char * buf) -{ - lv_fs_drv_t * drv; - uint8_t i = 0; - - LV_LL_READ(LV_GC_ROOT(_lv_drv_ll), drv) - { - buf[i] = drv->letter; - i++; - } - - buf[i] = '\0'; - - return buf; -} - -/** - * Return with the extension of the filename - * @param fn string with a filename - * @return pointer to the beginning extension or empty string if no extension - */ -const char * lv_fs_get_ext(const char * fn) -{ - size_t i; - for(i = strlen(fn); i > 0; i--) { - if(fn[i] == '.') { - return &fn[i + 1]; - } else if(fn[i] == '/' || fn[i] == '\\') { - return ""; /*No extension if a '\' or '/' found*/ - } - } - - return ""; /*Empty string if no '.' in the file name. */ -} - -/** - * Step up one level - * @param path pointer to a file name - * @return the truncated file name - */ -char * lv_fs_up(char * path) -{ - size_t len = strlen(path); - if(len == 0) return path; - - len--; /*Go before the trailing '\0'*/ - - /*Ignore trailing '/' or '\'*/ - while(path[len] == '/' || path[len] == '\\') { - path[len] = '\0'; - if(len > 0) - len--; - else - return path; - } - - size_t i; - for(i = len; i > 0; i--) { - if(path[i] == '/' || path[i] == '\\') break; - } - - if(i > 0) path[i] = '\0'; - - return path; -} - -/** - * Get the last element of a path (e.g. U:/folder/file -> file) - * @param path a character sting with the path to search in - * @return pointer to the beginning of the last element in the path - */ -const char * lv_fs_get_last(const char * path) -{ - size_t len = strlen(path); - if(len == 0) return path; - - len--; /*Go before the trailing '\0'*/ - - /*Ignore trailing '/' or '\'*/ - while(path[len] == '/' || path[len] == '\\') { - if(len > 0) - len--; - else - return path; - } - - size_t i; - for(i = len; i > 0; i--) { - if(path[i] == '/' || path[i] == '\\') break; - } - - /*No '/' or '\' in the path so return with path itself*/ - if(i == 0) return path; - - return &path[i + 1]; -} -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Leave the driver letters and / or \ letters from beginning of the path - * @param path path string (E.g. S:/folder/file.txt) - * @return pointer to the beginning of the real path (E.g. folder/file.txt) - */ -static const char * lv_fs_get_real_path(const char * path) -{ - /* Example path: "S:/folder/file.txt" - * Leave the letter and the : / \ characters*/ - - path++; /*Ignore the driver letter*/ - - while(*path != '\0') { - if(*path == ':' || *path == '\\' || *path == '/') { - path++; - } else { - break; - } - } - - return path; -} - -#endif /*LV_USE_FILESYSTEM*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_fs.h b/src/libs/lvgl/src/lv_misc/lv_fs.h deleted file mode 100644 index f1824282..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_fs.h +++ /dev/null @@ -1,299 +0,0 @@ -/** - * @file lv_fs.h - * - */ - -#ifndef LV_FS_H -#define LV_FS_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_FILESYSTEM - -#include <stdint.h> -#include <stdbool.h> -#include "lv_mem.h" - -/********************* - * DEFINES - *********************/ -#define LV_FS_MAX_FN_LENGTH 64 -#define LV_FS_MAX_PATH_LENGTH 256 - -/********************** - * TYPEDEFS - **********************/ -/** - * Errors in the filesystem module. - */ -enum { - LV_FS_RES_OK = 0, - LV_FS_RES_HW_ERR, /*Low level hardware error*/ - LV_FS_RES_FS_ERR, /*Error in the file system structure */ - LV_FS_RES_NOT_EX, /*Driver, file or directory is not exists*/ - LV_FS_RES_FULL, /*Disk full*/ - LV_FS_RES_LOCKED, /*The file is already opened*/ - LV_FS_RES_DENIED, /*Access denied. Check 'fs_open' modes and write protect*/ - LV_FS_RES_BUSY, /*The file system now can't handle it, try later*/ - LV_FS_RES_TOUT, /*Process time outed*/ - LV_FS_RES_NOT_IMP, /*Requested function is not implemented*/ - LV_FS_RES_OUT_OF_MEM, /*Not enough memory for an internal operation*/ - LV_FS_RES_INV_PARAM, /*Invalid parameter among arguments*/ - LV_FS_RES_UNKNOWN, /*Other unknown error*/ -}; -typedef uint8_t lv_fs_res_t; - -/** - * Filesystem mode. - */ -enum { - LV_FS_MODE_WR = 0x01, - LV_FS_MODE_RD = 0x02, -}; -typedef uint8_t lv_fs_mode_t; - -typedef struct _lv_fs_drv_t -{ - char letter; - uint16_t file_size; - uint16_t rddir_size; - bool (*ready_cb)(struct _lv_fs_drv_t * drv); - - lv_fs_res_t (*open_cb)(struct _lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); - lv_fs_res_t (*close_cb)(struct _lv_fs_drv_t * drv, void * file_p); - lv_fs_res_t (*remove_cb)(struct _lv_fs_drv_t * drv, const char * fn); - lv_fs_res_t (*read_cb)(struct _lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); - lv_fs_res_t (*write_cb)(struct _lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw); - lv_fs_res_t (*seek_cb)(struct _lv_fs_drv_t * drv, void * file_p, uint32_t pos); - lv_fs_res_t (*tell_cb)(struct _lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); - lv_fs_res_t (*trunc_cb)(struct _lv_fs_drv_t * drv, void * file_p); - lv_fs_res_t (*size_cb)(struct _lv_fs_drv_t * drv, void * file_p, uint32_t * size_p); - lv_fs_res_t (*rename_cb)(struct _lv_fs_drv_t * drv, const char * oldname, const char * newname); - lv_fs_res_t (*free_space_cb)(struct _lv_fs_drv_t * drv, uint32_t * total_p, uint32_t * free_p); - - lv_fs_res_t (*dir_open_cb)(struct _lv_fs_drv_t * drv, void * rddir_p, const char * path); - lv_fs_res_t (*dir_read_cb)(struct _lv_fs_drv_t * drv, void * rddir_p, char * fn); - lv_fs_res_t (*dir_close_cb)(struct _lv_fs_drv_t * drv, void * rddir_p); - -#if LV_USE_USER_DATA - lv_fs_drv_user_data_t user_data; /**< Custom file user data */ -#endif -} lv_fs_drv_t; - -typedef struct -{ - void * file_d; - lv_fs_drv_t * drv; -} lv_fs_file_t; - -typedef struct -{ - void * dir_d; - lv_fs_drv_t * drv; -} lv_fs_dir_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the File system interface - */ -void lv_fs_init(void); - -/** - * Initialize a file system driver with default values. - * It is used to surly have known values in the fields ant not memory junk. - * After it you can set the fields. - * @param drv pointer to driver variable to initialize - */ -void lv_fs_drv_init(lv_fs_drv_t * drv); - -/** - * Add a new drive - * @param drv_p pointer to an lv_fs_drv_t structure which is inited with the - * corresponding function pointers. The data will be copied so the variable can be local. - */ -void lv_fs_drv_register(lv_fs_drv_t * drv_p); - -/** - * Give a pointer to a driver from its letter - * @param letter the driver letter - * @return pointer to a driver or NULL if not found - */ -lv_fs_drv_t * lv_fs_get_drv(char letter); - -/** - * Test if a drive is rady or not. If the `ready` function was not initialized `true` will be - * returned. - * @param letter letter of the drive - * @return true: drive is ready; false: drive is not ready - */ -bool lv_fs_is_ready(char letter); - -/** - * Open a file - * @param file_p pointer to a lv_fs_file_t variable - * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt) - * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_open(lv_fs_file_t * file_p, const char * path, lv_fs_mode_t mode); - -/** - * Close an already opened file - * @param file_p pointer to a lv_fs_file_t variable - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_close(lv_fs_file_t * file_p); - -/** - * Delete a file - * @param path path of the file to delete - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_remove(const char * path); - -/** - * Read from a file - * @param file_p pointer to a lv_fs_file_t variable - * @param buf pointer to a buffer where the read bytes are stored - * @param btr Bytes To Read - * @param br the number of real read bytes (Bytes Read). NULL if unused. - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_read(lv_fs_file_t * file_p, void * buf, uint32_t btr, uint32_t * br); - -/** - * Write into a file - * @param file_p pointer to a lv_fs_file_t variable - * @param buf pointer to a buffer with the bytes to write - * @param btr Bytes To Write - * @param br the number of real written bytes (Bytes Written). NULL if unused. - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_write(lv_fs_file_t * file_p, const void * buf, uint32_t btw, uint32_t * bw); - -/** - * Set the position of the 'cursor' (read write pointer) in a file - * @param file_p pointer to a lv_fs_file_t variable - * @param pos the new position expressed in bytes index (0: start of file) - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_seek(lv_fs_file_t * file_p, uint32_t pos); - -/** - * Give the position of the read write pointer - * @param file_p pointer to a lv_fs_file_t variable - * @param pos_p pointer to store the position of the read write pointer - * @return LV_FS_RES_OK or any error from 'fs_res_t' - */ -lv_fs_res_t lv_fs_tell(lv_fs_file_t * file_p, uint32_t * pos); - -/** - * Truncate the file size to the current position of the read write pointer - * @param file_p pointer to an 'ufs_file_t' variable. (opened with lv_fs_open ) - * @return LV_FS_RES_OK: no error, the file is read - * any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_trunc(lv_fs_file_t * file_p); - -/** - * Give the size of a file bytes - * @param file_p pointer to a lv_fs_file_t variable - * @param size pointer to a variable to store the size - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_size(lv_fs_file_t * file_p, uint32_t * size); - -/** - * Rename a file - * @param oldname path to the file - * @param newname path with the new name - * @return LV_FS_RES_OK or any error from 'fs_res_t' - */ -lv_fs_res_t lv_fs_rename(const char * oldname, const char * newname); - -/** - * Initialize a 'fs_dir_t' variable for directory reading - * @param rddir_p pointer to a 'fs_read_dir_t' variable - * @param path path to a directory - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_dir_open(lv_fs_dir_t * rddir_p, const char * path); - -/** - * Read the next filename form a directory. - * The name of the directories will begin with '/' - * @param rddir_p pointer to an initialized 'fs_rdir_t' variable - * @param fn pointer to a buffer to store the filename - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_dir_read(lv_fs_dir_t * rddir_p, char * fn); - -/** - * Close the directory reading - * @param rddir_p pointer to an initialized 'fs_dir_t' variable - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_dir_close(lv_fs_dir_t * rddir_p); - -/** - * Get the free and total size of a driver in kB - * @param letter the driver letter - * @param total_p pointer to store the total size [kB] - * @param free_p pointer to store the free size [kB] - * @return LV_FS_RES_OK or any error from lv_fs_res_t enum - */ -lv_fs_res_t lv_fs_free_space(char letter, uint32_t * total_p, uint32_t * free_p); - -/** - * Fill a buffer with the letters of existing drivers - * @param buf buffer to store the letters ('\0' added after the last letter) - * @return the buffer - */ -char * lv_fs_get_letters(char * buf); - -/** - * Return with the extension of the filename - * @param fn string with a filename - * @return pointer to the beginning extension or empty string if no extension - */ -const char * lv_fs_get_ext(const char * fn); - -/** - * Step up one level - * @param path pointer to a file name - * @return the truncated file name - */ -char * lv_fs_up(char * path); - -/** - * Get the last element of a path (e.g. U:/folder/file -> file) - * @param buf buffer to store the letters ('\0' added after the last letter) - * @return pointer to the beginning of the last element in the path - */ -const char * lv_fs_get_last(const char * path); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_FILESYSTEM*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_FS_H*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_gc.c b/src/libs/lvgl/src/lv_misc/lv_gc.c deleted file mode 100644 index 94bf532a..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_gc.c +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @file lv_gc.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_gc.h" -#include "string.h" - -#if defined(LV_GC_INCLUDE) -#include LV_GC_INCLUDE -#endif /* LV_ENABLE_GC */ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -#if(!defined(LV_ENABLE_GC)) || LV_ENABLE_GC == 0 -LV_ROOTS -#endif /* LV_ENABLE_GC */ -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -void lv_gc_clear_roots(void) -{ -#define LV_CLEAR_ROOT(root_type, root_name) memset(&LV_GC_ROOT(root_name), 0, sizeof(LV_GC_ROOT(root_name))); - LV_ITERATE_ROOTS(LV_CLEAR_ROOT) -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/libs/lvgl/src/lv_misc/lv_gc.h b/src/libs/lvgl/src/lv_misc/lv_gc.h deleted file mode 100644 index afd4d600..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_gc.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @file lv_gc.h - * - */ - -#ifndef LV_GC_H -#define LV_GC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include <stdint.h> -#include <stdbool.h> -#include "lv_mem.h" -#include "lv_ll.h" -#include "../lv_draw/lv_img_cache.h" - -/********************* - * DEFINES - *********************/ - -#define LV_ITERATE_ROOTS(f) \ - f(lv_ll_t, _lv_task_ll) /*Linked list to store the lv_tasks*/ \ - f(lv_ll_t, _lv_disp_ll) /*Linked list of screens*/ \ - f(lv_ll_t, _lv_indev_ll) /*Linked list of screens*/ \ - f(lv_ll_t, _lv_drv_ll) \ - f(lv_ll_t, _lv_file_ll) \ - f(lv_ll_t, _lv_anim_ll) \ - f(lv_ll_t, _lv_group_ll) \ - f(lv_ll_t, _lv_img_defoder_ll) \ - f(lv_img_cache_entry_t*, _lv_img_cache_array) \ - f(void*, _lv_task_act) \ - f(void*, _lv_draw_buf) - -#define LV_DEFINE_ROOT(root_type, root_name) root_type root_name; -#define LV_ROOTS LV_ITERATE_ROOTS(LV_DEFINE_ROOT) - -#if LV_ENABLE_GC == 1 -#if LV_MEM_CUSTOM != 1 -#error "GC requires CUSTOM_MEM" -#endif /* LV_MEM_CUSTOM */ -#else /* LV_ENABLE_GC */ -#define LV_GC_ROOT(x) x -#define LV_EXTERN_ROOT(root_type, root_name) extern root_type root_name; -LV_ITERATE_ROOTS(LV_EXTERN_ROOT) -#endif /* LV_ENABLE_GC */ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_gc_clear_roots(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_GC_H*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_ll.c b/src/libs/lvgl/src/lv_misc/lv_ll.c deleted file mode 100644 index 99526659..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_ll.c +++ /dev/null @@ -1,422 +0,0 @@ -/** - * @file lv_ll.c - * Handle linked lists. - * The nodes are dynamically allocated by the 'lv_mem' module, - */ - -/********************* - * INCLUDES - *********************/ -#include <stdint.h> -#include <string.h> - -#include "lv_ll.h" -#include "lv_mem.h" - -/********************* - * DEFINES - *********************/ -#define LL_NODE_META_SIZE (sizeof(lv_ll_node_t *) + sizeof(lv_ll_node_t *)) -#define LL_PREV_P_OFFSET(ll_p) (ll_p->n_size) -#define LL_NEXT_P_OFFSET(ll_p) (ll_p->n_size + sizeof(lv_ll_node_t *)) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * prev); -static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * next); - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize linked list - * @param ll_dsc pointer to ll_dsc variable - * @param node_size the size of 1 node in bytes - */ -void lv_ll_init(lv_ll_t * ll_p, uint32_t node_size) -{ - ll_p->head = NULL; - ll_p->tail = NULL; -#ifdef LV_MEM_ENV64 - /*Round the size up to 8*/ - if(node_size & 0x7) { - node_size = node_size & (~0x7); - node_size += 8; - } -#else - /*Round the size up to 4*/ - if(node_size & 0x3) { - node_size = node_size & (~0x3); - node_size += 4; - } -#endif - - ll_p->n_size = node_size; -} - -/** - * Add a new head to a linked list - * @param ll_p pointer to linked list - * @return pointer to the new head - */ -void * lv_ll_ins_head(lv_ll_t * ll_p) -{ - lv_ll_node_t * n_new; - - n_new = lv_mem_alloc(ll_p->n_size + LL_NODE_META_SIZE); - - if(n_new != NULL) { - node_set_prev(ll_p, n_new, NULL); /*No prev. before the new head*/ - node_set_next(ll_p, n_new, ll_p->head); /*After new comes the old head*/ - - if(ll_p->head != NULL) { /*If there is old head then before it goes the new*/ - node_set_prev(ll_p, ll_p->head, n_new); - } - - ll_p->head = n_new; /*Set the new head in the dsc.*/ - if(ll_p->tail == NULL) { /*If there is no tail (1. node) set the tail too*/ - ll_p->tail = n_new; - } - } - - return n_new; -} - -/** - * Insert a new node in front of the n_act node - * @param ll_p pointer to linked list - * @param n_act pointer a node - * @return pointer to the new head - */ -void * lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act) -{ - lv_ll_node_t * n_new; - lv_ll_node_t * n_prev; - - if(NULL == ll_p || NULL == n_act) return NULL; - - if(lv_ll_get_head(ll_p) == n_act) { - n_new = lv_ll_ins_head(ll_p); - if(n_new == NULL) return NULL; - } else { - n_new = lv_mem_alloc(ll_p->n_size + LL_NODE_META_SIZE); - if(n_new == NULL) return NULL; - - n_prev = lv_ll_get_prev(ll_p, n_act); - node_set_next(ll_p, n_prev, n_new); - node_set_prev(ll_p, n_new, n_prev); - node_set_prev(ll_p, n_act, n_new); - node_set_next(ll_p, n_new, n_act); - } - - return n_new; -} - -/** - * Add a new tail to a linked list - * @param ll_p pointer to linked list - * @return pointer to the new tail - */ -void * lv_ll_ins_tail(lv_ll_t * ll_p) -{ - lv_ll_node_t * n_new; - - n_new = lv_mem_alloc(ll_p->n_size + LL_NODE_META_SIZE); - if(n_new == NULL) return NULL; - - if(n_new != NULL) { - node_set_next(ll_p, n_new, NULL); /*No next after the new tail*/ - node_set_prev(ll_p, n_new, ll_p->tail); /*The prev. before new is tho old tail*/ - if(ll_p->tail != NULL) { /*If there is old tail then the new comes after it*/ - node_set_next(ll_p, ll_p->tail, n_new); - } - - ll_p->tail = n_new; /*Set the new tail in the dsc.*/ - if(ll_p->head == NULL) { /*If there is no head (1. node) set the head too*/ - ll_p->head = n_new; - } - } - - return n_new; -} - -/** - * Remove the node 'node_p' from 'll_p' linked list. - * It does not free the the memory of node. - * @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) -{ - if(lv_ll_get_head(ll_p) == node_p) { - /*The new head will be the node after 'n_act'*/ - ll_p->head = lv_ll_get_next(ll_p, node_p); - if(ll_p->head == NULL) { - ll_p->tail = NULL; - } else { - node_set_prev(ll_p, ll_p->head, NULL); - } - } else if(lv_ll_get_tail(ll_p) == node_p) { - /*The new tail will be the node before 'n_act'*/ - ll_p->tail = lv_ll_get_prev(ll_p, node_p); - if(ll_p->tail == NULL) { - ll_p->head = NULL; - } else { - node_set_next(ll_p, ll_p->tail, NULL); - } - } else { - lv_ll_node_t * n_prev = lv_ll_get_prev(ll_p, node_p); - lv_ll_node_t * n_next = lv_ll_get_next(ll_p, node_p); - - node_set_next(ll_p, n_prev, n_next); - node_set_prev(ll_p, n_next, n_prev); - } -} - -/** - * Remove and free all elements from a linked list. The list remain valid but become empty. - * @param ll_p pointer to linked list - */ -void lv_ll_clear(lv_ll_t * ll_p) -{ - void * i; - void * i_next; - - i = lv_ll_get_head(ll_p); - i_next = NULL; - - while(i != NULL) { - i_next = lv_ll_get_next(ll_p, i); - - lv_ll_rem(ll_p, i); - lv_mem_free(i); - - i = i_next; - } -} - -/** - * Move a node to a new linked list - * @param ll_ori_p pointer to the original (old) linked list - * @param ll_new_p pointer to the new linked list - * @param node pointer to a node - * @param head true: be the head in the new list - * false be the head in the new list - */ -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); - - if(head) { - /*Set node as head*/ - node_set_prev(ll_new_p, node, NULL); - node_set_next(ll_new_p, node, ll_new_p->head); - - if(ll_new_p->head != NULL) { /*If there is old head then before it goes the new*/ - node_set_prev(ll_new_p, ll_new_p->head, node); - } - - ll_new_p->head = node; /*Set the new head in the dsc.*/ - if(ll_new_p->tail == NULL) { /*If there is no tail (first node) set the tail too*/ - ll_new_p->tail = node; - } - } else { - /*Set node as tail*/ - node_set_prev(ll_new_p, node, ll_new_p->tail); - node_set_next(ll_new_p, node, NULL); - - if(ll_new_p->tail != NULL) { /*If there is old tail then after it goes the new*/ - node_set_next(ll_new_p, ll_new_p->tail, node); - } - - ll_new_p->tail = node; /*Set the new tail in the dsc.*/ - if(ll_new_p->head == NULL) { /*If there is no head (first node) set the head too*/ - ll_new_p->head = node; - } - } -} - -/** - * Return with head node of the linked list - * @param ll_p pointer to linked list - * @return pointer to the head of 'll_p' - */ -void * lv_ll_get_head(const lv_ll_t * ll_p) -{ - void * head = NULL; - - if(ll_p != NULL) { - head = ll_p->head; - } - - return head; -} - -/** - * Return with tail node of the linked list - * @param ll_p pointer to linked list - * @return pointer to the head of 'll_p' - */ -void * lv_ll_get_tail(const lv_ll_t * ll_p) -{ - void * tail = NULL; - - if(ll_p != NULL) { - tail = ll_p->tail; - } - - return tail; -} - -/** - * Return with the pointer of the next node after 'n_act' - * @param ll_p pointer to linked list - * @param n_act pointer a node - * @return pointer to the next node - */ -void * lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act) -{ - void * next = NULL; - - if(ll_p != NULL) { - const lv_ll_node_t * n_act_d = n_act; - memcpy(&next, n_act_d + LL_NEXT_P_OFFSET(ll_p), sizeof(void *)); - } - - return next; -} - -/** - * Return with the pointer of the previous node after 'n_act' - * @param ll_p pointer to linked list - * @param n_act pointer a node - * @return pointer to the previous node - */ -void * lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act) -{ - void * prev = NULL; - - if(ll_p != NULL) { - const lv_ll_node_t * n_act_d = n_act; - memcpy(&prev, n_act_d + LL_PREV_P_OFFSET(ll_p), sizeof(void *)); - } - - return prev; -} - -/** - * Return the length of the linked list. - * @param ll_p pointer to linked list - * @return length of the linked list - */ -uint32_t lv_ll_get_len(const lv_ll_t * ll_p) -{ - uint32_t len = 0; - void * node; - - for(node = lv_ll_get_head(ll_p); node != NULL; node = lv_ll_get_next(ll_p, node)) { - len++; - } - - return len; -} - -/** - * Move a nodw before an other node in the same linked list - * @param ll_p pointer to a linked list - * @param n_act pointer to node to move - * @param n_after pointer to a node which should be after `n_act` - */ -void lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after) -{ - if(n_act == n_after) return; /*Can't move before itself*/ - - void * n_before; - if(n_after != NULL) - n_before = lv_ll_get_prev(ll_p, n_after); - else - n_before = lv_ll_get_tail(ll_p); /*if `n_after` is NULL `n_act` should be the new tail*/ - - 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); - - /*Add again by setting the prev. and next nodes*/ - node_set_next(ll_p, n_before, n_act); - node_set_prev(ll_p, n_act, n_before); - node_set_prev(ll_p, n_after, n_act); - node_set_next(ll_p, n_act, n_after); - - /*If `n_act` was moved before NULL then it become the new tail*/ - if(n_after == NULL) ll_p->tail = n_act; - - /*If `n_act` was moved before `NULL` then it's the new head*/ - if(n_before == NULL) ll_p->head = n_act; -} - -/** - * Check if a linked list is empty - * @param ll_p pointer to a linked list - * @return true: the linked list is empty; false: not empty - */ -bool lv_ll_is_empty(lv_ll_t * ll_p) -{ - if(ll_p == NULL) return true; - - if(ll_p->head == NULL && ll_p->tail == NULL) return true; - - return false; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Set the 'pervious node pointer' of a node - * @param ll_p pointer to linked list - * @param act pointer to a node which prev. node pointer should be set - * @param prev pointer to a node which should be the previous node before 'act' - */ -static void node_set_prev(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * prev) -{ - if(act == NULL) return; /*Can't set the prev node of `NULL`*/ - - uint32_t node_p_size = sizeof(lv_ll_node_t *); - if(prev) - memcpy(act + LL_PREV_P_OFFSET(ll_p), &prev, node_p_size); - else - memset(act + LL_PREV_P_OFFSET(ll_p), 0, node_p_size); -} - -/** - * Set the 'next node pointer' of a node - * @param ll_p pointer to linked list - * @param act pointer to a node which next node pointer should be set - * @param next pointer to a node which should be the next node before 'act' - */ -static void node_set_next(lv_ll_t * ll_p, lv_ll_node_t * act, lv_ll_node_t * next) -{ - if(act == NULL) return; /*Can't set the next node of `NULL`*/ - - uint32_t node_p_size = sizeof(lv_ll_node_t *); - if(next) - memcpy(act + LL_NEXT_P_OFFSET(ll_p), &next, node_p_size); - else - memset(act + LL_NEXT_P_OFFSET(ll_p), 0, node_p_size); -} diff --git a/src/libs/lvgl/src/lv_misc/lv_ll.h b/src/libs/lvgl/src/lv_misc/lv_ll.h deleted file mode 100644 index 2c02eb48..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_ll.h +++ /dev/null @@ -1,160 +0,0 @@ -/** - * @file lv_ll.c - * Handle linked lists. The nodes are dynamically allocated by the 'lv_mem' module. - */ - -#ifndef LV_LL_H -#define LV_LL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include "lv_mem.h" -#include <stdint.h> -#include <stddef.h> -#include <stdbool.h> - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Dummy type to make handling easier*/ -typedef uint8_t lv_ll_node_t; - -/** Description of a linked list*/ -typedef struct -{ - uint32_t n_size; - lv_ll_node_t * head; - lv_ll_node_t * tail; -} lv_ll_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize linked list - * @param ll_dsc pointer to ll_dsc variable - * @param node_size the size of 1 node in bytes - */ -void lv_ll_init(lv_ll_t * ll_p, uint32_t node_size); - -/** - * Add a new head to a linked list - * @param ll_p pointer to linked list - * @return pointer to the new head - */ -void * lv_ll_ins_head(lv_ll_t * ll_p); - -/** - * Insert a new node in front of the n_act node - * @param ll_p pointer to linked list - * @param n_act pointer a node - * @return pointer to the new head - */ -void * lv_ll_ins_prev(lv_ll_t * ll_p, void * n_act); - -/** - * Add a new tail to a linked list - * @param ll_p pointer to linked list - * @return pointer to the new tail - */ -void * lv_ll_ins_tail(lv_ll_t * ll_p); - -/** - * Remove the node 'node_p' from 'll_p' linked list. - * It does not free the the memory of node. - * @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); - -/** - * Remove and free all elements from a linked list. The list remain valid but become empty. - * @param ll_p pointer to linked list - */ -void lv_ll_clear(lv_ll_t * ll_p); - -/** - * Move a node to a new linked list - * @param ll_ori_p pointer to the original (old) linked list - * @param ll_new_p pointer to the new linked list - * @param node pointer to a node - * @param head true: be the head in the new list - * false be the head in the new list - */ -void lv_ll_chg_list(lv_ll_t * ll_ori_p, lv_ll_t * ll_new_p, void * node, bool head); - -/** - * Return with head node of the linked list - * @param ll_p pointer to linked list - * @return pointer to the head of 'll_p' - */ -void * lv_ll_get_head(const lv_ll_t * ll_p); - -/** - * Return with tail node of the linked list - * @param ll_p pointer to linked list - * @return pointer to the head of 'll_p' - */ -void * lv_ll_get_tail(const lv_ll_t * ll_p); - -/** - * Return with the pointer of the next node after 'n_act' - * @param ll_p pointer to linked list - * @param n_act pointer a node - * @return pointer to the next node - */ -void * lv_ll_get_next(const lv_ll_t * ll_p, const void * n_act); - -/** - * Return with the pointer of the previous node after 'n_act' - * @param ll_p pointer to linked list - * @param n_act pointer a node - * @return pointer to the previous node - */ -void * lv_ll_get_prev(const lv_ll_t * ll_p, const void * n_act); - -/** - * Return the length of the linked list. - * @param ll_p pointer to linked list - * @return length of the linked list - */ -uint32_t lv_ll_get_len(const lv_ll_t * ll_p); - -/** - * Move a nodw before an other node in the same linked list - * @param ll_p pointer to a linked list - * @param n_act pointer to node to move - * @param n_after pointer to a node which should be after `n_act` - */ -void lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after); - -/** - * Check if a linked list is empty - * @param ll_p pointer to a linked list - * @return true: the linked list is empty; false: not empty - */ -bool lv_ll_is_empty(lv_ll_t * ll_p); -/********************** - * MACROS - **********************/ - -#define LV_LL_READ(list, i) for(i = lv_ll_get_head(&list); i != NULL; i = lv_ll_get_next(&list, i)) - -#define LV_LL_READ_BACK(list, i) for(i = lv_ll_get_tail(&list); i != NULL; i = lv_ll_get_prev(&list, i)) - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/src/libs/lvgl/src/lv_misc/lv_log.c b/src/libs/lvgl/src/lv_misc/lv_log.c deleted file mode 100644 index acbdfb73..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_log.c +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @file lv_log.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_log.h" -#if LV_USE_LOG - -#if LV_LOG_PRINTF -#include <stdio.h> -#endif - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static lv_log_print_g_cb_t custom_print_cb; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Register custom print/write function to call when a log is added. - * It can format its "File path", "Line number" and "Description" as required - * and send the formatted log message to a consol or serial port. - * @param print_cb a function pointer to print a log - */ -void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb) -{ - custom_print_cb = print_cb; -} - -/** - * Add a log - * @param level the level of log. (From `lv_log_level_t` enum) - * @param file name of the file when the log added - * @param line line number in the source code where the log added - * @param dsc description of the log - */ -void lv_log_add(lv_log_level_t level, const char * file, int line, const char * dsc) -{ - if(level >= _LV_LOG_LEVEL_NUM) return; /*Invalid level*/ - - if(level >= LV_LOG_LEVEL) { - -#if LV_LOG_PRINTF - static const char * lvl_prefix[] = {"Trace", "Info", "Warn", "Error"}; - printf("%s: %s \t(%s #%d)\n", lvl_prefix[level], dsc, file, line); -#else - if(custom_print_cb) custom_print_cb(level, file, line, dsc); -#endif - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*LV_USE_LOG*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_log.h b/src/libs/lvgl/src/lv_misc/lv_log.h deleted file mode 100644 index 62c613b4..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_log.h +++ /dev/null @@ -1,144 +0,0 @@ -/** - * @file lv_log.h - * - */ - -#ifndef LV_LOG_H -#define LV_LOG_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif -#include <stdint.h> - -/********************* - * DEFINES - *********************/ - -/*Possible log level. For compatibility declare it independently from `LV_USE_LOG`*/ - -#define LV_LOG_LEVEL_TRACE 0 /**< A lot of logs to give detailed information*/ -#define LV_LOG_LEVEL_INFO 1 /**< Log important events*/ -#define LV_LOG_LEVEL_WARN 2 /**< Log if something unwanted happened but didn't caused problem*/ -#define LV_LOG_LEVEL_ERROR 3 /**< Only critical issue, when the system may fail*/ -#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 -/********************** - * TYPEDEFS - **********************/ - -/** - * Log print function. Receives "Log Level", "File path", "Line number" and "Description". - */ -typedef void (*lv_log_print_g_cb_t)(lv_log_level_t level, const char *, uint32_t, const char *); - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Register custom print/write function to call when a log is added. - * It can format its "File path", "Line number" and "Description" as required - * and send the formatted log message to a consol or serial port. - * @param print_cb a function pointer to print a log - */ -void lv_log_register_print_cb(lv_log_print_g_cb_t print_cb); - -/** - * Add a log - * @param level the level of log. (From `lv_log_level_t` enum) - * @param file name of the file when the log added - * @param line line number in the source code where the log added - * @param dsc description of the log - */ -void lv_log_add(lv_log_level_t level, const char * file, int line, const char * dsc); - -/********************** - * MACROS - **********************/ - -#if LV_LOG_LEVEL <= LV_LOG_LEVEL_TRACE -#define LV_LOG_TRACE(dsc) lv_log_add(LV_LOG_LEVEL_TRACE, __FILE__, __LINE__, dsc); -#else -#define LV_LOG_TRACE(dsc) \ - { \ - ; \ - } -#endif - -#if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO -#define LV_LOG_INFO(dsc) lv_log_add(LV_LOG_LEVEL_INFO, __FILE__, __LINE__, dsc); -#else -#define LV_LOG_INFO(dsc) \ - { \ - ; \ - } -#endif - -#if LV_LOG_LEVEL <= LV_LOG_LEVEL_WARN -#define LV_LOG_WARN(dsc) lv_log_add(LV_LOG_LEVEL_WARN, __FILE__, __LINE__, dsc); -#else -#define LV_LOG_WARN(dsc) \ - { \ - ; \ - } -#endif - -#if LV_LOG_LEVEL <= LV_LOG_LEVEL_ERROR -#define LV_LOG_ERROR(dsc) lv_log_add(LV_LOG_LEVEL_ERROR, __FILE__, __LINE__, dsc); -#else -#define LV_LOG_ERROR(dsc) \ - { \ - ; \ - } -#endif - -#else /*LV_USE_LOG*/ - -/*Do nothing if `LV_USE_LOG 0`*/ -#define lv_log_add(level, file, line, dsc) \ - { \ - ; \ - } -#define LV_LOG_TRACE(dsc) \ - { \ - ; \ - } -#define LV_LOG_INFO(dsc) \ - { \ - ; \ - } -#define LV_LOG_WARN(dsc) \ - { \ - ; \ - } -#define LV_LOG_ERROR(dsc) \ - { \ - ; \ - } -#endif /*LV_USE_LOG*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_LOG_H*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_math.c b/src/libs/lvgl/src/lv_misc/lv_math.c deleted file mode 100644 index f015456e..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_math.c +++ /dev/null @@ -1,203 +0,0 @@ -/** - * @file lv_math.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_math.h" -#include <stdbool.h> -#include <stdlib.h> - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static const int16_t sin0_90_table[] = { - 0, 572, 1144, 1715, 2286, 2856, 3425, 3993, 4560, 5126, 5690, 6252, 6813, 7371, 7927, 8481, - 9032, 9580, 10126, 10668, 11207, 11743, 12275, 12803, 13328, 13848, 14364, 14876, 15383, 15886, 16383, 16876, - 17364, 17846, 18323, 18794, 19260, 19720, 20173, 20621, 21062, 21497, 21925, 22347, 22762, 23170, 23571, 23964, - 24351, 24730, 25101, 25465, 25821, 26169, 26509, 26841, 27165, 27481, 27788, 28087, 28377, 28659, 28932, 29196, - 29451, 29697, 29934, 30162, 30381, 30591, 30791, 30982, 31163, 31335, 31498, 31650, 31794, 31927, 32051, 32165, - 32269, 32364, 32448, 32523, 32587, 32642, 32687, 32722, 32747, 32762, 32767}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Return with sinus of an angle - * @param angle - * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767 - */ -int16_t lv_trigo_sin(int16_t angle) -{ - int16_t ret = 0; - angle = angle % 360; - - if(angle < 0) angle = 360 + angle; - - if(angle < 90) { - ret = sin0_90_table[angle]; - } else if(angle >= 90 && angle < 180) { - angle = 180 - angle; - ret = sin0_90_table[angle]; - } else if(angle >= 180 && angle < 270) { - angle = angle - 180; - ret = -sin0_90_table[angle]; - } else { /*angle >=270*/ - angle = 360 - angle; - ret = -sin0_90_table[angle]; - } - - return ret; -} - -/** - * Calculate a value of a Cubic Bezier function. - * @param t time in range of [0..LV_BEZIER_VAL_MAX] - * @param u0 start values in range of [0..LV_BEZIER_VAL_MAX] - * @param u1 control value 1 values in range of [0..LV_BEZIER_VAL_MAX] - * @param u2 control value 2 in range of [0..LV_BEZIER_VAL_MAX] - * @param u3 end values in range of [0..LV_BEZIER_VAL_MAX] - * @return the value calculated from the given parameters in range of [0..LV_BEZIER_VAL_MAX] - */ -int32_t lv_bezier3(uint32_t t, int32_t u0, int32_t u1, int32_t u2, int32_t u3) -{ - uint32_t t_rem = 1024 - t; - uint32_t t_rem2 = (t_rem * t_rem) >> 10; - uint32_t t_rem3 = (t_rem2 * t_rem) >> 10; - uint32_t t2 = (t * t) >> 10; - uint32_t t3 = (t2 * t) >> 10; - - uint32_t v1 = ((uint32_t)t_rem3 * u0) >> 10; - uint32_t v2 = ((uint32_t)3 * t_rem2 * t * u1) >> 20; - uint32_t v3 = ((uint32_t)3 * t_rem * t2 * u2) >> 20; - uint32_t v4 = ((uint32_t)t3 * u3) >> 10; - - return v1 + v2 + v3 + v4; -} - -/** - * 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; -} - -/** - * Calculate the integer square root of a number. - * @param num - * @return square root of 'num' - */ -uint32_t lv_sqrt(uint32_t num) -{ - // http://www.codecodex.com/wiki/Calculate_an_integer_square_root#C - uint32_t root = 0; - uint32_t place = 0x40000000; - - while(place > num) place >>= 2; - while(place) { - if(num >= root + place) { - num -= root + place; - root += (place << 1); - } - root >>= 1; - place >>= 2; - } - return root; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/libs/lvgl/src/lv_misc/lv_math.h b/src/libs/lvgl/src/lv_misc/lv_math.h deleted file mode 100644 index 0f93a7c6..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_math.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * @file math_base.h - * - */ - -#ifndef LV_MATH_H -#define LV_MATH_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include <stdint.h> - -/********************* - * DEFINES - *********************/ -#define LV_MATH_MIN(a, b) ((a) < (b) ? (a) : (b)) -#define LV_MATH_MAX(a, b) ((a) > (b) ? (a) : (b)) -#define LV_MATH_ABS(x) ((x) > 0 ? (x) : (-(x))) - -#define LV_IS_SIGNED(t) (((t)(-1)) < ((t) 0)) -#define LV_UMAX_OF(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | (0xFULL << ((sizeof(t) * 8ULL) - 4ULL))) -#define LV_SMAX_OF(t) (((0x1ULL << ((sizeof(t) * 8ULL) - 1ULL)) - 1ULL) | (0x7ULL << ((sizeof(t) * 8ULL) - 4ULL))) -#define LV_MAX_OF(t) ((unsigned long) (LV_IS_SIGNED(t) ? LV_SMAX_OF(t) : LV_UMAX_OF(t))) - -#define LV_TRIGO_SIN_MAX 32767 -#define LV_TRIGO_SHIFT 15 /**< >> LV_TRIGO_SHIFT to normalize*/ - -#define LV_BEZIER_VAL_MAX 1024 /**< Max time in Bezier functions (not [0..1] to use integers) */ -#define LV_BEZIER_VAL_SHIFT 10 /**< log2(LV_BEZIER_VAL_MAX): used to normalize up scaled values*/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Return with sinus of an angle - * @param angle - * @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767 - */ -int16_t lv_trigo_sin(int16_t angle); - -/** - * Calculate a value of a Cubic Bezier function. - * @param t time in range of [0..LV_BEZIER_VAL_MAX] - * @param u0 start values in range of [0..LV_BEZIER_VAL_MAX] - * @param u1 control value 1 values in range of [0..LV_BEZIER_VAL_MAX] - * @param u2 control value 2 in range of [0..LV_BEZIER_VAL_MAX] - * @param u3 end values in range of [0..LV_BEZIER_VAL_MAX] - * @return the value calculated from the given parameters in range of [0..LV_BEZIER_VAL_MAX] - */ -int32_t lv_bezier3(uint32_t t, int32_t u0, int32_t u1, int32_t u2, int32_t u3); - -/** - * 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); - -/** - * Calculate the integer square root of a number. - * @param num - * @return square root of 'num' - */ -uint32_t lv_sqrt(uint32_t num); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/src/libs/lvgl/src/lv_misc/lv_mem.c b/src/libs/lvgl/src/lv_misc/lv_mem.c deleted file mode 100644 index 9e18310f..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_mem.c +++ /dev/null @@ -1,481 +0,0 @@ -/** - * @file lv_mem.c - * General and portable implementation of malloc and free. - * The dynamic memory monitoring is also supported. - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_mem.h" -#include "lv_math.h" -#include <string.h> - -#if LV_MEM_CUSTOM != 0 -#include LV_MEM_CUSTOM_INCLUDE -#endif - -/********************* - * DEFINES - *********************/ -/*Add memory junk on alloc (0xaa) and free(0xbb) (just for testing purposes)*/ -#ifndef LV_MEM_ADD_JUNK -#define LV_MEM_ADD_JUNK 0 -#endif - -#ifdef LV_ARCH_64 -#define MEM_UNIT uint64_t -#else -#define MEM_UNIT uint32_t -#endif - -/********************** - * TYPEDEFS - **********************/ - -#if LV_ENABLE_GC == 0 /*gc custom allocations must not include header*/ - -/*The size of this union must be 4 bytes (uint32_t)*/ -typedef union -{ - struct - { - MEM_UNIT used : 1; /* 1: if the entry is used*/ - MEM_UNIT d_size : 31; /* Size off the data (1 means 4 bytes)*/ - } s; - MEM_UNIT header; /* The header (used + d_size)*/ -} lv_mem_header_t; - -typedef struct -{ - lv_mem_header_t header; - uint8_t first_data; /*First data byte in the allocated data (Just for easily create a pointer)*/ -} lv_mem_ent_t; - -#endif /* LV_ENABLE_GC */ - -/********************** - * STATIC PROTOTYPES - **********************/ -#if LV_MEM_CUSTOM == 0 -static lv_mem_ent_t * ent_get_next(lv_mem_ent_t * act_e); -static void * ent_alloc(lv_mem_ent_t * e, size_t size); -static void ent_trunc(lv_mem_ent_t * e, size_t size); -#endif - -/********************** - * STATIC VARIABLES - **********************/ -#if LV_MEM_CUSTOM == 0 -static uint8_t * work_mem; -#endif - -static uint32_t zero_mem; /*Give the address of this variable if 0 byte should be allocated*/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initiaiize the dyn_mem module (work memory and other variables) - */ -void lv_mem_init(void) -{ -#if LV_MEM_CUSTOM == 0 - -#if LV_MEM_ADR == 0 - /*Allocate a large array to store the dynamically allocated data*/ - static LV_MEM_ATTR MEM_UNIT work_mem_int[LV_MEM_SIZE / sizeof(MEM_UNIT)]; - work_mem = (uint8_t *)work_mem_int; -#else - work_mem = (uint8_t *)LV_MEM_ADR; -#endif - - lv_mem_ent_t * full = (lv_mem_ent_t *)work_mem; - full->header.s.used = 0; - /*The total mem size id reduced by the first header and the close patterns */ - full->header.s.d_size = LV_MEM_SIZE - sizeof(lv_mem_header_t); -#endif -} - -/** - * Clean up the memory buffer which frees all the allocated memories. - * @note It work only if `LV_MEM_CUSTOM == 0` - */ -void lv_mem_deinit(void) -{ -#if LV_MEM_CUSTOM == 0 - memset(work_mem, 0x00, (LV_MEM_SIZE / sizeof(MEM_UNIT)) * sizeof(MEM_UNIT)); - lv_mem_ent_t * full = (lv_mem_ent_t *)work_mem; - full->header.s.used = 0; - /*The total mem size id reduced by the first header and the close patterns */ - full->header.s.d_size = LV_MEM_SIZE - sizeof(lv_mem_header_t); -#endif -} - -/** - * Allocate a memory dynamically - * @param size size of the memory to allocate in bytes - * @return pointer to the allocated memory - */ -void * lv_mem_alloc(size_t size) -{ - if(size == 0) { - return &zero_mem; - } - -#ifdef LV_ARCH_64 - /*Round the size up to 8*/ - if(size & 0x7) { - size = size & (~0x7); - size += 8; - } -#else - /*Round the size up to 4*/ - if(size & 0x3) { - size = size & (~0x3); - size += 4; - } -#endif - void * alloc = NULL; - -#if LV_MEM_CUSTOM == 0 - /*Use the built-in allocators*/ - lv_mem_ent_t * e = NULL; - - /* Search for a appropriate entry*/ - do { - /* Get the next entry*/ - e = ent_get_next(e); - - /*If there is next entry then try to allocate there*/ - if(e != NULL) { - alloc = ent_alloc(e, size); - } - /* End if there is not next entry OR the alloc. is successful*/ - } while(e != NULL && alloc == NULL); - -#else -/*Use custom, user defined malloc function*/ -#if LV_ENABLE_GC == 1 /*gc must not include header*/ - alloc = LV_MEM_CUSTOM_ALLOC(size); -#else /* LV_ENABLE_GC */ - /*Allocate a header too to store the size*/ - alloc = LV_MEM_CUSTOM_ALLOC(size + sizeof(lv_mem_header_t)); - if(alloc != NULL) { - ((lv_mem_ent_t *)alloc)->header.s.d_size = size; - ((lv_mem_ent_t *)alloc)->header.s.used = 1; - - alloc = &((lv_mem_ent_t *)alloc)->first_data; - } -#endif /* LV_ENABLE_GC */ -#endif /* LV_MEM_CUSTOM */ - -#if LV_MEM_ADD_JUNK - if(alloc != NULL) memset(alloc, 0xaa, size); -#endif - - if(alloc == NULL) LV_LOG_WARN("Couldn't allocate memory"); - - return alloc; -} - -/** - * Free an allocated data - * @param data pointer to an allocated memory - */ -void lv_mem_free(const void * data) -{ - if(data == &zero_mem) return; - if(data == NULL) return; - -#if LV_MEM_ADD_JUNK - memset((void *)data, 0xbb, lv_mem_get_size(data)); -#endif - -#if LV_ENABLE_GC == 0 - /*e points to the header*/ - lv_mem_ent_t * e = (lv_mem_ent_t *)((uint8_t *)data - sizeof(lv_mem_header_t)); - e->header.s.used = 0; -#endif - -#if LV_MEM_CUSTOM == 0 -#if LV_MEM_AUTO_DEFRAG - /* Make a simple defrag. - * Join the following free entries after this*/ - lv_mem_ent_t * e_next; - e_next = ent_get_next(e); - while(e_next != NULL) { - if(e_next->header.s.used == 0) { - e->header.s.d_size += e_next->header.s.d_size + sizeof(e->header); - } else { - break; - } - e_next = ent_get_next(e_next); - } -#endif -#else /*Use custom, user defined free function*/ -#if LV_ENABLE_GC == 0 - LV_MEM_CUSTOM_FREE(e); -#else - LV_MEM_CUSTOM_FREE((void *)data); -#endif /*LV_ENABLE_GC*/ -#endif -} - -/** - * Reallocate a memory with a new size. The old content will be kept. - * @param data pointer to an allocated memory. - * Its content will be copied to the new memory block and freed - * @param new_size the desired new size in byte - * @return pointer to the new memory - */ - -#if LV_ENABLE_GC == 0 - -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) { - lv_mem_ent_t * e = (lv_mem_ent_t *)((uint8_t *)data_p - sizeof(lv_mem_header_t)); - if(e->header.s.used == 0) { - data_p = NULL; - } - } - - uint32_t old_size = lv_mem_get_size(data_p); - if(old_size == new_size) return data_p; /*Also avoid reallocating the same memory*/ - -#if LV_MEM_CUSTOM == 0 - /* Truncate the memory if the new size is smaller. */ - if(new_size < old_size) { - lv_mem_ent_t * e = (lv_mem_ent_t *)((uint8_t *)data_p - sizeof(lv_mem_header_t)); - ent_trunc(e, new_size); - return &e->first_data; - } -#endif - - void * new_p; - new_p = lv_mem_alloc(new_size); - - if(new_p != NULL && 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)); - lv_mem_free(data_p); - } - } - - if(new_p == NULL) LV_LOG_WARN("Couldn't allocate memory"); - - return new_p; -} - -#else /* LV_ENABLE_GC */ - -void * lv_mem_realloc(void * data_p, size_t new_size) -{ - void * new_p = LV_MEM_CUSTOM_REALLOC(data_p, new_size); - if(new_p == NULL) LV_LOG_WARN("Couldn't allocate memory"); - return new_p; -} - -#endif /* lv_enable_gc */ - -/** - * Join the adjacent free memory blocks - */ -void lv_mem_defrag(void) -{ -#if LV_MEM_CUSTOM == 0 - lv_mem_ent_t * e_free; - lv_mem_ent_t * e_next; - e_free = ent_get_next(NULL); - - while(1) { - /*Search the next free entry*/ - while(e_free != NULL) { - if(e_free->header.s.used != 0) { - e_free = ent_get_next(e_free); - } else { - break; - } - } - - if(e_free == NULL) return; - - /*Joint the following free entries to the free*/ - e_next = ent_get_next(e_free); - while(e_next != NULL) { - if(e_next->header.s.used == 0) { - e_free->header.s.d_size += e_next->header.s.d_size + sizeof(e_next->header); - } else { - break; - } - - e_next = ent_get_next(e_next); - } - - if(e_next == NULL) return; - - /*Continue from the lastly checked entry*/ - e_free = e_next; - } -#endif -} - -/** - * Give information about the work memory of dynamic allocation - * @param mon_p pointer to a dm_mon_p variable, - * the result of the analysis will be stored here - */ -void lv_mem_monitor(lv_mem_monitor_t * mon_p) -{ - /*Init the data*/ - memset(mon_p, 0, sizeof(lv_mem_monitor_t)); -#if LV_MEM_CUSTOM == 0 - lv_mem_ent_t * e; - e = NULL; - - e = ent_get_next(e); - - while(e != NULL) { - if(e->header.s.used == 0) { - mon_p->free_cnt++; - mon_p->free_size += e->header.s.d_size; - if(e->header.s.d_size > mon_p->free_biggest_size) { - mon_p->free_biggest_size = e->header.s.d_size; - } - } else { - mon_p->used_cnt++; - } - - e = ent_get_next(e); - } - mon_p->total_size = LV_MEM_SIZE; - mon_p->used_pct = 100 - (100U * mon_p->free_size) / mon_p->total_size; - mon_p->frag_pct = (uint32_t)mon_p->free_biggest_size * 100U / mon_p->free_size; - mon_p->frag_pct = 100 - mon_p->frag_pct; -#endif -} - -/** - * Give the size of an allocated memory - * @param data pointer to an allocated memory - * @return the size of data memory in bytes - */ - -#if LV_ENABLE_GC == 0 - -uint32_t lv_mem_get_size(const void * data) -{ - if(data == NULL) return 0; - if(data == &zero_mem) return 0; - - lv_mem_ent_t * e = (lv_mem_ent_t *)((uint8_t *)data - sizeof(lv_mem_header_t)); - - return e->header.s.d_size; -} - -#else /* LV_ENABLE_GC */ - -uint32_t lv_mem_get_size(const void * data) -{ - return LV_MEM_CUSTOM_GET_SIZE(data); -} - -#endif /*LV_ENABLE_GC*/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -#if LV_MEM_CUSTOM == 0 -/** - * Give the next entry after 'act_e' - * @param act_e pointer to an entry - * @return pointer to an entry after 'act_e' - */ -static lv_mem_ent_t * ent_get_next(lv_mem_ent_t * act_e) -{ - lv_mem_ent_t * next_e = NULL; - - if(act_e == NULL) { /*NULL means: get the first entry*/ - next_e = (lv_mem_ent_t *)work_mem; - } else { /*Get the next entry */ - uint8_t * data = &act_e->first_data; - next_e = (lv_mem_ent_t *)&data[act_e->header.s.d_size]; - - if(&next_e->first_data >= &work_mem[LV_MEM_SIZE]) next_e = NULL; - } - - return next_e; -} - -/** - * Try to do the real allocation with a given size - * @param e try to allocate to this entry - * @param size size of the new memory in bytes - * @return pointer to the allocated memory or NULL if not enough memory in the entry - */ -static void * ent_alloc(lv_mem_ent_t * e, size_t size) -{ - void * alloc = NULL; - - /*If the memory is free and big enough then use it */ - if(e->header.s.used == 0 && e->header.s.d_size >= size) { - /*Truncate the entry to the desired size */ - ent_trunc(e, size), - - e->header.s.used = 1; - - /*Save the allocated data*/ - alloc = &e->first_data; - } - - return alloc; -} - -/** - * Truncate the data of entry to the given size - * @param e Pointer to an entry - * @param size new size in bytes - */ -static void ent_trunc(lv_mem_ent_t * e, size_t size) -{ -#ifdef LV_ARCH_64 - /*Round the size up to 8*/ - if(size & 0x7) { - size = size & (~0x7); - size += 8; - } -#else - /*Round the size up to 4*/ - if(size & 0x3) { - size = size & (~0x3); - size += 4; - } -#endif - - /*Don't let empty space only for a header without data*/ - if(e->header.s.d_size == size + sizeof(lv_mem_header_t)) { - size = e->header.s.d_size; - } - - /* Create the new entry after the current if there is space for it */ - if(e->header.s.d_size != size) { - uint8_t * e_data = &e->first_data; - lv_mem_ent_t * after_new_e = (lv_mem_ent_t *)&e_data[size]; - after_new_e->header.s.used = 0; - after_new_e->header.s.d_size = (uint32_t)e->header.s.d_size - size - sizeof(lv_mem_header_t); - } - - /* Set the new size for the original entry */ - e->header.s.d_size = (uint32_t)size; -} - -#endif diff --git a/src/libs/lvgl/src/lv_misc/lv_mem.h b/src/libs/lvgl/src/lv_misc/lv_mem.h deleted file mode 100644 index f7240742..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_mem.h +++ /dev/null @@ -1,113 +0,0 @@ -/** - * @file lv_mem.h - * - */ - -#ifndef LV_MEM_H -#define LV_MEM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include <stdint.h> -#include <stddef.h> -#include "lv_log.h" -#include "lv_types.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Heap information structure. - */ -typedef struct -{ - uint32_t total_size; /**< Total heap size */ - uint32_t free_cnt; - uint32_t free_size; /**< Size of available memory */ - uint32_t free_biggest_size; - uint32_t used_cnt; - uint8_t used_pct; /**< Percentage used */ - uint8_t frag_pct; /**< Amount of fragmentation */ -} lv_mem_monitor_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initiaize the dyn_mem module (work memory and other variables) - */ -void lv_mem_init(void); - -/** - * Clean up the memory buffer which frees all the allocated memories. - * @note It work only if `LV_MEM_CUSTOM == 0` - */ -void lv_mem_deinit(void); - -/** - * Allocate a memory dynamically - * @param size size of the memory to allocate in bytes - * @return pointer to the allocated memory - */ -void * lv_mem_alloc(size_t size); - -/** - * Free an allocated data - * @param data pointer to an allocated memory - */ -void lv_mem_free(const void * data); - -/** - * Reallocate a memory with a new size. The old content will be kept. - * @param data pointer to an allocated memory. - * Its content will be copied to the new memory block and freed - * @param new_size the desired new size in byte - * @return pointer to the new memory - */ -void * lv_mem_realloc(void * data_p, size_t new_size); - -/** - * Join the adjacent free memory blocks - */ -void lv_mem_defrag(void); - -/** - * Give information about the work memory of dynamic allocation - * @param mon_p pointer to a dm_mon_p variable, - * the result of the analysis will be stored here - */ -void lv_mem_monitor(lv_mem_monitor_t * mon_p); - -/** - * Give the size of an allocated memory - * @param data pointer to an allocated memory - * @return the size of data memory in bytes - */ -uint32_t lv_mem_get_size(const void * data); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_MEM_H*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_misc.mk b/src/libs/lvgl/src/lv_misc/lv_misc.mk deleted file mode 100644 index 67f496ba..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_misc.mk +++ /dev/null @@ -1,22 +0,0 @@ -CSRCS += lv_circ.c -CSRCS += lv_area.c -CSRCS += lv_task.c -CSRCS += lv_fs.c -CSRCS += lv_anim.c -CSRCS += lv_mem.c -CSRCS += lv_ll.c -CSRCS += lv_color.c -CSRCS += lv_txt.c -CSRCS += lv_math.c -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 - -CFLAGS += "-I$(LVGL_DIR)/lvgl/src/lv_misc" diff --git a/src/libs/lvgl/src/lv_misc/lv_printf.c b/src/libs/lvgl/src/lv_misc/lv_printf.c deleted file mode 100644 index e05f35be..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_printf.c +++ /dev/null @@ -1,852 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// \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 <stdbool.h> -#include <stdint.h> - - -// '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 <stddef.h> 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 <float.h> -#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 <m.jasperse@gmail.com> -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/libs/lvgl/src/lv_misc/lv_printf.h b/src/libs/lvgl/src/lv_misc/lv_printf.h deleted file mode 100644 index b3b8598d..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_printf.h +++ /dev/null @@ -1,75 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// \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 <stdarg.h> -#include <stddef.h> - -/** - * 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/libs/lvgl/src/lv_misc/lv_task.c b/src/libs/lvgl/src/lv_misc/lv_task.c deleted file mode 100644 index 5ac36edb..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_task.c +++ /dev/null @@ -1,382 +0,0 @@ -/** - * @file lv_task.c - * An 'lv_task' is a void (*fp) (void* param) type function which will be called periodically. - * A priority (5 levels + disable) can be assigned to lv_tasks. - */ - -/********************* - * INCLUDES - *********************/ -#include <stddef.h> -#include "lv_task.h" -#include "../lv_core/lv_debug.h" -#include "../lv_hal/lv_hal_tick.h" -#include "lv_gc.h" - -#if defined(LV_GC_INCLUDE) -#include LV_GC_INCLUDE -#endif /* LV_ENABLE_GC */ - -/********************* - * DEFINES - *********************/ -#define IDLE_MEAS_PERIOD 500 /*[ms]*/ -#define DEF_PRIO LV_TASK_PRIO_MID -#define DEF_PERIOD 500 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_task_exec(lv_task_t * task); - -/********************** - * STATIC VARIABLES - **********************/ -static bool lv_task_run = false; -static uint8_t idle_last = 0; -static bool task_deleted; -static bool task_created; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Init the lv_task module - */ -void lv_task_core_init(void) -{ - lv_ll_init(&LV_GC_ROOT(_lv_task_ll), sizeof(lv_task_t)); - - /*Initially enable the lv_task handling*/ - lv_task_enable(true); -} - -/** - * Call it periodically to handle lv_tasks. - */ -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 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) { - already_running = false; /*Release mutex*/ - return; - } - - handler_start = lv_tick_get(); - - /* Run all task from the highest to the lowest priority - * If a lower priority task is executed check task again from the highest priority - * but on the priority of executed tasks don't run tasks before the executed*/ - lv_task_t * task_interrupter = NULL; - lv_task_t * next; - bool end_flag; - do { - end_flag = true; - task_deleted = false; - task_created = false; - LV_GC_ROOT(_lv_task_act) = lv_ll_get_head(&LV_GC_ROOT(_lv_task_ll)); - while(LV_GC_ROOT(_lv_task_act)) { - /* The task might be deleted if it runs only once ('once = 1') - * So get next element until the current is surely valid*/ - next = lv_ll_get_next(&LV_GC_ROOT(_lv_task_ll), LV_GC_ROOT(_lv_task_act)); - - /*We reach priority of the turned off task. There is nothing more to do.*/ - if(((lv_task_t *)LV_GC_ROOT(_lv_task_act))->prio == LV_TASK_PRIO_OFF) { - break; - } - - /*Here is the interrupter task. Don't execute it again.*/ - if(LV_GC_ROOT(_lv_task_act) == task_interrupter) { - task_interrupter = NULL; /*From this point only task after the interrupter comes, so - the interrupter is not interesting anymore*/ - LV_GC_ROOT(_lv_task_act) = next; - continue; /*Load the next task*/ - } - - /*Just try to run the tasks with highest priority.*/ - 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 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))) { - 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; - } - } - } - } - /* It is no interrupter task or we already reached it earlier. - * Just run the remaining tasks*/ - else { - if(lv_task_exec(LV_GC_ROOT(_lv_task_act))) { - 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 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*/ - } - } while(!end_flag); - - busy_time += lv_tick_elaps(handler_start); - uint32_t idle_period_time = lv_tick_elaps(idle_period_start); - if(idle_period_time >= IDLE_MEAS_PERIOD) { - - idle_last = (uint32_t)((uint32_t)busy_time * 100) / IDLE_MEAS_PERIOD; /*Calculate the busy percentage*/ - idle_last = idle_last > 100 ? 0 : 100 - idle_last; /*But we need idle time*/ - busy_time = 0; - idle_period_start = lv_tick_get(); - } - - already_running = false; /*Release the mutex*/ - - LV_LOG_TRACE("lv_task_handler ready"); -} -/** - * Create an "empty" task. It needs to initialzed with at least - * `lv_task_set_cb` and `lv_task_set_period` - * @return pointer to the craeted task - */ -lv_task_t * lv_task_create_basic(void) -{ - lv_task_t * new_task = NULL; - lv_task_t * tmp; - - /*Create task lists in order of priority from high to low*/ - tmp = lv_ll_get_head(&LV_GC_ROOT(_lv_task_ll)); - - /*It's the first task*/ - if(NULL == tmp) { - new_task = lv_ll_ins_head(&LV_GC_ROOT(_lv_task_ll)); - LV_ASSERT_MEM(new_task); - if(new_task == NULL) return NULL; - } - /*Insert the new task to proper place according to its priority*/ - else { - do { - if(tmp->prio <= DEF_PRIO) { - new_task = lv_ll_ins_prev(&LV_GC_ROOT(_lv_task_ll), tmp); - LV_ASSERT_MEM(new_task); - if(new_task == NULL) return NULL; - break; - } - tmp = lv_ll_get_next(&LV_GC_ROOT(_lv_task_ll), tmp); - } while(tmp != NULL); - - /*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_ASSERT_MEM(new_task); - if(new_task == NULL) return NULL; - } - } - - new_task->period = DEF_PERIOD; - new_task->task_cb = NULL; - new_task->prio = DEF_PRIO; - - new_task->once = 0; - new_task->last_run = lv_tick_get(); - - new_task->user_data = NULL; - - task_created = true; - - return new_task; -} - -/** - * Create a new lv_task - * @param task_xcb a callback which is the task itself. It will be called periodically. - * (the 'x' in the argument name indicates that its not a fully generic function because it not follows - * the `func_name(object, callback, ...)` convention) - * @param period call period in ms unit - * @param prio priority of the task (LV_TASK_PRIO_OFF means the task is stopped) - * @param user_data custom parameter - * @return pointer to the new task - */ -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_ASSERT_MEM(new_task); - if(new_task == NULL) return NULL; - - lv_task_set_cb(new_task, task_cb); - lv_task_set_period(new_task, period); - lv_task_set_prio(new_task, prio); - new_task->user_data = user_data; - - return new_task; -} - -/** - * Set the callback the task (the function to call periodically) - * @param task pointer to a task - * @param task_cb teh function to call periodically - */ -void lv_task_set_cb(lv_task_t * task, lv_task_cb_t task_cb) -{ - task->task_cb = task_cb; -} - -/** - * Delete a lv_task - * @param task pointer to task created by task - */ -void lv_task_del(lv_task_t * task) -{ - lv_ll_rem(&LV_GC_ROOT(_lv_task_ll), task); - - lv_mem_free(task); - - if(LV_GC_ROOT(_lv_task_act) == task) task_deleted = true; /*The active task was deleted*/ -} - -/** - * Set new priority for a lv_task - * @param task pointer to a lv_task - * @param prio the new priority - */ -void lv_task_set_prio(lv_task_t * task, lv_task_prio_t prio) -{ - if(task->prio == prio) return; - - /*Find the tasks with new priority*/ - lv_task_t * i; - LV_LL_READ(LV_GC_ROOT(_lv_task_ll), i) - { - if(i->prio <= prio) { - if(i != task) lv_ll_move_before(&LV_GC_ROOT(_lv_task_ll), task, i); - break; - } - } - - /*There was no such a low priority so far then add the node to the tail*/ - if(i == NULL) { - lv_ll_move_before(&LV_GC_ROOT(_lv_task_ll), task, NULL); - } - - task->prio = prio; -} - -/** - * Set new period for a lv_task - * @param task pointer to a lv_task - * @param period the new period - */ -void lv_task_set_period(lv_task_t * task, uint32_t period) -{ - task->period = period; -} - -/** - * Make a lv_task ready. It will not wait its period. - * @param task pointer to a lv_task. - */ -void lv_task_ready(lv_task_t * task) -{ - task->last_run = lv_tick_get() - task->period - 1; -} - -/** - * Delete the lv_task after one call - * @param task pointer to a lv_task. - */ -void lv_task_once(lv_task_t * task) -{ - task->once = 1; -} - -/** - * Reset a lv_task. - * It will be called the previously set period milliseconds later. - * @param task pointer to a lv_task. - */ -void lv_task_reset(lv_task_t * task) -{ - task->last_run = lv_tick_get(); -} - -/** - * Enable or disable the whole lv_task handling - * @param en: true: lv_task handling is running, false: lv_task handling is suspended - */ -void lv_task_enable(bool en) -{ - lv_task_run = en; -} - -/** - * Get idle percentage - * @return the lv_task idle in percentage - */ -uint8_t lv_task_get_idle(void) -{ - return idle_last; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Execute task if its the priority is appropriate - * @param task pointer to lv_task - * @return true: execute, false: not executed - */ -static bool lv_task_exec(lv_task_t * task) -{ - bool exec = false; - - /*Execute if at least 'period' time elapsed*/ - uint32_t elp = lv_tick_elaps(task->last_run); - if(elp >= task->period) { - task->last_run = lv_tick_get(); - task_deleted = false; - task_created = false; - if(task->task_cb) task->task_cb(task); - - /*Delete if it was a one shot lv_task*/ - if(task_deleted == false) { /*The task might be deleted by itself as well*/ - if(task->once != 0) { - lv_task_del(task); - } - } - exec = true; - } - - return exec; -} diff --git a/src/libs/lvgl/src/lv_misc/lv_task.h b/src/libs/lvgl/src/lv_misc/lv_task.h deleted file mode 100644 index 05ff02b6..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_task.h +++ /dev/null @@ -1,177 +0,0 @@ -/** - * @file lv_task.c - * An 'lv_task' is a void (*fp) (void* param) type function which will be called periodically. - * A priority (5 levels + disable) can be assigned to lv_tasks. - */ - -#ifndef LV_TASK_H -#define LV_TASK_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include <stdint.h> -#include <stdbool.h> -#include "lv_mem.h" -#include "lv_ll.h" - -/********************* - * DEFINES - *********************/ -#ifndef LV_ATTRIBUTE_TASK_HANDLER -#define LV_ATTRIBUTE_TASK_HANDLER -#endif -/********************** - * TYPEDEFS - **********************/ - -struct _lv_task_t; - -/** - * Tasks execute this type type of functions. - */ -typedef void (*lv_task_cb_t)(struct _lv_task_t *); - -/** - * Possible priorities for lv_tasks - */ -enum { - LV_TASK_PRIO_OFF = 0, - LV_TASK_PRIO_LOWEST, - LV_TASK_PRIO_LOW, - LV_TASK_PRIO_MID, - LV_TASK_PRIO_HIGH, - LV_TASK_PRIO_HIGHEST, - _LV_TASK_PRIO_NUM, -}; -typedef uint8_t lv_task_prio_t; - -/** - * Descriptor of a lv_task - */ -typedef struct _lv_task_t -{ - uint32_t period; /**< How often the task should run */ - uint32_t last_run; /**< Last time the task ran */ - lv_task_cb_t task_cb; /**< Task function */ - - void * user_data; /**< Custom user data */ - - uint8_t prio : 3; /**< Task priority */ - uint8_t once : 1; /**< 1: one shot task */ -} lv_task_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Init the lv_task module - */ -void lv_task_core_init(void); - -//! @cond Doxygen_Suppress - -/** - * Call it periodically to handle lv_tasks. - */ -LV_ATTRIBUTE_TASK_HANDLER void lv_task_handler(void); - -//! @endcond - -/** - * Create an "empty" task. It needs to initialzed with at least - * `lv_task_set_cb` and `lv_task_set_period` - * @return pointer to the craeted task - */ -lv_task_t * lv_task_create_basic(void); - -/** - * Create a new lv_task - * @param task_xcb a callback which is the task itself. It will be called periodically. - * (the 'x' in the argument name indicates that its not a fully generic function because it not follows - * the `func_name(object, callback, ...)` convention) - * @param period call period in ms unit - * @param prio priority of the task (LV_TASK_PRIO_OFF means the task is stopped) - * @param user_data custom parameter - * @return pointer to the new task - */ -lv_task_t * lv_task_create(lv_task_cb_t task_xcb, uint32_t period, lv_task_prio_t prio, void * user_data); - -/** - * Delete a lv_task - * @param task pointer to task_cb created by task - */ -void lv_task_del(lv_task_t * task); - -/** - * Set the callback the task (the function to call periodically) - * @param task pointer to a task - * @param task_cb the function to call periodically - */ -void lv_task_set_cb(lv_task_t * task, lv_task_cb_t task_cb); - -/** - * Set new priority for a lv_task - * @param task pointer to a lv_task - * @param prio the new priority - */ -void lv_task_set_prio(lv_task_t * task, lv_task_prio_t prio); - -/** - * Set new period for a lv_task - * @param task pointer to a lv_task - * @param period the new period - */ -void lv_task_set_period(lv_task_t * task, uint32_t period); - -/** - * Make a lv_task ready. It will not wait its period. - * @param task pointer to a lv_task. - */ -void lv_task_ready(lv_task_t * task); - -/** - * Delete the lv_task after one call - * @param task pointer to a lv_task. - */ -void lv_task_once(lv_task_t * task); - -/** - * Reset a lv_task. - * It will be called the previously set period milliseconds later. - * @param task pointer to a lv_task. - */ -void lv_task_reset(lv_task_t * task); - -/** - * Enable or disable the whole lv_task handling - * @param en: true: lv_task handling is running, false: lv_task handling is suspended - */ -void lv_task_enable(bool en); - -/** - * Get idle percentage - * @return the lv_task idle in percentage - */ -uint8_t lv_task_get_idle(void); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/src/libs/lvgl/src/lv_misc/lv_templ.c b/src/libs/lvgl/src/lv_misc/lv_templ.c deleted file mode 100644 index c5bb68c0..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_templ.c +++ /dev/null @@ -1,40 +0,0 @@ -/** - * @file lv_templ.c - * - */ - -/********************* - * INCLUDES - *********************/ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/* This typedef exists purely to keep -Wpedantic happy when the file is empty. */ -/* It can be removed. */ -typedef int keep_pedantic_happy; - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/libs/lvgl/src/lv_misc/lv_templ.h b/src/libs/lvgl/src/lv_misc/lv_templ.h deleted file mode 100644 index 1f1b92d6..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_templ.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * @file lv_templ.h - * - */ - -#ifndef LV_TEMPL_H -#define LV_TEMPL_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_TEMPL_H*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_txt.c b/src/libs/lvgl/src/lv_misc/lv_txt.c deleted file mode 100644 index 9de132e9..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_txt.c +++ /dev/null @@ -1,845 +0,0 @@ -/** - * @file lv_text.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_txt.h" -#include "lv_math.h" -#include "lv_log.h" - -/********************* - * DEFINES - *********************/ -#define NO_BREAK_FOUND UINT32_MAX - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static inline bool is_break_char(uint32_t letter); - -#if LV_TXT_ENC == LV_TXT_ENC_UTF8 -static uint8_t lv_txt_utf8_size(const char * str); -static uint32_t lv_txt_unicode_to_utf8(uint32_t letter_uni); -static uint32_t lv_txt_utf8_conv_wc(uint32_t c); -static uint32_t lv_txt_utf8_next(const char * txt, uint32_t * i); -static uint32_t lv_txt_utf8_prev(const char * txt, uint32_t * i_start); -static uint32_t lv_txt_utf8_get_byte_id(const char * txt, uint32_t utf8_id); -static uint32_t lv_txt_utf8_get_char_id(const char * txt, uint32_t byte_id); -static uint32_t lv_txt_utf8_get_length(const char * txt); -#elif LV_TXT_ENC == LV_TXT_ENC_ASCII -static uint8_t lv_txt_iso8859_1_size(const char * str); -static uint32_t lv_txt_unicode_to_iso8859_1(uint32_t letter_uni); -static uint32_t lv_txt_iso8859_1_conv_wc(uint32_t c); -static uint32_t lv_txt_iso8859_1_next(const char * txt, uint32_t * i); -static uint32_t lv_txt_iso8859_1_prev(const char * txt, uint32_t * i_start); -static uint32_t lv_txt_iso8859_1_get_byte_id(const char * txt, uint32_t utf8_id); -static uint32_t lv_txt_iso8859_1_get_char_id(const char * txt, uint32_t byte_id); -static uint32_t lv_txt_iso8859_1_get_length(const char * txt); -#endif -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * GLOBAL VARIABLES - **********************/ -#if LV_TXT_ENC == LV_TXT_ENC_UTF8 -uint8_t (*lv_txt_encoded_size)(const char *) = lv_txt_utf8_size; -uint32_t (*lv_txt_unicode_to_encoded)(uint32_t) = lv_txt_unicode_to_utf8; -uint32_t (*lv_txt_encoded_conv_wc)(uint32_t) = lv_txt_utf8_conv_wc; -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_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; -uint32_t (*lv_txt_unicode_to_encoded)(uint32_t) = lv_txt_unicode_to_iso8859_1; -uint32_t (*lv_txt_encoded_conv_wc)(uint32_t) = lv_txt_iso8859_1_conv_wc; -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_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 - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Get size of a text - * @param size_res pointer to a 'point_t' variable to store the result - * @param text pointer to a text - * @param font pinter to font of the text - * @param letter_space letter space of the text - * @param txt.line_space line space of the text - * @param flags settings for the text from 'txt_flag_t' enum - * @param max_width max with of the text (break the lines to fit this size) Set CORD_MAX to avoid - * line breaks - */ -void lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t * font, lv_coord_t letter_space, - lv_coord_t line_space, lv_coord_t max_width, lv_txt_flag_t flag) -{ - size_res->x = 0; - size_res->y = 0; - - if(text == NULL) return; - if(font == NULL) return; - - if(flag & LV_TXT_FLAG_EXPAND) max_width = LV_COORD_MAX; - - 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); - - /*Calc. the height and longest line*/ - while(text[line_start] != '\0') { - new_line_start += lv_txt_get_next_line(&text[line_start], font, letter_space, max_width, flag); - - if ((unsigned long)size_res->y + (unsigned long)letter_height + (unsigned long)line_space > LV_MAX_OF(lv_coord_t)) { - LV_LOG_WARN("lv_txt_get_size: integer overflow while calculating text height"); - return; - } else { - size_res->y += letter_height; - size_res->y += line_space; - } - - /*Calculate the the longest line*/ - act_line_length = lv_txt_get_width(&text[line_start], new_line_start - line_start, font, letter_space, flag); - - size_res->x = LV_MATH_MAX(act_line_length, size_res->x); - line_start = new_line_start; - } - - /*Make the text one line taller if the last character is '\n' or '\r'*/ - if((line_start != 0) && (text[line_start - 1] == '\n' || text[line_start - 1] == '\r')) { - size_res->y += letter_height + line_space; - } - - /*Correction with the last line space or set the height manually if the text is empty*/ - if(size_res->y == 0) - size_res->y = letter_height; - else - 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; - - if(letter_w > 0) { - cur_w += letter_space; - } - - /* Test if this character fits within max_width */ - if(break_index == NO_BREAK_FOUND && (cur_w - letter_space) > 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; - - - 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 - * @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 - * @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) -{ - if(txt == NULL) return 0; - if(font == NULL) return 0; - - if(flag & LV_TXT_FLAG_EXPAND) max_width = LV_COORD_MAX; - lv_txt_cmd_state_t cmd_state = LV_TXT_CMD_STATE_WAIT; - uint32_t i = 0; /* Iterating index into txt */ - - 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; - - if( advance == 0 ){ - if(i == 0) lv_txt_encoded_next(txt, &i); // prevent inf loops - break; - } - - i += advance; - - if(txt[0] == '\n' || txt[0] == '\r') break; - - if(txt[i] == '\n' || txt[i] == '\r'){ - i++; /* Include the following newline in the current line */ - break; - } - - } - - /* Always step at least one to avoid infinite loops */ - if(i == 0) { - lv_txt_encoded_next(txt, &i); - } - - return i; -} - -/** - * Give the length of a text with a given font - * @param txt a '\0' terminate string - * @param length length of 'txt' in byte count and not characters (Á is 1 character but 2 bytes in - * UTF-8) - * @param font pointer to a font - * @param letter_space letter space - * @param flags settings for the text from 'txt_flag_t' enum - * @return length of a char_num long text - */ -lv_coord_t lv_txt_get_width(const char * txt, uint16_t length, const lv_font_t * font, lv_coord_t letter_space, - lv_txt_flag_t flag) -{ - if(txt == NULL) return 0; - if(font == NULL) return 0; - - uint32_t i = 0; - lv_coord_t width = 0; - lv_txt_cmd_state_t cmd_state = LV_TXT_CMD_STATE_WAIT; - uint32_t letter; - uint32_t letter_next; - - if(length != 0) { - while(i < length) { - letter = lv_txt_encoded_next(txt, &i); - letter_next = lv_txt_encoded_next(&txt[i], NULL); - if((flag & LV_TXT_FLAG_RECOLOR) != 0) { - if(lv_txt_is_cmd(&cmd_state, letter) != false) { - continue; - } - } - - lv_coord_t char_width = lv_font_get_glyph_width(font, letter, letter_next); - if(char_width > 0) { - width += char_width; - width += letter_space; - } - } - - if(width > 0) { - width -= letter_space; /*Trim the last letter space. Important if the text is center - aligned */ - } - } - - return width; -} - -/** - * Check next character in a string and decide if the character is part of the command or not - * @param state pointer to a txt_cmd_state_t variable which stores the current state of command - * processing (Initied. to TXT_CMD_STATE_WAIT ) - * @param c the current character - * @return true: the character is part of a command and should not be written, - * false: the character should be written - */ -bool lv_txt_is_cmd(lv_txt_cmd_state_t * state, uint32_t c) -{ - bool ret = false; - - if(c == (uint32_t)LV_TXT_COLOR_CMD[0]) { - if(*state == LV_TXT_CMD_STATE_WAIT) { /*Start char*/ - *state = LV_TXT_CMD_STATE_PAR; - ret = true; - } - /*Other start char in parameter is escaped cmd. char */ - else if(*state == LV_TXT_CMD_STATE_PAR) { - *state = LV_TXT_CMD_STATE_WAIT; - } - /*Command end */ - else if(*state == LV_TXT_CMD_STATE_IN) { - *state = LV_TXT_CMD_STATE_WAIT; - ret = true; - } - } - - /*Skip the color parameter and wait the space after it*/ - if(*state == LV_TXT_CMD_STATE_PAR) { - if(c == ' ') { - *state = LV_TXT_CMD_STATE_IN; /*After the parameter the text is in the command*/ - } - ret = true; - } - - return ret; -} - -/** - * Insert a string into an other - * @param txt_buf the original text (must be big enough for the result text) - * @param pos position to insert. Expressed in character index and not byte index (Different in - * UTF-8) 0: before the original text, 1: after the first char etc. - * @param ins_txt text to insert - */ -void lv_txt_ins(char * txt_buf, uint32_t pos, const char * ins_txt) -{ - size_t old_len = strlen(txt_buf); - size_t ins_len = strlen(ins_txt); - size_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*/ - - /*Copy the second part into the end to make place to text to insert*/ - size_t i; - for(i = new_len; i >= pos + ins_len; i--) { - txt_buf[i] = txt_buf[i - ins_len]; - } - - /* Copy the text into the new space*/ - memcpy(txt_buf + pos, ins_txt, ins_len); -} - -/** - * Delete a part of a string - * @param txt string to modify - * @param pos position where to start the deleting (0: before the first char, 1: after the first - * char etc.) - * @param len number of characters to delete - */ -void lv_txt_cut(char * txt, uint32_t pos, uint32_t len) -{ - - 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); - - /*Copy the second part into the end to make place to text to insert*/ - uint32_t i; - for(i = pos; i <= old_len - len; i++) { - txt[i] = txt[i + len]; - } -} - -#if LV_TXT_ENC == LV_TXT_ENC_UTF8 -/******************************* - * UTF-8 ENCODER/DECOER - ******************************/ - -/** - * Give the size of an UTF-8 coded character - * @param str pointer to a character in a string - * @return length of the UTF-8 character (1,2,3 or 4). O on invalid code - */ -static uint8_t lv_txt_utf8_size(const char * str) -{ - if((str[0] & 0x80) == 0) - return 1; - else if((str[0] & 0xE0) == 0xC0) - return 2; - else if((str[0] & 0xF0) == 0xE0) - return 3; - else if((str[0] & 0xF8) == 0xF0) - return 4; - return 0; /*If the char was invalid tell it's 1 byte long*/ -} - -/** - * Convert an Unicode letter to UTF-8. - * @param letter_uni an Unicode letter - * @return UTF-8 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű') - */ -static uint32_t lv_txt_unicode_to_utf8(uint32_t letter_uni) -{ - if(letter_uni < 128) return letter_uni; - uint8_t bytes[4]; - - if(letter_uni < 0x0800) { - bytes[0] = ((letter_uni >> 6) & 0x1F) | 0xC0; - bytes[1] = ((letter_uni >> 0) & 0x3F) | 0x80; - bytes[2] = 0; - bytes[3] = 0; - } else if(letter_uni < 0x010000) { - bytes[0] = ((letter_uni >> 12) & 0x0F) | 0xE0; - bytes[1] = ((letter_uni >> 6) & 0x3F) | 0x80; - bytes[2] = ((letter_uni >> 0) & 0x3F) | 0x80; - bytes[3] = 0; - } else if(letter_uni < 0x110000) { - bytes[0] = ((letter_uni >> 18) & 0x07) | 0xF0; - bytes[1] = ((letter_uni >> 12) & 0x3F) | 0x80; - bytes[2] = ((letter_uni >> 6) & 0x3F) | 0x80; - bytes[3] = ((letter_uni >> 0) & 0x3F) | 0x80; - } - - uint32_t * res_p = (uint32_t *)bytes; - return *res_p; -} - -/** - * Convert a wide character, e.g. 'Á' little endian to be UTF-8 compatible - * @param c a wide character or a Little endian number - * @return `c` in big endian - */ -static uint32_t lv_txt_utf8_conv_wc(uint32_t c) -{ - /*Swap the bytes (UTF-8 is big endian, but the MCUs are little endian)*/ - if((c & 0x80) != 0) { - uint32_t swapped; - uint8_t c8[4]; - memcpy(c8, &c, 4); - swapped = (c8[0] << 24) + (c8[1] << 16) + (c8[2] << 8) + (c8[3]); - uint8_t i; - for(i = 0; i < 4; i++) { - if((swapped & 0xFF) == 0) - swapped = (swapped >> 8); /*Ignore leading zeros (they were in the end originally)*/ - } - c = swapped; - } - - return c; -} - -/** - * Decode an UTF-8 character from a string. - * @param txt pointer to '\0' terminated string - * @param i start byte index in 'txt' where to start. - * After call it will point to the next UTF-8 char in 'txt'. - * NULL to use txt[0] as index - * @return the decoded Unicode character or 0 on invalid UTF-8 code - */ -static uint32_t lv_txt_utf8_next(const char * txt, uint32_t * i) -{ - /* Unicode to UTF-8 - * 00000000 00000000 00000000 0xxxxxxx -> 0xxxxxxx - * 00000000 00000000 00000yyy yyxxxxxx -> 110yyyyy 10xxxxxx - * 00000000 00000000 zzzzyyyy yyxxxxxx -> 1110zzzz 10yyyyyy 10xxxxxx - * 00000000 000wwwzz zzzzyyyy yyxxxxxx -> 11110www 10zzzzzz 10yyyyyy 10xxxxxx - * */ - - uint32_t result = 0; - - /*Dummy 'i' pointer is required*/ - uint32_t i_tmp = 0; - if(i == NULL) i = &i_tmp; - - /*Normal ASCII*/ - if((txt[*i] & 0x80) == 0) { - result = txt[*i]; - (*i)++; - } - /*Real UTF-8 decode*/ - else { - /*2 bytes UTF-8 code*/ - if((txt[*i] & 0xE0) == 0xC0) { - result = (uint32_t)(txt[*i] & 0x1F) << 6; - (*i)++; - if((txt[*i] & 0xC0) != 0x80) return 0; /*Invalid UTF-8 code*/ - result += (txt[*i] & 0x3F); - (*i)++; - } - /*3 bytes UTF-8 code*/ - else if((txt[*i] & 0xF0) == 0xE0) { - result = (uint32_t)(txt[*i] & 0x0F) << 12; - (*i)++; - - if((txt[*i] & 0xC0) != 0x80) return 0; /*Invalid UTF-8 code*/ - result += (uint32_t)(txt[*i] & 0x3F) << 6; - (*i)++; - - if((txt[*i] & 0xC0) != 0x80) return 0; /*Invalid UTF-8 code*/ - result += (txt[*i] & 0x3F); - (*i)++; - } - /*4 bytes UTF-8 code*/ - else if((txt[*i] & 0xF8) == 0xF0) { - result = (uint32_t)(txt[*i] & 0x07) << 18; - (*i)++; - - if((txt[*i] & 0xC0) != 0x80) return 0; /*Invalid UTF-8 code*/ - result += (uint32_t)(txt[*i] & 0x3F) << 12; - (*i)++; - - if((txt[*i] & 0xC0) != 0x80) return 0; /*Invalid UTF-8 code*/ - result += (uint32_t)(txt[*i] & 0x3F) << 6; - (*i)++; - - if((txt[*i] & 0xC0) != 0x80) return 0; /*Invalid UTF-8 code*/ - result += txt[*i] & 0x3F; - (*i)++; - } else { - (*i)++; /*Not UTF-8 char. Go the next.*/ - } - } - return result; -} - -/** - * Get previous UTF-8 character form a string. - * @param txt pointer to '\0' terminated string - * @param i start byte index in 'txt' where to start. After the call it will point to the previous - * UTF-8 char in 'txt'. - * @return the decoded Unicode character or 0 on invalid UTF-8 code - */ -static uint32_t lv_txt_utf8_prev(const char * txt, uint32_t * i) -{ - uint8_t c_size; - uint8_t cnt = 0; - - /*Try to find a !0 long UTF-8 char by stepping one character back*/ - (*i)--; - do { - if(cnt >= 4) return 0; /*No UTF-8 char found before the initial*/ - - c_size = lv_txt_encoded_size(&txt[*i]); - if(c_size == 0) { - if(*i != 0) - (*i)--; - else - return 0; - } - cnt++; - } while(c_size == 0); - - uint32_t i_tmp = *i; - uint32_t letter = lv_txt_encoded_next(txt, &i_tmp); /*Character found, get it*/ - - return letter; -} - -/** - * Convert a character index (in an UTF-8 text) to byte index. - * E.g. in "AÁRT" index of 'R' is 2th char but start at byte 3 because 'Á' is 2 bytes long - * @param txt a '\0' terminated UTF-8 string - * @param utf8_id character index - * @return byte index of the 'utf8_id'th letter - */ -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++) { - uint8_t c_size = lv_txt_encoded_size(&txt[byte_cnt]); - byte_cnt += c_size > 0 ? c_size : 1; - } - - return byte_cnt; -} - -/** - * Convert a byte index (in an UTF-8 text) to character index. - * E.g. in "AÁRT" index of 'R' is 2th char but start at byte 3 because 'Á' is 2 bytes long - * @param txt a '\0' terminated UTF-8 string - * @param byte_id byte index - * @return character index of the letter at 'byte_id'th position - */ -static uint32_t lv_txt_utf8_get_char_id(const char * txt, uint32_t byte_id) -{ - uint32_t i = 0; - uint32_t char_cnt = 0; - - while(i < byte_id) { - lv_txt_encoded_next(txt, &i); /*'i' points to the next letter so use the prev. value*/ - char_cnt++; - } - - return char_cnt; -} - -/** - * Get the number of characters (and NOT bytes) in a string. Decode it with UTF-8 if enabled. - * E.g.: "ÁBC" is 3 characters (but 4 bytes) - * @param txt a '\0' terminated char string - * @return number of characters - */ -static uint32_t lv_txt_utf8_get_length(const char * txt) -{ - uint32_t len = 0; - uint32_t i = 0; - - while(txt[i] != '\0') { - lv_txt_encoded_next(txt, &i); - len++; - } - - return len; -} - -#elif LV_TXT_ENC == LV_TXT_ENC_ASCII -/******************************* - * ASCII ENCODER/DECOER - ******************************/ - -/** - * Give the size of an ISO8859-1 coded character - * @param str pointer to a character in a string - * @return length of the UTF-8 character (1,2,3 or 4). O on invalid code - */ -static uint8_t lv_txt_iso8859_1_size(const char * str) -{ - (void)str; /*Unused*/ - return 1; -} - -/** - * Convert an Unicode letter to ISO8859-1. - * @param letter_uni an Unicode letter - * @return ISO8859-1 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű') - */ -static uint32_t lv_txt_unicode_to_iso8859_1(uint32_t letter_uni) -{ - if(letter_uni < 128) - return letter_uni; - else - return ' '; -} - -/** - * Convert wide characters to ASCII, however wide characters in ASCII range (e.g. 'A') are ASCII compatible by default. - * So this function does nothing just returns with `c`. - * @param c a character, e.g. 'A' - * @return same as `c` - */ -static uint32_t lv_txt_iso8859_1_conv_wc(uint32_t c) -{ - return c; -} - -/** - * Decode an ISO8859-1 character from a string. - * @param txt pointer to '\0' terminated string - * @param i start byte index in 'txt' where to start. - * After call it will point to the next UTF-8 char in 'txt'. - * NULL to use txt[0] as index - * @return the decoded Unicode character or 0 on invalid UTF-8 code - */ -static uint32_t lv_txt_iso8859_1_next(const char * txt, uint32_t * i) -{ - if(i == NULL) return txt[1]; /*Get the next char */ - - uint8_t letter = txt[*i]; - (*i)++; - return letter; -} - -/** - * Get previous ISO8859-1 character form a string. - * @param txt pointer to '\0' terminated string - * @param i start byte index in 'txt' where to start. After the call it will point to the previous UTF-8 char in 'txt'. - * @return the decoded Unicode character or 0 on invalid UTF-8 code - */ -static uint32_t lv_txt_iso8859_1_prev(const char * txt, uint32_t * i) -{ - if(i == NULL) return *(txt - 1); /*Get the prev. char */ - - (*i)--; - uint8_t letter = txt[*i]; - - return letter; -} - -/** - * Convert a character index (in an ISO8859-1 text) to byte index. - * E.g. in "AÁRT" index of 'R' is 2th char but start at byte 3 because 'Á' is 2 bytes long - * @param txt a '\0' terminated UTF-8 string - * @param utf8_id character index - * @return byte index of the 'utf8_id'th letter - */ -static uint32_t lv_txt_iso8859_1_get_byte_id(const char * txt, uint32_t utf8_id) -{ - (void)txt; /*Unused*/ - return utf8_id; /*In Non encoded no difference*/ -} - -/** - * Convert a byte index (in an ISO8859-1 text) to character index. - * E.g. in "AÁRT" index of 'R' is 2th char but start at byte 3 because 'Á' is 2 bytes long - * @param txt a '\0' terminated UTF-8 string - * @param byte_id byte index - * @return character index of the letter at 'byte_id'th position - */ -static uint32_t lv_txt_iso8859_1_get_char_id(const char * txt, uint32_t byte_id) -{ - (void)txt; /*Unused*/ - return byte_id; /*In Non encoded no difference*/ -} - -/** - * Get the number of characters (and NOT bytes) in a string. Decode it with UTF-8 if enabled. - * E.g.: "ÁBC" is 3 characters (but 4 bytes) - * @param txt a '\0' terminated char string - * @return number of characters - */ -static uint32_t lv_txt_iso8859_1_get_length(const char * txt) -{ - return strlen(txt); -} -#else - -#error "Invalid character encoding. See `LV_TXT_ENC` in `lv_conf.h`" - -#endif - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Test if char is break char or not (a text can broken here or not) - * @param letter a letter - * @return false: 'letter' is not break char - */ -static inline bool is_break_char(uint32_t letter) -{ - uint8_t i; - bool ret = false; - - /*Compare the letter to TXT_BREAK_CHARS*/ - for(i = 0; LV_TXT_BREAK_CHARS[i] != '\0'; i++) { - if(letter == (uint32_t)LV_TXT_BREAK_CHARS[i]) { - ret = true; /*If match then it is break char*/ - break; - } - } - - return ret; -} diff --git a/src/libs/lvgl/src/lv_misc/lv_txt.h b/src/libs/lvgl/src/lv_misc/lv_txt.h deleted file mode 100644 index 6dbce5d4..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_txt.h +++ /dev/null @@ -1,211 +0,0 @@ -/** - * @file lv_text.h - * - */ - -#ifndef LV_TXT_H -#define LV_TXT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include <stdbool.h> -#include "lv_area.h" -#include "lv_area.h" -#include "../lv_font/lv_font.h" - -/********************* - * DEFINES - *********************/ -#ifndef LV_TXT_COLOR_CMD -#define LV_TXT_COLOR_CMD "#" -#endif - -#define LV_TXT_ENC_UTF8 1 -#define LV_TXT_ENC_ASCII 2 - -/********************** - * TYPEDEFS - **********************/ -/** - * Options for text rendering. - */ -enum { - LV_TXT_FLAG_NONE = 0x00, - LV_TXT_FLAG_RECOLOR = 0x01, /**< Enable parsing of recolor command*/ - LV_TXT_FLAG_EXPAND = 0x02, /**< Ignore width to avoid automatic word wrapping*/ - LV_TXT_FLAG_CENTER = 0x04, /**< Align the text to the middle*/ - LV_TXT_FLAG_RIGHT = 0x08, /**< Align the text to the right*/ -}; -typedef uint8_t lv_txt_flag_t; - -/** - * State machine for text renderer. */ -enum { - LV_TXT_CMD_STATE_WAIT, /**< Waiting for command*/ - LV_TXT_CMD_STATE_PAR, /**< Processing the parameter*/ - LV_TXT_CMD_STATE_IN, /**< Processing the command*/ -}; -typedef uint8_t lv_txt_cmd_state_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Get size of a text - * @param size_res pointer to a 'point_t' variable to store the result - * @param text pointer to a text - * @param font pinter to font of the text - * @param letter_space letter space of the text - * @param line_space line space of the text - * @param flags settings for the text from 'txt_flag_t' enum - * @param max_width max with of the text (break the lines to fit this size) Set CORD_MAX to avoid - * line breaks - */ -void lv_txt_get_size(lv_point_t * size_res, const char * text, const lv_font_t * font, lv_coord_t letter_space, - lv_coord_t line_space, lv_coord_t max_width, lv_txt_flag_t flag); - -/** - * Get the next line of text. Check line length and break chars too. - * @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 - * @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); - -/** - * Give the length of a text with a given font - * @param txt a '\0' terminate string - * @param length length of 'txt' in byte count and not characters (Á is 1 character but 2 bytes in - * UTF-8) - * @param font pointer to a font - * @param letter_space letter space - * @param flags settings for the text from 'txt_flag_t' enum - * @return length of a char_num long text - */ -lv_coord_t lv_txt_get_width(const char * txt, uint16_t length, const lv_font_t * font, lv_coord_t letter_space, - lv_txt_flag_t flag); - -/** - * Check next character in a string and decide if te character is part of the command or not - * @param state pointer to a txt_cmd_state_t variable which stores the current state of command - * processing - * @param c the current character - * @return true: the character is part of a command and should not be written, - * false: the character should be written - */ -bool lv_txt_is_cmd(lv_txt_cmd_state_t * state, uint32_t c); - -/** - * Insert a string into an other - * @param txt_buf the original text (must be big enough for the result text) - * @param pos position to insert (0: before the original text, 1: after the first char etc.) - * @param ins_txt text to insert - */ -void lv_txt_ins(char * txt_buf, uint32_t pos, const char * ins_txt); - -/** - * Delete a part of a string - * @param txt string to modify - * @param pos position where to start the deleting (0: before the first char, 1: after the first - * char etc.) - * @param len number of characters to delete - */ -void lv_txt_cut(char * txt, uint32_t pos, uint32_t len); - -/*************************************************************** - * GLOBAL FUNCTION POINTERS FOR CAHRACTER ENCODING INTERFACE - ***************************************************************/ - -/** - * Give the size of an encoded character - * @param str pointer to a character in a string - * @return length of the encoded character (1,2,3 ...). O in invalid - */ -extern uint8_t (*lv_txt_encoded_size)(const char *); - -/** - * Convert an Unicode letter to encoded - * @param letter_uni an Unicode letter - * @return Encoded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ü') - */ -extern uint32_t (*lv_txt_unicode_to_encoded)(uint32_t); - -/** - * Convert a wide character, e.g. 'Á' little endian to be compatible with the encoded format. - * @param c a wide character - * @return `c` in the encoded format - */ -extern uint32_t (*lv_txt_encoded_conv_wc)(uint32_t c); - -/** - * Decode the next encoded character from a string. - * @param txt pointer to '\0' terminated string - * @param i start index in 'txt' where to start. - * After the call it will point to the next encoded char in 'txt'. - * NULL to use txt[0] as index - * @return the decoded Unicode character or 0 on invalid data code - */ -extern uint32_t (*lv_txt_encoded_next)(const char *, uint32_t *); - -/** - * Get the previous encoded character form a string. - * @param txt pointer to '\0' terminated string - * @param i_start index in 'txt' where to start. After the call it will point to the previous - * encoded char in 'txt'. - * @return the decoded Unicode character or 0 on invalid data - */ -extern uint32_t (*lv_txt_encoded_prev)(const char *, uint32_t *); - -/** - * Convert a letter index (in an the encoded text) to byte index. - * E.g. in UTF-8 "AÁRT" index of 'R' is 2 but start at byte 3 because 'Á' is 2 bytes long - * @param txt a '\0' terminated UTF-8 string - * @param enc_id letter index - * @return byte index of the 'enc_id'th letter - */ -extern uint32_t (*lv_txt_encoded_get_byte_id)(const char *, uint32_t); - -/** - * Convert a byte index (in an encoded text) to character index. - * E.g. in UTF-8 "AÁRT" index of 'R' is 2 but start at byte 3 because 'Á' is 2 bytes long - * @param txt a '\0' terminated UTF-8 string - * @param byte_id byte index - * @return character index of the letter at 'byte_id'th position - */ -extern uint32_t (*lv_txt_encoded_get_char_id)(const char *, uint32_t); - -/** - * Get the number of characters (and NOT bytes) in a string. - * E.g. in UTF-8 "ÁBC" is 3 characters (but 4 bytes) - * @param txt a '\0' terminated char string - * @return number of characters - */ -extern uint32_t (*lv_txt_get_encoded_length)(const char *); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*USE_TXT*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_types.h b/src/libs/lvgl/src/lv_misc/lv_types.h deleted file mode 100644 index 2c28bca1..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_types.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @file lv_types.h - * - */ - -#ifndef LV_TYPES_H -#define LV_TYPES_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ - -/********************* - * 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 - **********************/ - -/** - * LittlevGL error codes. - */ -enum { - LV_RES_INV = 0, /*Typically indicates that the object is deleted (become invalid) in the action - function or an operation was failed*/ - LV_RES_OK, /*The object is valid (no deleted) after the action*/ -}; -typedef uint8_t lv_res_t; - -#ifdef LV_ARCH_64 -typedef uint64_t lv_uintptr_t; -#else -typedef uint32_t lv_uintptr_t; -#endif - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_TYPES_H*/ diff --git a/src/libs/lvgl/src/lv_misc/lv_utils.c b/src/libs/lvgl/src/lv_misc/lv_utils.c deleted file mode 100644 index 3f189560..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_utils.c +++ /dev/null @@ -1,115 +0,0 @@ -/** - * @file lv_utils.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include <stdbool.h> - -#include "lv_utils.h" -#include "lv_math.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Convert a number to string - * @param num a number - * @param buf pointer to a `char` buffer. The result will be stored here (max 10 elements) - * @return same as `buf` (just for convenience) - */ -char * lv_utils_num_to_str(int32_t num, char * buf) -{ - if(num == 0) { - buf[0] = '0'; - buf[1] = '\0'; - return buf; - } - int8_t digitCount = 0; - int8_t i = 0; - if(num < 0) { - buf[digitCount++] = '-'; - num = LV_MATH_ABS(num); - ++i; - } - while(num) { - char digit = num % 10; - buf[digitCount++] = digit + 48; - num /= 10; - } - buf[digitCount] = '\0'; - digitCount--; - while(digitCount > i) { - char temp = buf[i]; - buf[i] = buf[digitCount]; - buf[digitCount] = temp; - digitCount--; - i++; - } - return buf; -} - -/** Searches base[0] to base[n - 1] for an item that matches *key. - * - * @note The function cmp must return negative if its first - * argument (the search key) is less that its second (a table entry), - * zero if equal, and positive if greater. - * - * @note Items in the array must be in ascending order. - * - * @param key Pointer to item being searched for - * @param base Pointer to first element to search - * @param n Number of elements - * @param size Size of each element - * @param cmp Pointer to comparison function (see #lv_font_codeCompare as a comparison function - * example) - * - * @return a pointer to a matching item, or NULL if none exists. - */ -void * lv_utils_bsearch(const void * key, const void * base, uint32_t n, uint32_t size, - int32_t (*cmp)(const void * pRef, const void * pElement)) -{ - const char * middle; - int32_t c; - - for(middle = base; n != 0;) { - middle += (n / 2) * size; - if((c = (*cmp)(key, middle)) > 0) { - n = (n / 2) - ((n & 1) == 0); - base = (middle += size); - } else if(c < 0) { - n /= 2; - middle = base; - } else { - return (char *)middle; - } - } - return NULL; -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/libs/lvgl/src/lv_misc/lv_utils.h b/src/libs/lvgl/src/lv_misc/lv_utils.h deleted file mode 100644 index 6eed7950..00000000 --- a/src/libs/lvgl/src/lv_misc/lv_utils.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @file lv_utils.h - * - */ - -#ifndef LV_UTILS_H -#define LV_UTILS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#include <stdint.h> -#include <stddef.h> - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ -/** - * Convert a number to string - * @param num a number - * @param buf pointer to a `char` buffer. The result will be stored here (max 10 elements) - * @return same as `buf` (just for convenience) - */ -char * lv_utils_num_to_str(int32_t num, char * buf); - -/** Searches base[0] to base[n - 1] for an item that matches *key. - * - * @note The function cmp must return negative if its first - * argument (the search key) is less that its second (a table entry), - * zero if equal, and positive if greater. - * - * @note Items in the array must be in ascending order. - * - * @param key Pointer to item being searched for - * @param base Pointer to first element to search - * @param n Number of elements - * @param size Size of each element - * @param cmp Pointer to comparison function (see #lv_font_codeCompare as a comparison function - * example) - * - * @return a pointer to a matching item, or NULL if none exists. - */ -void * lv_utils_bsearch(const void * key, const void * base, uint32_t n, uint32_t size, - int32_t (*cmp)(const void * pRef, const void * pElement)); - -/********************** - * MACROS - **********************/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_arc.c b/src/libs/lvgl/src/lv_objx/lv_arc.c deleted file mode 100644 index e2146a84..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_arc.c +++ /dev/null @@ -1,305 +0,0 @@ -/** - * @file lv_arc.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_arc" - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_arc_design(lv_obj_t * arc, const lv_area_t * mask, lv_design_mode_t mode); -static lv_res_t lv_arc_signal(lv_obj_t * arc, lv_signal_t sign, void * param); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_design_cb_t ancestor_design; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a arc object - * @param par pointer to an object, it will be the parent of the new arc - * @param copy pointer to a arc object, if not NULL then the new object will be copied from it - * @return pointer to the created arc - */ -lv_obj_t * lv_arc_create(lv_obj_t * par, const lv_obj_t * copy) -{ - - LV_LOG_TRACE("arc create started"); - - /*Create the ancestor of arc*/ - lv_obj_t * new_arc = lv_obj_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) 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); - - /*Initialize the allocated 'ext' */ - ext->angle_start = 45; - ext->angle_end = 315; - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_arc, lv_arc_signal); - lv_obj_set_design_cb(new_arc, lv_arc_design); - - /*Init the new arc arc*/ - if(copy == NULL) { - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_arc_set_style(new_arc, LV_ARC_STYLE_MAIN, th->style.arc); - } else { - lv_arc_set_style(new_arc, LV_ARC_STYLE_MAIN, &lv_style_plain_color); - } - - } - /*Copy an existing arc*/ - else { - lv_arc_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->angle_start = copy_ext->angle_start; - ext->angle_end = copy_ext->angle_end; - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_arc); - } - - LV_LOG_INFO("arc created"); - - return new_arc; -} - -/*====================== - * Add/remove functions - *=====================*/ - -/* - * New object specific "add" or "remove" functions come here - */ - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the start and end angles of an arc. 0 deg: bottom, 90 deg: 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) -{ - 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; - - ext->angle_start = start; - ext->angle_end = end; - - lv_obj_invalidate(arc); -} - -/** - * Set a style of a arc. - * @param arc pointer to arc object - * @param type which style should be set - * @param style pointer to a style - * */ -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; - } -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the start angle of an arc. - * @param arc pointer to an arc object - * @return the start angle [0..360] - */ -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; -} - -/** - * Get the end angle of an arc. - * @param arc pointer to an arc object - * @return the end angle [0..360] - */ -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; -} - -/** - * Get style of a arc. - * @param arc pointer to arc object - * @param type which style should be get - * @return style pointer to the style - * */ -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) { - case LV_ARC_STYLE_MAIN: style = lv_obj_get_style(arc); break; - default: style = NULL; break; - } - - return style; -} - -/*===================== - * Other functions - *====================*/ - -/* - * New object specific "other" functions come here - */ - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_arc_design(lv_obj_t * arc, const lv_area_t * mask, 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; - } - /*Draw the object*/ - else if(mode == LV_DESIGN_DRAW_MAIN) { - lv_arc_ext_t * ext = lv_obj_get_ext_attr(arc); - const lv_style_t * style = lv_arc_get_style(arc, LV_ARC_STYLE_MAIN); - - lv_coord_t r = (LV_MATH_MIN(lv_obj_get_width(arc), lv_obj_get_height(arc))) / 2; - 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); - } - - } - /*Post draw when the children are drawn*/ - else if(mode == LV_DESIGN_DRAW_POST) { - } - - return true; -} - -/** - * Signal function of the arc - * @param arc pointer to a arc 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_arc_signal(lv_obj_t * arc, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* Include the ancient signal function */ - 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')*/ - } - - return res; -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_arc.h b/src/libs/lvgl/src/lv_objx/lv_arc.h deleted file mode 100644 index 8cc34d5f..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_arc.h +++ /dev/null @@ -1,123 +0,0 @@ -/** - * @file lv_arc.h - * - */ - -#ifndef LV_ARC_H -#define LV_ARC_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_ARC != 0 - -#include "../lv_core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -/*Data of arc*/ -typedef struct -{ - /*New data for this type */ - lv_coord_t angle_start; - lv_coord_t angle_end; -} lv_arc_ext_t; - -/*Styles*/ -enum { - LV_ARC_STYLE_MAIN, -}; -typedef uint8_t lv_arc_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a arc objects - * @param par pointer to an object, it will be the parent of the new arc - * @param copy pointer to a arc object, if not NULL then the new object will be copied from it - * @return pointer to the created arc - */ -lv_obj_t * lv_arc_create(lv_obj_t * par, const lv_obj_t * copy); - -/*====================== - * Add/remove functions - *=====================*/ - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the start and end angles of an arc. 0 deg: bottom, 90 deg: 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); - -/** - * Set a style of a arc. - * @param arc pointer to arc object - * @param type which style should be set - * @param style pointer to a style - * */ -void lv_arc_set_style(lv_obj_t * arc, lv_arc_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the start angle of an arc. - * @param arc pointer to an arc object - * @return the start angle [0..360] - */ -uint16_t lv_arc_get_angle_start(lv_obj_t * arc); - -/** - * Get the end angle of an arc. - * @param arc pointer to an arc object - * @return the end angle [0..360] - */ -uint16_t lv_arc_get_angle_end(lv_obj_t * arc); - -/** - * Get style of a arc. - * @param arc pointer to arc object - * @param type which style should be get - * @return style pointer to the style - * */ -const lv_style_t * lv_arc_get_style(const lv_obj_t * arc, lv_arc_style_t type); - -/*===================== - * Other functions - *====================*/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_ARC*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_ARC_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_bar.c b/src/libs/lvgl/src/lv_objx/lv_bar.c deleted file mode 100644 index 5faab91e..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_bar.c +++ /dev/null @@ -1,548 +0,0 @@ - - -/** - * @file lv_bar.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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 <stdio.h> - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_bar" - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_bar_design(lv_obj_t * bar, const lv_area_t * mask, lv_design_mode_t mode); -static lv_res_t lv_bar_signal(lv_obj_t * bar, lv_signal_t sign, void * param); - -#if LV_USE_ANIMATION -static void lv_bar_anim(void * bar, lv_anim_value_t value); -static void lv_bar_anim_ready(lv_anim_t * a); -#endif - -/********************** - * STATIC VARIABLES - **********************/ -static lv_design_cb_t ancestor_design_f; -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a bar objects - * @param par pointer to an object, it will be the parent of the new bar - * @param copy pointer to a bar object, if not NULL then the new object will be copied from it - * @return pointer to the created bar - */ -lv_obj_t * lv_bar_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("lv_bar create started"); - - /*Create the ancestor basic object*/ - lv_obj_t * new_bar = lv_obj_create(par, copy); - LV_ASSERT_MEM(new_bar); - if(new_bar == NULL) return NULL; - - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_bar); - if(ancestor_design_f == NULL) ancestor_design_f = lv_obj_get_design_cb(new_bar); - - /*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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - ext->min_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; -#endif - ext->sym = 0; - ext->style_indic = &lv_style_pretty_color; - - lv_obj_set_signal_cb(new_bar, lv_bar_signal); - lv_obj_set_design_cb(new_bar, lv_bar_design); - - /*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_bar_set_value(new_bar, ext->cur_value, false); - - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_bar_set_style(new_bar, LV_BAR_STYLE_BG, th->style.bar.bg); - lv_bar_set_style(new_bar, LV_BAR_STYLE_INDIC, th->style.bar.indic); - } else { - lv_obj_set_style(new_bar, &lv_style_pretty); - } - } else { - lv_bar_ext_t * ext_copy = lv_obj_get_ext_attr(copy); - ext->min_value = ext_copy->min_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; - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_bar); - - lv_bar_set_value(new_bar, ext->cur_value, false); - } - - LV_LOG_INFO("bar created"); - - return new_bar; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new value on the bar - * @param bar pointer to a bar object - * @param value new value - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediatelly - */ -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 - lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); - if(ext->cur_value == value) return; - - int16_t new_value; - new_value = value > ext->max_value ? ext->max_value : value; - new_value = new_value < ext->min_value ? ext->min_value : new_value; - - if(ext->cur_value == new_value) return; - - 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_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); -#endif - } -} - -/** - * Set minimum and the maximum values of a bar - * @param bar pointer to the bar object - * @param min minimum value - * @param max maximum value - */ -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(ext->cur_value > max) { - ext->cur_value = max; - lv_bar_set_value(bar, ext->cur_value, false); - } - if(ext->cur_value < min) { - ext->cur_value = min; - lv_bar_set_value(bar, ext->cur_value, false); - } - lv_obj_invalidate(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 - */ -void lv_bar_set_sym(lv_obj_t * bar, bool en) -{ - LV_ASSERT_OBJ(bar, LV_OBJX_NAME); - - lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); - ext->sym = en ? 1 : 0; -} - -/** - * Set the animation time of the bar - * @param bar pointer to a bar object - * @param anim_time the animation time in milliseconds. - */ -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; -#else - (void)bar; /*Unused*/ - (void)anim_time; /*Unused*/ -#endif -} - -/** - * Set a style of a bar - * @param bar pointer to a bar object - * @param type which style should be set - * @param style pointer to a style - */ -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) { - case LV_BAR_STYLE_BG: lv_obj_set_style(bar, style); break; - case LV_BAR_STYLE_INDIC: - ext->style_indic = style; - lv_obj_refresh_ext_draw_pad(bar); - break; - } -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the value of a bar - * @param bar pointer to a bar object - * @return the value of the bar - */ -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; -#endif - /*No animation, simple return the current value*/ - return ext->cur_value; -} - -/** - * Get the minimum value of a bar - * @param bar pointer to a bar object - * @return the minimum value of the 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; -} - -/** - * Get the maximum value of a bar - * @param bar pointer to a bar object - * @return the maximum value of the 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 - */ -bool lv_bar_get_sym(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; -} - -/** - * 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) -{ - 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; -#else - (void)bar; /*Unused*/ - return 0; -#endif -} - -/** - * Get a style of a bar - * @param bar pointer to a bar object - * @param type which style should be get - * @return style pointer to a style - */ -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); - - switch(type) { - case LV_BAR_STYLE_BG: style = lv_obj_get_style(bar); break; - case LV_BAR_STYLE_INDIC: style = ext->style_indic; break; - default: style = NULL; break; - } - - return style; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_bar_design(lv_obj_t * bar, const lv_area_t * mask, 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); - } 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); - - 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); - } -#endif - } - return true; -} - -/** - * Signal function of the bar - * @param bar pointer to a bar 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_bar_signal(lv_obj_t * bar, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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); - if(style_indic->body.shadow.width > bar->ext_draw_pad) bar->ext_draw_pad = style_indic->body.shadow.width; - } - - return res; -} - -#if LV_USE_ANIMATION -static void lv_bar_anim(void * bar, lv_anim_value_t value) -{ - lv_bar_ext_t * ext = lv_obj_get_ext_attr(bar); - ext->anim_state = value; - lv_obj_invalidate(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); -} -#endif - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_bar.h b/src/libs/lvgl/src/lv_objx/lv_bar.h deleted file mode 100644 index 9ffdbdd6..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_bar.h +++ /dev/null @@ -1,193 +0,0 @@ -/** - * @file lv_bar.h - * - */ - -#ifndef LV_BAR_H -#define LV_BAR_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_BAR != 0 - -#include "../lv_core/lv_obj.h" -#include "../lv_misc/lv_anim.h" -#include "lv_cont.h" -#include "lv_btn.h" -#include "lv_label.h" - -/********************* - * 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 - -LV_EXPORT_CONST_INT(LV_BAR_ANIM_STATE_START); -LV_EXPORT_CONST_INT(LV_BAR_ANIM_STATE_END); -LV_EXPORT_CONST_INT(LV_BAR_ANIM_STATE_INV); -LV_EXPORT_CONST_INT(LV_BAR_ANIM_STATE_NORM); - -/********************** - * TYPEDEFS - **********************/ - -/** Data of bar*/ -typedef struct -{ - /*No inherited ext, derived from the base object */ - - /*New data for this type */ - 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*/ -#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; -#endif - uint8_t sym : 1; /*Symmetric: means the center is around zero value*/ - const lv_style_t * style_indic; /*Style of the indicator*/ -} lv_bar_ext_t; - -/** Bar styles. */ -enum { - LV_BAR_STYLE_BG, /** Bar background style. */ - LV_BAR_STYLE_INDIC, /** Bar fill area style. */ -}; -typedef uint8_t lv_bar_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a bar objects - * @param par pointer to an object, it will be the parent of the new bar - * @param copy pointer to a bar object, if not NULL then the new object will be copied from it - * @return pointer to the created bar - */ -lv_obj_t * lv_bar_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new value on the bar - * @param bar pointer to a bar object - * @param value new value - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -void lv_bar_set_value(lv_obj_t * bar, int16_t value, lv_anim_enable_t anim); - -/** - * Set minimum and the maximum values of a bar - * @param bar pointer to the bar object - * @param min minimum value - * @param max maximum value - */ -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 - */ -void lv_bar_set_sym(lv_obj_t * bar, bool en); - -/** - * Set the animation time of the bar - * @param bar pointer to a bar object - * @param anim_time the animation time in milliseconds. - */ -void lv_bar_set_anim_time(lv_obj_t * bar, uint16_t anim_time); - -/** - * Set a style of a bar - * @param bar pointer to a bar object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_bar_set_style(lv_obj_t * bar, lv_bar_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the value of a bar - * @param bar pointer to a bar object - * @return the value of the bar - */ -int16_t lv_bar_get_value(const lv_obj_t * bar); - -/** - * Get the minimum value of a bar - * @param bar pointer to a bar object - * @return the minimum value of the bar - */ -int16_t lv_bar_get_min_value(const lv_obj_t * bar); - -/** - * Get the maximum value of a bar - * @param bar pointer to a bar object - * @return the maximum value of the 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 - */ -bool lv_bar_get_sym(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); - -/** - * Get a style of a bar - * @param bar pointer to a bar object - * @param type which style should be get - * @return style pointer to a style - */ -const lv_style_t * lv_bar_get_style(const lv_obj_t * bar, lv_bar_style_t type); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_BAR*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_BAR_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_btn.c b/src/libs/lvgl/src/lv_objx/lv_btn.c deleted file mode 100644 index 4cfe9527..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_btn.c +++ /dev/null @@ -1,723 +0,0 @@ -/** - * @file lv_btn.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_btn.h" -#if LV_USE_BTN != 0 - -#include <string.h> -#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" -#include "../lv_misc/lv_color.h" -#include "../lv_misc/lv_math.h" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_btn" -#define LV_BTN_INK_VALUE_MAX 256 -#define LV_BTN_INK_VALUE_MAX_SHIFT 8 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_btn_design(lv_obj_t * btn, const lv_area_t * mask, 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 -static void lv_btn_ink_effect_anim(lv_obj_t * btn, lv_anim_value_t val); -static void lv_btn_ink_effect_anim_ready(lv_anim_t * a); -#endif - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_design_cb_t ancestor_design; - -#if LV_USE_ANIMATION && LV_BTN_INK_EFFECT -static lv_coord_t ink_act_value; -static lv_obj_t * ink_obj; -static lv_btn_state_t ink_bg_state; -static lv_btn_state_t ink_top_state; -static bool ink_ready; -static bool ink_playback; -static lv_point_t ink_point; -#endif - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a button object - * @param par pointer to an object, it will be the parent of the new button - * @param copy pointer to a button object, if not NULL then the new object will be copied from it - * @return pointer to the created button - */ -lv_obj_t * lv_btn_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("button create started"); - - lv_obj_t * new_btn; - - new_btn = lv_cont_create(par, copy); - LV_ASSERT_MEM(new_btn); - if(new_btn == NULL) return NULL; - - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_btn); - if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_btn); - - /*Allocate the extended data*/ - lv_btn_ext_t * ext = lv_obj_allocate_ext_attr(new_btn, sizeof(lv_btn_ext_t)); - LV_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - ext->state = LV_BTN_STATE_REL; - - ext->styles[LV_BTN_STATE_REL] = &lv_style_btn_rel; - ext->styles[LV_BTN_STATE_PR] = &lv_style_btn_pr; - ext->styles[LV_BTN_STATE_TGL_REL] = &lv_style_btn_tgl_rel; - ext->styles[LV_BTN_STATE_TGL_PR] = &lv_style_btn_tgl_pr; - ext->styles[LV_BTN_STATE_INA] = &lv_style_btn_ina; - - ext->toggle = 0; -#if LV_USE_ANIMATION && LV_BTN_INK_EFFECT - ext->ink_in_time = 0; - ext->ink_wait_time = 0; - ext->ink_out_time = 0; -#endif - - lv_obj_set_signal_cb(new_btn, lv_btn_signal); - lv_obj_set_design_cb(new_btn, lv_btn_design); - - /*If no copy do the basic initialization*/ - if(copy == NULL) { - /*Set layout if the button is not a screen*/ - if(par != NULL) { - lv_btn_set_layout(new_btn, LV_LAYOUT_CENTER); - } - - lv_obj_set_click(new_btn, true); /*Be sure the button is clickable*/ - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_btn_set_style(new_btn, LV_BTN_STYLE_REL, th->style.btn.rel); - lv_btn_set_style(new_btn, LV_BTN_STYLE_PR, th->style.btn.pr); - lv_btn_set_style(new_btn, LV_BTN_STYLE_TGL_REL, th->style.btn.tgl_rel); - lv_btn_set_style(new_btn, LV_BTN_STYLE_TGL_PR, th->style.btn.tgl_pr); - lv_btn_set_style(new_btn, LV_BTN_STYLE_INA, th->style.btn.ina); - } else { - lv_obj_set_style(new_btn, ext->styles[LV_BTN_STATE_REL]); - } - } - /*Copy 'copy'*/ - else { - lv_btn_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->state = copy_ext->state; - ext->toggle = copy_ext->toggle; -#if LV_USE_ANIMATION && LV_BTN_INK_EFFECT - ext->ink_in_time = copy_ext->ink_in_time; - ext->ink_wait_time = copy_ext->ink_wait_time; - ext->ink_out_time = copy_ext->ink_out_time; -#endif - memcpy((void*) ext->styles, copy_ext->styles, sizeof(ext->styles)); - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_btn); - } - - LV_LOG_INFO("button created"); - - return new_btn; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Enable the toggled states - * @param btn pointer to a button object - * @param tgl true: enable toggled states, false: disable - */ -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; -} - -/** - * Set the state of the button - * @param btn pointer to a button object - * @param state the new state of the button (from lv_btn_state_t enum) - */ -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; - lv_obj_set_style(btn, ext->styles[state]); - } -} - -/** - * Toggle the state of the button (ON->OFF, OFF->ON) - * @param btn pointer to a button object - */ -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; - case LV_BTN_STATE_PR: lv_btn_set_state(btn, LV_BTN_STATE_TGL_PR); break; - case LV_BTN_STATE_TGL_REL: lv_btn_set_state(btn, LV_BTN_STATE_REL); break; - case LV_BTN_STATE_TGL_PR: lv_btn_set_state(btn, LV_BTN_STATE_PR); break; - default: break; - } -} - -/** - * Set time of the ink effect (draw a circle on click to animate in the new state) - * @param btn pointer to a button object - * @param time the time of the ink animation - */ -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; -#else - (void)btn; /*Unused*/ - (void)time; /*Unused*/ - LV_LOG_WARN("`lv_btn_set_ink_ink_time` has no effect if LV_BTN_INK_EFEFCT or LV_USE_ANIMATION " - "is disabled") -#endif -} - -/** - * Set the wait time before the ink disappears - * @param btn pointer to a button object - * @param time the time of the ink animation - */ -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); - ext->ink_wait_time = time; -#else - (void)btn; /*Unused*/ - (void)time; /*Unused*/ - LV_LOG_WARN("`lv_btn_set_ink_wait_time` has no effect if LV_BTN_INK_EFEFCT or LV_USE_ANIMATION " - "is disabled") -#endif -} - -/** - * Set time of the ink out effect (animate to the released state) - * @param btn pointer to a button object - * @param time the time of the ink animation - */ -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; -#else - (void)btn; /*Unused*/ - (void)time; /*Unused*/ - LV_LOG_WARN("`lv_btn_set_ink_out_time` has no effect if LV_BTN_INK_EFEFCT or LV_USE_ANIMATION " - "is disabled") -#endif -} - -/** - * Set a style of a button - * @param btn pointer to a button object - * @param type which style should be set - * @param style pointer to a style - */ -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) { - case LV_BTN_STYLE_REL: ext->styles[LV_BTN_STATE_REL] = style; break; - case LV_BTN_STYLE_PR: ext->styles[LV_BTN_STATE_PR] = style; break; - case LV_BTN_STYLE_TGL_REL: ext->styles[LV_BTN_STATE_TGL_REL] = style; break; - case LV_BTN_STYLE_TGL_PR: ext->styles[LV_BTN_STATE_TGL_PR] = style; break; - case LV_BTN_STYLE_INA: ext->styles[LV_BTN_STATE_INA] = style; break; - } - - /*Refresh the object with the new style*/ - lv_obj_set_style(btn, ext->styles[ext->state]); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the current state of the button - * @param btn pointer to a button object - * @return the state of the button (from lv_btn_state_t enum) - */ -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; -} - -/** - * Get the toggle enable attribute of the button - * @param btn pointer to a button object - * @return true: toggle enabled, false: disabled - */ -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; -} - -/** - * Get time of the ink in effect (draw a circle on click to animate in the new state) - * @param btn pointer to a button object - * @return the time of the ink animation - */ -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; -#else - (void)btn; /*Unused*/ - return 0; -#endif -} - -/** - * Get the wait time before the ink disappears - * @param btn pointer to a button object - * @return the time of the ink animation - */ -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; -#else - (void)btn; /*Unused*/ - return 0; -#endif -} -/** - * Get time of the ink out effect (animate to the releases state) - * @param btn pointer to a button object - * @return the time of the ink animation - */ -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_out_time; -#else - (void)btn; /*Unused*/ - return 0; -#endif -} - -/** - * Get a style of a button - * @param btn pointer to a button object - * @param type which style should be get - * @return style pointer to a style - */ -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); - - /* If the style of the current state is asked then return object style. - * If the button is focused then this style is updated by the group's - * `style_mod_cb` function */ - if((type == LV_BTN_STYLE_REL && state == LV_BTN_STATE_REL) || - (type == LV_BTN_STYLE_PR && state == LV_BTN_STATE_PR) || - (type == LV_BTN_STYLE_TGL_REL && state == LV_BTN_STATE_TGL_REL) || - (type == LV_BTN_STYLE_TGL_PR && state == LV_BTN_STATE_TGL_PR) || - (type == LV_BTN_STYLE_INA && state == LV_BTN_STATE_INA)) { - - style = lv_obj_get_style(btn); - } else { - switch(type) { - case LV_BTN_STYLE_REL: style = ext->styles[LV_BTN_STATE_REL]; break; - case LV_BTN_STYLE_PR: style = ext->styles[LV_BTN_STATE_PR]; break; - case LV_BTN_STYLE_TGL_REL: style = ext->styles[LV_BTN_STATE_TGL_REL]; break; - case LV_BTN_STYLE_TGL_PR: style = ext->styles[LV_BTN_STATE_TGL_PR]; break; - case LV_BTN_STYLE_INA: style = ext->styles[LV_BTN_STATE_INA]; break; - default: style = NULL; break; - } - } - - return style; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Handle the drawing related tasks of the drop down lists - * @param btn 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 - * @param return true/false, depends on 'mode' - */ -static bool lv_btn_design(lv_obj_t * btn, const lv_area_t * mask, lv_design_mode_t mode) -{ - if(mode == LV_DESIGN_COVER_CHK) { - return false; - } else if(mode == LV_DESIGN_DRAW_MAIN) { - -#if LV_USE_ANIMATION && LV_BTN_INK_EFFECT - if(btn != ink_obj) { - ancestor_design(btn, mask, mode); - } else { - lv_opa_t opa_scale = lv_obj_get_opa_scale(btn); - lv_btn_ext_t * ext = lv_obj_get_ext_attr(btn); - - /*Draw the normal button*/ - if(ink_playback == false) { - 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_coord_t w = lv_obj_get_width(btn); - lv_coord_t h = lv_obj_get_height(btn); - lv_coord_t r_max = LV_MATH_MIN(w, h) / 2; - - /*In the first part of the animation increase the size of the circle (ink effect) */ - lv_area_t cir_area; - - lv_coord_t coord_state = - ink_act_value < LV_BTN_INK_VALUE_MAX / 2 ? ink_act_value : LV_BTN_INK_VALUE_MAX / 2; - lv_point_t p_act; - p_act.x = ink_point.x; - p_act.y = ink_point.y; - lv_coord_t x_err = (btn->coords.x1 + w / 2) - p_act.x; - lv_coord_t y_err = (btn->coords.y1 + h / 2) - p_act.y; - - p_act.x += (x_err * coord_state) >> (LV_BTN_INK_VALUE_MAX_SHIFT - 1); - p_act.y += (y_err * coord_state) >> (LV_BTN_INK_VALUE_MAX_SHIFT - 1); - - lv_coord_t half_side = LV_MATH_MAX(w, h) / 2; - cir_area.x1 = p_act.x - ((half_side * coord_state) >> (LV_BTN_INK_VALUE_MAX_SHIFT - 1)); - cir_area.y1 = p_act.y - ((half_side * coord_state) >> (LV_BTN_INK_VALUE_MAX_SHIFT - 1)); - cir_area.x2 = p_act.x + ((half_side * coord_state) >> (LV_BTN_INK_VALUE_MAX_SHIFT - 1)); - cir_area.y2 = p_act.y + ((half_side * coord_state) >> (LV_BTN_INK_VALUE_MAX_SHIFT - 1)); - - lv_area_intersect(&cir_area, &btn->coords, - &cir_area); /*Limit the area. (It might be too big on the smaller side)*/ - - /*In the second part animate the radius. Circle -> body.radius*/ - lv_coord_t r_state = - ink_act_value > LV_BTN_INK_VALUE_MAX / 2 ? ink_act_value - LV_BTN_INK_VALUE_MAX / 2 : 0; - - lv_style_copy(&style_tmp, ext->styles[ink_top_state]); - style_tmp.body.radius = r_max + (((ext->styles[ink_bg_state]->body.radius - r_max) * r_state) >> - (LV_BTN_INK_VALUE_MAX_SHIFT - 1)); - style_tmp.body.border.width = 0; - - /*Draw the circle*/ - lv_draw_rect(&cir_area, mask, &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); - } - } -#else - ancestor_design(btn, mask, mode); -#endif - } else if(mode == LV_DESIGN_DRAW_POST) { - ancestor_design(btn, mask, mode); - } - - return true; -} - -/** - * Signal function of the button - * @param btn pointer to a button 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_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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); - - if(sign == LV_SIGNAL_PRESSED) { - /*Refresh the state*/ - if(ext->state == LV_BTN_STATE_REL) { - lv_btn_set_state(btn, LV_BTN_STATE_PR); -#if LV_USE_ANIMATION && LV_BTN_INK_EFFECT - ink_bg_state = LV_BTN_STATE_REL; - ink_top_state = LV_BTN_STATE_PR; -#endif - } else if(ext->state == LV_BTN_STATE_TGL_REL) { - lv_btn_set_state(btn, LV_BTN_STATE_TGL_PR); -#if LV_USE_ANIMATION && LV_BTN_INK_EFFECT - ink_bg_state = LV_BTN_STATE_TGL_REL; - ink_top_state = LV_BTN_STATE_TGL_PR; -#endif - } - -#if LV_USE_ANIMATION && LV_BTN_INK_EFFECT - /*Forget the old inked button*/ - if(ink_obj != NULL && ink_obj != btn) { - lv_anim_del(ink_obj, (lv_anim_exec_xcb_t)lv_btn_ink_effect_anim); - lv_obj_invalidate(ink_obj); - ink_obj = NULL; - } - /*Save the new data for inking and start it's animation if enabled*/ - if(ext->ink_in_time > 0) { - ink_obj = btn; - ink_playback = false; - ink_ready = false; - lv_indev_get_point(lv_indev_get_act(), &ink_point); - - lv_anim_t a; - a.var = btn; - a.start = 0; - a.end = LV_BTN_INK_VALUE_MAX; - a.exec_cb = (lv_anim_exec_xcb_t)lv_btn_ink_effect_anim; - a.path_cb = lv_anim_path_linear; - a.ready_cb = lv_btn_ink_effect_anim_ready; - a.act_time = 0; - a.time = ext->ink_in_time; - a.playback = 0; - a.playback_pause = 0; - a.repeat = 0; - a.repeat_pause = 0; - lv_anim_create(&a); - } -#endif - } else if(sign == LV_SIGNAL_PRESS_LOST) { - /*Refresh the state*/ - if(ext->state == LV_BTN_STATE_PR) - lv_btn_set_state(btn, LV_BTN_STATE_REL); - else if(ext->state == LV_BTN_STATE_TGL_PR) - lv_btn_set_state(btn, LV_BTN_STATE_TGL_REL); - } else if(sign == LV_SIGNAL_PRESSING) { - /*When the button begins to drag revert pressed states to released*/ - if(lv_indev_is_dragging(param) != false) { - if(ext->state == LV_BTN_STATE_PR) - lv_btn_set_state(btn, LV_BTN_STATE_REL); - else if(ext->state == LV_BTN_STATE_TGL_PR) - lv_btn_set_state(btn, LV_BTN_STATE_TGL_REL); - } - } else if(sign == LV_SIGNAL_RELEASED) { - /*If not dragged and it was not long press action then - *change state and run the action*/ - if(lv_indev_is_dragging(param) == false) { - uint32_t toggled = 0; - if(ext->state == LV_BTN_STATE_PR && tgl == false) { - lv_btn_set_state(btn, LV_BTN_STATE_REL); - toggled = 0; - } else if(ext->state == LV_BTN_STATE_TGL_PR && tgl == false) { - lv_btn_set_state(btn, LV_BTN_STATE_TGL_REL); - toggled = 1; - } else if(ext->state == LV_BTN_STATE_PR && tgl == true) { - lv_btn_set_state(btn, LV_BTN_STATE_TGL_REL); - toggled = 1; - } else if(ext->state == LV_BTN_STATE_TGL_PR && tgl == true) { - lv_btn_set_state(btn, LV_BTN_STATE_REL); - toggled = 0; - } - - if(tgl) { - res = lv_event_send(btn, LV_EVENT_VALUE_CHANGED, &toggled); - if(res != LV_RES_OK) return res; - } - - } else { /*If dragged change back the state*/ - if(ext->state == LV_BTN_STATE_PR) { - lv_btn_set_state(btn, LV_BTN_STATE_REL); - } else if(ext->state == LV_BTN_STATE_TGL_PR) { - lv_btn_set_state(btn, LV_BTN_STATE_TGL_REL); - } - } - -#if LV_USE_ANIMATION && LV_BTN_INK_EFFECT - /*Draw the toggled state in the inking instead*/ - if(ext->toggle) { - ink_top_state = ext->state; - } - /*If not a toggle button and the "IN" inking is ready then start an "OUT" inking*/ - else if(ink_ready && ext->ink_out_time > 0) { - ink_obj = btn; - ink_playback = true; /*It is the playback. If not set `lv_btn_ink_effect_anim_ready` - will start its own playback*/ - lv_indev_get_point(lv_indev_get_act(), &ink_point); - - lv_anim_t a; - a.var = ink_obj; - a.start = LV_BTN_INK_VALUE_MAX; - a.end = 0; - a.exec_cb = (lv_anim_exec_xcb_t)lv_btn_ink_effect_anim; - a.path_cb = lv_anim_path_linear; - a.ready_cb = lv_btn_ink_effect_anim_ready; - a.act_time = 0; - a.time = ext->ink_out_time; - a.playback = 0; - a.playback_pause = 0; - a.repeat = 0; - a.repeat_pause = 0; - lv_anim_create(&a); - } -#endif - } else if(sign == LV_SIGNAL_CONTROL) { - char c = *((char *)param); - if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { - if(lv_btn_get_toggle(btn)) { - lv_btn_set_state(btn, LV_BTN_STATE_TGL_REL); - - uint32_t state = 1; - res = lv_event_send(btn, LV_EVENT_VALUE_CHANGED, &state); - if(res != LV_RES_OK) return res; - } - - } else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { - if(lv_btn_get_toggle(btn)) { - lv_btn_set_state(btn, LV_BTN_STATE_REL); - - uint32_t state = 0; - res = lv_event_send(btn, LV_EVENT_VALUE_CHANGED, &state); - if(res != LV_RES_OK) return res; - } - } - } else if(sign == LV_SIGNAL_CLEANUP) { -#if LV_USE_ANIMATION && LV_BTN_INK_EFFECT - if(btn == ink_obj) { - lv_anim_del(ink_obj, (lv_anim_exec_xcb_t)lv_btn_ink_effect_anim); - ink_obj = NULL; - } -#endif - } - - return res; -} - -#if LV_USE_ANIMATION && LV_BTN_INK_EFFECT - -/** - * The animator function of inking. CAlled to increase the radius of ink - * @param btn pointer to the animated button - * @param val the new radius - */ -static void lv_btn_ink_effect_anim(lv_obj_t * btn, lv_anim_value_t val) -{ - if(btn) { - ink_act_value = val; - lv_obj_invalidate(btn); - } -} - -/** - * Called to clean up when the ink animation is ready - * @param a unused - */ -static void lv_btn_ink_effect_anim_ready(lv_anim_t * a) -{ - (void)a; /*Unused*/ - - lv_btn_ext_t * ext = lv_obj_get_ext_attr(ink_obj); - lv_btn_state_t state = lv_btn_get_state(ink_obj); - - lv_obj_invalidate(ink_obj); - ink_ready = true; - - if((state == LV_BTN_STATE_REL || state == LV_BTN_STATE_TGL_REL) && ext->toggle == 0 && ink_playback == false) { - lv_anim_t new_a; - new_a.var = ink_obj; - new_a.start = LV_BTN_INK_VALUE_MAX; - new_a.end = 0; - new_a.exec_cb = (lv_anim_exec_xcb_t)lv_btn_ink_effect_anim; - new_a.path_cb = lv_anim_path_linear; - new_a.ready_cb = lv_btn_ink_effect_anim_ready; - new_a.act_time = -ext->ink_wait_time; - new_a.time = ext->ink_out_time; - new_a.playback = 0; - new_a.playback_pause = 0; - new_a.repeat = 0; - new_a.repeat_pause = 0; - lv_anim_create(&new_a); - - ink_playback = true; - } else { - ink_obj = NULL; - } -} -#endif /*LV_USE_ANIMATION*/ - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_btn.h b/src/libs/lvgl/src/lv_objx/lv_btn.h deleted file mode 100644 index f7bd85fa..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_btn.h +++ /dev/null @@ -1,329 +0,0 @@ -/** - * @file lv_btn.h - * - */ - -#ifndef LV_BTN_H -#define LV_BTN_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_BTN != 0 - -/*Testing of dependencies*/ -#if LV_USE_CONT == 0 -#error "lv_btn: lv_cont is required. Enable it in lv_conf.h (LV_USE_CONT 1) " -#endif - -#include "lv_cont.h" -#include "../lv_core/lv_indev.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Possible states of a button. - * It can be used not only by buttons but other button-like objects too*/ -enum { - /**Released*/ - LV_BTN_STATE_REL, - - /**Pressed*/ - LV_BTN_STATE_PR, - - /**Toggled released*/ - LV_BTN_STATE_TGL_REL, - - /**Toggled pressed*/ - LV_BTN_STATE_TGL_PR, - - /**Inactive*/ - LV_BTN_STATE_INA, - - /**Number of states*/ - _LV_BTN_STATE_NUM, -}; -typedef uint8_t lv_btn_state_t; - -/** Extended data of button*/ -typedef struct -{ - /** Ext. of ancestor*/ - lv_cont_ext_t cont; - - /*New data for this type */ - - /**Styles in each state*/ - const lv_style_t * styles[_LV_BTN_STATE_NUM]; -#if LV_BTN_INK_EFFECT - /** [ms] Time of ink fill effect (0: disable ink effect)*/ - uint16_t ink_in_time; - - /** [ms] Wait before the ink disappears */ - uint16_t ink_wait_time; - - /** [ms] Time of ink disappearing*/ - uint16_t ink_out_time; -#endif - - /** Current state of the button from 'lv_btn_state_t' enum*/ - lv_btn_state_t state : 3; - - /** 1: Toggle enabled*/ - uint8_t toggle : 1; -} lv_btn_ext_t; - -/**Styles*/ -enum { - /** Release style */ - LV_BTN_STYLE_REL, - - /**Pressed style*/ - LV_BTN_STYLE_PR, - - /** Toggle released style*/ - LV_BTN_STYLE_TGL_REL, - - /** Toggle pressed style */ - LV_BTN_STYLE_TGL_PR, - - /** Inactive style*/ - LV_BTN_STYLE_INA, -}; -typedef uint8_t lv_btn_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a button object - * @param par pointer to an object, it will be the parent of the new button - * @param copy pointer to a button object, if not NULL then the new object will be copied from it - * @return pointer to the created button - */ -lv_obj_t * lv_btn_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Enable the toggled states. On release the button will change from/to toggled state. - * @param btn pointer to a button object - * @param tgl true: enable toggled states, false: disable - */ -void lv_btn_set_toggle(lv_obj_t * btn, bool tgl); - -/** - * Set the state of the button - * @param btn pointer to a button object - * @param state the new state of the button (from lv_btn_state_t enum) - */ -void lv_btn_set_state(lv_obj_t * btn, lv_btn_state_t state); - -/** - * Toggle the state of the button (ON->OFF, OFF->ON) - * @param btn pointer to a button object - */ -void lv_btn_toggle(lv_obj_t * btn); - -/** - * Set the layout on a button - * @param btn pointer to a button object - * @param layout a layout from 'lv_cont_layout_t' - */ -static inline void lv_btn_set_layout(lv_obj_t * btn, lv_layout_t layout) -{ - lv_cont_set_layout(btn, layout); -} - -/** - * Set the fit policy in all 4 directions separately. - * It tells how to change the button size automatically. - * @param btn pointer to a button object - * @param left left fit policy from `lv_fit_t` - * @param right right fit policy from `lv_fit_t` - * @param top top fit policy from `lv_fit_t` - * @param bottom bottom fit policy from `lv_fit_t` - */ -static inline void lv_btn_set_fit4(lv_obj_t * btn, lv_fit_t left, lv_fit_t right, lv_fit_t top, lv_fit_t bottom) -{ - lv_cont_set_fit4(btn, left, right, top, bottom); -} - -/** - * Set the fit policy horizontally and vertically separately. - * It tells how to change the button size automatically. - * @param btn pointer to a button object - * @param hor horizontal fit policy from `lv_fit_t` - * @param ver vertical fit policy from `lv_fit_t` - */ -static inline void lv_btn_set_fit2(lv_obj_t * btn, lv_fit_t hor, lv_fit_t ver) -{ - lv_cont_set_fit2(btn, hor, ver); -} - -/** - * Set the fit policy in all 4 direction at once. - * It tells how to change the button size automatically. - * @param btn pointer to a button object - * @param fit fit policy from `lv_fit_t` - */ -static inline void lv_btn_set_fit(lv_obj_t * btn, lv_fit_t fit) -{ - lv_cont_set_fit(btn, fit); -} - -/** - * Set time of the ink effect (draw a circle on click to animate in the new state) - * @param btn pointer to a button object - * @param time the time of the ink animation - */ -void lv_btn_set_ink_in_time(lv_obj_t * btn, uint16_t time); - -/** - * Set the wait time before the ink disappears - * @param btn pointer to a button object - * @param time the time of the ink animation - */ -void lv_btn_set_ink_wait_time(lv_obj_t * btn, uint16_t time); - -/** - * Set time of the ink out effect (animate to the released state) - * @param btn pointer to a button object - * @param time the time of the ink animation - */ -void lv_btn_set_ink_out_time(lv_obj_t * btn, uint16_t time); - -/** - * Set a style of a button. - * @param btn pointer to button object - * @param type which style should be set - * @param style pointer to a style - * */ -void lv_btn_set_style(lv_obj_t * btn, lv_btn_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the current state of the button - * @param btn pointer to a button object - * @return the state of the button (from lv_btn_state_t enum) - */ -lv_btn_state_t lv_btn_get_state(const lv_obj_t * btn); - -/** - * Get the toggle enable attribute of the button - * @param btn pointer to a button object - * @return true: toggle enabled, false: disabled - */ -bool lv_btn_get_toggle(const lv_obj_t * btn); - -/** - * Get the layout of a button - * @param btn pointer to button object - * @return the layout from 'lv_cont_layout_t' - */ -static inline lv_layout_t lv_btn_get_layout(const lv_obj_t * btn) -{ - return lv_cont_get_layout(btn); -} - -/** - * Get the left fit mode - * @param btn pointer to a button object - * @return an element of `lv_fit_t` - */ -static inline lv_fit_t lv_btn_get_fit_left(const lv_obj_t * btn) -{ - return lv_cont_get_fit_left(btn); -} - -/** - * Get the right fit mode - * @param btn pointer to a button object - * @return an element of `lv_fit_t` - */ -static inline lv_fit_t lv_btn_get_fit_right(const lv_obj_t * btn) -{ - return lv_cont_get_fit_right(btn); -} - -/** - * Get the top fit mode - * @param btn pointer to a button object - * @return an element of `lv_fit_t` - */ -static inline lv_fit_t lv_btn_get_fit_top(const lv_obj_t * btn) -{ - return lv_cont_get_fit_top(btn); -} - -/** - * Get the bottom fit mode - * @param btn pointer to a button object - * @return an element of `lv_fit_t` - */ -static inline lv_fit_t lv_btn_get_fit_bottom(const lv_obj_t * btn) -{ - return lv_cont_get_fit_bottom(btn); -} - -/** - * Get time of the ink in effect (draw a circle on click to animate in the new state) - * @param btn pointer to a button object - * @return the time of the ink animation - */ -uint16_t lv_btn_get_ink_in_time(const lv_obj_t * btn); - -/** - * Get the wait time before the ink disappears - * @param btn pointer to a button object - * @return the time of the ink animation - */ -uint16_t lv_btn_get_ink_wait_time(const lv_obj_t * btn); - -/** - * Get time of the ink out effect (animate to the releases state) - * @param btn pointer to a button object - * @return the time of the ink animation - */ -uint16_t lv_btn_get_ink_out_time(const lv_obj_t * btn); - -/** - * Get style of a button. - * @param btn pointer to button object - * @param type which style should be get - * @return style pointer to the style - * */ -const lv_style_t * lv_btn_get_style(const lv_obj_t * btn, lv_btn_style_t type); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_BUTTON*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_BTN_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_btnm.c b/src/libs/lvgl/src/lv_objx/lv_btnm.c deleted file mode 100644 index d8d5f700..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_btnm.c +++ /dev/null @@ -1,1125 +0,0 @@ -/** - * @file lv_btnm.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" -#include "../lv_themes/lv_theme.h" -#include "../lv_misc/lv_txt.h" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_btnm" - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * 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 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); -static bool button_is_inactive(lv_btnm_ctrl_t ctrl_bits); -static bool button_is_click_trig(lv_btnm_ctrl_t ctrl_bits); -static bool button_is_tgl_enabled(lv_btnm_ctrl_t ctrl_bits); -static bool button_get_tgl_state(lv_btnm_ctrl_t ctrl_bits); -static uint16_t get_button_from_point(lv_obj_t * btnm, lv_point_t * p); -static void allocate_btn_areas_and_controls(const lv_obj_t * btnm, const char ** map); -static void invalidate_button_area(const lv_obj_t * btnm, uint16_t btn_idx); -static bool maps_are_identical(const char ** map1, const char ** map2); -static void make_one_button_toggled(lv_obj_t * btnm, uint16_t btn_idx); - -/********************** - * STATIC VARIABLES - **********************/ -static const char * lv_btnm_def_map[] = {"Btn1", "Btn2", "Btn3", "\n", "Btn4", "Btn5", ""}; - -static lv_design_cb_t ancestor_design_f; -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a button matrix objects - * @param par pointer to an object, it will be the parent of the new button matrix - * @param copy pointer to a button matrix object, if not NULL then the new object will be copied - * from it - * @return pointer to the created button matrix - */ -lv_obj_t * lv_btnm_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("button matrix create started"); - - /*Create the ancestor object*/ - lv_obj_t * new_btnm = lv_obj_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - ext->btn_cnt = 0; - ext->btn_id_pr = LV_BTNM_BTN_NONE; - ext->btn_id_act = LV_BTNM_BTN_NONE; - ext->button_areas = NULL; - ext->ctrl_bits = NULL; - ext->map_p = NULL; - ext->recolor = 0; - ext->one_toggle = 0; - ext->styles_btn[LV_BTN_STATE_REL] = &lv_style_btn_rel; - ext->styles_btn[LV_BTN_STATE_PR] = &lv_style_btn_pr; - ext->styles_btn[LV_BTN_STATE_TGL_REL] = &lv_style_btn_tgl_rel; - ext->styles_btn[LV_BTN_STATE_TGL_PR] = &lv_style_btn_tgl_pr; - ext->styles_btn[LV_BTN_STATE_INA] = &lv_style_btn_ina; - - if(ancestor_design_f == NULL) ancestor_design_f = lv_obj_get_design_cb(new_btnm); - - lv_obj_set_signal_cb(new_btnm, lv_btnm_signal); - lv_obj_set_design_cb(new_btnm, lv_btnm_design); - - /*Init the new button matrix object*/ - if(copy == NULL) { - 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(); - if(th) { - lv_btnm_set_style(new_btnm, LV_BTNM_STYLE_BG, th->style.btnm.bg); - lv_btnm_set_style(new_btnm, LV_BTNM_STYLE_BTN_REL, th->style.btnm.btn.rel); - lv_btnm_set_style(new_btnm, LV_BTNM_STYLE_BTN_PR, th->style.btnm.btn.pr); - lv_btnm_set_style(new_btnm, LV_BTNM_STYLE_BTN_TGL_REL, th->style.btnm.btn.tgl_rel); - lv_btnm_set_style(new_btnm, LV_BTNM_STYLE_BTN_TGL_PR, th->style.btnm.btn.tgl_pr); - lv_btnm_set_style(new_btnm, LV_BTNM_STYLE_BTN_INA, th->style.btnm.btn.ina); - } else { - lv_obj_set_style(new_btnm, &lv_style_pretty); - } - } - /*Copy an existing object*/ - else { - lv_btnm_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - 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)); - } - - LV_LOG_INFO("button matrix created"); - - return new_btnm; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new map. Buttons will be created/deleted according to the map. The - * button matrix keeps a reference to the map and so the string array must not - * be deallocated during the life of the matrix. - * @param btnm pointer to a button matrix object - * @param map pointer a string array. The last string has to be: "". Use "\n" to make a line break. - */ -void lv_btnm_set_map(const lv_obj_t * btnm, const char * map[]) -{ - LV_ASSERT_OBJ(btnm, LV_OBJX_NAME); - LV_ASSERT_NULL(map); - - /* - * lv_btnm_set_map is called on receipt of signals such as - * LV_SIGNAL_CORD_CHG regardless of whether the map has changed (e.g. - * calling lv_obj_align on the map will trigger this). - * - * We check if the map has changed here to avoid overwriting changes made - * to hidden/longpress/disabled states after the map was originally set. - * - * TODO: separate all map set/allocation from layout code below and skip - * set/allocation when map hasn't changed. - */ - lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); - if(!maps_are_identical(ext->map_p, map)) { - - /*Analyze the map and create the required number of buttons*/ - allocate_btn_areas_and_controls(btnm, map); - } - ext->map_p = map; - - /*Set size and positions of the buttons*/ - const lv_style_t * style_bg = lv_btnm_get_style(btnm, LV_BTNM_STYLE_BG); - lv_coord_t max_w = lv_obj_get_width(btnm) - style_bg->body.padding.left - style_bg->body.padding.right; - lv_coord_t max_h = lv_obj_get_height(btnm) - style_bg->body.padding.top - style_bg->body.padding.bottom; - lv_coord_t act_y = style_bg->body.padding.top; - - /*Count the lines to calculate button height*/ - uint8_t line_cnt = 1; - uint8_t li; - for(li = 0; strlen(map[li]) != 0; li++) { - if(strcmp(map[li], "\n") == 0) line_cnt++; - } - - lv_coord_t btn_h = max_h - ((line_cnt - 1) * style_bg->body.padding.inner); - btn_h = btn_h / line_cnt; - btn_h--; /*-1 because e.g. height = 100 means 101 pixels (0..100)*/ - - /* Count the units and the buttons in a line - * (A button can be 1,2,3... unit wide)*/ - uint16_t unit_cnt; /*Number of units in a row*/ - uint16_t unit_act_cnt; /*Number of units currently put in a row*/ - uint16_t btn_cnt; /*Number of buttons in a row*/ - uint16_t i_tot = 0; /*Act. index in the str map*/ - uint16_t btn_i = 0; /*Act. index of button areas*/ - const char ** map_p_tmp = map; - - /*Count the units and the buttons in a line*/ - while(1) { - unit_cnt = 0; - btn_cnt = 0; - /*Count the buttons in a line*/ - while(strcmp(map_p_tmp[btn_cnt], "\n") != 0 && strlen(map_p_tmp[btn_cnt]) != 0) { /*Check a line*/ - unit_cnt += get_button_width(ext->ctrl_bits[btn_i + btn_cnt]); - btn_cnt++; - } - - /*Make sure the last row is at the bottom of 'btnm'*/ - if(map_p_tmp[btn_cnt][0] == '\0') { /*Last row?*/ - 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*/ - lv_coord_t all_unit_w = max_w - ((btn_cnt - 1) * style_bg->body.padding.inner); - - /*Set the button size and positions and set the texts*/ - uint16_t i; - lv_coord_t act_x; - - lv_coord_t act_unit_w; - unit_act_cnt = 0; - for(i = 0; i < btn_cnt; i++) { - /* one_unit_w = all_unit_w / unit_cnt - * act_unit_w = one_unit_w * button_width - * do this two operations but the multiply first to divide a greater number */ - act_unit_w = (all_unit_w * get_button_width(ext->ctrl_bits[btn_i])) / unit_cnt; - act_unit_w--; /*-1 because e.g. width = 100 means 101 pixels (0..100)*/ - - /*Always recalculate act_x because of rounding errors */ - 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*/ - if(style_bg->body.padding.inner == 0 && act_x != style_bg->body.padding.left) { - lv_area_set(&ext->button_areas[btn_i], ext->button_areas[btn_i - 1].x2, act_y, act_x + act_unit_w, - act_y + btn_h); - } else { - lv_area_set(&ext->button_areas[btn_i], act_x, act_y, act_x + act_unit_w, act_y + btn_h); - } - - unit_act_cnt += get_button_width(ext->ctrl_bits[btn_i]); - - i_tot++; - btn_i++; - } - } - act_y += btn_h + style_bg->body.padding.inner + 1; - - if(strlen(map_p_tmp[btn_cnt]) == 0) break; /*Break on end of map*/ - map_p_tmp = &map_p_tmp[btn_cnt + 1]; /*Set the map to the next line*/ - i_tot++; /*Skip the '\n'*/ - } - - lv_obj_invalidate(btnm); -} - -/** - * Set the button control map (hidden, disabled etc.) for a button matrix. The - * control map array will be copied and so may be deallocated after this - * function returns. - * @param btnm pointer to a button matrix object - * @param ctrl_map pointer to an array of `lv_btn_ctrl_t` control bytes. The - * length of the array and position of the elements must match - * the number and order of the individual buttons (i.e. excludes - * newline entries). - * An element of the map should look like e.g.: - * `ctrl_map[0] = width | LV_BTNM_CTRL_NO_REPEAT | LV_BTNM_CTRL_TGL_ENABLE` - */ -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); - - lv_btnm_set_map(btnm, ext->map_p); -} - -/** - * Set the pressed button i.e. visually highlight it. - * Mainly used a when the btnm is in a group to show the selected button - * @param btnm pointer to button matrix object - * @param id index of the currently pressed button (`LV_BTNM_BTN_NONE` to unpress) - */ -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; - - if(id == ext->btn_id_pr) return; - - ext->btn_id_pr = id; - lv_obj_invalidate(btnm); -} - -/** - * Set a style of a button matrix - * @param btnm pointer to a button matrix object - * @param type which style should be set - * @param style pointer to a style - */ -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) { - case LV_BTNM_STYLE_BG: lv_obj_set_style(btnm, style); break; - case LV_BTNM_STYLE_BTN_REL: - ext->styles_btn[LV_BTN_STATE_REL] = style; - lv_obj_invalidate(btnm); - break; - case LV_BTNM_STYLE_BTN_PR: - ext->styles_btn[LV_BTN_STATE_PR] = style; - lv_obj_invalidate(btnm); - break; - case LV_BTNM_STYLE_BTN_TGL_REL: - ext->styles_btn[LV_BTN_STATE_TGL_REL] = style; - lv_obj_invalidate(btnm); - break; - case LV_BTNM_STYLE_BTN_TGL_PR: - ext->styles_btn[LV_BTN_STATE_TGL_PR] = style; - lv_obj_invalidate(btnm); - break; - case LV_BTNM_STYLE_BTN_INA: - ext->styles_btn[LV_BTN_STATE_INA] = style; - lv_obj_invalidate(btnm); - break; - } -} - -/** - * Enable recoloring of button's texts - * @param btnm pointer to button matrix object - * @param en true: enable recoloring; false: disable - */ -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; - lv_obj_invalidate(btnm); -} - -/** - * Set the attributes of a button of the button matrix - * @param btnm pointer to button matrix object - * @param btn_id 0 based index of the button to modify. (Not counting new lines) - */ -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; - - ext->ctrl_bits[btn_id] |= ctrl; - invalidate_button_area(btnm, btn_id); -} - -/** - * Clear the attributes of a button of the button matrix - * @param btnm pointer to button matrix object - * @param btn_id 0 based index of the button to modify. (Not counting new lines) - */ -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; - - ext->ctrl_bits[btn_id] &= (~ctrl); - invalidate_button_area(btnm, btn_id); -} - -/** - * Set the attributes of all buttons of a button matrix - * @param btnm pointer to a button matrix object - * @param ctrl attribute(s) to set from `lv_btnm_ctrl_t`. Values can be ORed. - */ -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++) { - lv_btnm_set_btn_ctrl(btnm, i, ctrl); - } -} - -/** - * Clear the attributes of all buttons of a button matrix - * @param btnm pointer to a button matrix object - * @param ctrl attribute(s) to set from `lv_btnm_ctrl_t`. Values can be ORed. - * @param en true: set the attributes; false: clear the attributes - */ -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++) { - lv_btnm_clear_btn_ctrl(btnm, i, ctrl); - } -} - -/** - * Set a single buttons relative width. - * This method will cause the matrix be regenerated and is a relatively - * expensive operation. It is recommended that initial width be specified using - * `lv_btnm_set_ctrl_map` and this method only be used for dynamic changes. - * @param btnm pointer to button matrix object - * @param btn_id 0 based index of the button to modify. - * @param width Relative width compared to the buttons in the same row. [1..7] - */ -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; - ext->ctrl_bits[btn_id] &= (~LV_BTNM_WIDTH_MASK); - ext->ctrl_bits[btn_id] |= (LV_BTNM_WIDTH_MASK & width); - - lv_btnm_set_map(btnm, ext->map_p); -} - -/** - * Make the button matrix like a selector widget (only one button may be toggled at a time). - * - * Toggling must be enabled on the buttons you want to be selected with `lv_btnm_set_ctrl` or - * `lv_btnm_set_btn_ctrl_all`. - * - * @param btnm Button matrix object - * @param one_toggle Whether "one toggle" mode is enabled - */ -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; - - /*If more than one button is toggled only the first one should be*/ - make_one_button_toggled(btnm, 0); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the current map of a button matrix - * @param btnm pointer to a button matrix object - * @return the current map - */ -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; -} - -/** - * Check whether the button's text can use recolor or not - * @param btnm pointer to button matrix object - * @return true: text recolor enable; false: disabled - */ -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; -} - -/** - * Get the index of the lastly "activated" button by the user (pressed, released etc) - * Useful in the the `event_cb` to get the text of the button, check if hidden etc. - * @param btnm pointer to button matrix object - * @return index of the last released button (LV_BTNM_BTN_NONE: if unset) - */ -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; -} - -/** - * Get the text of the lastly "activated" button by the user (pressed, released etc) - * Useful in the the `event_cb` - * @param btnm pointer to button matrix object - * @return text of the last released button (NULL: if unset) - */ -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); - } else { - return NULL; - } -} - -/** - * Get the pressed button's index. - * The button be really pressed by the user or manually set to pressed with `lv_btnm_set_pressed` - * @param btnm pointer to button matrix object - * @return index of the pressed button (LV_BTNM_BTN_NONE: if unset) - */ -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; -} - -/** - * Get the button's text - * @param btnm pointer to button matrix object - * @param btn_id the index a button not counting new line characters. (The return value of - * lv_btnm_get_pressed/released) - * @return text of btn_index` button - */ -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; - - uint16_t txt_i = 0; - uint16_t btn_i = 0; - - /* Search the text of ext->btn_pr the buttons text in the map - * Skip "\n"-s*/ - while(btn_i != btn_id) { - btn_i++; - txt_i++; - if(strcmp(ext->map_p[txt_i], "\n") == 0) txt_i++; - } - - if(btn_i == ext->btn_cnt) return NULL; - - return ext->map_p[txt_i]; -} - -/** - * Get the whether a control value is enabled or disabled for button of a button matrix - * @param btnm pointer to a button matrix object - * @param btn_id the index a button not counting new line characters. (E.g. the return value of - * lv_btnm_get_pressed/released) - * @param ctrl control values to check (ORed value can be used) - * @return true: long press repeat is disabled; false: long press repeat enabled - */ -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; - - return ext->ctrl_bits[btn_id] & ctrl ? true : false; -} - -/** - * Get a style of a button matrix - * @param btnm pointer to a button matrix object - * @param type which style should be get - * @return style pointer to a style - */ -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); - - switch(type) { - case LV_BTNM_STYLE_BG: style = lv_obj_get_style(btnm); break; - case LV_BTNM_STYLE_BTN_REL: style = ext->styles_btn[LV_BTN_STATE_REL]; break; - case LV_BTNM_STYLE_BTN_PR: style = ext->styles_btn[LV_BTN_STATE_PR]; break; - case LV_BTNM_STYLE_BTN_TGL_REL: style = ext->styles_btn[LV_BTN_STATE_TGL_REL]; break; - case LV_BTNM_STYLE_BTN_TGL_PR: style = ext->styles_btn[LV_BTN_STATE_TGL_PR]; break; - case LV_BTNM_STYLE_BTN_INA: style = ext->styles_btn[LV_BTN_STATE_INA]; break; - default: style = NULL; break; - } - - return style; -} - -/** - * Find whether "one toggle" mode is enabled. - * @param btnm Button matrix object - * @return whether "one toggle" mode is enabled - */ -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; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_btnm_design(lv_obj_t * btnm, const lv_area_t * mask, 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*/ - } - /*Draw the object*/ - else if(mode == LV_DESIGN_DRAW_MAIN) { - ancestor_design_f(btnm, mask, mode); - - lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); - const lv_style_t * bg_style = lv_obj_get_style(btnm); - const lv_style_t * btn_style; - lv_opa_t opa_scale = lv_obj_get_opa_scale(btnm); - - lv_area_t area_btnm; - lv_obj_get_coords(btnm, &area_btnm); - - lv_area_t area_tmp; - lv_coord_t btn_w; - lv_coord_t btn_h; - - uint16_t btn_i = 0; - uint16_t txt_i = 0; - lv_style_t style_tmp; - 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) { - txt_i++; - } - - /*Skip hidden buttons*/ - if(button_is_hidden(ext->ctrl_bits[btn_i])) continue; - - lv_area_copy(&area_tmp, &ext->button_areas[btn_i]); - area_tmp.x1 += area_btnm.x1; - area_tmp.y1 += area_btnm.y1; - area_tmp.x2 += area_btnm.x1; - area_tmp.y2 += area_btnm.y1; - - btn_w = lv_area_get_width(&area_tmp); - btn_h = lv_area_get_height(&area_tmp); - - /*Load the style*/ - bool tgl_state = button_get_tgl_state(ext->ctrl_bits[btn_i]); - if(button_is_inactive(ext->ctrl_bits[btn_i])) - btn_style = lv_btnm_get_style(btnm, LV_BTNM_STYLE_BTN_INA); - else if(btn_i != ext->btn_id_pr && tgl_state == false) - btn_style = lv_btnm_get_style(btnm, LV_BTNM_STYLE_BTN_REL); - else if(btn_i == ext->btn_id_pr && tgl_state == false) - btn_style = lv_btnm_get_style(btnm, LV_BTNM_STYLE_BTN_PR); - else if(btn_i != ext->btn_id_pr && tgl_state == true) - btn_style = lv_btnm_get_style(btnm, LV_BTNM_STYLE_BTN_TGL_REL); - else if(btn_i == ext->btn_id_pr && tgl_state == true) - btn_style = lv_btnm_get_style(btnm, LV_BTNM_STYLE_BTN_TGL_PR); - else - btn_style = lv_btnm_get_style(btnm, LV_BTNM_STYLE_BTN_REL); /*Not possible option, just to be sure*/ - - 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(area_tmp.y1 == btnm->coords.y1 + bg_style->body.padding.top) { - style_tmp.body.border.part &= ~LV_BORDER_TOP; - } - if(area_tmp.y2 == btnm->coords.y2 - bg_style->body.padding.bottom) { - style_tmp.body.border.part &= ~LV_BORDER_BOTTOM; - } - - if(txt_i == 0) { - style_tmp.body.border.part &= ~LV_BORDER_LEFT; - } else if(strcmp(ext->map_p[txt_i - 1], "\n") == 0) { - style_tmp.body.border.part &= ~LV_BORDER_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; - } - } - lv_draw_rect(&area_tmp, mask, &style_tmp, opa_scale); - - /*Calculate the size of the text*/ - if(btn_style->glass) btn_style = bg_style; - const lv_font_t * font = btn_style->text.font; - lv_point_t txt_size; - lv_txt_get_size(&txt_size, ext->map_p[txt_i], font, btn_style->text.letter_space, - btn_style->text.line_space, lv_area_get_width(&area_btnm), txt_flag); - - area_tmp.x1 += (btn_w - txt_size.x) / 2; - area_tmp.y1 += (btn_h - txt_size.y) / 2; - 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, NULL, NULL, lv_obj_get_base_dir(btnm)); - } - } - - return true; -} - -/** - * Signal function of the button matrix - * @param btnm pointer to a button matrix 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_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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; - if(sign == LV_SIGNAL_CLEANUP) { - lv_mem_free(ext->button_areas); - lv_mem_free(ext->ctrl_bits); - } else if(sign == LV_SIGNAL_STYLE_CHG || sign == LV_SIGNAL_CORD_CHG) { - lv_btnm_set_map(btnm, ext->map_p); - } else if(sign == LV_SIGNAL_PRESSED) { - lv_indev_t * indev = lv_indev_get_act(); - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON) { - uint16_t btn_pr; - /*Search the pressed area*/ - lv_indev_get_point(param, &p); - btn_pr = get_button_from_point(btnm, &p); - - invalidate_button_area(btnm, ext->btn_id_pr) /*Invalidate the old area*/; - ext->btn_id_pr = btn_pr; - ext->btn_id_act = btn_pr; - invalidate_button_area(btnm, ext->btn_id_pr); /*Invalidate the new area*/ - } - if(ext->btn_id_act != LV_BTNM_BTN_NONE) { - if(button_is_click_trig(ext->ctrl_bits[ext->btn_id_act]) == false && - button_is_inactive(ext->ctrl_bits[ext->btn_id_act]) == false && - button_is_hidden(ext->ctrl_bits[ext->btn_id_act]) == false) { - uint32_t b = ext->btn_id_act; - res = lv_event_send(btnm, LV_EVENT_VALUE_CHANGED, &b); - } - } - } else if(sign == LV_SIGNAL_PRESSING) { - uint16_t btn_pr; - /*Search the pressed area*/ - lv_indev_get_point(param, &p); - btn_pr = get_button_from_point(btnm, &p); - /*Invalidate to old and the new areas*/; - if(btn_pr != ext->btn_id_pr) { - lv_indev_reset_long_press(param); /*Start the log press time again on the new button*/ - if(ext->btn_id_pr != LV_BTNM_BTN_NONE) { - invalidate_button_area(btnm, ext->btn_id_pr); - } - if(btn_pr != LV_BTNM_BTN_NONE) { - uint32_t b = ext->btn_id_act; - res = lv_event_send(btnm, LV_EVENT_VALUE_CHANGED, &b); - if(res == LV_RES_OK) { - invalidate_button_area(btnm, btn_pr); - } - } - } - - ext->btn_id_pr = btn_pr; - ext->btn_id_act = btn_pr; - } else if(sign == LV_SIGNAL_RELEASED) { - if(ext->btn_id_pr != LV_BTNM_BTN_NONE) { - /*Toggle the button if enabled*/ - if(button_is_tgl_enabled(ext->ctrl_bits[ext->btn_id_pr]) && - !button_is_inactive(ext->ctrl_bits[ext->btn_id_pr])) { - if(button_get_tgl_state(ext->ctrl_bits[ext->btn_id_pr])) { - ext->ctrl_bits[ext->btn_id_pr] &= (~LV_BTNM_CTRL_TGL_STATE); - } else { - ext->ctrl_bits[ext->btn_id_pr] |= LV_BTNM_CTRL_TGL_STATE; - } - if(ext->one_toggle) make_one_button_toggled(btnm, ext->btn_id_pr); - } - - /*Invalidate to old pressed area*/; - invalidate_button_area(btnm, ext->btn_id_pr); - -#if LV_USE_GROUP - /*Leave the clicked button when releases if this not the focused object in a group*/ - lv_group_t * g = lv_obj_get_group(btnm); - if(lv_group_get_focused(g) != btnm) { - ext->btn_id_pr = LV_BTNM_BTN_NONE; - } -#else - ext->btn_id_pr = LV_BTNM_BTN_NONE; -#endif - - if(button_is_click_trig(ext->ctrl_bits[ext->btn_id_act]) == true && - button_is_inactive(ext->ctrl_bits[ext->btn_id_act]) == false && - button_is_hidden(ext->ctrl_bits[ext->btn_id_act]) == false) { - uint32_t b = ext->btn_id_act; - res = lv_event_send(btnm, LV_EVENT_VALUE_CHANGED, &b); - } - } - } else if(sign == LV_SIGNAL_LONG_PRESS_REP) { - if(ext->btn_id_act != LV_BTNM_BTN_NONE) { - if(button_is_repeat_disabled(ext->ctrl_bits[ext->btn_id_act]) == false && - button_is_inactive(ext->ctrl_bits[ext->btn_id_act]) == false && - button_is_hidden(ext->ctrl_bits[ext->btn_id_act]) == false) { - uint32_t b = ext->btn_id_act; - res = lv_event_send(btnm, LV_EVENT_VALUE_CHANGED, &b); - } - } - } else if(sign == LV_SIGNAL_PRESS_LOST || sign == LV_SIGNAL_DEFOCUS) { - ext->btn_id_pr = LV_BTNM_BTN_NONE; - ext->btn_id_act = LV_BTNM_BTN_NONE; - lv_obj_invalidate(btnm); - } else if(sign == LV_SIGNAL_FOCUS) { -#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 == NULL) { - indev = lv_indev_get_next(NULL); - indev_type = lv_indev_get_type(indev); - } - - if(indev_type == LV_INDEV_TYPE_POINTER) { - /*Select the clicked button*/ - lv_point_t p1; - lv_indev_get_point(indev, &p1); - uint16_t btn_i = get_button_from_point(btnm, &p1); - ext->btn_id_pr = btn_i; - - } else if(indev_type == LV_INDEV_TYPE_ENCODER) { - /*In navigation mode don't select any button but in edit mode select the fist*/ - if(lv_group_get_editing(lv_obj_get_group(btnm))) - ext->btn_id_pr = 0; - else - ext->btn_id_pr = LV_BTNM_BTN_NONE; - } else { - ext->btn_id_pr = 0; - } -#else - ext->btn_id_pr = 0; -#endif - - ext->btn_id_act = ext->btn_id_pr; - lv_obj_invalidate(btnm); - } else if(sign == LV_SIGNAL_CONTROL) { - char c = *((char *)param); - if(c == LV_KEY_RIGHT) { - if(ext->btn_id_pr == LV_BTNM_BTN_NONE) - ext->btn_id_pr = 0; - else - ext->btn_id_pr++; - if(ext->btn_id_pr >= ext->btn_cnt - 1) ext->btn_id_pr = ext->btn_cnt - 1; - ext->btn_id_act = ext->btn_id_pr; - lv_obj_invalidate(btnm); - } else if(c == LV_KEY_LEFT) { - if(ext->btn_id_pr == LV_BTNM_BTN_NONE) ext->btn_id_pr = 0; - if(ext->btn_id_pr > 0) ext->btn_id_pr--; - ext->btn_id_act = ext->btn_id_pr; - lv_obj_invalidate(btnm); - } else if(c == LV_KEY_DOWN) { - const lv_style_t * style = lv_btnm_get_style(btnm, LV_BTNM_STYLE_BG); - /*Find the area below the the current*/ - if(ext->btn_id_pr == LV_BTNM_BTN_NONE) { - ext->btn_id_pr = 0; - } else { - uint16_t area_below; - lv_coord_t pr_center = - ext->button_areas[ext->btn_id_pr].x1 + (lv_area_get_width(&ext->button_areas[ext->btn_id_pr]) >> 1); - - for(area_below = ext->btn_id_pr; area_below < ext->btn_cnt; area_below++) { - if(ext->button_areas[area_below].y1 > ext->button_areas[ext->btn_id_pr].y1 && - pr_center >= ext->button_areas[area_below].x1 && - pr_center <= ext->button_areas[area_below].x2 + style->body.padding.inner) { - break; - } - } - - if(area_below < ext->btn_cnt) ext->btn_id_pr = area_below; - } - ext->btn_id_act = ext->btn_id_pr; - lv_obj_invalidate(btnm); - } else if(c == LV_KEY_UP) { - const lv_style_t * style = lv_btnm_get_style(btnm, LV_BTNM_STYLE_BG); - /*Find the area below the the current*/ - if(ext->btn_id_pr == LV_BTNM_BTN_NONE) { - ext->btn_id_pr = 0; - } else { - int16_t area_above; - lv_coord_t pr_center = - ext->button_areas[ext->btn_id_pr].x1 + (lv_area_get_width(&ext->button_areas[ext->btn_id_pr]) >> 1); - - for(area_above = ext->btn_id_pr; area_above >= 0; area_above--) { - if(ext->button_areas[area_above].y1 < ext->button_areas[ext->btn_id_pr].y1 && - pr_center >= ext->button_areas[area_above].x1 - style->body.padding.inner && - pr_center <= ext->button_areas[area_above].x2) { - break; - } - } - if(area_above >= 0) ext->btn_id_pr = area_above; - } - ext->btn_id_act = ext->btn_id_pr; - lv_obj_invalidate(btnm); - } - } else if(sign == LV_SIGNAL_GET_EDITABLE) { - bool * editable = (bool *)param; - *editable = true; - } - return res; -} - -/** - * Create the required number of buttons and control bytes according to a map - * @param btnm pointer to button matrix object - * @param map_p pointer to a string array - */ -static void allocate_btn_areas_and_controls(const lv_obj_t * btnm, const char ** map) -{ - /*Count the buttons in the map*/ - uint16_t btn_cnt = 0; - uint16_t i = 0; - while(strlen(map[i]) != 0) { - if(strcmp(map[i], "\n") != 0) { /*Do not count line breaks*/ - btn_cnt++; - } - i++; - } - - lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); - - if(ext->button_areas != NULL) { - lv_mem_free(ext->button_areas); - ext->button_areas = NULL; - } - if(ext->ctrl_bits != NULL) { - lv_mem_free(ext->ctrl_bits); - ext->ctrl_bits = NULL; - } - - ext->button_areas = lv_mem_alloc(sizeof(lv_area_t) * btn_cnt); - LV_ASSERT_MEM(ext->button_areas); - ext->ctrl_bits = lv_mem_alloc(sizeof(lv_btnm_ctrl_t) * btn_cnt); - 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); - - ext->btn_cnt = btn_cnt; -} - -/** - * Get the width of a button in units (default is 1). - * @param ctrl_bits least significant 3 bits used (1..7 valid values) - * @return the width of the button in units - */ -static uint8_t get_button_width(lv_btnm_ctrl_t ctrl_bits) -{ - uint8_t w = ctrl_bits & LV_BTNM_WIDTH_MASK; - return w != 0 ? w : 1; -} - -static bool button_is_hidden(lv_btnm_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BTNM_CTRL_HIDDEN ? true : false; -} - -static bool button_is_repeat_disabled(lv_btnm_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BTNM_CTRL_NO_REPEAT ? true : false; -} - -static bool button_is_inactive(lv_btnm_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BTNM_CTRL_INACTIVE ? true : false; -} - -static bool button_is_click_trig(lv_btnm_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BTNM_CTRL_CLICK_TRIG ? true : false; -} - -static bool button_is_tgl_enabled(lv_btnm_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BTNM_CTRL_TGL_ENABLE ? true : false; -} - -static bool button_get_tgl_state(lv_btnm_ctrl_t ctrl_bits) -{ - return ctrl_bits & LV_BTNM_CTRL_TGL_STATE ? true : false; -} - -/** - * Gives the button id of a button under a given point - * @param btnm pointer to a button matrix object - * @param p a point with absolute coordinates - * @return the id of the button or LV_BTNM_BTN_NONE. - */ -static uint16_t get_button_from_point(lv_obj_t * btnm, lv_point_t * p) -{ - lv_area_t btnm_cords; - lv_area_t btn_area; - lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); - uint16_t i; - lv_obj_get_coords(btnm, &btnm_cords); - - for(i = 0; i < ext->btn_cnt; i++) { - lv_area_copy(&btn_area, &ext->button_areas[i]); - btn_area.x1 += btnm_cords.x1; - btn_area.y1 += btnm_cords.y1; - btn_area.x2 += btnm_cords.x1; - btn_area.y2 += btnm_cords.y1; - if(lv_area_is_point_on(&btn_area, p) != false) { - break; - } - } - - if(i == ext->btn_cnt) i = LV_BTNM_BTN_NONE; - - return i; -} - -static void invalidate_button_area(const lv_obj_t * btnm, uint16_t btn_idx) -{ - if(btn_idx == LV_BTNM_BTN_NONE) return; - - lv_area_t btn_area; - lv_area_t btnm_area; - - lv_btnm_ext_t * ext = lv_obj_get_ext_attr(btnm); - lv_area_copy(&btn_area, &ext->button_areas[btn_idx]); - lv_obj_get_coords(btnm, &btnm_area); - - /* Convert relative coordinates to absolute */ - btn_area.x1 += btnm_area.x1; - btn_area.y1 += btnm_area.y1; - btn_area.x2 += btnm_area.x1; - btn_area.y2 += btnm_area.y1; - - lv_obj_invalidate_area(btnm, &btn_area); -} - -/** - * Compares two button matrix maps for equality - * @param map1 map to compare - * @param map2 map to compare - * @return true if maps are identical in length and content - */ -static bool maps_are_identical(const char ** map1, const char ** map2) -{ - if(map1 == map2) return true; - if(map1 == NULL || map2 == NULL) return map1 == map2; - - uint16_t i = 0; - while(map1[i][0] != '\0' && map2[i][0] != '\0') { - if(strcmp(map1[i], map2[i]) != 0) return false; - i++; - } - return map1[i][0] == '\0' && map2[i][0] == '\0'; -} - -/** - * Enforces a single button being toggled on the button matrix. - * It simply clears the toggle flag on other buttons. - * @param btnm Button matrix object - * @param btn_idx Button that should remain toggled - */ -static void make_one_button_toggled(lv_obj_t * btnm, uint16_t btn_idx) -{ - /*Save whether the button was toggled*/ - bool was_toggled = lv_btnm_get_btn_ctrl(btnm, btn_idx, LV_BTNM_CTRL_TGL_STATE); - - lv_btnm_clear_btn_ctrl_all(btnm, LV_BTNM_CTRL_TGL_STATE); - - if(was_toggled) lv_btnm_set_btn_ctrl(btnm, btn_idx, LV_BTNM_CTRL_TGL_STATE); -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_btnm.h b/src/libs/lvgl/src/lv_objx/lv_btnm.h deleted file mode 100644 index 44bc4efb..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_btnm.h +++ /dev/null @@ -1,276 +0,0 @@ -/** - * @file lv_btnm.h - * - */ - -#ifndef LV_BTNM_H -#define LV_BTNM_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_BTNM != 0 - -#include "../lv_core/lv_obj.h" -#include "lv_label.h" -#include "lv_btn.h" - -/********************* - * DEFINES - *********************/ -#define LV_BTNM_WIDTH_MASK 0x0007 -#define LV_BTNM_BTN_NONE 0xFFFF - -LV_EXPORT_CONST_INT(LV_BTNM_BTN_NONE); - -/********************** - * TYPEDEFS - **********************/ - -/** Type to store button control bits (disabled, hidden etc.) */ -enum { - LV_BTNM_CTRL_HIDDEN = 0x0008, /**< Button hidden */ - LV_BTNM_CTRL_NO_REPEAT = 0x0010, /**< Do not repeat press this button. */ - LV_BTNM_CTRL_INACTIVE = 0x0020, /**< Disable this button. */ - LV_BTNM_CTRL_TGL_ENABLE = 0x0040, /**< Button *can* be toggled. */ - LV_BTNM_CTRL_TGL_STATE = 0x0080, /**< Button is currently toggled (e.g. checked). */ - LV_BTNM_CTRL_CLICK_TRIG = 0x0100, /**< 1: Send LV_EVENT_SELECTED on CLICK, 0: Send LV_EVENT_SELECTED on PRESS*/ -}; -typedef uint16_t lv_btnm_ctrl_t; - -/*Data of button matrix*/ -typedef struct -{ - /*No inherited ext.*/ /*Ext. of ancestor*/ - /*New data for this type */ - const char ** map_p; /*Pointer to the current map*/ - lv_area_t * button_areas; /*Array of areas of buttons*/ - lv_btnm_ctrl_t * ctrl_bits; /*Array of control bytes*/ - const lv_style_t * styles_btn[_LV_BTN_STATE_NUM]; /*Styles of buttons in each state*/ - uint16_t btn_cnt; /*Number of button in 'map_p'(Handled by the library)*/ - uint16_t btn_id_pr; /*Index of the currently pressed button or LV_BTNM_BTN_NONE*/ - uint16_t btn_id_act; /*Index of the active button (being pressed/released etc) or LV_BTNM_BTN_NONE */ - uint8_t recolor : 1; /*Enable button recoloring*/ - uint8_t one_toggle : 1; /*Single button toggled at once*/ -} lv_btnm_ext_t; - -enum { - LV_BTNM_STYLE_BG, - LV_BTNM_STYLE_BTN_REL, - LV_BTNM_STYLE_BTN_PR, - LV_BTNM_STYLE_BTN_TGL_REL, - LV_BTNM_STYLE_BTN_TGL_PR, - LV_BTNM_STYLE_BTN_INA, -}; -typedef uint8_t lv_btnm_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a button matrix objects - * @param par pointer to an object, it will be the parent of the new button matrix - * @param copy pointer to a button matrix object, if not NULL then the new object will be copied - * from it - * @return pointer to the created button matrix - */ -lv_obj_t * lv_btnm_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new map. Buttons will be created/deleted according to the map. The - * button matrix keeps a reference to the map and so the string array must not - * be deallocated during the life of the matrix. - * @param btnm pointer to a button matrix object - * @param map pointer a string array. The last string has to be: "". Use "\n" to make a line break. - */ -void lv_btnm_set_map(const lv_obj_t * btnm, const char * map[]); - -/** - * Set the button control map (hidden, disabled etc.) for a button matrix. The - * control map array will be copied and so may be deallocated after this - * function returns. - * @param btnm pointer to a button matrix object - * @param ctrl_map pointer to an array of `lv_btn_ctrl_t` control bytes. The - * length of the array and position of the elements must match - * the number and order of the individual buttons (i.e. excludes - * newline entries). - * An element of the map should look like e.g.: - * `ctrl_map[0] = width | LV_BTNM_CTRL_NO_REPEAT | LV_BTNM_CTRL_TGL_ENABLE` - */ -void lv_btnm_set_ctrl_map(const lv_obj_t * btnm, const lv_btnm_ctrl_t ctrl_map[]); - -/** - * Set the pressed button i.e. visually highlight it. - * Mainly used a when the btnm is in a group to show the selected button - * @param btnm pointer to button matrix object - * @param id index of the currently pressed button (`LV_BTNM_BTN_NONE` to unpress) - */ -void lv_btnm_set_pressed(const lv_obj_t * btnm, uint16_t id); - -/** - * Set a style of a button matrix - * @param btnm pointer to a button matrix object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_btnm_set_style(lv_obj_t * btnm, lv_btnm_style_t type, const lv_style_t * style); - -/** - * Enable recoloring of button's texts - * @param btnm pointer to button matrix object - * @param en true: enable recoloring; false: disable - */ -void lv_btnm_set_recolor(const lv_obj_t * btnm, bool en); - -/** - * Set the attributes of a button of the button matrix - * @param btnm pointer to button matrix object - * @param btn_id 0 based index of the button to modify. (Not counting new lines) - */ -void lv_btnm_set_btn_ctrl(const lv_obj_t * btnm, uint16_t btn_id, lv_btnm_ctrl_t ctrl); - -/** - * Clear the attributes of a button of the button matrix - * @param btnm pointer to button matrix object - * @param btn_id 0 based index of the button to modify. (Not counting new lines) - */ -void lv_btnm_clear_btn_ctrl(const lv_obj_t * btnm, uint16_t btn_id, lv_btnm_ctrl_t ctrl); - -/** - * Set the attributes of all buttons of a button matrix - * @param btnm pointer to a button matrix object - * @param ctrl attribute(s) to set from `lv_btnm_ctrl_t`. Values can be ORed. - */ -void lv_btnm_set_btn_ctrl_all(lv_obj_t * btnm, lv_btnm_ctrl_t ctrl); - -/** - * Clear the attributes of all buttons of a button matrix - * @param btnm pointer to a button matrix object - * @param ctrl attribute(s) to set from `lv_btnm_ctrl_t`. Values can be ORed. - * @param en true: set the attributes; false: clear the attributes - */ -void lv_btnm_clear_btn_ctrl_all(lv_obj_t * btnm, lv_btnm_ctrl_t ctrl); - -/** - * Set a single buttons relative width. - * This method will cause the matrix be regenerated and is a relatively - * expensive operation. It is recommended that initial width be specified using - * `lv_btnm_set_ctrl_map` and this method only be used for dynamic changes. - * @param btnm pointer to button matrix object - * @param btn_id 0 based index of the button to modify. - * @param width Relative width compared to the buttons in the same row. [1..7] - */ -void lv_btnm_set_btn_width(const lv_obj_t * btnm, uint16_t btn_id, uint8_t width); - -/** - * Make the button matrix like a selector widget (only one button may be toggled at a time). - * - * Toggling must be enabled on the buttons you want to be selected with `lv_btnm_set_ctrl` or - * `lv_btnm_set_btn_ctrl_all`. - * - * @param btnm Button matrix object - * @param one_toggle Whether "one toggle" mode is enabled - */ -void lv_btnm_set_one_toggle(lv_obj_t * btnm, bool one_toggle); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the current map of a button matrix - * @param btnm pointer to a button matrix object - * @return the current map - */ -const char ** lv_btnm_get_map_array(const lv_obj_t * btnm); - -/** - * Check whether the button's text can use recolor or not - * @param btnm pointer to button matrix object - * @return true: text recolor enable; false: disabled - */ -bool lv_btnm_get_recolor(const lv_obj_t * btnm); - -/** - * Get the index of the lastly "activated" button by the user (pressed, released etc) - * Useful in the the `event_cb` to get the text of the button, check if hidden etc. - * @param btnm pointer to button matrix object - * @return index of the last released button (LV_BTNM_BTN_NONE: if unset) - */ -uint16_t lv_btnm_get_active_btn(const lv_obj_t * btnm); - -/** - * Get the text of the lastly "activated" button by the user (pressed, released etc) - * Useful in the the `event_cb` - * @param btnm pointer to button matrix object - * @return text of the last released button (NULL: if unset) - */ -const char * lv_btnm_get_active_btn_text(const lv_obj_t * btnm); - -/** - * Get the pressed button's index. - * The button be really pressed by the user or manually set to pressed with `lv_btnm_set_pressed` - * @param btnm pointer to button matrix object - * @return index of the pressed button (LV_BTNM_BTN_NONE: if unset) - */ -uint16_t lv_btnm_get_pressed_btn(const lv_obj_t * btnm); - -/** - * Get the button's text - * @param btnm pointer to button matrix object - * @param btn_id the index a button not counting new line characters. (The return value of - * lv_btnm_get_pressed/released) - * @return text of btn_index` button - */ -const char * lv_btnm_get_btn_text(const lv_obj_t * btnm, uint16_t btn_id); - -/** - * Get the whether a control value is enabled or disabled for button of a button matrix - * @param btnm pointer to a button matrix object - * @param btn_id the index a button not counting new line characters. (E.g. the return value of - * lv_btnm_get_pressed/released) - * @param ctrl control values to check (ORed value can be used) - * @return true: long press repeat is disabled; false: long press repeat enabled - */ -bool lv_btnm_get_btn_ctrl(lv_obj_t * btnm, uint16_t btn_id, lv_btnm_ctrl_t ctrl); - -/** - * Get a style of a button matrix - * @param btnm pointer to a button matrix object - * @param type which style should be get - * @return style pointer to a style - */ -const lv_style_t * lv_btnm_get_style(const lv_obj_t * btnm, lv_btnm_style_t type); - -/** - * Find whether "one toggle" mode is enabled. - * @param btnm Button matrix object - * @return whether "one toggle" mode is enabled - */ -bool lv_btnm_get_one_toggle(const lv_obj_t * btnm); -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_BTNM*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_BTNM_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_calendar.c b/src/libs/lvgl/src/lv_objx/lv_calendar.c deleted file mode 100644 index 53f32a22..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_calendar.c +++ /dev/null @@ -1,983 +0,0 @@ -/** - * @file lv_calendar.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" -#include "../lv_core/lv_indev.h" -#include "../lv_themes/lv_theme.h" -#include <string.h> - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_calendar" - -/********************** - * TYPEDEFS - **********************/ -enum { - DAY_DRAW_PREV_MONTH, - DAY_DRAW_ACT_MONTH, - DAY_DRAW_NEXT_MONTH, -}; -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_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); -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); -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); -static uint8_t get_day_of_week(uint32_t year, uint32_t month, uint32_t day); -static bool is_highlighted(lv_obj_t * calendar, int32_t year, int32_t month, int32_t day); -static const char * get_day_name(lv_obj_t * calendar, uint8_t day); -static const char * get_month_name(lv_obj_t * calendar, int32_t month); -static uint8_t get_month_length(int32_t year, int32_t month); -static uint8_t is_leap_year(uint32_t year); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_design_cb_t ancestor_design; -static const char * day_name[7] = {"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"}; -static const char * month_name[12] = {"January", "February", "March", "April", "May", "June", - "July", "August", "September", "October", "November", "December"}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a calendar object - * @param par pointer to an object, it will be the parent of the new calendar - * @param copy pointer to a calendar object, if not NULL then the new object will be copied from it - * @return pointer to the created calendar - */ -lv_obj_t * lv_calendar_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("calendar create started"); - - /*Create the ancestor of calendar*/ - lv_obj_t * new_calendar = lv_obj_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) 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); - - /*Initialize the allocated 'ext' */ - ext->today.year = 2018; - ext->today.month = 1; - ext->today.day = 1; - - ext->showed_date.year = 2018; - ext->showed_date.month = 1; - ext->showed_date.day = 1; - - ext->pressed_date.year = 0; - ext->pressed_date.month = 0; - ext->pressed_date.day = 0; - - ext->highlighted_dates = NULL; - ext->highlighted_dates_num = 0; - ext->day_names = NULL; - ext->month_names = NULL; - ext->style_header = &lv_style_plain_color; - ext->style_header_pr = &lv_style_pretty_color; - ext->style_highlighted_days = &lv_style_plain_color; - ext->style_inactive_days = &lv_style_btn_ina; - ext->style_week_box = &lv_style_plain_color; - ext->style_today_box = &lv_style_pretty_color; - ext->style_day_names = &lv_style_pretty; - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_calendar, lv_calendar_signal); - lv_obj_set_design_cb(new_calendar, lv_calendar_design); - - /*Init the new calendar calendar*/ - if(copy == NULL) { - lv_obj_set_size(new_calendar, LV_DPI * 2, LV_DPI * 2); - lv_obj_set_style(new_calendar, &lv_style_pretty); - - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_BG, th->style.calendar.bg); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_HEADER, th->style.calendar.header); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_HEADER_PR, th->style.calendar.header_pr); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_DAY_NAMES, th->style.calendar.day_names); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_WEEK_BOX, th->style.calendar.week_box); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_TODAY_BOX, th->style.calendar.today_box); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_HIGHLIGHTED_DAYS, - th->style.calendar.highlighted_days); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_INACTIVE_DAYS, th->style.calendar.inactive_days); - } else { - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_BG, &lv_style_pretty); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_HEADER, ext->style_header); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_HEADER_PR, ext->style_header_pr); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_DAY_NAMES, ext->style_day_names); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_WEEK_BOX, ext->style_week_box); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_TODAY_BOX, ext->style_today_box); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_HIGHLIGHTED_DAYS, ext->style_highlighted_days); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_INACTIVE_DAYS, ext->style_inactive_days); - } - } - /*Copy an existing calendar*/ - else { - lv_calendar_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->today.year = copy_ext->today.year; - ext->today.month = copy_ext->today.month; - ext->today.day = copy_ext->today.day; - - ext->showed_date.year = copy_ext->showed_date.year; - ext->showed_date.month = copy_ext->showed_date.month; - ext->showed_date.day = copy_ext->showed_date.day; - - ext->highlighted_dates = copy_ext->highlighted_dates; - ext->highlighted_dates_num = copy_ext->highlighted_dates_num; - ext->day_names = copy_ext->day_names; - - ext->month_names = copy_ext->month_names; - ext->style_header = copy_ext->style_header; - ext->style_header_pr = copy_ext->style_header_pr; - ext->style_highlighted_days = copy_ext->style_highlighted_days; - ext->style_inactive_days = copy_ext->style_inactive_days; - ext->style_week_box = copy_ext->style_week_box; - ext->style_today_box = copy_ext->style_today_box; - ext->style_day_names = copy_ext->style_day_names; - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_calendar); - } - - LV_LOG_INFO("calendar created"); - - return new_calendar; -} - -/*====================== - * Add/remove functions - *=====================*/ - -/* - * New object specific "add" or "remove" functions come here - */ - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the today's date - * @param calendar pointer to a calendar object - * @param today pointer to an `lv_calendar_date_t` variable containing the date of today. The value - * will be saved it can be local variable too. - */ -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; - ext->today.day = today->day; - - lv_obj_invalidate(calendar); -} - -/** - * Set the currently showed - * @param calendar pointer to a calendar object - * @param showed pointer to an `lv_calendar_date_t` variable containing the date to show. The value - * will be saved it can be local variable too. - */ -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; - ext->showed_date.day = showed->day; - - lv_obj_invalidate(calendar); -} - -/** - * Set the the highlighted dates - * @param calendar pointer to a calendar object - * @param highlighted pointer to an `lv_calendar_date_t` array containing the dates. ONLY A POINTER - * 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) -{ - 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; - - lv_obj_invalidate(calendar); -} - -/** - * Set the name of the days - * @param calendar pointer to a calendar object - * @param day_names pointer to an array with the names. E.g. `const char * days[7] = {"Sun", "Mon", - * ...}` Only the pointer will be saved so this variable can't be local which will be destroyed - * later. - */ -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); -} - -/** - * Set the name of the month - * @param calendar pointer to a calendar object - * @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 ** 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 = month_names; - lv_obj_invalidate(calendar); -} - -/** - * Set a style of a calendar. - * @param calendar pointer to calendar object - * @param type which style should be set - * @param style pointer to a style - * */ -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) { - case LV_CALENDAR_STYLE_BG: lv_obj_set_style(calendar, style); break; - case LV_CALENDAR_STYLE_DAY_NAMES: ext->style_day_names = style; break; - case LV_CALENDAR_STYLE_HEADER: ext->style_header = style; break; - case LV_CALENDAR_STYLE_HEADER_PR: ext->style_header_pr = style; break; - case LV_CALENDAR_STYLE_HIGHLIGHTED_DAYS: ext->style_highlighted_days = style; break; - case LV_CALENDAR_STYLE_INACTIVE_DAYS: ext->style_inactive_days = style; break; - case LV_CALENDAR_STYLE_TODAY_BOX: ext->style_today_box = style; break; - case LV_CALENDAR_STYLE_WEEK_BOX: ext->style_week_box = style; break; - } - - lv_obj_invalidate(calendar); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the today's date - * @param calendar pointer to a calendar object - * @return return pointer to an `lv_calendar_date_t` variable containing the date of today. - */ -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; -} - -/** - * Get the currently showed - * @param calendar pointer to a calendar object - * @return pointer to an `lv_calendar_date_t` variable containing the date is being shown. - */ -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; -} - -/** - * Get the the pressed date. - * @param calendar pointer to a calendar object - * @return pointer to an `lv_calendar_date_t` variable containing the pressed date. - * `NULL` if not date pressed (e.g. the header) - */ -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; -} - -/** - * Get the the highlighted dates - * @param calendar pointer to a calendar object - * @return pointer to an `lv_calendar_date_t` array containing the dates. - */ -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; -} - -/** - * Get the number of the highlighted dates - * @param calendar pointer to a calendar object - * @return number of highlighted days - */ -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; -} - -/** - * Get the name of the days - * @param calendar pointer to a calendar object - * @return pointer to the array of day names - */ -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; -} - -/** - * Get the name of the month - * @param calendar pointer to a calendar object - * @return pointer to the array of month names - */ -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; -} - -/** - * Get style of a calendar. - * @param calendar pointer to calendar object - * @param type which style should be get - * @return style pointer to the style - * */ -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); - - switch(type) { - case LV_CALENDAR_STYLE_BG: style = lv_obj_get_style(calendar); break; - case LV_CALENDAR_STYLE_HEADER: style = ext->style_header; break; - case LV_CALENDAR_STYLE_HEADER_PR: style = ext->style_header_pr; break; - case LV_CALENDAR_STYLE_DAY_NAMES: style = ext->style_day_names; break; - case LV_CALENDAR_STYLE_HIGHLIGHTED_DAYS: style = ext->style_highlighted_days; break; - case LV_CALENDAR_STYLE_INACTIVE_DAYS: style = ext->style_inactive_days; break; - case LV_CALENDAR_STYLE_WEEK_BOX: style = ext->style_week_box; break; - case LV_CALENDAR_STYLE_TODAY_BOX: style = ext->style_today_box; break; - default: style = NULL; break; - } - - return style; -} - -/*===================== - * Other functions - *====================*/ - -/* - * New object specific "other" functions come here - */ - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_calendar_design(lv_obj_t * calendar, const lv_area_t * mask, 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); - } - /*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); - - draw_header(calendar, mask); - draw_day_names(calendar, mask); - draw_days(calendar, mask); - - } - /*Post draw when the children are drawn*/ - else if(mode == LV_DESIGN_DRAW_POST) { - } - - return true; -} - -/** - * Signal function of the calendar - * @param calendar pointer to a calendar 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_calendar_signal(lv_obj_t * calendar, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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')*/ - } else if(sign == LV_SIGNAL_PRESSING) { - lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); - lv_area_t header_area; - lv_area_copy(&header_area, &calendar->coords); - header_area.y2 = header_area.y1 + get_header_height(calendar); - - lv_indev_t * indev = lv_indev_get_act(); - lv_point_t p; - lv_indev_get_point(indev, &p); - - /*If the header is pressed mark an arrow as pressed*/ - if(lv_area_is_point_on(&header_area, &p)) { - if(p.x < header_area.x1 + lv_area_get_width(&header_area) / 2) { - if(ext->btn_pressing != -1) lv_obj_invalidate(calendar); - ext->btn_pressing = -1; - } else { - if(ext->btn_pressing != 1) lv_obj_invalidate(calendar); - ext->btn_pressing = 1; - } - - ext->pressed_date.year = 0; - ext->pressed_date.month = 0; - ext->pressed_date.day = 0; - } - /*If a day is pressed save it*/ - else if(calculate_touched_day(calendar, &p)) { - if(ext->btn_pressing != 0) lv_obj_invalidate(calendar); - ext->btn_pressing = 0; - } - /*ELse set a deafault state*/ - else { - if(ext->btn_pressing != 0) lv_obj_invalidate(calendar); - ext->btn_pressing = 0; - ext->pressed_date.year = 0; - ext->pressed_date.month = 0; - ext->pressed_date.day = 0; - } - } else if(sign == LV_SIGNAL_PRESS_LOST) { - lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); - ext->btn_pressing = 0; - lv_obj_invalidate(calendar); - - } else if(sign == LV_SIGNAL_RELEASED) { - lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); - if(ext->btn_pressing < 0) { - if(ext->showed_date.month <= 1) { - ext->showed_date.month = 12; - ext->showed_date.year--; - } else { - ext->showed_date.month--; - } - } else if(ext->btn_pressing > 0) { - if(ext->showed_date.month >= 12) { - ext->showed_date.month = 1; - ext->showed_date.year++; - } else { - ext->showed_date.month++; - } - } else if(ext->pressed_date.year != 0) { - res = lv_event_send(calendar, LV_EVENT_VALUE_CHANGED, NULL); - if(res != LV_RES_OK) return res; - } - - ext->btn_pressing = 0; - lv_obj_invalidate(calendar); - } else if(sign == LV_SIGNAL_CONTROL) { - uint8_t c = *((uint8_t *)param); - lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); - if(c == LV_KEY_RIGHT || c == LV_KEY_UP) { - if(ext->showed_date.month >= 12) { - ext->showed_date.month = 1; - ext->showed_date.year++; - } else { - ext->showed_date.month++; - } - lv_obj_invalidate(calendar); - } else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { - if(ext->showed_date.month <= 1) { - ext->showed_date.month = 12; - ext->showed_date.year--; - } else { - ext->showed_date.month--; - } - lv_obj_invalidate(calendar); - } - } - - return res; -} - -/** - * It will check if the days part of calendar is touched - * and if it is, it will calculate the day and put it in pressed_date of calendar object. - * @param calendar pointer to a calendar object - * @param pointer to a point - * @return true: days part of calendar is touched and its related date is put in pressed date - * false: the point is out of days part area. - */ -static bool calculate_touched_day(lv_obj_t * calendar, const lv_point_t * touched_point) -{ - lv_area_t days_area; - lv_area_copy(&days_area, &calendar->coords); - const lv_style_t * style_bg = lv_calendar_get_style(calendar, LV_CALENDAR_STYLE_BG); - days_area.x1 += style_bg->body.padding.left; - days_area.x2 -= style_bg->body.padding.right; - days_area.y1 = - calendar->coords.y1 + get_header_height(calendar) + get_day_names_height(calendar) - style_bg->body.padding.top; - - if(lv_area_is_point_on(&days_area, touched_point)) { - lv_coord_t w = (days_area.x2 - days_area.x1 + 1) / 7; - lv_coord_t h = (days_area.y2 - days_area.y1 + 1) / 6; - uint8_t x_pos = 0; - x_pos = (touched_point->x - days_area.x1) / w; - if(x_pos > 6) x_pos = 6; - uint8_t y_pos = 0; - y_pos = (touched_point->y - days_area.y1) / h; - if(y_pos > 5) y_pos = 5; - - uint8_t i_pos = 0; - i_pos = (y_pos * 7) + x_pos; - lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); - if(i_pos < get_day_of_week(ext->showed_date.year, ext->showed_date.month, 1)) { - ext->pressed_date.year = ext->showed_date.year - (ext->showed_date.month == 1 ? 1 : 0); - ext->pressed_date.month = ext->showed_date.month == 1 ? 12 : (ext->showed_date.month - 1); - ext->pressed_date.day = get_month_length(ext->pressed_date.year, ext->pressed_date.month) - - get_day_of_week(ext->showed_date.year, ext->showed_date.month, 1) + 1 + i_pos; - } else if(i_pos < (get_day_of_week(ext->showed_date.year, ext->showed_date.month, 1) + - get_month_length(ext->showed_date.year, ext->showed_date.month))) { - ext->pressed_date.year = ext->showed_date.year; - ext->pressed_date.month = ext->showed_date.month; - ext->pressed_date.day = i_pos + 1 - get_day_of_week(ext->showed_date.year, ext->showed_date.month, 1); - } else if(i_pos < 42) { - ext->pressed_date.year = ext->showed_date.year + (ext->showed_date.month == 12 ? 1 : 0); - ext->pressed_date.month = ext->showed_date.month == 12 ? 1 : (ext->showed_date.month + 1); - ext->pressed_date.day = i_pos + 1 - get_day_of_week(ext->showed_date.year, ext->showed_date.month, 1) - - get_month_length(ext->showed_date.year, ext->showed_date.month); - } - return true; - } else { - return false; - } -} - -/** - * Get the height of a calendar's header based on it's style - * @param calendar point to a calendar - * @return the header's height - */ -static lv_coord_t get_header_height(lv_obj_t * calendar) -{ - lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); - - return lv_font_get_line_height(ext->style_header->text.font) + ext->style_header->body.padding.top + - ext->style_header->body.padding.bottom; -} - -/** - * Get the height of a calendar's day_names based on it's style - * @param calendar point to a calendar - * @return the day_names's height - */ -static lv_coord_t get_day_names_height(lv_obj_t * calendar) -{ - lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); - - return lv_font_get_line_height(ext->style_day_names->text.font) + ext->style_day_names->body.padding.top + - ext->style_day_names->body.padding.bottom; -} - -/** - * Draw the calendar header with month name and arrows - * @param calendar point to a calendar - * @param mask a mask for drawing - */ -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; - header_area.x1 = calendar->coords.x1; - header_area.x2 = calendar->coords.x2; - header_area.y1 = calendar->coords.y1; - header_area.y2 = calendar->coords.y1 + get_header_height(calendar); - - lv_draw_rect(&header_area, mask, ext->style_header, opa_scale); - - /*Add the year + month name*/ - char txt_buf[64]; - lv_utils_num_to_str(ext->showed_date.year, txt_buf); - txt_buf[4] = ' '; - 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, 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, 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, (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, NULL, NULL, bidi_dir); -} - -/** - * Draw the day's name below the header - * @param calendar point to a calendar - * @param mask a mask for drawing - */ -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; - lv_coord_t w = - lv_obj_get_width(calendar) - ext->style_day_names->body.padding.left - ext->style_day_names->body.padding.right; - lv_coord_t box_w = w / 7; - lv_area_t label_area; - label_area.y1 = calendar->coords.y1 + get_header_height(calendar) + ext->style_day_names->body.padding.top; - label_area.y2 = label_area.y1 + lv_font_get_line_height(ext->style_day_names->text.font); - uint32_t i; - for(i = 0; i < 7; i++) { - 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, NULL, NULL, bidi_dir); - } -} - -/** - * Draw the date numbers in a matrix - * @param calendar point to a calendar - * @param mask a mask for drawing - */ -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); - label_area.y1 = calendar->coords.y1 + get_header_height(calendar) + ext->style_day_names->body.padding.top + - lv_font_get_line_height(ext->style_day_names->text.font) + - ext->style_day_names->body.padding.bottom; - label_area.y2 = label_area.y1 + lv_font_get_line_height(style_bg->text.font); - - lv_coord_t w = lv_obj_get_width(calendar) - style_bg->body.padding.left - style_bg->body.padding.right; - lv_coord_t h = calendar->coords.y2 - label_area.y1 - style_bg->body.padding.bottom; - lv_coord_t box_w = w / 7; - lv_coord_t vert_space = (h - (6 * lv_font_get_line_height(style_bg->text.font))) / 5; - - uint32_t week; - uint8_t day_cnt; - uint8_t month_start_day = get_day_of_week(ext->showed_date.year, ext->showed_date.month, 1); - day_draw_state_t draw_state; /*true: Not the prev. or next month is drawn*/ - const lv_style_t * act_style; - - /*If starting with the first day of the week then the previous month is not visible*/ - if(month_start_day == 0) { - day_cnt = 1; - draw_state = DAY_DRAW_ACT_MONTH; - act_style = style_bg; - } else { - draw_state = DAY_DRAW_PREV_MONTH; - day_cnt = get_month_length(ext->showed_date.year, ext->showed_date.month - 1); /*Length of the previous month*/ - day_cnt -= month_start_day - 1; /*First visible number of the previous month*/ - act_style = ext->style_inactive_days; - } - - bool month_of_today_shown = false; - if(ext->showed_date.year == ext->today.year && ext->showed_date.month == ext->today.month) { - month_of_today_shown = true; - } - - char buf[3]; - bool in_week_box = false; - - /*Draw 6 weeks*/ - for(week = 0; week < 6; week++) { - - /*Draw the "week box"*/ - if(month_of_today_shown && - ((draw_state == DAY_DRAW_ACT_MONTH && ext->today.day >= day_cnt && ext->today.day < day_cnt + 7) || - (draw_state == DAY_DRAW_PREV_MONTH && ext->today.day <= 7 - month_start_day && week == 0))) { - lv_area_t week_box_area; - lv_area_copy(&week_box_area, &label_area); /*'label_area' is already set for this row*/ - week_box_area.x1 = - calendar->coords.x1 + style_bg->body.padding.left - ext->style_week_box->body.padding.left; - week_box_area.x2 = - calendar->coords.x2 - style_bg->body.padding.right + ext->style_week_box->body.padding.right; - - week_box_area.y1 -= ext->style_week_box->body.padding.top; - week_box_area.y2 += ext->style_week_box->body.padding.bottom; - lv_draw_rect(&week_box_area, mask, ext->style_week_box, opa_scale); - - in_week_box = true; - } else { - in_week_box = false; - } - - /*Draw the 7 days of a week*/ - uint32_t day; - for(day = 0; day < 7; day++) { - /*The previous month is over*/ - if(draw_state == DAY_DRAW_PREV_MONTH && day == month_start_day) { - draw_state = DAY_DRAW_ACT_MONTH; - day_cnt = 1; - act_style = style_bg; - } - /*The current month is over*/ - if(draw_state == DAY_DRAW_ACT_MONTH && - day_cnt > get_month_length(ext->showed_date.year, ext->showed_date.month)) { - draw_state = DAY_DRAW_NEXT_MONTH; - day_cnt = 1; - act_style = ext->style_inactive_days; - } - - label_area.x1 = - calendar->coords.x1 + (w * day) / 7 + style_bg->body.padding.left; - label_area.x2 = label_area.x1 + box_w - 1; - - /*Draw the "today box"*/ - if(draw_state == DAY_DRAW_ACT_MONTH && month_of_today_shown && ext->today.day == day_cnt) { - lv_area_t today_box_area; - lv_area_copy(&today_box_area, &label_area); - today_box_area.x1 = label_area.x1; - today_box_area.x2 = label_area.x2; - - today_box_area.y1 = label_area.y1 - ext->style_today_box->body.padding.top; - today_box_area.y2 = label_area.y2 + ext->style_today_box->body.padding.bottom; - lv_draw_rect(&today_box_area, mask, ext->style_today_box, opa_scale); - } - - /*Get the final style : highlighted/week box/today box/normal*/ - const lv_style_t * final_style; - if(draw_state == DAY_DRAW_PREV_MONTH && - is_highlighted(calendar, ext->showed_date.year - (ext->showed_date.month == 1 ? 1 : 0), - ext->showed_date.month == 1 ? 12 : ext->showed_date.month - 1, day_cnt)) { - final_style = ext->style_highlighted_days; - } else if(draw_state == DAY_DRAW_ACT_MONTH && - is_highlighted(calendar, ext->showed_date.year, ext->showed_date.month, day_cnt)) { - final_style = ext->style_highlighted_days; - } else if(draw_state == DAY_DRAW_NEXT_MONTH && - is_highlighted(calendar, ext->showed_date.year + (ext->showed_date.month == 12 ? 1 : 0), - ext->showed_date.month == 12 ? 1 : ext->showed_date.month + 1, day_cnt)) { - final_style = ext->style_highlighted_days; - } else if(month_of_today_shown && day_cnt == ext->today.day && draw_state == DAY_DRAW_ACT_MONTH) - final_style = ext->style_today_box; - else if(in_week_box && draw_state == DAY_DRAW_ACT_MONTH) - final_style = ext->style_week_box; - else - final_style = act_style; - - /*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, NULL, NULL, bidi_dir); - - /*Go to the next day*/ - day_cnt++; - } - - /*Got to the next weeks row*/ - label_area.y1 += vert_space + lv_font_get_line_height(style_bg->text.font); - label_area.y2 += vert_space + lv_font_get_line_height(style_bg->text.font); - } -} - -/** - * Check weather a date is highlighted or not - * @param calendar pointer to a calendar object - * @param year a year - * @param month a month [1..12] - * @param day a day [1..31] - * @return true: highlighted - */ -static bool is_highlighted(lv_obj_t * calendar, int32_t year, int32_t month, int32_t day) -{ - lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); - - if(ext->highlighted_dates == NULL || ext->highlighted_dates_num == 0) return false; - - uint32_t i; - for(i = 0; i < ext->highlighted_dates_num; i++) { - if(ext->highlighted_dates[i].year == year && ext->highlighted_dates[i].month == month && - ext->highlighted_dates[i].day == day) { - return true; - } - } - - return false; -} - -/** - * Get the day name - * @param calendar pointer to a calendar object - * @param day a day in [0..6] - * @return - */ -static const char * get_day_name(lv_obj_t * calendar, uint8_t day) -{ - - lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); - if(ext->day_names) - return ext->day_names[day]; - else - return day_name[day]; -} - -/** - * Get the month name - * @param calendar pointer to a calendar object - * @param month a month. The range is basically [1..12] but [-11..1] is also supported to handle - * previous year - * @return - */ -static const char * get_month_name(lv_obj_t * calendar, int32_t month) -{ - month--; /*Range of months id [1..12] but range of indexes is [0..11]*/ - if(month < 0) month = 12 + month; - - lv_calendar_ext_t * ext = lv_obj_get_ext_attr(calendar); - if(ext->month_names) - return ext->month_names[month]; - else - return month_name[month]; -} - -/** - * Get the number of days in a month - * @param year a year - * @param month a month. The range is basically [1..12] but [-11..1] is also supported to handle - * previous year - * @return [28..31] - */ -static uint8_t get_month_length(int32_t year, int32_t month) -{ - month--; /*Range of months id [1..12] but range of indexes is [0..11]*/ - if(month < 0) { - year--; /*Already in the previous year (won't be less then -12 to skip a whole year)*/ - month = 12 + month; /*`month` is negative, the result will be < 12*/ - } - if(month >= 12) { - year++; - month -= 12; - } - - /*month == 1 is february*/ - return (month == 1) ? (28 + is_leap_year(year)) : 31 - month % 7 % 2; -} - -/** - * Tells whether a year is leap year or not - * @param year a year - * @return 0: not leap year; 1: leap year - */ -static uint8_t is_leap_year(uint32_t year) -{ - return (year % 4) || ((year % 100 == 0) && (year % 400)) ? 0 : 1; -} - -/** - * Get the day of the week - * @param year a year - * @param month a month - * @param day a day - * @return [0..6] which means [Sun..Sat] - */ -static uint8_t get_day_of_week(uint32_t year, uint32_t month, uint32_t day) -{ - uint32_t a = month < 3 ? 1 : 0; - uint32_t b = year - a; - - uint32_t day_of_week = (day + (31 * (month - 2 + 12 * a) / 12) + b + (b / 4) - (b / 100) + (b / 400)) % 7; - - return day_of_week; -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_calendar.h b/src/libs/lvgl/src/lv_objx/lv_calendar.h deleted file mode 100644 index 21317bbd..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_calendar.h +++ /dev/null @@ -1,229 +0,0 @@ -/** - * @file lv_calendar.h - * - */ - -#ifndef LV_CALENDAR_H -#define LV_CALENDAR_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_CALENDAR != 0 - -#include "../lv_core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Represents a date on the calendar object (platform-agnostic). - */ -typedef struct -{ - uint16_t year; - int8_t month; - int8_t day; -} lv_calendar_date_t; - -/*Data of calendar*/ -typedef struct -{ - /*None*/ /*Ext. of ancestor*/ - /*New data for this type */ - lv_calendar_date_t today; /*Date of today*/ - 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)*/ - 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)*/ - - /*Styles*/ - const lv_style_t * style_header; - const lv_style_t * style_header_pr; - const lv_style_t * style_day_names; - const lv_style_t * style_highlighted_days; - const lv_style_t * style_inactive_days; - const lv_style_t * style_week_box; - const lv_style_t * style_today_box; -} lv_calendar_ext_t; - -/** Calendar styles*/ -enum { - LV_CALENDAR_STYLE_BG, /**< Background and "normal" date numbers style */ - LV_CALENDAR_STYLE_HEADER, /** Calendar header style */ - LV_CALENDAR_STYLE_HEADER_PR, /** Calendar header style (when pressed) */ - LV_CALENDAR_STYLE_DAY_NAMES, /** Day name style */ - LV_CALENDAR_STYLE_HIGHLIGHTED_DAYS, /** Highlighted day style */ - LV_CALENDAR_STYLE_INACTIVE_DAYS, /** Inactive day style */ - LV_CALENDAR_STYLE_WEEK_BOX, /** Week highlight style */ - LV_CALENDAR_STYLE_TODAY_BOX, /** Today highlight style */ -}; -typedef uint8_t lv_calendar_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a calendar objects - * @param par pointer to an object, it will be the parent of the new calendar - * @param copy pointer to a calendar object, if not NULL then the new object will be copied from it - * @return pointer to the created calendar - */ -lv_obj_t * lv_calendar_create(lv_obj_t * par, const lv_obj_t * copy); - -/*====================== - * Add/remove functions - *=====================*/ - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the today's date - * @param calendar pointer to a calendar object - * @param today pointer to an `lv_calendar_date_t` variable containing the date of today. The value - * will be saved it can be local variable too. - */ -void lv_calendar_set_today_date(lv_obj_t * calendar, lv_calendar_date_t * today); - -/** - * Set the currently showed - * @param calendar pointer to a calendar object - * @param showed pointer to an `lv_calendar_date_t` variable containing the date to show. The value - * will be saved it can be local variable too. - */ -void lv_calendar_set_showed_date(lv_obj_t * calendar, lv_calendar_date_t * showed); - -/** - * Set the the highlighted dates - * @param calendar pointer to a calendar object - * @param highlighted pointer to an `lv_calendar_date_t` array containing the dates. ONLY A POINTER - * 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); - -/** - * Set the name of the days - * @param calendar pointer to a calendar object - * @param day_names pointer to an array with the names. E.g. `const char * days[7] = {"Sun", "Mon", - * ...}` Only the pointer will be saved so this variable can't be local which will be destroyed - * later. - */ -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 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 ** month_names); - -/** - * Set a style of a calendar. - * @param calendar pointer to calendar object - * @param type which style should be set - * @param style pointer to a style - * */ -void lv_calendar_set_style(lv_obj_t * calendar, lv_calendar_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the today's date - * @param calendar pointer to a calendar object - * @return return pointer to an `lv_calendar_date_t` variable containing the date of today. - */ -lv_calendar_date_t * lv_calendar_get_today_date(const lv_obj_t * calendar); - -/** - * Get the currently showed - * @param calendar pointer to a calendar object - * @return pointer to an `lv_calendar_date_t` variable containing the date is being shown. - */ -lv_calendar_date_t * lv_calendar_get_showed_date(const lv_obj_t * calendar); - -/** - * Get the the pressed date. - * @param calendar pointer to a calendar object - * @return pointer to an `lv_calendar_date_t` variable containing the pressed date. - * `NULL` if not date pressed (e.g. the header) - */ -lv_calendar_date_t * lv_calendar_get_pressed_date(const lv_obj_t * calendar); - -/** - * Get the the highlighted dates - * @param calendar pointer to a calendar object - * @return pointer to an `lv_calendar_date_t` array containing the dates. - */ -lv_calendar_date_t * lv_calendar_get_highlighted_dates(const lv_obj_t * calendar); - -/** - * Get the number of the highlighted dates - * @param calendar pointer to a calendar object - * @return number of highlighted days - */ -uint16_t lv_calendar_get_highlighted_dates_num(const lv_obj_t * calendar); - -/** - * Get the name of the days - * @param calendar pointer to a calendar object - * @return pointer to the array of day names - */ -const char ** lv_calendar_get_day_names(const lv_obj_t * calendar); - -/** - * Get the name of the month - * @param calendar pointer to a calendar object - * @return pointer to the array of month names - */ -const char ** lv_calendar_get_month_names(const lv_obj_t * calendar); - -/** - * Get style of a calendar. - * @param calendar pointer to calendar object - * @param type which style should be get - * @return style pointer to the style - * */ -const lv_style_t * lv_calendar_get_style(const lv_obj_t * calendar, lv_calendar_style_t type); - -/*===================== - * Other functions - *====================*/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_CALENDAR*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_CALENDAR_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_canvas.c b/src/libs/lvgl/src/lv_objx/lv_canvas.c deleted file mode 100644 index 8d2275aa..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_canvas.c +++ /dev/null @@ -1,870 +0,0 @@ -/** - * @file lv_canvas.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include <stdlib.h> -#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" - -#if LV_USE_CANVAS != 0 - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_canvas" - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_res_t lv_canvas_signal(lv_obj_t * canvas, lv_signal_t sign, void * param); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_design_cb_t ancestor_design; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a canvas object - * @param par pointer to an object, it will be the parent of the new canvas - * @param copy pointer to a canvas object, if not NULL then the new object will be copied from it - * @return pointer to the created canvas - */ -lv_obj_t * lv_canvas_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("canvas create started"); - - /*Create the ancestor of canvas*/ - lv_obj_t * new_canvas = lv_img_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) 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); - - /*Initialize the allocated 'ext' */ - ext->dsc.header.always_zero = 0; - ext->dsc.header.cf = LV_IMG_CF_TRUE_COLOR; - ext->dsc.header.h = 0; - ext->dsc.header.w = 0; - ext->dsc.data_size = 0; - ext->dsc.data = NULL; - - lv_img_set_src(new_canvas, &ext->dsc); - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_canvas, lv_canvas_signal); - - /*Init the new canvas canvas*/ - if(copy == NULL) { - - } - /*Copy an existing canvas*/ - else { - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_canvas); - } - - LV_LOG_INFO("canvas created"); - - return new_canvas; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a buffer for the canvas. - * @param buf a buffer where the content of the canvas will be. - * The required size is (lv_img_color_format_get_px_size(cf) * w * h) / 8) - * It can be allocated with `lv_mem_alloc()` or - * it can be statically allocated array (e.g. static lv_color_t buf[100*50]) or - * it can be an address in RAM or external SRAM - * @param canvas pointer to a canvas object - * @param w width of the canvas - * @param h height of the canvas - * @param cf color format. The following formats are supported: - * LV_IMG_CF_TRUE_COLOR, LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED, LV_IMG_CF_INDEXES_1/2/4/8BIT - * - */ -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; - - lv_img_set_src(canvas, &ext->dsc); -} - -/** - * Set the color of a pixel on the canvas - * @param canvas pointer to canvas object - * @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_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); - lv_obj_invalidate(canvas); -} - -/** - * Set the palette color of a canvas with index format. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` - * @param canvas pointer to canvas object - * @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_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); - lv_obj_invalidate(canvas); -} - -/** - * Set a style of a canvas. - * @param canvas pointer to canvas object - * @param type which style should be set - * @param style pointer to a style - */ -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; - } -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the color of a pixel on the canvas - * @param canvas - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @return color of the point - */ -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); -} - -/** - * Get the image of the canvas as a pointer to an `lv_img_dsc_t` variable. - * @param canvas pointer to a canvas object - * @return pointer to the image descriptor. - */ -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; -} - -/** - * Get style of a canvas. - * @param canvas pointer to canvas object - * @param type which style should be get - * @return style pointer to the style - */ -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) { - case LV_CANVAS_STYLE_MAIN: style = lv_img_get_style(canvas, LV_IMG_STYLE_MAIN); break; - default: style = NULL; - } - - return style; -} - -/*===================== - * Other functions - *====================*/ - -/** - * Copy a buffer to the canvas - * @param canvas pointer to a canvas object - * @param to_copy buffer to copy. The color format has to match with the canvas's buffer color - * format - * @param w width of the buffer to copy - * @param h height of the buffer to copy - * @param x left side of the destination position - * @param y top side of the destination position - */ -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 >= (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 = ext->dsc.header.w * y * px_size + x * px_size; - uint8_t * to_copy8 = (uint8_t *)to_copy; - lv_coord_t i; - for(i = 0; i < h; i++) { - memcpy((void *)&ext->dsc.data[px], to_copy8, w * px_size); - px += ext->dsc.header.w * px_size; - to_copy8 += w * px_size; - } -} - -/** - * Rotate 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 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 - */ -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) -{ - 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; - - /*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; - - /*Get the integer part of the source pixel*/ - int xs_int = xs >> 8; - int ys_int = ys >> 8; - - if(xs_int >= img_width) - continue; - else if(xs_int < 0) - continue; - - 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(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); - } 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); - - /*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); - } - /*Both the image and canvas has alpha channel. Some extra calculation is - required*/ - else { - 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); - } - /*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)); - } - /*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); - 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_img_buf_set_px_color(&ext_dst->dsc, x + offset_x, y + offset_y, - lv_color_mix(color_res, bg_color, ratio)); - lv_img_buf_set_px_alpha(&ext_dst->dsc, x + offset_x, y + offset_y, opa_res_2); - } - } - } - } - } - } - - lv_obj_invalidate(canvas); -} - -/** - * 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) -{ - 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; - uint32_t y; - 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); - } - } -} - -/** - * Draw a rectangle on the canvas - * @param canvas pointer to a canvas object - * @param x left coordinate of the rectangle - * @param y top coordinate of the rectangle - * @param w width of the rectangle - * @param h height of the rectangle - * @param style style of the rectangle (`body` properties are used except `padding`) - */ -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); - - /* Create a dummy display to fool the lv_draw function. - * It will think it draws to real screen. */ - lv_area_t mask; - mask.x1 = 0; - mask.x2 = dsc->header.w - 1; - mask.y1 = 0; - mask.y2 = dsc->header.h - 1; - - lv_area_t coords; - coords.x1 = x; - coords.y1 = y; - coords.x2 = x + w - 1; - coords.y2 = y + h - 1; - - lv_disp_t disp; - memset(&disp, 0, sizeof(lv_disp_t)); - - lv_disp_buf_t disp_buf; - lv_disp_buf_init(&disp_buf, (void *)dsc->data, NULL, dsc->header.w * dsc->header.h); - lv_area_copy(&disp_buf.area, &mask); - - lv_disp_drv_init(&disp.driver); - - disp.driver.buffer = &disp_buf; - disp.driver.hor_res = dsc->header.w; - disp.driver.ver_res = dsc->header.h; - -#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 && - style->body.main_color.full == ctransp.full && - style->body.grad_color.full == ctransp.full) - { - disp.driver.antialiasing = 0; - } -#endif - - lv_disp_t * refr_ori = lv_refr_get_disp_refreshing(); - lv_refr_set_disp_refreshing(&disp); - - lv_draw_rect(&coords, &mask, style, LV_OPA_COVER); - - lv_refr_set_disp_refreshing(refr_ori); -} - -/** - * Draw a text on the canvas. - * @param canvas pointer to a canvas object - * @param x left coordinate of the text - * @param y top coordinate of the text - * @param max_w max width of the text. The text will be wrapped to fit into this size - * @param style style of the text (`text` properties are used) - * @param txt text to display - * @param align align of the text (`LV_LABEL_ALIGN_LEFT/RIGHT/CENTER`) - */ -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); - - /* Create a dummy display to fool the lv_draw function. - * It will think it draws to real screen. */ - lv_area_t mask; - mask.x1 = 0; - mask.x2 = dsc->header.w - 1; - mask.y1 = 0; - mask.y2 = dsc->header.h - 1; - - lv_area_t coords; - coords.x1 = x; - coords.y1 = y; - coords.x2 = x + max_w - 1; - coords.y2 = dsc->header.h - 1; - - lv_disp_t disp; - memset(&disp, 0, sizeof(lv_disp_t)); - - lv_disp_buf_t disp_buf; - lv_disp_buf_init(&disp_buf, (void *)dsc->data, NULL, dsc->header.w * dsc->header.h); - lv_area_copy(&disp_buf.area, &mask); - - lv_disp_drv_init(&disp.driver); - - disp.driver.buffer = &disp_buf; - disp.driver.hor_res = dsc->header.w; - disp.driver.ver_res = dsc->header.h; - - lv_disp_t * refr_ori = lv_refr_get_disp_refreshing(); - lv_refr_set_disp_refreshing(&disp); - - lv_txt_flag_t flag; - switch(align) { - case LV_LABEL_ALIGN_LEFT: flag = LV_TXT_FLAG_NONE; break; - case LV_LABEL_ALIGN_RIGHT: flag = LV_TXT_FLAG_RIGHT; break; - case LV_LABEL_ALIGN_CENTER: flag = LV_TXT_FLAG_CENTER; break; - default: flag = LV_TXT_FLAG_NONE; break; - } - - 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); -} - -/** - * Draw an image on the canvas - * @param canvas pointer to a canvas object - * @param src image source. Can be a pointer an `lv_img_dsc_t` variable or a path an image. - * @param style style of the image (`image` properties are used) - */ -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); - - /* Create a dummy display to fool the lv_draw function. - * It will think it draws to real screen. */ - lv_area_t mask; - mask.x1 = 0; - mask.x2 = dsc->header.w - 1; - mask.y1 = 0; - mask.y2 = dsc->header.h - 1; - - lv_img_header_t header; - lv_res_t res = lv_img_decoder_get_info(src, &header); - if(res != LV_RES_OK) { - LV_LOG_WARN("lv_canvas_draw_img: Couldn't get the image data."); - return; - } - - lv_area_t coords; - coords.x1 = x; - coords.y1 = y; - coords.x2 = x + header.w - 1; - coords.y2 = y + header.h - 1; - - lv_disp_t disp; - memset(&disp, 0, sizeof(lv_disp_t)); - - lv_disp_buf_t disp_buf; - lv_disp_buf_init(&disp_buf, (void *)dsc->data, NULL, dsc->header.w * dsc->header.h); - lv_area_copy(&disp_buf.area, &mask); - - lv_disp_drv_init(&disp.driver); - - disp.driver.buffer = &disp_buf; - disp.driver.hor_res = dsc->header.w; - disp.driver.ver_res = dsc->header.h; - - 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_refr_set_disp_refreshing(refr_ori); -} - -/** - * Draw a line on the canvas - * @param canvas pointer to a canvas object - * @param points point of the line - * @param point_cnt number of points - * @param style style of the line (`line` properties are used) - */ -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); - - /* Create a dummy display to fool the lv_draw function. - * It will think it draws to real screen. */ - lv_area_t mask; - mask.x1 = 0; - mask.x2 = dsc->header.w - 1; - mask.y1 = 0; - mask.y2 = dsc->header.h - 1; - - lv_disp_t disp; - memset(&disp, 0, sizeof(lv_disp_t)); - - lv_disp_buf_t disp_buf; - lv_disp_buf_init(&disp_buf, (void *)dsc->data, NULL, dsc->header.w * dsc->header.h); - lv_area_copy(&disp_buf.area, &mask); - - lv_disp_drv_init(&disp.driver); - - disp.driver.buffer = &disp_buf; - disp.driver.hor_res = dsc->header.w; - disp.driver.ver_res = dsc->header.h; - -#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 && - style->body.main_color.full == ctransp.full && - style->body.grad_color.full == ctransp.full) - { - disp.driver.antialiasing = 0; - } -#endif - - 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); -} - -/** - * Draw a polygon on the canvas - * @param canvas pointer to a canvas object - * @param points point of the polygon - * @param point_cnt number of points - * @param style style of the polygon (`body.main_color` and `body.opa` is used) - */ -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); - - /* Create a dummy display to fool the lv_draw function. - * It will think it draws to real screen. */ - lv_area_t mask; - mask.x1 = 0; - mask.x2 = dsc->header.w - 1; - mask.y1 = 0; - mask.y2 = dsc->header.h - 1; - - lv_disp_t disp; - memset(&disp, 0, sizeof(lv_disp_t)); - - lv_disp_buf_t disp_buf; - lv_disp_buf_init(&disp_buf, (void *)dsc->data, NULL, dsc->header.w * dsc->header.h); - lv_area_copy(&disp_buf.area, &mask); - - lv_disp_drv_init(&disp.driver); - - disp.driver.buffer = &disp_buf; - disp.driver.hor_res = dsc->header.w; - disp.driver.ver_res = dsc->header.h; - -#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 && - style->body.main_color.full == ctransp.full && - style->body.grad_color.full == ctransp.full) - { - disp.driver.antialiasing = 0; - } -#endif - - lv_disp_t * refr_ori = lv_refr_get_disp_refreshing(); - lv_refr_set_disp_refreshing(&disp); - - lv_draw_polygon(points, point_cnt, &mask, style, LV_OPA_COVER); - - lv_refr_set_disp_refreshing(refr_ori); -} - -/** - * Draw an arc on the canvas - * @param canvas pointer to a canvas object - * @param x origo x of the arc - * @param y origo y of the arc - * @param r radius of the arc - * @param start_angle start angle in degrees - * @param end_angle end angle in degrees - * @param style style of the polygon (`body.main_color` and `body.opa` is used) - */ -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); - - /* Create a dummy display to fool the lv_draw function. - * It will think it draws to real screen. */ - lv_area_t mask; - mask.x1 = 0; - mask.x2 = dsc->header.w - 1; - mask.y1 = 0; - mask.y2 = dsc->header.h - 1; - - lv_disp_t disp; - memset(&disp, 0, sizeof(lv_disp_t)); - - lv_disp_buf_t disp_buf; - lv_disp_buf_init(&disp_buf, (void *)dsc->data, NULL, dsc->header.w * dsc->header.h); - lv_area_copy(&disp_buf.area, &mask); - - lv_disp_drv_init(&disp.driver); - - disp.driver.buffer = &disp_buf; - disp.driver.hor_res = dsc->header.w; - disp.driver.ver_res = dsc->header.h; - -#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 && - style->body.main_color.full == ctransp.full && - style->body.grad_color.full == ctransp.full) - { - disp.driver.antialiasing = 0; - } -#endif - - lv_disp_t * refr_ori = lv_refr_get_disp_refreshing(); - lv_refr_set_disp_refreshing(&disp); - - lv_draw_arc(x, y, r, &mask, start_angle, end_angle, style, LV_OPA_COVER); - - lv_refr_set_disp_refreshing(refr_ori); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Signal function of the canvas - * @param canvas pointer to a canvas 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_canvas_signal(lv_obj_t * canvas, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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')*/ - } - - return res; -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_canvas.h b/src/libs/lvgl/src/lv_objx/lv_canvas.h deleted file mode 100644 index 9f9cf03e..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_canvas.h +++ /dev/null @@ -1,265 +0,0 @@ -/** - * @file lv_canvas.h - * - */ - -#ifndef LV_CANVAS_H -#define LV_CANVAS_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_CANVAS != 0 - -#include "../lv_core/lv_obj.h" -#include "../lv_objx/lv_img.h" -#include "../lv_draw/lv_draw_img.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -/*Data of canvas*/ -typedef struct -{ - lv_img_ext_t img; /*Ext. of ancestor*/ - /*New data for this type */ - lv_img_dsc_t dsc; -} lv_canvas_ext_t; - -/*Styles*/ -enum { - LV_CANVAS_STYLE_MAIN, -}; -typedef uint8_t lv_canvas_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a canvas object - * @param par pointer to an object, it will be the parent of the new canvas - * @param copy pointer to a canvas object, if not NULL then the new object will be copied from it - * @return pointer to the created canvas - */ -lv_obj_t * lv_canvas_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a buffer for the canvas. - * @param buf a buffer where the content of the canvas will be. - * The required size is (lv_img_color_format_get_px_size(cf) * w * h) / 8) - * It can be allocated with `lv_mem_alloc()` or - * it can be statically allocated array (e.g. static lv_color_t buf[100*50]) or - * it can be an address in RAM or external SRAM - * @param canvas pointer to a canvas object - * @param w width of the canvas - * @param h height of the canvas - * @param cf color format. `LV_IMG_CF_...` - */ -void lv_canvas_set_buffer(lv_obj_t * canvas, void * buf, lv_coord_t w, lv_coord_t h, lv_img_cf_t cf); - -/** - * Set the color of a pixel on the canvas - * @param canvas - * @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_canvas_set_px(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y, lv_color_t c); - -/** - * Set the palette color of a canvas with index format. Valid only for `LV_IMG_CF_INDEXED1/2/4/8` - * @param canvas pointer to canvas object - * @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_canvas_set_palette(lv_obj_t * canvas, uint8_t id, lv_color_t c); - -/** - * Set a style of a canvas. - * @param canvas pointer to canvas object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_canvas_set_style(lv_obj_t * canvas, lv_canvas_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the color of a pixel on the canvas - * @param canvas - * @param x x coordinate of the point to set - * @param y x coordinate of the point to set - * @return color of the point - */ -lv_color_t lv_canvas_get_px(lv_obj_t * canvas, lv_coord_t x, lv_coord_t y); - -/** - * Get the image of the canvas as a pointer to an `lv_img_dsc_t` variable. - * @param canvas pointer to a canvas object - * @return pointer to the image descriptor. - */ -lv_img_dsc_t * lv_canvas_get_img(lv_obj_t * canvas); - -/** - * Get style of a canvas. - * @param canvas pointer to canvas object - * @param type which style should be get - * @return style pointer to the style - */ -const lv_style_t * lv_canvas_get_style(const lv_obj_t * canvas, lv_canvas_style_t type); - -/*===================== - * Other functions - *====================*/ - -/** - * Copy a buffer to the canvas - * @param canvas pointer to a canvas object - * @param to_copy buffer to copy. The color format has to match with the canvas's buffer color - * format - * @param x left side of the destination position - * @param y top side of the destination position - * @param w width of the buffer to copy - * @param h height of the buffer to copy - */ -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); - -/** - * Rotate 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 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 - */ -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); - -/** - * 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); - -/** - * Draw a rectangle on the canvas - * @param canvas pointer to a canvas object - * @param x left coordinate of the rectangle - * @param y top coordinate of the rectangle - * @param w width of the rectangle - * @param h height of the rectangle - * @param style style of the rectangle (`body` properties are used except `padding`) - */ -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); - -/** - * Draw a text on the canvas. - * @param canvas pointer to a canvas object - * @param x left coordinate of the text - * @param y top coordinate of the text - * @param max_w max width of the text. The text will be wrapped to fit into this size - * @param style style of the text (`text` properties are used) - * @param txt text to display - * @param align align of the text (`LV_LABEL_ALIGN_LEFT/RIGHT/CENTER`) - */ -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); - -/** - * Draw an image on the canvas - * @param canvas pointer to a canvas object - * @param src image source. Can be a pointer an `lv_img_dsc_t` variable or a path an image. - * @param style style of the image (`image` properties are used) - */ -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); - -/** - * Draw a line on the canvas - * @param canvas pointer to a canvas object - * @param points point of the line - * @param point_cnt number of points - * @param style style of the line (`line` properties are used) - */ -void lv_canvas_draw_line(lv_obj_t * canvas, const lv_point_t * points, uint32_t point_cnt, const lv_style_t * style); - -/** - * Draw a polygon on the canvas - * @param canvas pointer to a canvas object - * @param points point of the polygon - * @param point_cnt number of points - * @param style style of the polygon (`body.main_color` and `body.opa` is used) - */ -void lv_canvas_draw_polygon(lv_obj_t * canvas, const lv_point_t * points, uint32_t point_cnt, const lv_style_t * style); - -/** - * Draw an arc on the canvas - * @param canvas pointer to a canvas object - * @param x origo x of the arc - * @param y origo y of the arc - * @param r radius of the arc - * @param start_angle start angle in degrees - * @param end_angle end angle in degrees - * @param style style of the polygon (`body.main_color` and `body.opa` is used) - */ -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); - -/********************** - * MACROS - **********************/ -#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) 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_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*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_CANVAS_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_cb.c b/src/libs/lvgl/src/lv_objx/lv_cb.c deleted file mode 100644 index c54adf40..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_cb.c +++ /dev/null @@ -1,338 +0,0 @@ -/** - * @file lv_cb.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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 - **********************/ - -/********************** - * 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_res_t lv_cb_signal(lv_obj_t * cb, lv_signal_t sign, void * param); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_design_cb_t ancestor_bg_design; -static lv_design_cb_t ancestor_bullet_design; -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a check box objects - * @param par pointer to an object, it will be the parent of the new check box - * @param copy pointer to a check box object, if not NULL then the new object will be copied from it - * @return pointer to the created check box - */ -lv_obj_t * lv_cb_create(lv_obj_t * par, const lv_obj_t * copy) -{ - - LV_LOG_TRACE("check box create started"); - - /*Create the ancestor basic object*/ - lv_obj_t * new_cb = lv_btn_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - ext->bullet = NULL; - ext->label = NULL; - - lv_obj_set_signal_cb(new_cb, lv_cb_signal); - lv_obj_set_design_cb(new_cb, lv_cb_design); - - /*Init the new checkbox object*/ - if(copy == NULL) { - ext->bullet = lv_btn_create(new_cb, NULL); - if(ancestor_bullet_design == NULL) ancestor_bullet_design = lv_obj_get_design_cb(ext->bullet); - lv_obj_set_click(ext->bullet, false); - - ext->label = lv_label_create(new_cb, NULL); - - lv_cb_set_text(new_cb, "Check box"); - lv_btn_set_layout(new_cb, LV_LAYOUT_ROW_M); - lv_btn_set_fit(new_cb, LV_FIT_TIGHT); - lv_btn_set_toggle(new_cb, true); - lv_obj_set_protect(new_cb, LV_PROTECT_PRESS_LOST); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_cb_set_style(new_cb, LV_CB_STYLE_BG, th->style.cb.bg); - lv_cb_set_style(new_cb, LV_CB_STYLE_BOX_REL, th->style.cb.box.rel); - lv_cb_set_style(new_cb, LV_CB_STYLE_BOX_PR, th->style.cb.box.pr); - lv_cb_set_style(new_cb, LV_CB_STYLE_BOX_TGL_REL, th->style.cb.box.tgl_rel); - lv_cb_set_style(new_cb, LV_CB_STYLE_BOX_TGL_PR, th->style.cb.box.tgl_pr); - lv_cb_set_style(new_cb, LV_CB_STYLE_BOX_INA, th->style.cb.box.ina); - } else { - lv_cb_set_style(new_cb, LV_CB_STYLE_BG, &lv_style_transp); - lv_cb_set_style(new_cb, LV_CB_STYLE_BOX_REL, &lv_style_pretty); - } - } else { - lv_cb_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->bullet = lv_btn_create(new_cb, copy_ext->bullet); - ext->label = lv_label_create(new_cb, copy_ext->label); - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_cb); - } - - lv_obj_set_design_cb(ext->bullet, lv_bullet_design); - - LV_LOG_INFO("check box created"); - - return new_cb; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the text of a check box. `txt` will be copied and may be deallocated - * after this function returns. - * @param cb pointer to a check box - * @param txt the text of the check box. NULL to refresh with the current text. - */ -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); -} - -/** - * Set the text of a check box. `txt` must not be deallocated during the life - * of this checkbox. - * @param cb pointer to a check box - * @param txt the text of the check box. NULL to refresh with the current text. - */ -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); -} - -/** - * Set a style of a check box - * @param cb pointer to check box object - * @param type which style should be set - * @param style pointer to a style - * */ -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) { - case LV_CB_STYLE_BG: - lv_btn_set_style(cb, LV_BTN_STYLE_REL, style); - lv_btn_set_style(cb, LV_BTN_STYLE_PR, style); - lv_btn_set_style(cb, LV_BTN_STYLE_TGL_REL, style); - lv_btn_set_style(cb, LV_BTN_STYLE_TGL_PR, style); - lv_btn_set_style(cb, LV_BTN_STYLE_INA, style); - break; - case LV_CB_STYLE_BOX_REL: lv_btn_set_style(ext->bullet, LV_BTN_STYLE_REL, style); break; - case LV_CB_STYLE_BOX_PR: lv_btn_set_style(ext->bullet, LV_BTN_STYLE_PR, style); break; - case LV_CB_STYLE_BOX_TGL_REL: lv_btn_set_style(ext->bullet, LV_BTN_STYLE_TGL_REL, style); break; - case LV_CB_STYLE_BOX_TGL_PR: lv_btn_set_style(ext->bullet, LV_BTN_STYLE_TGL_PR, style); break; - case LV_CB_STYLE_BOX_INA: lv_btn_set_style(ext->bullet, LV_BTN_STYLE_INA, style); break; - } -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the text of a check box - * @param cb pointer to check box object - * @return pointer to the text of the check box - */ -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); -} - -/** - * Get a style of a button - * @param cb pointer to check box object - * @param type which style should be get - * @return style pointer to the style - * */ -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; - case LV_CB_STYLE_BOX_TGL_PR: style = lv_btn_get_style(ext->bullet, LV_BTN_STYLE_TGL_PR); break; - case LV_CB_STYLE_BOX_INA: style = lv_btn_get_style(ext->bullet, LV_BTN_STYLE_INA); break; - default: style = NULL; break; - } - - return style; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_cb_design(lv_obj_t * cb, const lv_area_t * mask, 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); - } 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); - - /*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); - - } else { - result = ancestor_bg_design(cb, mask, mode); - } - - return result; -} - -/** - * 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 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' - */ -static bool lv_bullet_design(lv_obj_t * bullet, const lv_area_t * mask, lv_design_mode_t mode) -{ - if(mode == LV_DESIGN_COVER_CHK) { - return ancestor_bullet_design(bullet, mask, mode); - } else if(mode == LV_DESIGN_DRAW_MAIN) { -#if LV_USE_GROUP - /* If the check box is the active in a group and - * the background is not visible (transparent) - * then activate the style of the bullet*/ - const lv_style_t * style_ori = lv_obj_get_style(bullet); - lv_obj_t * bg = lv_obj_get_parent(bullet); - const lv_style_t * style_page = lv_obj_get_style(bg); - lv_group_t * g = lv_obj_get_group(bg); - if(style_page->body.opa == LV_OPA_TRANSP) { /*Is the Background visible?*/ - if(lv_group_get_focused(g) == bg) { - lv_style_t * style_mod; - style_mod = lv_group_mod_style(g, style_ori); - bullet->style_p = style_mod; /*Temporally change the style to the activated */ - } - } -#endif - ancestor_bullet_design(bullet, mask, 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); - } - - return true; -} - -/** - * Signal function of the check box - * @param cb pointer to a check box 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_cb_signal(lv_obj_t * cb, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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); - - if(sign == LV_SIGNAL_STYLE_CHG) { - const lv_style_t * label_style = lv_label_get_style(ext->label, LV_LABEL_STYLE_MAIN); - lv_obj_set_size(ext->bullet, lv_font_get_line_height(label_style->text.font), - lv_font_get_line_height(label_style->text.font)); - lv_btn_set_state(ext->bullet, lv_btn_get_state(cb)); - } else if(sign == LV_SIGNAL_PRESSED || sign == LV_SIGNAL_RELEASED || sign == LV_SIGNAL_PRESS_LOST) { - lv_btn_set_state(ext->bullet, lv_btn_get_state(cb)); - } else if(sign == LV_SIGNAL_CONTROL) { - char c = *((char *)param); - if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN || c == LV_KEY_LEFT || c == LV_KEY_UP) { - /*Follow the backgrounds state with the bullet*/ - lv_btn_set_state(ext->bullet, lv_btn_get_state(cb)); - } - } - - return res; -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_cb.h b/src/libs/lvgl/src/lv_objx/lv_cb.h deleted file mode 100644 index a6b1e74a..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_cb.h +++ /dev/null @@ -1,173 +0,0 @@ -/** - * @file lv_cb.h - * - */ - -#ifndef LV_CB_H -#define LV_CB_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_CB != 0 - -/*Testing of dependencies*/ -#if LV_USE_BTN == 0 -#error "lv_cb: lv_btn is required. Enable it in lv_conf.h (LV_USE_BTN 1) " -#endif - -#if LV_USE_LABEL == 0 -#error "lv_cb: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "lv_btn.h" -#include "lv_label.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*Data of check box*/ -typedef struct -{ - lv_btn_ext_t bg_btn; /*Ext. of ancestor*/ - /*New data for this type */ - lv_obj_t * bullet; /*Pointer to button*/ - lv_obj_t * label; /*Pointer to label*/ -} lv_cb_ext_t; - -/** Checkbox styles. */ -enum { - LV_CB_STYLE_BG, /**< Style of object background. */ - LV_CB_STYLE_BOX_REL, /**< Style of box (released). */ - LV_CB_STYLE_BOX_PR, /**< Style of box (pressed). */ - LV_CB_STYLE_BOX_TGL_REL, /**< Style of box (released but checked). */ - LV_CB_STYLE_BOX_TGL_PR, /**< Style of box (pressed and checked). */ - LV_CB_STYLE_BOX_INA, /**< Style of disabled box */ -}; -typedef uint8_t lv_cb_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a check box objects - * @param par pointer to an object, it will be the parent of the new check box - * @param copy pointer to a check box object, if not NULL then the new object will be copied from it - * @return pointer to the created check box - */ -lv_obj_t * lv_cb_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the text of a check box. `txt` will be copied and may be deallocated - * after this function returns. - * @param cb pointer to a check box - * @param txt the text of the check box. NULL to refresh with the current text. - */ -void lv_cb_set_text(lv_obj_t * cb, const char * txt); - -/** - * Set the text of a check box. `txt` must not be deallocated during the life - * of this checkbox. - * @param cb pointer to a check box - * @param txt the text of the check box. NULL to refresh with the current text. - */ -void lv_cb_set_static_text(lv_obj_t * cb, const char * txt); - -/** - * Set the state of the check box - * @param cb pointer to a check box object - * @param checked true: make the check box checked; false: make it unchecked - */ -static inline void lv_cb_set_checked(lv_obj_t * cb, bool checked) -{ - lv_btn_set_state(cb, checked ? LV_BTN_STATE_TGL_REL : LV_BTN_STATE_REL); -} - -/** - * Make the check box inactive (disabled) - * @param cb pointer to a check box object - */ -static inline void lv_cb_set_inactive(lv_obj_t * cb) -{ - lv_btn_set_state(cb, LV_BTN_STATE_INA); -} - -/** - * Set a style of a check box - * @param cb pointer to check box object - * @param type which style should be set - * @param style pointer to a style - * */ -void lv_cb_set_style(lv_obj_t * cb, lv_cb_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the text of a check box - * @param cb pointer to check box object - * @return pointer to the text of the check box - */ -const char * lv_cb_get_text(const lv_obj_t * cb); - -/** - * Get the current state of the check box - * @param cb pointer to a check box object - * @return true: checked; false: not checked - */ -static inline bool lv_cb_is_checked(const lv_obj_t * cb) -{ - return lv_btn_get_state(cb) == LV_BTN_STATE_REL ? false : true; -} - -/** - * Get whether the check box is inactive or not. - * @param cb pointer to a check box object - * @return true: inactive; false: not inactive - */ -static inline bool lv_cb_is_inactive(const lv_obj_t * cb) -{ - return lv_btn_get_state(cb) == LV_BTN_STATE_INA ? true :false; -} - -/** - * Get a style of a button - * @param cb pointer to check box object - * @param type which style should be get - * @return style pointer to the style - * */ -const lv_style_t * lv_cb_get_style(const lv_obj_t * cb, lv_cb_style_t type); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_CB*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_CB_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_chart.c b/src/libs/lvgl/src/lv_objx/lv_chart.c deleted file mode 100644 index 2dfdef0e..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_chart.c +++ /dev/null @@ -1,1557 +0,0 @@ -/** - * @file lv_chart.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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_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 -#define LV_CHART_VDIV_DEF 5 -#define LV_CHART_PNUM_DEF 10 -#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_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); -static void lv_chart_draw_points(lv_obj_t * chart, const lv_area_t * mask); -static void lv_chart_draw_cols(lv_obj_t * chart, const lv_area_t * mask); -static void lv_chart_draw_vertical_lines(lv_obj_t * chart, const lv_area_t * mask); -static void lv_chart_draw_areas(lv_obj_t * chart, const lv_area_t * mask); -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 - **********************/ -static lv_design_cb_t ancestor_design_f; -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a chart background objects - * @param par pointer to an object, it will be the parent of the new chart background - * @param copy pointer to a chart background object, if not NULL then the new object will be copied - * from it - * @return pointer to the created chart background - */ -lv_obj_t * lv_chart_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("chart create started"); - - /*Create the ancestor basic object*/ - lv_obj_t * new_chart = lv_obj_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - lv_ll_init(&ext->series_ll, sizeof(lv_chart_series_t)); - - ext->series.num = 0; - ext->ymin = LV_CHART_YMIN_DEF; - ext->ymax = LV_CHART_YMAX_DEF; - ext->hdiv_cnt = LV_CHART_HDIV_DEF; - ext->vdiv_cnt = LV_CHART_VDIV_DEF; - ext->point_cnt = LV_CHART_PNUM_DEF; - ext->type = LV_CHART_TYPE_LINE; - ext->update_mode = LV_CHART_UPDATE_MODE_SHIFT; - ext->series.opa = LV_OPA_COVER; - ext->series.dark = LV_OPA_50; - ext->series.width = 2; - 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); - - lv_obj_set_signal_cb(new_chart, lv_chart_signal); - lv_obj_set_design_cb(new_chart, lv_chart_design); - - /*Init the new chart background object*/ - if(copy == NULL) { - lv_obj_set_size(new_chart, LV_DPI * 3, LV_DPI * 2); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_chart_set_style(new_chart, LV_CHART_STYLE_MAIN, th->style.chart); - } else { - lv_chart_set_style(new_chart, LV_CHART_STYLE_MAIN, &lv_style_pretty); - } - - } else { - lv_chart_ext_t * ext_copy = lv_obj_get_ext_attr(copy); - - ext->type = ext_copy->type; - ext->ymin = ext_copy->ymin; - ext->ymax = ext_copy->ymax; - ext->hdiv_cnt = ext_copy->hdiv_cnt; - ext->vdiv_cnt = ext_copy->vdiv_cnt; - ext->point_cnt = ext_copy->point_cnt; - ext->series.opa = ext_copy->series.opa; - 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); - } - - LV_LOG_INFO("chart created"); - - return new_chart; -} - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Allocate and add a data series to the chart - * @param chart pointer to a chart object - * @param color color of the data series - * @return pointer to the allocated data series - */ -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_ASSERT_MEM(ser); - if(ser == NULL) return NULL; - - lv_coord_t def = LV_CHART_POINT_DEF; - - if(ser == NULL) return NULL; - - ser->color = color; - ser->points = lv_mem_alloc(sizeof(lv_coord_t) * ext->point_cnt); - LV_ASSERT_MEM(ser->points); - if(ser->points == NULL) { - lv_ll_rem(&ext->series_ll, ser); - lv_mem_free(ser); - return NULL; - } - - ser->start_point = 0; - - uint16_t i; - lv_coord_t * p_tmp = ser->points; - for(i = 0; i < ext->point_cnt; i++) { - *p_tmp = def; - p_tmp++; - } - - ext->series.num++; - - return ser; -} - -/** - * Clear the point of a serie - * @param chart pointer to a chart object - * @param serie pointer to the chart's serie to clear - */ -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; - - uint32_t i; - for(i = 0; i < ext->point_cnt; i++) { - serie->points[i] = LV_CHART_POINT_DEF; - } - - serie->start_point = 0; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the number of horizontal and vertical division lines - * @param chart pointer to a graph background object - * @param hdiv number of horizontal division lines - * @param vdiv number of vertical division lines - */ -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; - - ext->hdiv_cnt = hdiv; - ext->vdiv_cnt = vdiv; - - lv_obj_invalidate(chart); -} - -/** - * Set the minimal and maximal y values - * @param chart pointer to a graph background object - * @param ymin y minimum value - * @param ymax y maximum value - */ -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; - - ext->ymin = ymin; - ext->ymax = ymax; - - lv_chart_refresh(chart); -} - -/** - * Set a new type for a chart - * @param chart pointer to a chart object - * @param type new type of the chart (from 'lv_chart_type_t' enum) - */ -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; - - ext->type = type; - - lv_chart_refresh(chart); -} - -/** - * Set the number of points on a data line on a chart - * @param chart pointer r to chart object - * @param point_cnt new number of points on the data lines - */ -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; - - lv_chart_series_t * ser; - uint16_t point_cnt_old = ext->point_cnt; - uint16_t i; - lv_coord_t def = LV_CHART_POINT_DEF; - - if(point_cnt < 1) point_cnt = 1; - - LV_LL_READ_BACK(ext->series_ll, ser) - { - if(ser->start_point != 0) { - lv_coord_t * new_points = lv_mem_alloc(sizeof(lv_coord_t) * point_cnt); - LV_ASSERT_MEM(new_points); - if(new_points == NULL) return; - - if(point_cnt >= point_cnt_old) { - for(i = 0; i < point_cnt_old; i++) { - new_points[i] = - ser->points[(i + ser->start_point) % point_cnt_old]; /*Copy old contents to new array*/ - } - for(i = point_cnt_old; i < point_cnt; i++) { - new_points[i] = def; /*Fill up the rest with default value*/ - } - } else { - for(i = 0; i < point_cnt; i++) { - new_points[i] = - ser->points[(i + ser->start_point) % point_cnt_old]; /*Copy old contents to new array*/ - } - } - - /*Switch over pointer from old to new*/ - lv_mem_free(ser->points); - ser->points = new_points; - } else { - ser->points = lv_mem_realloc(ser->points, sizeof(lv_coord_t) * point_cnt); - LV_ASSERT_MEM(ser->points); - if(ser->points == NULL) return; - /*Initialize the new points*/ - if(point_cnt > point_cnt_old) { - for(i = point_cnt_old - 1; i < point_cnt; i++) { - ser->points[i] = def; - } - } - } - - ser->start_point = 0; - } - - ext->point_cnt = point_cnt; - - lv_chart_refresh(chart); -} - -/** - * Set the opacity of the data series - * @param chart pointer to a chart object - * @param opa opacity of the data series - */ -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; - - ext->series.opa = opa; - lv_obj_invalidate(chart); -} - -/** - * Set the line width or point radius of the data series - * @param chart pointer to a chart object - * @param width the new width - */ -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; - - ext->series.width = width; - lv_obj_invalidate(chart); -} -/** - * Set the dark effect on the bottom of the points or columns - * @param chart pointer to a chart object - * @param dark_eff dark effect level (LV_OPA_TRANSP to turn off) - */ -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; - - ext->series.dark = dark_eff; - lv_obj_invalidate(chart); -} - -/** - * Initialize all data points with a value - * @param chart pointer to chart object - * @param ser pointer to a data series on 'chart' - * @param y the new value for all points - */ -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++) { - ser->points[i] = y; - } - ser->start_point = 0; - lv_chart_refresh(chart); -} - -/** - * Set the value of points from an array - * @param chart pointer to chart object - * @param ser pointer to a data series on 'chart' - * @param y_array array of 'lv_coord_t' points (with 'points count' elements ) - */ -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; - lv_chart_refresh(chart); -} - -/** - * Shift all data left and set the rightmost data on a data line - * @param chart pointer to chart object - * @param ser pointer to a data series on 'chart' - * @param y the new value of the rightmost data - */ -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] = - y; /*This was the place of the former left most value, after shifting it is the rightmost*/ - ser->start_point = (ser->start_point + 1) % ext->point_cnt; - lv_chart_refresh(chart); - } else if(ext->update_mode == LV_CHART_UPDATE_MODE_CIRCULAR) { - ser->points[ser->start_point] = y; - - if(ext->type & LV_CHART_TYPE_LINE) lv_chart_inv_lines(chart, ser->start_point); - if(ext->type & LV_CHART_TYPE_COLUMN) lv_chart_inv_cols(chart, ser->start_point); - 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); - - ser->start_point = (ser->start_point + 1) % ext->point_cnt; /*update the x for next incoming y*/ - } -} - -/** - * Set update mode of the chart object. - * @param chart pointer to a chart object - * @param update mode - */ -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; - - ext->update_mode = update_mode; - lv_obj_invalidate(chart); -} - -/** - * Set the length of the tick marks on the x 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_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; -} - -/** - * Set the length of the tick marks on the 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_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 - * @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_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; - ext->x_axis.options = options; -} - -/** - * Set the 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_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 - * @param margin value of the margin [px] - */ -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); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the type of a chart - * @param chart pointer to chart object - * @return type of the chart (from 'lv_chart_t' enum) - */ -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; -} - -/** - * Get the data point number per data line on 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) -{ - LV_ASSERT_OBJ(chart, LV_OBJX_NAME); - - lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - return ext->point_cnt; -} - -/** - * Get the opacity of the data series - * @param chart pointer to chart object - * @return the opacity of the data series - */ -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; -} - -/** - * Get the data series width - * @param chart pointer to chart object - * @return the width the data series (lines or points) - */ -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; -} - -/** - * Get the dark effect level on the bottom of the points or columns - * @param chart pointer to chart object - * @return dark effect level (LV_OPA_TRANSP to turn off) - */ -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; -} - -/*===================== - * Other functions - *====================*/ - -/** - * Refresh a chart if its data line has changed - * @param chart pointer to chart object - */ -void lv_chart_refresh(lv_obj_t * chart) -{ - LV_ASSERT_OBJ(chart, LV_OBJX_NAME); - - lv_obj_invalidate(chart); -} - -/** - * Get the margin around the chart, used for axes value and labels - * @param chart pointer to an chart object - * @param return value of the margin - */ -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; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_chart_design(lv_obj_t * chart, const lv_area_t * mask, 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); - } 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_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - - lv_chart_draw_div(chart, mask); - - /* 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); - - 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); - } - - lv_chart_draw_axes(chart, mask); - } - return true; -} - -/** - * Signal function of the chart background - * @param chart pointer to a chart background object - * @param sign a signal type from lv_signal_t enum - * @param param pointer to a signal specific variable - */ -static lv_res_t lv_chart_signal(lv_obj_t * chart, lv_signal_t sign, void * param) -{ - /* 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; - LV_LL_READ(ext->series_ll, datal) - { - lv_mem_free(*datal); - } - lv_ll_clear(&ext->series_ll); - } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { - /*Provide extra px draw area around the chart*/ - chart->ext_draw_pad = ext->margin; - } - - return res; -} - -/** - * Draw the division lines on chart background - * @param chart pointer to chart object - * @param mask mask, inherited from the design function - */ -static void lv_chart_draw_div(lv_obj_t * chart, const lv_area_t * mask) -{ - lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - const lv_style_t * style = lv_obj_get_style(chart); - lv_opa_t opa_scale = lv_obj_get_opa_scale(chart); - - uint8_t div_i; - uint8_t div_i_end; - uint8_t div_i_start; - lv_point_t p1; - lv_point_t p2; - 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; - - if(ext->hdiv_cnt != 0) { - /*Draw side lines if no border*/ - if(style->body.border.width != 0) { - div_i_start = 1; - div_i_end = ext->hdiv_cnt; - } else { - div_i_start = 0; - div_i_end = ext->hdiv_cnt + 1; - } - - p1.x = 0 + x_ofs; - p2.x = w - 1 + x_ofs; - for(div_i = div_i_start; div_i <= div_i_end; div_i++) { - p1.y = (int32_t)((int32_t)(h - style->line.width) * div_i) / (ext->hdiv_cnt + 1); - p1.y += y_ofs; - p2.y = p1.y; - lv_draw_line(&p1, &p2, mask, style, opa_scale); - } - } - - if(ext->vdiv_cnt != 0) { - /*Draw side lines if no border*/ - if(style->body.border.width != 0) { - div_i_start = 1; - div_i_end = ext->vdiv_cnt; - } else { - div_i_start = 0; - div_i_end = ext->vdiv_cnt + 1; - } - - p1.y = 0 + y_ofs; - p2.y = h + y_ofs - 1; - for(div_i = div_i_start; div_i <= div_i_end; div_i++) { - p1.x = (int32_t)((int32_t)(w - style->line.width) * div_i) / (ext->vdiv_cnt + 1); - p1.x += x_ofs; - p2.x = p1.x; - lv_draw_line(&p1, &p2, mask, style, opa_scale); - } - } -} - -/** - * Draw the data lines as lines on a chart - * @param obj pointer to chart object - */ -static void lv_chart_draw_lines(lv_obj_t * chart, const lv_area_t * mask) -{ - lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - - uint16_t i; - lv_point_t p1; - lv_point_t p2; - 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; - int32_t y_tmp; - lv_coord_t p_prev; - lv_coord_t p_act; - lv_chart_series_t * ser; - lv_opa_t opa_scale = lv_obj_get_opa_scale(chart); - lv_style_t style; - lv_style_copy(&style, &lv_style_plain); - style.line.opa = ext->series.opa; - style.line.width = ext->series.width; - - /*Go through all data lines*/ - LV_LL_READ_BACK(ext->series_ll, ser) - { - style.line.color = ser->color; - - lv_coord_t start_point = ext->update_mode == LV_CHART_UPDATE_MODE_SHIFT ? ser->start_point : 0; - - p1.x = 0 + x_ofs; - p2.x = 0 + x_ofs; - - p_prev = start_point; - y_tmp = (int32_t)((int32_t)ser->points[p_prev] - ext->ymin) * h; - y_tmp = y_tmp / (ext->ymax - ext->ymin); - p2.y = h - y_tmp + y_ofs; - - for(i = 1; i < ext->point_cnt; i++) { - p1.x = p2.x; - p1.y = p2.y; - - p2.x = ((w * i) / (ext->point_cnt - 1)) + x_ofs; - - p_act = (start_point + i) % ext->point_cnt; - - y_tmp = (int32_t)((int32_t)ser->points[p_act] - ext->ymin) * h; - 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_draw_line(&p1, &p2, mask, &style, opa_scale); - - p_prev = p_act; - } - } -} - -/** - * Draw the data lines as points on a chart - * @param chart pointer to chart object - * @param mask mask, inherited from the design function - */ -static void lv_chart_draw_points(lv_obj_t * chart, const lv_area_t * mask) -{ - lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - - uint16_t i; - 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; - int32_t y_tmp; - lv_coord_t p_act; - lv_chart_series_t * ser; - uint8_t series_cnt = 0; - lv_style_t style_point; - lv_style_copy(&style_point, &lv_style_plain); - - style_point.body.border.width = 0; - style_point.body.radius = LV_RADIUS_CIRCLE; - style_point.body.opa = ext->series.opa; - style_point.body.radius = ext->series.width; - - /*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_point.body.main_color = ser->color; - style_point.body.grad_color = lv_color_mix(LV_COLOR_BLACK, ser->color, ext->series.dark); - - for(i = 0; i < ext->point_cnt; i++) { - cir_a.x1 = ((w * i) / (ext->point_cnt - 1)) + x_ofs; - cir_a.x2 = cir_a.x1 + style_point.body.radius; - cir_a.x1 -= style_point.body.radius; - - p_act = (start_point + i) % ext->point_cnt; - y_tmp = (int32_t)((int32_t)ser->points[p_act] - ext->ymin) * h; - y_tmp = y_tmp / (ext->ymax - ext->ymin); - - cir_a.y1 = h - y_tmp + y_ofs - 1; - cir_a.y2 = cir_a.y1 + style_point.body.radius; - cir_a.y1 -= style_point.body.radius; - - if(ser->points[p_act] != LV_CHART_POINT_DEF) - lv_draw_rect(&cir_a, mask, &style_point, lv_obj_get_opa_scale(chart)); - } - series_cnt++; - } -} - -/** - * Draw the data lines as columns on a chart - * @param chart pointer to chart object - * @param mask mask, inherited from the design function - */ -static void lv_chart_draw_cols(lv_obj_t * chart, const lv_area_t * mask) -{ - lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - - uint16_t i; - lv_area_t col_a; - lv_area_t col_mask; - bool mask_ret; - lv_coord_t w = lv_obj_get_width(chart); - lv_coord_t h = lv_obj_get_height(chart); - int32_t y_tmp; - lv_chart_series_t * ser; - lv_style_t rects; - lv_coord_t col_w = w / ((ext->series.num + 1) * ext->point_cnt); /* Suppose + 1 series as separator*/ - lv_coord_t x_ofs = col_w / 2; /*Shift with a half col.*/ - - lv_style_copy(&rects, &lv_style_plain); - rects.body.border.width = 0; - rects.body.radius = 0; - rects.body.opa = ext->series.opa; - - col_a.y2 = chart->coords.y2; - - lv_coord_t x_act; - - /*Go through all points*/ - for(i = 0; i < ext->point_cnt; i++) { - x_act = (int32_t)((int32_t)w * i) / ext->point_cnt; - x_act += chart->coords.x1 + x_ofs; - - /*Draw the current point of all data line*/ - 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; - - col_a.x1 = x_act; - col_a.x2 = col_a.x1 + col_w; - x_act += col_w; - - if(col_a.x2 < mask->x1) continue; - if(col_a.x1 > mask->x2) break; - - rects.body.main_color = ser->color; - rects.body.grad_color = lv_color_mix(LV_COLOR_BLACK, ser->color, ext->series.dark); - - lv_coord_t p_act = (start_point + i) % ext->point_cnt; - y_tmp = (int32_t)((int32_t)ser->points[p_act] - ext->ymin) * h; - y_tmp = y_tmp / (ext->ymax - ext->ymin); - col_a.y1 = h - y_tmp + chart->coords.y1; - - mask_ret = lv_area_intersect(&col_mask, mask, &col_a); - if(mask_ret != false && ser->points[p_act] != LV_CHART_POINT_DEF) { - lv_draw_rect(&chart->coords, &col_mask, &rects, lv_obj_get_opa_scale(chart)); - } - } - } -} - -/** - * Draw the data lines as vertical lines on a chart if there is only 1px between point - * @param obj pointer to chart object - */ -static void lv_chart_draw_vertical_lines(lv_obj_t * chart, const lv_area_t * mask) -{ - - lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - lv_coord_t w = lv_obj_get_width(chart); - /*Vertical lines works only if the width == point count. Else use the normal line type*/ - if(ext->point_cnt != w) { - lv_chart_draw_lines(chart, mask); - return; - } - - uint16_t i; - lv_point_t p1; - lv_point_t p2; - lv_coord_t p_act; - 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; - int32_t y_tmp; - lv_chart_series_t * ser; - lv_opa_t opa_scale = lv_obj_get_opa_scale(chart); - lv_style_t style; - lv_style_copy(&style, &lv_style_plain); - style.line.opa = ext->series.opa; - style.line.width = ext->series.width; - - /*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.line.color = ser->color; - - p1.x = 0 + x_ofs; - p2.x = 0 + x_ofs; - y_tmp = (int32_t)((int32_t)ser->points[0] - ext->ymin) * h; - y_tmp = y_tmp / (ext->ymax - ext->ymin); - p2.y = h - y_tmp + y_ofs; - p1.y = p2.y; - - for(i = 0; i < ext->point_cnt; i++) { - p_act = (start_point + i) % ext->point_cnt; - - y_tmp = (int32_t)((int32_t)ser->points[p_act] - ext->ymin) * h; - y_tmp = y_tmp / (ext->ymax - ext->ymin); - p2.y = h - y_tmp + y_ofs; - - if(p1.y == p2.y) { - p2.x++; - } - - if(ser->points[p_act] != LV_CHART_POINT_DEF) { - lv_draw_line(&p1, &p2, mask, &style, opa_scale); - } - - p2.x = ((w * p_act) / (ext->point_cnt - 1)) + x_ofs; - p1.x = p2.x; - p1.y = p2.y; - } - } -} - -/** - * Draw the data lines as areas on a chart - * @param obj pointer to chart object - */ -static void lv_chart_draw_areas(lv_obj_t * chart, const lv_area_t * mask) -{ - lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - - uint16_t i; - lv_point_t p1; - lv_point_t p2; - 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; - int32_t y_tmp; - lv_coord_t p_prev; - lv_coord_t p_act; - lv_chart_series_t * ser; - lv_opa_t opa_scale = lv_obj_get_opa_scale(chart); - lv_style_t style; - lv_style_copy(&style, &lv_style_plain); - - /*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.opa = ext->series.opa; - - p2.x = 0 + x_ofs; - - p_prev = start_point; - y_tmp = (int32_t)((int32_t)ser->points[p_prev] - ext->ymin) * h; - y_tmp = y_tmp / (ext->ymax - ext->ymin); - p2.y = h - y_tmp + y_ofs; - - for(i = 1; i < ext->point_cnt; i++) { - p1.x = p2.x; - p1.y = p2.y; - - p_act = (start_point + i) % ext->point_cnt; - p2.x = ((w * i) / (ext->point_cnt - 1)) + x_ofs; - - y_tmp = (int32_t)((int32_t)ser->points[p_act] - ext->ymin) * h; - 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); - } - p_prev = p_act; - } - } -} - -/** - * 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(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; - uint8_t num_of_labels; - uint8_t num_scale_ticks; - 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; - 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(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 = y_axis->major_tick_len; - - 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 = y_axis->minor_tick_len; - - /* 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(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 = y_axis->num_tick_marks; - else - 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; - - /* 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 % 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 */ - - /* draw a line at moving y position */ - p2.y = p1.y = - y_ofs + (int32_t)((int32_t)(h - style->line.width) * i) / num_scale_ticks; - - 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(lv_chart_is_tick_with_label(i, y_axis)) { - - lv_chart_get_next_label(&iter, buf); - - /* reserve appropriate area */ - lv_point_t size; - lv_txt_get_size(&size, buf, style->text.font, style->text.letter_space, style->text.line_space, - 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 = {.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)); - } - } - - } - } -} - -static void lv_chart_draw_x_ticks(lv_obj_t * chart, const lv_area_t * mask) -{ - lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - - if(ext->x_axis.list_of_values != NULL || ext->x_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; - 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; - 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 */ - - /* calculate the size of tick marks */ - if(ext->x_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->x_axis.major_tick_len; - - if(ext->x_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->x_axis.minor_tick_len; - - /*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; - - /* calculate total number of marks */ - if(num_of_labels < 2) - num_scale_ticks = ext->x_axis.num_tick_marks; - else - num_scale_ticks = (ext->x_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.y = h + y_ofs; - - /* second point of the tick */ - if((num_of_labels != 0) && (i == 0 || i % ext->x_axis.num_tick_marks == 0)) - p2.y = p1.y + major_tick_len; /* major tick */ - else - p2.y = p1.y + minor_tick_len; /* minor tick */ - - /* draw a line at moving x position */ - p2.x = p1.x = x_ofs + (int32_t)((int32_t)(w - style->line.width) * i) / num_scale_ticks; - - if(i != num_scale_ticks) - lv_draw_line(&p1, &p2, mask, style, opa_scale); - else if((ext->x_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(lv_chart_is_tick_with_label(i, &(ext->x_axis))) { - lv_chart_get_next_label(&iter, buf); - - /* reserve appropriate area */ - lv_point_t size; - lv_txt_get_size(&size, buf, style->text.font, style->text.letter_space, style->text.line_space, - LV_COORD_MAX, LV_TXT_FLAG_CENTER); - - /* 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, NULL, NULL, lv_obj_get_base_dir(chart)); - } - } - } - } -} - -static void lv_chart_draw_axes(lv_obj_t * chart, const lv_area_t * 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); -} - -/** - * invalid area of the new line data lines on a chart - * @param obj pointer to chart object - */ -static void lv_chart_inv_lines(lv_obj_t * chart, uint16_t i) -{ - lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - - lv_coord_t w = lv_obj_get_width(chart); - lv_coord_t x_ofs = chart->coords.x1; - - if(i < ext->point_cnt) { - lv_area_t coords; - lv_obj_get_coords(chart, &coords); - if(i < ext->point_cnt - 1) { - coords.x1 = ((w * i) / (ext->point_cnt - 1)) + x_ofs - ext->series.width; - coords.x2 = ((w * (i + 1)) / (ext->point_cnt - 1)) + x_ofs + ext->series.width; - lv_obj_invalidate_area(chart, &coords); - } - - if(i > 0) { - coords.x1 = ((w * (i - 1)) / (ext->point_cnt - 1)) + x_ofs - ext->series.width; - coords.x2 = ((w * i) / (ext->point_cnt - 1)) + x_ofs + ext->series.width; - lv_obj_invalidate_area(chart, &coords); - } - } -} - -/** - * invalid area of the new point data lines on a chart - * @param chart pointer to chart object - * @param mask mask, inherited from the design function - */ -static void lv_chart_inv_points(lv_obj_t * chart, uint16_t i) -{ - lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - - lv_area_t cir_a; - lv_coord_t w = lv_obj_get_width(chart); - lv_coord_t x_ofs = chart->coords.x1; - - lv_obj_get_coords(chart, &cir_a); - cir_a.x1 = ((w * i) / (ext->point_cnt - 1)) + x_ofs; - cir_a.x2 = cir_a.x1 + ext->series.width; - cir_a.x1 -= ext->series.width; - - lv_inv_area(lv_obj_get_disp(chart), &cir_a); -} - -/** - * invalid area of the new column data lines on a chart - * @param chart pointer to chart object - * @param mask mask, inherited from the design function - */ -static void lv_chart_inv_cols(lv_obj_t * chart, uint16_t i) -{ - lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - - lv_area_t col_a; - lv_coord_t w = lv_obj_get_width(chart); - lv_coord_t col_w = w / ((ext->series.num + 1) * ext->point_cnt); /* Suppose + 1 series as separator*/ - lv_coord_t x_ofs = col_w / 2; /*Shift with a half col.*/ - - lv_coord_t x_act; - - x_act = (int32_t)((int32_t)w * i) / ext->point_cnt; - x_act += chart->coords.x1 + x_ofs; - - lv_obj_get_coords(chart, &col_a); - col_a.x1 = x_act; - col_a.x2 = col_a.x1 + col_w; - - lv_inv_area(lv_obj_get_disp(chart), &col_a); -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_chart.h b/src/libs/lvgl/src/lv_objx/lv_chart.h deleted file mode 100644 index 55fb9299..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_chart.h +++ /dev/null @@ -1,395 +0,0 @@ -/** - * @file lv_chart.h - * - */ - -#ifndef LV_CHART_H -#define LV_CHART_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_CHART != 0 - -#include "../lv_core/lv_obj.h" -#include "lv_line.h" - -/********************* - * DEFINES - *********************/ - -/**Default value of points. Can be used to not draw a point*/ -#define LV_CHART_POINT_DEF (LV_COORD_MIN) - -/**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 - **********************/ - -/** Chart types*/ -enum { - LV_CHART_TYPE_NONE = 0x00, /**< Don't draw the series*/ - LV_CHART_TYPE_LINE = 0x01, /**< Connect the points with lines*/ - LV_CHART_TYPE_COLUMN = 0x02, /**< Draw columns*/ - 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*/ -}; -typedef uint8_t lv_chart_type_t; - -/** Chart update mode for `lv_chart_set_next`*/ -enum { - LV_CHART_UPDATE_MODE_SHIFT, /**< Shift old data to the left and add the new one o the right*/ - LV_CHART_UPDATE_MODE_CIRCULAR, /**< Add the new data in a circular way*/ -}; -typedef uint8_t lv_chart_update_mode_t; - -typedef struct -{ - lv_coord_t * points; - lv_color_t color; - uint16_t start_point; -} lv_chart_series_t; - -/** 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_INVERSE_LABELS_ORDER = 0x02 /**< draw tick labels in an inversed order*/ -}; -typedef uint8_t lv_chart_axis_options_t; - -typedef struct -{ - const char * list_of_values; - lv_chart_axis_options_t options; - uint8_t num_tick_marks; - uint8_t major_tick_len; - uint8_t minor_tick_len; -} lv_chart_axis_cfg_t; - -/*Data of chart */ -typedef struct -{ - /*No inherited ext*/ /*Ext. of ancestor*/ - /*New data for this type */ - lv_ll_t series_ll; /*Linked list for the data line pointers (stores lv_chart_dl_t)*/ - lv_coord_t ymin; /*y min value (used to scale the data)*/ - lv_coord_t ymax; /*y max value (used to scale the data)*/ - uint8_t hdiv_cnt; /*Number of horizontal division lines*/ - uint8_t vdiv_cnt; /*Number of vertical division lines*/ - uint16_t point_cnt; /*Point number in a data line*/ - 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 - { - lv_coord_t width; /*Line width or point radius*/ - uint8_t num; /*Number of data lines in dl_ll*/ - lv_opa_t opa; /*Opacity of data lines*/ - lv_opa_t dark; /*Dark level of the point/column bottoms*/ - } series; -} lv_chart_ext_t; - -enum { - LV_CHART_STYLE_MAIN, -}; -typedef uint8_t lv_chart_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a chart background objects - * @param par pointer to an object, it will be the parent of the new chart background - * @param copy pointer to a chart background object, if not NULL then the new object will be copied - * from it - * @return pointer to the created chart background - */ -lv_obj_t * lv_chart_create(lv_obj_t * par, const lv_obj_t * copy); - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Allocate and add a data series to the chart - * @param chart pointer to a chart object - * @param color color of the data series - * @return pointer to the allocated data series - */ -lv_chart_series_t * lv_chart_add_series(lv_obj_t * chart, lv_color_t color); - -/** - * Clear the point of a serie - * @param chart pointer to a chart object - * @param serie pointer to the chart's serie to clear - */ -void lv_chart_clear_serie(lv_obj_t * chart, lv_chart_series_t * serie); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the number of horizontal and vertical division lines - * @param chart pointer to a graph background object - * @param hdiv number of horizontal division lines - * @param vdiv number of vertical division lines - */ -void lv_chart_set_div_line_count(lv_obj_t * chart, uint8_t hdiv, uint8_t vdiv); - -/** - * Set the minimal and maximal y values - * @param chart pointer to a graph background object - * @param ymin y minimum value - * @param ymax y maximum value - */ -void lv_chart_set_range(lv_obj_t * chart, lv_coord_t ymin, lv_coord_t ymax); - -/** - * Set a new type for a chart - * @param chart pointer to a chart object - * @param type new type of the chart (from 'lv_chart_type_t' enum) - */ -void lv_chart_set_type(lv_obj_t * chart, lv_chart_type_t type); - -/** - * Set the number of points on a data line on a chart - * @param chart pointer r to chart object - * @param point_cnt new number of points on the data lines - */ -void lv_chart_set_point_count(lv_obj_t * chart, uint16_t point_cnt); - -/** - * Set the opacity of the data series - * @param chart pointer to a chart object - * @param opa opacity of the data series - */ -void lv_chart_set_series_opa(lv_obj_t * chart, lv_opa_t opa); - -/** - * Set the line width or point radius of the data series - * @param chart pointer to a chart object - * @param width the new width - */ -void lv_chart_set_series_width(lv_obj_t * chart, lv_coord_t width); - -/** - * Set the dark effect on the bottom of the points or columns - * @param chart pointer to a chart object - * @param dark_eff dark effect level (LV_OPA_TRANSP to turn off) - */ -void lv_chart_set_series_darking(lv_obj_t * chart, lv_opa_t dark_eff); - -/** - * Initialize all data points with a value - * @param chart pointer to chart object - * @param ser pointer to a data series on 'chart' - * @param y the new value for all points - */ -void lv_chart_init_points(lv_obj_t * chart, lv_chart_series_t * ser, lv_coord_t y); - -/** - * Set the value of points from an array - * @param chart pointer to chart object - * @param ser pointer to a data series on 'chart' - * @param y_array array of 'lv_coord_t' points (with 'points count' elements ) - */ -void lv_chart_set_points(lv_obj_t * chart, lv_chart_series_t * ser, lv_coord_t y_array[]); - -/** - * Shift all data right and set the most right data on a data line - * @param chart pointer to chart object - * @param ser pointer to a data series on 'chart' - * @param y the new value of the most right data - */ -void lv_chart_set_next(lv_obj_t * chart, lv_chart_series_t * ser, lv_coord_t y); - -/** - * Set update mode of the chart object. - * @param chart pointer to a chart object - * @param update mode - */ -void lv_chart_set_update_mode(lv_obj_t * chart, lv_chart_update_mode_t update_mode); - -/** - * Set the style of a chart - * @param chart pointer to a chart object - * @param type which style should be set (can be only `LV_CHART_STYLE_MAIN`) - * @param style pointer to a style - */ -static inline void lv_chart_set_style(lv_obj_t * chart, lv_chart_style_t type, const lv_style_t * style) -{ - (void)type; /*Unused*/ - lv_obj_set_style(chart, style); -} - -/** - * Set the length of the tick marks on the x 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_x_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 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_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 - * @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_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 - * @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_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 margin around the chart, used for axes value and ticks - * @param chart pointer to an chart object - * @param margin value of the margin [px] - */ -void lv_chart_set_margin(lv_obj_t * chart, uint16_t margin); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the type of a chart - * @param chart pointer to chart object - * @return type of the chart (from 'lv_chart_t' enum) - */ -lv_chart_type_t lv_chart_get_type(const lv_obj_t * chart); - -/** - * Get the data point number per data line on 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); - -/** - * Get the opacity of the data series - * @param chart pointer to chart object - * @return the opacity of the data series - */ -lv_opa_t lv_chart_get_series_opa(const lv_obj_t * chart); - -/** - * Get the data series width - * @param chart pointer to chart object - * @return the width the data series (lines or points) - */ -lv_coord_t lv_chart_get_series_width(const lv_obj_t * chart); - -/** - * Get the dark effect level on the bottom of the points or columns - * @param chart pointer to chart object - * @return dark effect level (LV_OPA_TRANSP to turn off) - */ -lv_opa_t lv_chart_get_series_darking(const lv_obj_t * chart); - -/** - * Get the style of an chart object - * @param chart pointer to an chart object - * @param type which style should be get (can be only `LV_CHART_STYLE_MAIN`) - * @return pointer to the chart's style - */ -static inline const lv_style_t * lv_chart_get_style(const lv_obj_t * chart, lv_chart_style_t type) -{ - (void)type; /*Unused*/ - return lv_obj_get_style(chart); -} - -/** - * Get the margin around the chart, used for axes value and labels - * @param chart pointer to an chart object - * @param return value of the margin - */ -uint16_t lv_chart_get_margin(lv_obj_t * chart); - -/*===================== - * Other functions - *====================*/ - -/** - * Refresh a chart if its data line has changed - * @param chart pointer to chart object - */ -void lv_chart_refresh(lv_obj_t * chart); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_CHART*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_CHART_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_cont.c b/src/libs/lvgl/src/lv_objx/lv_cont.c deleted file mode 100644 index 22e9f514..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_cont.c +++ /dev/null @@ -1,710 +0,0 @@ -/** - * @file lv_cont.c - * - */ - -/********************* - * INCLUDES - *********************/ - -#include "lv_cont.h" -#if LV_USE_CONT != 0 - -#include <stdbool.h> -#include <stdint.h> -#include <string.h> - -#include "../lv_core/lv_debug.h" -#include "../lv_draw/lv_draw.h" -#include "../lv_draw/lv_draw_basic.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 - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_res_t lv_cont_signal(lv_obj_t * cont, lv_signal_t sign, void * param); -static void lv_cont_refr_layout(lv_obj_t * cont); -static void lv_cont_layout_col(lv_obj_t * cont); -static void lv_cont_layout_row(lv_obj_t * cont); -static void lv_cont_layout_center(lv_obj_t * cont); -static void lv_cont_layout_pretty(lv_obj_t * cont); -static void lv_cont_layout_grid(lv_obj_t * cont); -static void lv_cont_refr_autofit(lv_obj_t * cont); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a container objects - * @param par pointer to an object, it will be the parent of the new container - * @param copy pointer to a container object, if not NULL then the new object will be copied from it - * @return pointer to the created container - */ -lv_obj_t * lv_cont_create(lv_obj_t * par, const lv_obj_t * copy) -{ - - LV_LOG_TRACE("container create started"); - - /*Create a basic object*/ - lv_obj_t * new_cont = lv_obj_create(par, copy); - LV_ASSERT_MEM(new_cont); - if(new_cont == NULL) return NULL; - - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_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; - - LV_ASSERT_MEM(ext); - ext->fit_left = LV_FIT_NONE; - ext->fit_right = LV_FIT_NONE; - ext->fit_top = LV_FIT_NONE; - ext->fit_bottom = LV_FIT_NONE; - ext->layout = LV_LAYOUT_OFF; - - lv_obj_set_signal_cb(new_cont, lv_cont_signal); - - /*Init the new container*/ - if(copy == NULL) { - /*Set the default styles if it's not screen*/ - if(par != NULL) { - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_cont_set_style(new_cont, LV_CONT_STYLE_MAIN, th->style.cont); - } else { - lv_cont_set_style(new_cont, LV_CONT_STYLE_MAIN, &lv_style_pretty); - } - } - } - /*Copy an existing object*/ - else { - lv_cont_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->fit_left = copy_ext->fit_left; - ext->fit_right = copy_ext->fit_right; - ext->fit_top = copy_ext->fit_top; - ext->fit_bottom = copy_ext->fit_bottom; - ext->layout = copy_ext->layout; - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_cont); - } - - LV_LOG_INFO("container created"); - - return new_cont; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a layout on a container - * @param cont pointer to a container object - * @param layout a layout from 'lv_cont_layout_t' - */ -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; - - ext->layout = layout; - - /*Send a signal to refresh the layout*/ - cont->signal_cb(cont, LV_SIGNAL_CHILD_CHG, NULL); -} - -/** - * Set the fit policy in all 4 directions separately. - * It tell how to change the container's size automatically. - * @param cont pointer to a container object - * @param left left fit policy from `lv_fit_t` - * @param right right fit policy from `lv_fit_t` - * @param top bottom fit policy from `lv_fit_t` - * @param bottom bottom fit policy from `lv_fit_t` - */ -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) { - return; - } - - ext->fit_left = left; - ext->fit_right = right; - ext->fit_top = top; - ext->fit_bottom = bottom; - - /*Send a signal to refresh the layout*/ - cont->signal_cb(cont, LV_SIGNAL_CHILD_CHG, NULL); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the layout of a container - * @param cont pointer to container object - * @return the layout from 'lv_cont_layout_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; -} - -/** - * Get left fit mode of a container - * @param cont pointer to a container object - * @return an element of `lv_fit_t` - */ -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; -} - -/** - * Get right fit mode of a container - * @param cont pointer to a container object - * @return an element of `lv_fit_t` - */ -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; -} - -/** - * Get top fit mode of a container - * @param cont pointer to a container object - * @return an element of `lv_fit_t` - */ -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; -} - -/** - * Get bottom fit mode of a container - * @param cont pointer to a container object - * @return an element of `lv_fit_t` - */ -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; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Signal function of the container - * @param cont pointer to a container 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_cont_signal(lv_obj_t * cont, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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); - lv_cont_refr_autofit(cont); - } else if(sign == LV_SIGNAL_CHILD_CHG) { - lv_cont_refr_layout(cont); - lv_cont_refr_autofit(cont); - } else if(sign == LV_SIGNAL_CORD_CHG) { - if(lv_obj_get_width(cont) != lv_area_get_width(param) || lv_obj_get_height(cont) != lv_area_get_height(param)) { - lv_cont_refr_layout(cont); - lv_cont_refr_autofit(cont); - } - } else if(sign == LV_SIGNAL_PARENT_SIZE_CHG) { - /*FLOOD and FILL fit needs to be refreshed if the parent size has changed*/ - lv_cont_refr_autofit(cont); - - } - - return res; -} - -/** - * Refresh the layout of a container - * @param cont pointer to an object which layout should be refreshed - */ -static void lv_cont_refr_layout(lv_obj_t * cont) -{ - lv_layout_t type = lv_cont_get_layout(cont); - - /*'cont' has to be at least 1 child*/ - if(lv_obj_get_child(cont, NULL) == NULL) return; - - if(type == LV_LAYOUT_OFF) return; - - if(type == LV_LAYOUT_CENTER) { - lv_cont_layout_center(cont); - } else if(type == LV_LAYOUT_COL_L || type == LV_LAYOUT_COL_M || type == LV_LAYOUT_COL_R) { - lv_cont_layout_col(cont); - } else if(type == LV_LAYOUT_ROW_T || type == LV_LAYOUT_ROW_M || type == LV_LAYOUT_ROW_B) { - lv_cont_layout_row(cont); - } else if(type == LV_LAYOUT_PRETTY) { - lv_cont_layout_pretty(cont); - } else if(type == LV_LAYOUT_GRID) { - lv_cont_layout_grid(cont); - } -} - -/** - * Handle column type layouts - * @param cont pointer to an object which layout should be handled - */ -static void lv_cont_layout_col(lv_obj_t * cont) -{ - lv_layout_t type = lv_cont_get_layout(cont); - lv_obj_t * child; - - /*Adjust margin and get the alignment type*/ - lv_align_t align; - const lv_style_t * style = lv_obj_get_style(cont); - lv_coord_t hpad_corr; - - switch(type) { - case LV_LAYOUT_COL_L: - hpad_corr = style->body.padding.left; - align = LV_ALIGN_IN_TOP_LEFT; - break; - case LV_LAYOUT_COL_M: - hpad_corr = 0; - align = LV_ALIGN_IN_TOP_MID; - break; - case LV_LAYOUT_COL_R: - hpad_corr = -style->body.padding.right; - align = LV_ALIGN_IN_TOP_RIGHT; - break; - default: - hpad_corr = 0; - align = LV_ALIGN_IN_TOP_LEFT; - break; - } - - /* Disable child change action because the children will be moved a lot - * an unnecessary child change signals could be sent*/ - lv_obj_set_protect(cont, LV_PROTECT_CHILD_CHG); - /* Align the children */ - lv_coord_t last_cord = style->body.padding.top; - 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, hpad_corr, last_cord); - last_cord += lv_obj_get_height(child) + style->body.padding.inner; - } - - lv_obj_clear_protect(cont, LV_PROTECT_CHILD_CHG); -} - -/** - * Handle row type layouts - * @param cont pointer to an object which layout should be handled - */ -static void lv_cont_layout_row(lv_obj_t * cont) -{ - lv_layout_t type = lv_cont_get_layout(cont); - lv_obj_t * child; - - /*Adjust margin and get the alignment type*/ - 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 = 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 = 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 = base_dir == LV_BIDI_DIR_RTL ? LV_ALIGN_IN_BOTTOM_RIGHT: LV_ALIGN_IN_BOTTOM_LEFT; - break; - default: - vpad_corr = 0; - align = base_dir == LV_BIDI_DIR_RTL ? LV_ALIGN_IN_TOP_RIGHT : LV_ALIGN_IN_TOP_LEFT; - break; - } - - /* Disable child change action because the children will be moved a lot - * an unnecessary child change signals could be sent*/ - lv_obj_set_protect(cont, LV_PROTECT_CHILD_CHG); - - /* Align the children */ - 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; - -// 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; - } - - lv_obj_clear_protect(cont, LV_PROTECT_CHILD_CHG); -} - -/** - * Handle the center layout - * @param cont pointer to an object which layout should be handled - */ -static void lv_cont_layout_center(lv_obj_t * cont) -{ - lv_obj_t * child; - const lv_style_t * style = lv_obj_get_style(cont); - uint32_t obj_num = 0; - lv_coord_t h_tot = 0; - - LV_LL_READ(cont->child_ll, child) - { - if(lv_obj_get_hidden(child) != false || lv_obj_is_protected(child, LV_PROTECT_POS) != false) continue; - h_tot += lv_obj_get_height(child) + style->body.padding.inner; - obj_num++; - } - - if(obj_num == 0) return; - - h_tot -= style->body.padding.inner; - - /* Disable child change action because the children will be moved a lot - * an unnecessary child change signals could be sent*/ - lv_obj_set_protect(cont, LV_PROTECT_CHILD_CHG); - - /* Align the children */ - lv_coord_t last_cord = -(h_tot / 2); - 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, LV_ALIGN_CENTER, 0, last_cord + lv_obj_get_height(child) / 2); - last_cord += lv_obj_get_height(child) + style->body.padding.inner; - } - - lv_obj_clear_protect(cont, LV_PROTECT_CHILD_CHG); -} - -/** - * Handle the pretty layout. Put as many object as possible in row - * then begin a new row - * @param cont pointer to an object which layout should be handled - */ -static void lv_cont_layout_pretty(lv_obj_t * cont) -{ - lv_obj_t * child_rs; /* Row starter child */ - lv_obj_t * child_rc; /* Row closer child */ - lv_obj_t * child_tmp; /* Temporary child */ - const lv_style_t * style = lv_obj_get_style(cont); - lv_coord_t w_obj = lv_obj_get_width(cont); - lv_coord_t act_y = style->body.padding.top; - /* Disable child change action because the children will be moved a lot - * an unnecessary child change signals could be sent*/ - - child_rs = lv_ll_get_tail(&cont->child_ll); /*Set the row starter child*/ - if(child_rs == NULL) return; /*Return if no child*/ - - lv_obj_set_protect(cont, LV_PROTECT_CHILD_CHG); - - child_rc = child_rs; /*Initially the the row starter and closer is the same*/ - while(child_rs != NULL) { - lv_coord_t h_row = 0; - lv_coord_t w_row = - style->body.padding.left + style->body.padding.right; /*The width is at least the left+right hpad*/ - uint32_t obj_num = 0; - - /*Find the row closer object and collect some data*/ - do { - if(lv_obj_get_hidden(child_rc) == false && lv_obj_is_protected(child_rc, LV_PROTECT_POS) == false) { - /*If this object is already not fit then break*/ - if(w_row + lv_obj_get_width(child_rc) > w_obj) { - /*Step back one child because the last already not fit, so the previous is the - * closer*/ - if(child_rc != NULL && obj_num != 0) { - child_rc = lv_ll_get_next(&cont->child_ll, child_rc); - } - break; - } - w_row += lv_obj_get_width(child_rc) + style->body.padding.inner; /*Add the object width + opad*/ - h_row = LV_MATH_MAX(h_row, lv_obj_get_height(child_rc)); /*Search the highest object*/ - obj_num++; - if(lv_obj_is_protected(child_rc, LV_PROTECT_FOLLOW)) - break; /*If can not be followed by an other object then break here*/ - } - child_rc = lv_ll_get_prev(&cont->child_ll, child_rc); /*Load the next object*/ - if(obj_num == 0) - child_rs = child_rc; /*If the first object was hidden (or too long) then set the - next as first */ - } while(child_rc != NULL); - - /*If the object is too long then align it to the middle*/ - if(obj_num == 0) { - if(child_rc != NULL) { - lv_obj_align(child_rc, cont, LV_ALIGN_IN_TOP_MID, 0, act_y); - h_row = lv_obj_get_height(child_rc); /*Not set previously because of the early break*/ - } - } - /*If there is only one object in the row then align it to the middle*/ - else if(obj_num == 1) { - lv_obj_align(child_rs, cont, LV_ALIGN_IN_TOP_MID, 0, act_y); - } - /*If there are two object in the row then align them proportionally*/ - else if(obj_num == 2) { - lv_obj_t * obj1 = child_rs; - lv_obj_t * obj2 = lv_ll_get_prev(&cont->child_ll, child_rs); - w_row = lv_obj_get_width(obj1) + lv_obj_get_width(obj2); - lv_coord_t pad = (w_obj - w_row) / 3; - lv_obj_align(obj1, cont, LV_ALIGN_IN_TOP_LEFT, pad, act_y + (h_row - lv_obj_get_height(obj1)) / 2); - lv_obj_align(obj2, cont, LV_ALIGN_IN_TOP_RIGHT, -pad, act_y + (h_row - lv_obj_get_height(obj2)) / 2); - } - /* Align the children (from child_rs to child_rc)*/ - else { - w_row -= style->body.padding.inner * obj_num; - lv_coord_t new_opad = (w_obj - w_row) / (obj_num - 1); - lv_coord_t act_x = style->body.padding.left; /*x init*/ - child_tmp = child_rs; - while(child_tmp != NULL) { - if(lv_obj_get_hidden(child_tmp) == false && lv_obj_is_protected(child_tmp, LV_PROTECT_POS) == false) { - lv_obj_align(child_tmp, cont, LV_ALIGN_IN_TOP_LEFT, act_x, - act_y + (h_row - lv_obj_get_height(child_tmp)) / 2); - act_x += lv_obj_get_width(child_tmp) + new_opad; - } - if(child_tmp == child_rc) break; - child_tmp = lv_ll_get_prev(&cont->child_ll, child_tmp); - } - } - - if(child_rc == NULL) break; - act_y += style->body.padding.inner + h_row; /*y increment*/ - child_rs = lv_ll_get_prev(&cont->child_ll, child_rc); /*Go to the next object*/ - child_rc = child_rs; - } - lv_obj_clear_protect(cont, LV_PROTECT_CHILD_CHG); -} - -/** - * Handle the grid layout. Align same-sized objects in a grid - * @param cont pointer to an object which layout should be handled - */ -static void lv_cont_layout_grid(lv_obj_t * cont) -{ - lv_obj_t * child; - const lv_style_t * style = lv_obj_get_style(cont); - lv_coord_t w_tot = lv_obj_get_width(cont); - lv_coord_t w_obj = lv_obj_get_width(lv_obj_get_child(cont, NULL)); - lv_coord_t w_fit = lv_obj_get_width_fit(cont); - lv_coord_t h_obj = lv_obj_get_height(lv_obj_get_child(cont, NULL)); - uint16_t obj_row = (w_fit) / (w_obj + style->body.padding.inner); /*Obj. num. in a row*/ - lv_coord_t x_ofs; - if(obj_row > 1) { - x_ofs = w_obj + (w_fit - (obj_row * w_obj)) / (obj_row - 1); - } else { - x_ofs = w_tot / 2 - w_obj / 2; - } - lv_coord_t y_ofs = h_obj + style->body.padding.inner; - - /* Disable child change action because the children will be moved a lot - * an unnecessary child change signals could be sent*/ - lv_obj_set_protect(cont, LV_PROTECT_CHILD_CHG); - - /* Align the children */ - lv_coord_t act_x = style->body.padding.left; - lv_coord_t act_y = style->body.padding.top; - uint16_t obj_cnt = 0; - 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; - - if(obj_row > 1) { - lv_obj_set_pos(child, act_x, act_y); - act_x += x_ofs; - } else { - lv_obj_set_pos(child, x_ofs, act_y); - } - obj_cnt++; - - if(obj_cnt >= obj_row) { - obj_cnt = 0; - act_x = style->body.padding.left; - act_y += y_ofs; - } - } - - lv_obj_clear_protect(cont, LV_PROTECT_CHILD_CHG); -} - -/** - * Handle auto fit. Set the size of the object to involve all children. - * @param cont pointer to an object which size will be modified - */ -static void lv_cont_refr_autofit(lv_obj_t * cont) -{ - lv_cont_ext_t * ext = lv_obj_get_ext_attr(cont); - - if(ext->fit_left == LV_FIT_NONE && ext->fit_right == LV_FIT_NONE && ext->fit_top == LV_FIT_NONE && - ext->fit_bottom == LV_FIT_NONE) { - return; - } - - lv_area_t tight_area; - lv_area_t ori; - const lv_style_t * style = lv_obj_get_style(cont); - lv_obj_t * child_i; - - lv_obj_t * par = lv_obj_get_parent(cont); - const lv_style_t * par_style = lv_obj_get_style(par); - lv_area_t flood_area; - lv_area_copy(&flood_area, &par->coords); - flood_area.x1 += par_style->body.padding.left; - flood_area.x2 -= par_style->body.padding.right; - flood_area.y1 += par_style->body.padding.top; - flood_area.y2 -= par_style->body.padding.bottom; - - /*Search the side coordinates of the children*/ - lv_obj_get_coords(cont, &ori); - lv_obj_get_coords(cont, &tight_area); - - bool has_children = lv_ll_is_empty(&cont->child_ll) ? false : true; - - if(has_children) { - tight_area.x1 = LV_COORD_MAX; - tight_area.y1 = LV_COORD_MAX; - tight_area.x2 = LV_COORD_MIN; - tight_area.y2 = LV_COORD_MIN; - - LV_LL_READ(cont->child_ll, child_i) - { - if(lv_obj_get_hidden(child_i) != false) continue; - tight_area.x1 = LV_MATH_MIN(tight_area.x1, child_i->coords.x1); - tight_area.y1 = LV_MATH_MIN(tight_area.y1, child_i->coords.y1); - tight_area.x2 = LV_MATH_MAX(tight_area.x2, child_i->coords.x2); - tight_area.y2 = LV_MATH_MAX(tight_area.y2, child_i->coords.y2); - } - - tight_area.x1 -= style->body.padding.left; - tight_area.x2 += style->body.padding.right; - tight_area.y1 -= style->body.padding.top; - tight_area.y2 += style->body.padding.bottom; - } - - lv_area_t new_area; - lv_area_copy(&new_area, &ori); - - switch(ext->fit_left) { - case LV_FIT_TIGHT: new_area.x1 = tight_area.x1; break; - case LV_FIT_FLOOD: new_area.x1 = flood_area.x1; break; - case LV_FIT_FILL: new_area.x1 = has_children ? LV_MATH_MIN(tight_area.x1, flood_area.x1) : flood_area.x1; break; - default: break; - } - - switch(ext->fit_right) { - case LV_FIT_TIGHT: new_area.x2 = tight_area.x2; break; - case LV_FIT_FLOOD: new_area.x2 = flood_area.x2; break; - case LV_FIT_FILL: new_area.x2 = has_children ? LV_MATH_MAX(tight_area.x2, flood_area.x2) : flood_area.x2; break; - default: break; - } - - switch(ext->fit_top) { - case LV_FIT_TIGHT: new_area.y1 = tight_area.y1; break; - case LV_FIT_FLOOD: new_area.y1 = flood_area.y1; break; - case LV_FIT_FILL: new_area.y1 = has_children ? LV_MATH_MIN(tight_area.y1, flood_area.y1) : flood_area.y1; break; - default: break; - } - - switch(ext->fit_bottom) { - case LV_FIT_TIGHT: new_area.y2 = tight_area.y2; break; - case LV_FIT_FLOOD: new_area.y2 = flood_area.y2; break; - case LV_FIT_FILL: new_area.y2 = has_children ? LV_MATH_MAX(tight_area.y2, flood_area.y2) : flood_area.y2; break; - default: break; - } - - /*Do nothing if the coordinates are not changed*/ - if(cont->coords.x1 != new_area.x1 || cont->coords.y1 != new_area.y1 || cont->coords.x2 != new_area.x2 || - cont->coords.y2 != new_area.y2) { - - lv_obj_invalidate(cont); - lv_area_copy(&cont->coords, &new_area); - lv_obj_invalidate(cont); - - /*Notify the object about its new coordinates*/ - cont->signal_cb(cont, LV_SIGNAL_CORD_CHG, &ori); - - /*Inform the parent about the new coordinates*/ - par->signal_cb(par, LV_SIGNAL_CHILD_CHG, cont); - - if(lv_obj_get_auto_realign(cont)) { - lv_obj_realign(cont); - } - - /*Tell the children the parent's size has changed*/ - LV_LL_READ(cont->child_ll, child_i) - { - child_i->signal_cb(child_i, LV_SIGNAL_PARENT_SIZE_CHG, NULL); - } - } -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_cont.h b/src/libs/lvgl/src/lv_objx/lv_cont.h deleted file mode 100644 index d4ed19fe..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_cont.h +++ /dev/null @@ -1,210 +0,0 @@ -/** - * @file lv_cont.h - * - */ - -#ifndef LV_CONT_H -#define LV_CONT_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_CONT != 0 - -#include "../lv_core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Container layout options*/ -enum { - LV_LAYOUT_OFF = 0, /**< No layout */ - LV_LAYOUT_CENTER, /**< Center objects */ - LV_LAYOUT_COL_L, /**< Column left align*/ - LV_LAYOUT_COL_M, /**< Column middle align*/ - LV_LAYOUT_COL_R, /**< Column right align*/ - LV_LAYOUT_ROW_T, /**< Row top align*/ - LV_LAYOUT_ROW_M, /**< Row middle align*/ - LV_LAYOUT_ROW_B, /**< Row bottom align*/ - LV_LAYOUT_PRETTY, /**< Put as many object as possible in row and begin a new row*/ - LV_LAYOUT_GRID, /**< Align same-sized object into a grid*/ - _LV_LAYOUT_NUM -}; -typedef uint8_t lv_layout_t; - -/** - * How to resize the container around the children. - */ -enum { - LV_FIT_NONE, /**< Do not change the size automatically*/ - LV_FIT_TIGHT, /**< Shrink wrap around the children */ - LV_FIT_FLOOD, /**< Align the size to the parent's edge*/ - LV_FIT_FILL, /**< Align the size to the parent's edge first but if there is an object out of it - then get larger */ - _LV_FIT_NUM -}; -typedef uint8_t lv_fit_t; - -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_cont_ext_t; - -/*Styles*/ -enum { - LV_CONT_STYLE_MAIN, -}; -typedef uint8_t lv_cont_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a container objects - * @param par pointer to an object, it will be the parent of the new container - * @param copy pointer to a container object, if not NULL then the new object will be copied from it - * @return pointer to the created container - */ -lv_obj_t * lv_cont_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a layout on a container - * @param cont pointer to a container object - * @param layout a layout from 'lv_cont_layout_t' - */ -void lv_cont_set_layout(lv_obj_t * cont, lv_layout_t layout); - -/** - * Set the fit policy in all 4 directions separately. - * It tell how to change the container's size automatically. - * @param cont pointer to a container object - * @param left left fit policy from `lv_fit_t` - * @param right right fit policy from `lv_fit_t` - * @param top top fit policy from `lv_fit_t` - * @param bottom bottom fit policy from `lv_fit_t` - */ -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); - -/** - * Set the fit policy horizontally and vertically separately. - * It tells how to change the container's size automatically. - * @param cont pointer to a container object - * @param hor horizontal fit policy from `lv_fit_t` - * @param ver vertical fit policy from `lv_fit_t` - */ -static inline void lv_cont_set_fit2(lv_obj_t * cont, lv_fit_t hor, lv_fit_t ver) -{ - lv_cont_set_fit4(cont, hor, hor, ver, ver); -} - -/** - * Set the fit policy in all 4 direction at once. - * It tells how to change the container's size automatically. - * @param cont pointer to a container object - * @param fit fit policy from `lv_fit_t` - */ -static inline void lv_cont_set_fit(lv_obj_t * cont, lv_fit_t fit) -{ - lv_cont_set_fit4(cont, fit, fit, fit, fit); -} - -/** - * Set the style of a container - * @param cont 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_cont_set_style(lv_obj_t * cont, lv_cont_style_t type, const lv_style_t * style) -{ - (void)type; /*Unused*/ - lv_obj_set_style(cont, style); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the layout of a container - * @param cont pointer to container object - * @return the layout from 'lv_cont_layout_t' - */ -lv_layout_t lv_cont_get_layout(const lv_obj_t * cont); - -/** - * Get left fit mode of a container - * @param cont pointer to a container object - * @return an element of `lv_fit_t` - */ -lv_fit_t lv_cont_get_fit_left(const lv_obj_t * cont); - -/** - * Get right fit mode of a container - * @param cont pointer to a container object - * @return an element of `lv_fit_t` - */ -lv_fit_t lv_cont_get_fit_right(const lv_obj_t * cont); - -/** - * Get top fit mode of a container - * @param cont pointer to a container object - * @return an element of `lv_fit_t` - */ -lv_fit_t lv_cont_get_fit_top(const lv_obj_t * cont); - -/** - * Get bottom fit mode of a container - * @param cont pointer to a container object - * @return an element of `lv_fit_t` - */ -lv_fit_t lv_cont_get_fit_bottom(const lv_obj_t * cont); - -/** - * Get the style of a container - * @param cont 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_cont_get_style(const lv_obj_t * cont, lv_cont_style_t type) -{ - (void)type; /*Unused*/ - return lv_obj_get_style(cont); -} - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_CONT*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_CONT_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_cpicker.c b/src/libs/lvgl/src/lv_objx/lv_cpicker.c deleted file mode 100644 index 65826673..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_cpicker.c +++ /dev/null @@ -1,1068 +0,0 @@ -/** - * @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 bool lv_cpicker_design(lv_obj_t * cpicker, const lv_area_t * mask, 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) 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_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); - - switch(type) { - case LV_CPICKER_STYLE_MAIN: - return lv_obj_get_style(cpicker); - case LV_CPICKER_STYLE_INDICATOR: - return ext->indic.style; - default: - return NULL; - } - - /*To avoid warning*/ - return NULL; -} - -/** - * 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 true/false, depends on 'mode' - */ -static bool lv_cpicker_design(lv_obj_t * cpicker, const lv_area_t * mask, 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; - } - /*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, mask, opa_scale); - } else if(ext->type == LV_CPICKER_TYPE_RECT) { - draw_rect_grad(cpicker, mask, opa_scale); - } - - draw_indic(cpicker, mask, opa_scale); - } - /*Post draw when the children are drawn*/ - else if(mode == LV_DESIGN_DRAW_POST) { - } - - return true; -} - -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); - int16_t start_angle = 0; /*Default*/ - int16_t end_angle = 360 - LV_CPICKER_DEF_QF; /*Default*/ - - 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; - - /*if the mask does not include the center of the object - * redrawing all the wheel is not necessary; - * only a given angular range - */ - lv_point_t center = {cx, cy}; - if(!lv_area_is_point_on(mask, ¢er)) - { - /*get angle from center of object to each corners of the area*/ - int16_t dr, ur, ul, dl; - dr = lv_atan2(mask->x2 - cx, mask->y2 - cy); - ur = lv_atan2(mask->x2 - cx, mask->y1 - cy); - ul = lv_atan2(mask->x1 - cx, mask->y1 - cy); - dl = lv_atan2(mask->x1 - cx, mask->y2 - cy); - - /*check area position from object axis*/ - bool left = (mask->x2 < cx && mask->x1 < cx) ? true : false; - bool onYaxis = (mask->x2 > cx && mask->x1 < cx) ? true : false; - bool right = (mask->x2 > cx && mask->x1 > cx) ? true : false; - bool top = (mask->y2 < cy && mask->y1 < cy) ? true : false; - bool onXaxis = (mask->y2 > cy && mask->y1 < cy) ? true : false; - bool bottom = (mask->y2 > cy && mask->y1 > cy) ? true : false; - - /*store angular range*/ - if(right && bottom) { - start_angle = dl; - end_angle = ur; - } else if(right && onXaxis) { - start_angle = dl; - end_angle = ul; - } else if(right && top) { - start_angle = dr; - end_angle = ul; - } else if(onYaxis && top) { - start_angle = dr; - end_angle = dl; - } else if(left && top) { - start_angle = ur; - end_angle = dl; - } else if(left && onXaxis) { - start_angle = ur; - end_angle = dr; - } else if(left && bottom) { - start_angle = ul; - end_angle = dr; - } else if(onYaxis && bottom) { - start_angle = ul; - end_angle = ur; - } - - /*rollover angle*/ - if(start_angle > end_angle) end_angle += 360; - - /*round to QF factor*/ - start_angle = (start_angle/LV_CPICKER_DEF_QF) * LV_CPICKER_DEF_QF; - end_angle = (end_angle / LV_CPICKER_DEF_QF) * LV_CPICKER_DEF_QF; - - /*shift angle if necessary before adding offset*/ - if((start_angle - LV_CPICKER_DEF_QF) < 0) { - start_angle += 360; - end_angle += 360; - } - - /*ensure overlapping by adding offset*/ - start_angle -= LV_CPICKER_DEF_QF; - end_angle += LV_CPICKER_DEF_QF; - } - - lv_point_t triangle_points[3]; - lv_style_t style; - lv_style_copy(&style, &lv_style_plain); - uint16_t i; - for(i = start_angle; i <= end_angle; i+= LV_CPICKER_DEF_QF) { - style.body.main_color = angle_to_mode_color(cpicker, i); - style.body.grad_color = style.body.main_color; - - triangle_points[0].x = cx; - triangle_points[0].y = cy; - - triangle_points[1].x = cx + (r * lv_trigo_sin(i) >> LV_TRIGO_SHIFT); - triangle_points[1].y = cy + (r * lv_trigo_sin(i + 90) >> LV_TRIGO_SHIFT); - - if(i == end_angle || i == (360 - LV_CPICKER_DEF_QF)) { - /*the last triangle is drawn without additional overlapping pixels*/ - triangle_points[2].x = cx + (r * lv_trigo_sin(i + LV_CPICKER_DEF_QF) >> LV_TRIGO_SHIFT); - triangle_points[2].y = cy + (r * lv_trigo_sin(i + LV_CPICKER_DEF_QF + 90) >> LV_TRIGO_SHIFT); - } else { - triangle_points[2].x = cx + (r * lv_trigo_sin(i + LV_CPICKER_DEF_QF + TRI_OFFSET) >> LV_TRIGO_SHIFT); - triangle_points[2].y = cy + (r * lv_trigo_sin(i + LV_CPICKER_DEF_QF + TRI_OFFSET + 90) >> LV_TRIGO_SHIFT); - } - - lv_draw_triangle(triangle_points, mask, &style, LV_OPA_COVER); - } - - /*Mask out the center area*/ - const lv_style_t * style_main = lv_cpicker_get_style(cpicker, LV_CPICKER_STYLE_MAIN); - lv_style_copy(&style, style_main); - style.body.radius = LV_RADIUS_CIRCLE; - lv_area_t area_mid; - lv_area_copy(&area_mid, &cpicker->coords); - lv_area_increment(&area_mid, -style_main->line.width); - - lv_draw_rect(&area_mid, mask, &style, opa_scale); - - if(ext->preview) { - lv_color_t color = lv_cpicker_get_color(cpicker); - style.body.main_color = color; - style.body.grad_color = color; - lv_area_increment(&area_mid, -style_main->line.width / 2); - - 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_obj_invalidate_area(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; - 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 the inner area is being pressed, go to the next color mode on long press*/ - if(p.x * p.x + p.y * p.y < r_in * r_in) { - uint32_t diff = lv_tick_elaps(ext->last_change_time); - if(diff > indev->driver.long_press_time && !ext->color_mode_fixed) { - next_color_mode(cpicker); - lv_indev_wait_release(lv_indev_get_act()); - } - 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; - } - - 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/libs/lvgl/src/lv_objx/lv_cpicker.h b/src/libs/lvgl/src/lv_objx/lv_cpicker.h deleted file mode 100644 index a9feee5a..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_cpicker.h +++ /dev/null @@ -1,263 +0,0 @@ -/** - * @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/libs/lvgl/src/lv_objx/lv_ddlist.c b/src/libs/lvgl/src/lv_objx/lv_ddlist.c deleted file mode 100644 index fb57cd2f..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_ddlist.c +++ /dev/null @@ -1,1032 +0,0 @@ -/** - * @file lv_ddlist.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" -#include "../lv_themes/lv_theme.h" -#include "../lv_font/lv_symbol_def.h" -#include "../lv_misc/lv_anim.h" -#include "../lv_misc/lv_math.h" -#include <string.h> - -/********************* - * 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*/ -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_ddlist_design(lv_obj_t * ddlist, const lv_area_t * mask, 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); -static void lv_ddlist_refr_size(lv_obj_t * ddlist, lv_anim_enable_t anim); -static void lv_ddlist_pos_current_option(lv_obj_t * ddlist); -static void lv_ddlist_refr_width(lv_obj_t * ddlist); -#if LV_USE_ANIMATION -static void lv_ddlist_anim_ready_cb(lv_anim_t * a); -static void lv_ddlist_anim_finish(lv_obj_t * ddlist); -static void lv_ddlist_adjust_height(lv_obj_t * ddlist, lv_anim_value_t height); -#endif - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_signal_cb_t ancestor_scrl_signal; -static lv_design_cb_t ancestor_design; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a drop down list objects - * @param par pointer to an object, it will be the parent of the new drop down list - * @param copy pointer to a drop down list object, if not NULL then the new object will be copied - * from it - * @return pointer to the created drop down list - */ -lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("drop down list create started"); - - /*Create the ancestor drop down list*/ - lv_obj_t * new_ddlist = lv_page_create(par, copy); - LV_ASSERT_MEM(new_ddlist); - if(new_ddlist == NULL) return NULL; - - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_ddlist); - if(ancestor_scrl_signal == NULL) ancestor_scrl_signal = lv_obj_get_signal_cb(lv_page_get_scrl(new_ddlist)); - if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_ddlist); - - /*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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - /*Initialize the allocated 'ext' */ - ext->label = 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*/ - lv_obj_set_signal_cb(new_ddlist, lv_ddlist_signal); - lv_obj_set_signal_cb(lv_page_get_scrl(new_ddlist), lv_ddlist_scrl_signal); - lv_obj_set_design_cb(new_ddlist, lv_ddlist_design); - - /*Init the new drop down list drop down list*/ - if(copy == NULL) { - lv_page_set_anim_time(new_ddlist, LV_DDLIST_DEF_ANIM_TIME); - - lv_obj_t * scrl = lv_page_get_scrl(new_ddlist); - 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); - lv_page_set_style(new_ddlist, LV_PAGE_STYLE_SCRL, &lv_style_transp_tight); - - 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) { - lv_ddlist_set_style(new_ddlist, LV_DDLIST_STYLE_BG, th->style.ddlist.bg); - lv_ddlist_set_style(new_ddlist, LV_DDLIST_STYLE_SEL, th->style.ddlist.sel); - lv_ddlist_set_style(new_ddlist, LV_DDLIST_STYLE_SB, th->style.ddlist.sb); - } else { - lv_ddlist_set_style(new_ddlist, LV_DDLIST_STYLE_BG, &lv_style_pretty); - 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 { - lv_ddlist_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->label = lv_label_create(new_ddlist, copy_ext->label); - lv_label_set_text(ext->label, lv_label_get_text(copy_ext->label)); - ext->sel_opt_id = copy_ext->sel_opt_id; - ext->sel_opt_id_ori = copy_ext->sel_opt_id; - 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->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)); - lv_ddlist_set_style(new_ddlist, LV_DDLIST_STYLE_SB, lv_ddlist_get_style(copy, LV_DDLIST_STYLE_SB)); - lv_ddlist_set_style(new_ddlist, LV_DDLIST_STYLE_SEL, lv_ddlist_get_style(copy, LV_DDLIST_STYLE_SEL)); - - } - - LV_LOG_INFO("drop down list created"); - - return new_ddlist; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the options in a drop down list from a string - * @param ddlist pointer to drop down list object - * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" - */ -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*/ - ext->option_cnt = 0; - uint16_t i; - for(i = 0; options[i] != '\0'; i++) { - if(options[i] == '\n') ext->option_cnt++; - } - ext->option_cnt++; /*Last option has no `\n`*/ - ext->sel_opt_id = 0; - ext->sel_opt_id_ori = 0; - - lv_label_set_text(ext->label, options); - - lv_ddlist_refr_width(ddlist); - - 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, false); -} - -/** - * Set the selected option - * @param ddlist pointer to drop down list object - * @param sel_opt id of the selected option (0 ... number of option - 1); - */ -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; - - ext->sel_opt_id = sel_opt < ext->option_cnt ? sel_opt : ext->option_cnt - 1; - ext->sel_opt_id_ori = ext->sel_opt_id; - /*Move the list to show the current option*/ - if(ext->opened == 0) { - lv_ddlist_pos_current_option(ddlist); - } else { - lv_obj_invalidate(ddlist); - } -} - -/** - * Set a fix height for the drop down list - * If 0 then the opened ddlist will be auto. sized else the set height will be applied. - * @param ddlist pointer to a drop down list - * @param h the height when the list is opened (0: auto size) - */ -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; - - ext->fix_height = h; - - lv_ddlist_refr_size(ddlist, false); -} - -/** - * Set a fix width for the drop down list - * @param ddlist pointer to a drop down list - * @param w the width when the list is opened (0: auto size) - */ -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)); - } else { - lv_cont_set_fit2(ddlist, LV_FIT_NONE, lv_cont_get_fit_bottom(ddlist)); - lv_obj_set_width(ddlist, w); - } - - 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; - } - - lv_ddlist_refr_size(ddlist, false); -} - -/** - * 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) -{ - LV_ASSERT_OBJ(ddlist, LV_OBJX_NAME); - - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - - /*Set the flag*/ - ext->draw_arrow = en ? 1 : 0; -} - -/** - * Leave the list opened when a new value is selected - * @param ddlist pointer to drop down list object - * @param en enable/disable "stay open" feature - */ -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*/ - ext->stay_open = en ? 1 : 0; -} - -/** - * Set a style of a drop down list - * @param ddlist pointer to a drop down list object - * @param type which style should be set - * @param style pointer to a style - */ -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) { - case LV_DDLIST_STYLE_BG: - lv_page_set_style(ddlist, LV_PAGE_STYLE_BG, style); - lv_ddlist_refr_width(ddlist); - break; - case LV_DDLIST_STYLE_SB: lv_page_set_style(ddlist, LV_PAGE_STYLE_SB, style); break; - case LV_DDLIST_STYLE_SEL: - ext->sel_style = style; - lv_obj_t * scrl = lv_page_get_scrl(ddlist); - lv_obj_refresh_ext_draw_pad(scrl); /*Because of the wider selected rectangle*/ - break; - } -} - -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); - 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; - } -} -/*===================== - * Getter functions - *====================*/ - -/** - * Get the options of a drop down list - * @param ddlist pointer to drop down list object - * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") - */ -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); -} - -/** - * Get the selected option - * @param ddlist pointer to drop down list object - * @return id of the selected option (0 ... number of option - 1); - */ -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; -} - -/** - * Get the current selected option as a string - * @param ddlist pointer to ddlist object - * @param buf pointer to an array to store the string - * @param buf_size size of `buf` in bytes. 0: to ignore it. - */ -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); - 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++; - } - - uint16_t c; - for(c = 0; opt_txt[i] != '\n' && i < txt_len; c++, i++) { - if(buf_size && c >= buf_size - 1) { - LV_LOG_WARN("lv_ddlist_get_selected_str: the buffer was too small") - break; - } - buf[c] = opt_txt[i]; - } - - buf[c] = '\0'; -} - -/** - * Get the fix height value. - * @param ddlist pointer to a drop down list object - * @return the height if the ddlist is opened (0: auto size) - */ -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 - * @param ddlist pointer to drop down list object - */ -bool lv_ddlist_get_draw_arrow(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; -} - -/** - * Get whether the drop down list stay open after selecting a value or not - * @param ddlist pointer to drop down list object - */ -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; -} - -/** - * Get a style of a drop down list - * @param ddlist pointer to a drop down list object - * @param type which style should be get - * @return style pointer to a style - */ -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); - - 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; - } - - /*To avoid warning*/ - return NULL; -} - -lv_label_align_t lv_ddlist_get_align(const lv_obj_t * ddlist) -{ - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - - return lv_label_get_align(ext->label); -} - -/*===================== - * Other functions - *====================*/ - -/** - * Open the drop down list with or without animation - * @param ddlist pointer to drop down list object - * @param anim_en LV_ANIM_EN: use animation; LV_ANIM_OFF: not use animations - */ -void lv_ddlist_open(lv_obj_t * ddlist, lv_anim_enable_t anim) -{ -#if LV_USE_ANIMATION == 0 - anim = false; -#endif - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - ext->opened = 1; - lv_obj_set_drag(lv_page_get_scrl(ddlist), true); - lv_ddlist_refr_size(ddlist, anim); -} - -/** - * Close (Collapse) the drop down list - * @param ddlist pointer to drop down list object - * @param anim_en LV_ANIM_ON: use animation; LV_ANIM_OFF: not use animations - */ -void lv_ddlist_close(lv_obj_t * ddlist, lv_anim_enable_t anim) -{ -#if LV_USE_ANIMATION == 0 - anim = false; -#endif - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - ext->opened = 0; - lv_obj_set_drag(lv_page_get_scrl(ddlist), false); - lv_ddlist_refr_size(ddlist, anim); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Get the text alignment flag for a drop down list. - * @param ddlist drop down list - * @return text alignment flag - */ -static lv_txt_flag_t lv_ddlist_get_txt_flag(const lv_obj_t * ddlist) -{ - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - - /*The label might be already deleted so just return with some value*/ - if(!ext->label) return LV_TXT_FLAG_CENTER; - - lv_label_align_t align = lv_label_get_align(ext->label); - - switch(align) { - default: - case LV_LABEL_ALIGN_LEFT: return LV_TXT_FLAG_NONE; - case LV_LABEL_ALIGN_CENTER: return LV_TXT_FLAG_CENTER; - case LV_LABEL_ALIGN_RIGHT: return LV_TXT_FLAG_RIGHT; - } -} - -/** - * 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 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' - */ -static bool lv_ddlist_design(lv_obj_t * ddlist, const lv_area_t * mask, 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); - } - /*Draw the object*/ - else if(mode == LV_DESIGN_DRAW_MAIN) { - ancestor_design(ddlist, mask, mode); - - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - lv_opa_t opa_scale = lv_obj_get_opa_scale(ddlist); - /*If the list is opened draw a rectangle under the selected item*/ - if(ext->opened != 0 || ext->force_sel) { - const lv_style_t * style = lv_ddlist_get_style(ddlist, LV_DDLIST_STYLE_BG); - const lv_font_t * font = style->text.font; - lv_coord_t font_h = lv_font_get_line_height(font); - - /*Draw the selected*/ - lv_area_t rect_area; - rect_area.y1 = ext->label->coords.y1; - rect_area.y1 += ext->sel_opt_id * (font_h + style->text.line_space); - rect_area.y1 -= style->text.line_space / 2; - - rect_area.y2 = rect_area.y1 + font_h + style->text.line_space - 1; - rect_area.x1 = ddlist->coords.x1; - rect_area.x2 = ddlist->coords.x2; - - lv_draw_rect(&rect_area, mask, ext->sel_style, opa_scale); - } - } - /*Post draw when the children are drawn*/ - else if(mode == LV_DESIGN_DRAW_POST) { - /*Redraw the text on the selected area with a different color*/ - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - lv_opa_t opa_scale = lv_obj_get_opa_scale(ddlist); - - /*Redraw only in opened state*/ - if(ext->opened || ext->force_sel) { - const lv_style_t * style = lv_ddlist_get_style(ddlist, LV_DDLIST_STYLE_BG); - const lv_font_t * font = style->text.font; - lv_coord_t font_h = lv_font_get_line_height(font); - - lv_area_t area_sel; - area_sel.y1 = ext->label->coords.y1; - area_sel.y1 += ext->sel_opt_id * (font_h + style->text.line_space); - area_sel.y1 -= style->text.line_space / 2; - - area_sel.y2 = area_sel.y1 + font_h + style->text.line_space - 1; - area_sel.x1 = ddlist->coords.x1; - area_sel.x2 = ddlist->coords.x2; - lv_area_t mask_sel; - bool area_ok; - area_ok = lv_area_intersect(&mask_sel, mask, &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; - lv_style_copy(&new_style, style); - new_style.text.color = sel_style->text.color; - 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, NULL, NULL, lv_obj_get_base_dir(ddlist)); - } - } - - /*Add a down symbol in ddlist when closed*/ - else { - /*Draw a arrow in ddlist if enabled*/ - if(ext->draw_arrow) { - 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); - lv_coord_t font_h = lv_font_get_line_height(font); - lv_style_t new_style; - 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; - lv_coord_t arrow_width = lv_txt_get_width(LV_SYMBOL_DOWN, (uint16_t)strlen(LV_SYMBOL_DOWN), sel_style->text.font, 0, 0); - if(lv_label_get_align(ext->label) != LV_LABEL_ALIGN_RIGHT) { - area_arrow.x2 = ddlist->coords.x2 - style->body.padding.right; - area_arrow.x1 = area_arrow.x2 - arrow_width; - } else { - area_arrow.x1 = ddlist->coords.x1 + style->body.padding.left; - area_arrow.x2 = area_arrow.x1 + arrow_width; - } - - area_arrow.y1 = ddlist->coords.y1 + style->text.line_space; - area_arrow.y2 = area_arrow.y1 + font_h; - - lv_area_t mask_arrow; - bool area_ok; - area_ok = lv_area_intersect(&mask_arrow, mask, &area_arrow); - if(area_ok) { - /*Use a down arrow in ddlist, you can replace it with yourcustom symbol*/ - lv_draw_label(&area_arrow, &mask_arrow, &new_style, opa_scale, LV_SYMBOL_DOWN, 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); - } - - return true; -} - -/** - * Signal function of the drop down list - * @param ddlist pointer to a drop down list 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_ddlist_signal(lv_obj_t * ddlist, lv_signal_t sign, void * param) -{ - lv_res_t res; - /* 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; - } else if(sign == LV_SIGNAL_FOCUS) { -#if LV_USE_GROUP - lv_group_t * g = lv_obj_get_group(ddlist); - bool editing = lv_group_get_editing(g); - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); - - /*Encoders need special handling*/ - if(indev_type == LV_INDEV_TYPE_ENCODER) { - /*Open the list if editing*/ - if(editing) { - ext->opened = true; - ext->sel_opt_id_ori = ext->sel_opt_id; - lv_ddlist_refr_size(ddlist, true); - } - /*Close the lift if navigating*/ - else { - ext->opened = false; - ext->sel_opt_id = ext->sel_opt_id_ori; - lv_ddlist_refr_size(ddlist, true); - } - } else { - /*Open the list if closed*/ - if(!ext->opened) { - ext->opened = true; - ext->sel_opt_id_ori = ext->sel_opt_id; /*Save the current value. Used to revert this - state if ENER wont't be pressed*/ - lv_ddlist_refr_size(ddlist, true); - } - } -#endif - } else if(sign == LV_SIGNAL_RELEASED) { - release_handler(ddlist); - } else if(sign == LV_SIGNAL_DEFOCUS) { - if(ext->opened) { - ext->opened = false; - ext->sel_opt_id = ext->sel_opt_id_ori; - lv_ddlist_refr_size(ddlist, true); - } - } else if(sign == LV_SIGNAL_CONTROL) { - char c = *((char *)param); - if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) { - if(!ext->opened) { - ext->opened = 1; - lv_ddlist_refr_size(ddlist, true); - } - - if(ext->sel_opt_id + 1 < ext->option_cnt) { - ext->sel_opt_id++; - lv_ddlist_pos_current_option(ddlist); - lv_obj_invalidate(ddlist); - } - } else if(c == LV_KEY_LEFT || c == LV_KEY_UP) { - if(!ext->opened) { - ext->opened = 1; - lv_ddlist_refr_size(ddlist, true); - } - if(ext->sel_opt_id > 0) { - ext->sel_opt_id--; - lv_ddlist_pos_current_option(ddlist); - lv_obj_invalidate(ddlist); - } - } else if(c == LV_KEY_ESC) { - if(ext->opened) { - ext->opened = 0; - ext->sel_opt_id = ext->sel_opt_id_ori; - lv_ddlist_refr_size(ddlist, true); - } - } - } else if(sign == LV_SIGNAL_GET_EDITABLE) { - bool * editable = (bool *)param; - *editable = true; - } - - return res; -} - -/** - * Signal function of the drop down list's scrollable part - * @param scrl pointer to a drop down list's scrollable part - * @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_ddlist_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* Include the ancient signal function */ - res = ancestor_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 * ddlist = lv_obj_get_parent(scrl); - - if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { - /*TODO review this*/ - /* Because of the wider selected rectangle ext. size - * In this way by dragging the scrollable part the wider rectangle area can be redrawn too*/ - const lv_style_t * style = lv_ddlist_get_style(ddlist, LV_DDLIST_STYLE_BG); - lv_coord_t hpad = LV_MATH_MAX(style->body.padding.left, style->body.padding.right); - if(scrl->ext_draw_pad < hpad) scrl->ext_draw_pad = hpad; - } else if(sign == LV_SIGNAL_RELEASED) { - if(lv_indev_is_dragging(lv_indev_get_act()) == false) { - release_handler(ddlist); - } - } else if(sign == LV_SIGNAL_CLEANUP) { - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - ext->label = NULL; /*The label is already deleted*/ - } - - return res; -} - -/** - * Called when a drop down list is released to open it or set new option - * @param ddlist pointer to a drop down list object - * @return LV_ACTION_RES_INV if the ddlist it deleted in the user callback else LV_ACTION_RES_OK - */ -static lv_res_t release_handler(lv_obj_t * ddlist) -{ - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - - /*Only deal with clickable drop down lists*/ - if(!lv_obj_get_click(ddlist)) - return LV_RES_OK; - - if(ext->opened == 0) { /*Open the list*/ - ext->opened = 1; - lv_obj_set_drag(lv_page_get_scrl(ddlist), true); - lv_ddlist_refr_size(ddlist, true); - } else { - - lv_indev_t * indev = lv_indev_get_act(); -#if LV_USE_GROUP - /*Leave edit mode once a new item is selected*/ - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) { - ext->sel_opt_id_ori = ext->sel_opt_id; - lv_group_t * g = lv_obj_get_group(ddlist); - if(lv_group_get_editing(g)) { - lv_group_set_editing(g, false); - } - } -#endif - - /*Search the clicked option (For KEYPAD and ENCODER the new value should be already set)*/ - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_POINTER || lv_indev_get_type(indev) == LV_INDEV_TYPE_BUTTON) { - lv_point_t p; - lv_indev_get_point(indev, &p); - p.y -= ext->label->coords.y1; - p.x -= ext->label->coords.x1; - uint16_t letter_i; - letter_i = lv_label_get_letter_on(ext->label, &p); - - uint16_t new_opt = 0; - const char * txt = lv_label_get_text(ext->label); - uint32_t i = 0; - uint32_t i_prev = 0; - - uint32_t letter_cnt = 0; - uint32_t letter; - for(letter_cnt = 0; letter_cnt < letter_i; letter_cnt++) { - letter = lv_txt_encoded_next(txt, &i); - /*Count he lines to reach the clicked letter. But ignore the last '\n' because it - * still belongs to the clicked line*/ - if(letter == '\n' && i_prev != letter_i) new_opt++; - i_prev = i; - } - - ext->sel_opt_id = new_opt; - ext->sel_opt_id_ori = ext->sel_opt_id; - } - - uint32_t id = ext->sel_opt_id; /*Just to use uint32_t in event data*/ - lv_res_t res = lv_event_send(ddlist, LV_EVENT_VALUE_CHANGED, &id); - if(res != LV_RES_OK) return res; - - if(ext->stay_open == 0) { - ext->opened = 0; - lv_obj_set_drag(lv_page_get_scrl(ddlist), false); - lv_ddlist_refr_size(ddlist, true); - } else { - lv_obj_invalidate(ddlist); - } - } - - return LV_RES_OK; -} - -/** - * Refresh the size of drop down list according to its status (open or closed) - * @param ddlist pointer to a drop down list object - * @param anim Change the size (open/close) with or without animation (true/false) - */ -static void lv_ddlist_refr_size(lv_obj_t * ddlist, lv_anim_enable_t anim) -{ -#if LV_USE_ANIMATION == 0 - anim = false; -#endif - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - const lv_style_t * style = lv_obj_get_style(ddlist); - lv_coord_t new_height; - - /*Open the list*/ - if(ext->opened) { - if(ext->fix_height == 0) { - new_height = - lv_obj_get_height(lv_page_get_scrl(ddlist)) + style->body.padding.top + style->body.padding.bottom; - } else { - new_height = ext->fix_height; - } - - } - /*Close the list*/ - else { - const lv_font_t * font = style->text.font; - const lv_style_t * label_style = lv_obj_get_style(ext->label); - lv_coord_t font_h = lv_font_get_line_height(font); - new_height = font_h + 2 * label_style->text.line_space; - - lv_page_set_sb_mode(ddlist, LV_SB_MODE_HIDE); - } - - if(anim == LV_ANIM_OFF) { - lv_obj_set_height(ddlist, new_height); - lv_ddlist_pos_current_option(ddlist); - if(ext->opened) lv_page_set_sb_mode(ddlist, LV_SB_MODE_UNHIDE); -#if LV_USE_ANIMATION - lv_anim_del(ddlist, (lv_anim_exec_xcb_t)lv_ddlist_adjust_height); /*If an animation is in progress then - it will overwrite this changes*/ - - /*Force animation complete to fix highlight selection*/ - lv_ddlist_anim_finish(ddlist); - } else { - /*Run the animation only if the the size will be different*/ - if(lv_obj_get_height(ddlist) != new_height) { - lv_anim_t a; - a.var = ddlist; - a.start = lv_obj_get_height(ddlist); - a.end = new_height; - a.exec_cb = (lv_anim_exec_xcb_t)lv_ddlist_adjust_height; - a.path_cb = lv_anim_path_linear; - a.ready_cb = lv_ddlist_anim_ready_cb; - a.act_time = 0; - a.time = lv_ddlist_get_anim_time(ddlist); - a.playback = 0; - a.playback_pause = 0; - a.repeat = 0; - a.repeat_pause = 0; - - ext->force_sel = 1; /*Keep the list item selected*/ - lv_anim_create(&a); - } -#endif - } -} - -#if LV_USE_ANIMATION -/** - * Position the list and remove the selection highlight if it's closed. - * Called at end of list animation. - * @param a pointer to the animation - */ -static void lv_ddlist_anim_ready_cb(lv_anim_t * a) -{ - lv_obj_t * ddlist = a->var; - lv_ddlist_anim_finish(ddlist); -} - -/** - * Clean up after the open animation - * @param ddlist - */ -static void lv_ddlist_anim_finish(lv_obj_t * ddlist) -{ - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - - lv_ddlist_pos_current_option(ddlist); - ext->force_sel = 0; /*Turn off drawing of selection*/ - if(ext->opened) lv_page_set_sb_mode(ddlist, LV_SB_MODE_UNHIDE); -} - -/** - * Adjusts the ddlist's height and then positions the option within it's new height. - * This keeps the option visible during animation. - * @param ddlist Drop down list object - * @param height New drop down list height - */ -static void lv_ddlist_adjust_height(lv_obj_t * ddlist, lv_anim_value_t height) -{ - lv_obj_set_height(ddlist, height); - lv_ddlist_pos_current_option(ddlist); -} -#endif - -/** - * Set the position of list when it is closed to show the selected item - * @param ddlist pointer to a drop down list - */ -static void lv_ddlist_pos_current_option(lv_obj_t * ddlist) -{ - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(ddlist); - const lv_style_t * style = lv_obj_get_style(ddlist); - const lv_font_t * font = style->text.font; - lv_coord_t font_h = lv_font_get_line_height(font); - const lv_style_t * label_style = lv_obj_get_style(ext->label); - lv_obj_t * scrl = lv_page_get_scrl(ddlist); - - lv_coord_t h = lv_obj_get_height(ddlist); - lv_coord_t line_y1 = - ext->sel_opt_id * (font_h + label_style->text.line_space) + ext->label->coords.y1 - scrl->coords.y1; - - lv_obj_set_y(scrl, -line_y1 + (h - font_h) / 2); - lv_obj_invalidate(ddlist); -} - -/** - * Be sure the width of the scrollable exactly fits the ddlist - * @param ddlist pointer to a ddlist - */ -static void lv_ddlist_refr_width(lv_obj_t * ddlist) -{ - lv_ddlist_ext_t * ext = lv_obj_get_ext_attr(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); - - /*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/libs/lvgl/src/lv_objx/lv_ddlist.h b/src/libs/lvgl/src/lv_objx/lv_ddlist.h deleted file mode 100644 index ee6c1f70..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_ddlist.h +++ /dev/null @@ -1,269 +0,0 @@ -/** - * @file lv_ddlist.h - * - */ - -#ifndef LV_DDLIST_H -#define LV_DDLIST_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_DDLIST != 0 - -/*Testing of dependencies*/ -#if LV_USE_PAGE == 0 -#error "lv_ddlist: lv_page is required. Enable it in lv_conf.h (LV_USE_PAGE 1) " -#endif - -#if LV_USE_LABEL == 0 -#error "lv_ddlist: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "../lv_objx/lv_page.h" -#include "../lv_objx/lv_label.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -/*Data of drop down list*/ -typedef struct -{ - lv_page_ext_t page; /*Ext. of ancestor*/ - /*New data for this type */ - lv_obj_t * label; /*Label for the options*/ - const lv_style_t * sel_style; /*Style of the selected option*/ - 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; - -enum { - LV_DDLIST_STYLE_BG, - LV_DDLIST_STYLE_SEL, - LV_DDLIST_STYLE_SB, -}; -typedef uint8_t lv_ddlist_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ -/** - * Create a drop down list objects - * @param par pointer to an object, it will be the parent of the new drop down list - * @param copy pointer to a drop down list object, if not NULL then the new object will be copied - * from it - * @return pointer to the created drop down list - */ -lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the options in a drop down list from a string - * @param ddlist pointer to drop down list object - * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" - */ -void lv_ddlist_set_options(lv_obj_t * ddlist, const char * options); - -/** - * Set the selected option - * @param ddlist pointer to drop down list object - * @param sel_opt id of the selected option (0 ... number of option - 1); - */ -void lv_ddlist_set_selected(lv_obj_t * ddlist, uint16_t sel_opt); - -/** - * Set a fix height for the drop down list - * If 0 then the opened ddlist will be auto. sized else the set height will be applied. - * @param ddlist pointer to a drop down list - * @param h the height when the list is opened (0: auto size) - */ -void lv_ddlist_set_fix_height(lv_obj_t * ddlist, lv_coord_t h); - -/** - * Set a fix width for the drop down list - * @param ddlist pointer to a drop down list - * @param w the width when the list is opened (0: auto size) - */ -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); - -/** - * Leave the list opened when a new value is selected - * @param ddlist pointer to drop down list object - * @param en enable/disable "stay open" feature - */ -void lv_ddlist_set_stay_open(lv_obj_t * ddlist, bool en); - -/** - * Set the scroll bar mode of a drop down list - * @param ddlist pointer to a drop down list object - * @param sb_mode the new mode from 'lv_page_sb_mode_t' enum - */ -static inline void lv_ddlist_set_sb_mode(lv_obj_t * ddlist, lv_sb_mode_t mode) -{ - lv_page_set_sb_mode(ddlist, mode); -} -/** - * Set the open/close animation time. - * @param ddlist pointer to a drop down list - * @param anim_time: open/close animation time [ms] - */ -static inline void lv_ddlist_set_anim_time(lv_obj_t * ddlist, uint16_t anim_time) -{ - lv_page_set_anim_time(ddlist, anim_time); -} - -/** - * Set a style of a drop down list - * @param ddlist pointer to a drop down list object - * @param type which style should be set - * @param style pointer to a style - * */ -void lv_ddlist_set_style(lv_obj_t * ddlist, lv_ddlist_style_t type, const lv_style_t * style); - -/** - * Set the alignment of the labels in a drop down list - * @param ddlist pointer to a drop down list object - * @param align alignment of labels - */ -void lv_ddlist_set_align(lv_obj_t * ddlist, lv_label_align_t align); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the options of a drop down list - * @param ddlist pointer to drop down list object - * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") - */ -const char * lv_ddlist_get_options(const lv_obj_t * ddlist); - -/** - * Get the selected option - * @param ddlist pointer to drop down list object - * @return id of the selected option (0 ... number of option - 1); - */ -uint16_t lv_ddlist_get_selected(const lv_obj_t * ddlist); - -/** - * Get the current selected option as a string - * @param ddlist pointer to ddlist object - * @param buf pointer to an array to store the string - * @param buf_size size of `buf` in bytes. 0: to ignore it. - */ -void lv_ddlist_get_selected_str(const lv_obj_t * ddlist, char * buf, uint16_t buf_size); - -/** - * Get the fix height value. - * @param ddlist pointer to a drop down list object - * @return the height if the ddlist is opened (0: auto size) - */ -lv_coord_t lv_ddlist_get_fix_height(const lv_obj_t * ddlist); - -/** - * Get arrow draw in a drop down list - * @param ddlist pointer to drop down list object - */ -bool lv_ddlist_get_draw_arrow(lv_obj_t * ddlist); - -/** - * Get whether the drop down list stay open after selecting a value or not - * @param ddlist pointer to drop down list object - */ -bool lv_ddlist_get_stay_open(lv_obj_t * ddlist); - -/** - * Get the scroll bar mode of a drop down list - * @param ddlist pointer to a drop down list object - * @return scrollbar mode from 'lv_page_sb_mode_t' enum - */ -static inline lv_sb_mode_t lv_ddlist_get_sb_mode(const lv_obj_t * ddlist) -{ - return lv_page_get_sb_mode(ddlist); -} - -/** - * Get the open/close animation time. - * @param ddlist pointer to a drop down list - * @return open/close animation time [ms] - */ -static inline uint16_t lv_ddlist_get_anim_time(const lv_obj_t * ddlist) -{ - return lv_page_get_anim_time(ddlist); -} - -/** - * Get a style of a drop down list - * @param ddlist pointer to a drop down list object - * @param type which style should be get - * @return style pointer to a style - */ -const lv_style_t * lv_ddlist_get_style(const lv_obj_t * ddlist, lv_ddlist_style_t type); - -/** - * Get the alignment of the labels in a drop down list - * @param ddlist pointer to a drop down list object - * @return alignment of labels - */ -lv_label_align_t lv_ddlist_get_align(const lv_obj_t * ddlist); - -/*===================== - * Other functions - *====================*/ - -/** - * Open the drop down list with or without animation - * @param ddlist pointer to drop down list object - * @param anim_en LV_ANIM_ON: use animation; LV_ANOM_OFF: not use animations - */ -void lv_ddlist_open(lv_obj_t * ddlist, lv_anim_enable_t anim); - -/** - * Close (Collapse) the drop down list - * @param ddlist pointer to drop down list object - * @param anim_en LV_ANIM_ON: use animation; LV_ANOM_OFF: not use animations - */ -void lv_ddlist_close(lv_obj_t * ddlist, lv_anim_enable_t anim); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_DDLIST*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_DDLIST_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_gauge.c b/src/libs/lvgl/src/lv_objx/lv_gauge.c deleted file mode 100644 index 7191d832..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_gauge.c +++ /dev/null @@ -1,473 +0,0 @@ -/** - * @file lv_gauge.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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 <stdio.h> -#include <string.h> - -/********************* - * 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 - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_gauge_design(lv_obj_t * gauge, const lv_area_t * mask, 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 VARIABLES - **********************/ -static lv_design_cb_t ancestor_design; -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a gauge objects - * @param par pointer to an object, it will be the parent of the new gauge - * @param copy pointer to a gauge object, if not NULL then the new object will be copied from it - * @return pointer to the created gauge - */ -lv_obj_t * lv_gauge_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("gauge create started"); - - /*Create the ancestor gauge*/ - lv_obj_t * new_gauge = lv_lmeter_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) 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; - 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); - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_gauge, lv_gauge_signal); - lv_obj_set_design_cb(new_gauge, lv_gauge_design); - - /*Init the new gauge gauge*/ - if(copy == NULL) { - lv_gauge_set_scale(new_gauge, LV_GAUGE_DEF_ANGLE, LV_GAUGE_DEF_LINE_COUNT, LV_GAUGE_DEF_LABEL_COUNT); - lv_gauge_set_needle_count(new_gauge, 1, NULL); - lv_gauge_set_critical_value(new_gauge, 80); - lv_obj_set_size(new_gauge, 2 * LV_DPI, 2 * LV_DPI); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_gauge_set_style(new_gauge, LV_GAUGE_STYLE_MAIN, th->style.gauge); - } else { - lv_gauge_set_style(new_gauge, LV_GAUGE_STYLE_MAIN, &lv_style_pretty_color); - } - } - /*Copy an existing gauge*/ - else { - lv_gauge_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - lv_gauge_set_needle_count(new_gauge, copy_ext->needle_count, copy_ext->needle_colors); - - uint8_t i; - for(i = 0; i < ext->needle_count; i++) { - ext->values[i] = copy_ext->values[i]; - } - ext->label_count = copy_ext->label_count; - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_gauge); - } - - LV_LOG_INFO("gauge created"); - - return new_gauge; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the number of needles - * @param gauge pointer to gauge object - * @param needle_cnt new count of needles - * @param colors an array of colors for needles (with 'num' elements) - */ -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) { - if(ext->values != NULL) { - lv_mem_free(ext->values); - ext->values = NULL; - } - - ext->values = lv_mem_realloc(ext->values, needle_cnt * sizeof(int16_t)); - LV_ASSERT_MEM(ext->values); - if(ext->values == NULL) return; - - int16_t min = lv_gauge_get_min_value(gauge); - uint8_t n; - for(n = ext->needle_count; n < needle_cnt; n++) { - ext->values[n] = min; - } - - ext->needle_count = needle_cnt; - } - - ext->needle_colors = colors; - lv_obj_invalidate(gauge); -} - -/** - * Set the value of a needle - * @param gauge pointer to a gauge - * @param needle_id the id of the needle - * @param value the new value - */ -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; - if(ext->values[needle_id] == value) return; - - int16_t min = lv_gauge_get_min_value(gauge); - int16_t max = lv_gauge_get_max_value(gauge); - - if(value > max) - value = max; - else if(value < min) - value = min; - - ext->values[needle_id] = value; - - lv_obj_invalidate(gauge); -} - -/** - * Set the scale settings of a gauge - * @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 - * @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); - ext->label_count = label_cnt; - lv_obj_invalidate(gauge); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the value of a needle - * @param gauge pointer to gauge object - * @param needle the id of the needle - * @return the value of the needle [min,max] - */ -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); - - if(needle >= ext->needle_count) return min; - - return ext->values[needle]; -} - -/** - * Get the count of needles on a gauge - * @param gauge pointer to gauge - * @return count of needles - */ -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; -} - -/** - * Set the number of labels (and the thicker lines too) - * @param gauge pointer to a gauge object - * @return count of labels - */ -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; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_gauge_design(lv_obj_t * gauge, const lv_area_t * mask, 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; - } - /*Draw the object*/ - else if(mode == LV_DESIGN_DRAW_MAIN) { - - /* Store the real pointer because of 'lv_group' - * If the object is in focus 'lv_obj_get_style()' will give a pointer to tmp style - * and to the real object style. It is important because of style change tricks below*/ - const lv_style_t * style_ori_p = gauge->style_p; - 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); - - /*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*/ - - /*Temporally modify the line meter to draw longer lines where labels are*/ - lv_style_t style_tmp; - lv_style_copy(&style_tmp, style); - ext->lmeter.line_cnt = ext->label_count; /*Only to labels*/ - style_tmp.body.padding.left = style_tmp.body.padding.left * 2; /*Longer lines*/ - 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*/ - - 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); - - } - /*Post draw when the children are drawn*/ - else if(mode == LV_DESIGN_DRAW_POST) { - ancestor_design(gauge, mask, mode); - } - - return true; -} - -/** - * Signal function of the gauge - * @param gauge pointer to a gauge 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_gauge_signal(lv_obj_t * gauge, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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; - } - - return res; -} - -/** - * Draw the scale on a gauge - * @param gauge pointer to gauge object - * @param mask mask of drawing - */ -static void lv_gauge_draw_scale(lv_obj_t * gauge, const lv_area_t * mask) -{ - char scale_txt[16]; - - lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); - const lv_style_t * style = lv_obj_get_style(gauge); - lv_opa_t opa_scale = lv_obj_get_opa_scale(gauge); - lv_coord_t r = lv_obj_get_width(gauge) / 2 - (3 * style->body.padding.left) - style->body.padding.inner; - lv_coord_t x_ofs = lv_obj_get_width(gauge) / 2 + gauge->coords.x1; - lv_coord_t y_ofs = lv_obj_get_height(gauge) / 2 + gauge->coords.y1; - int16_t scale_angle = lv_lmeter_get_scale_angle(gauge); - uint16_t label_num = ext->label_count; - int16_t angle_ofs = 90 + (360 - scale_angle) / 2; - int16_t min = lv_gauge_get_min_value(gauge); - int16_t max = lv_gauge_get_max_value(gauge); - - uint8_t i; - for(i = 0; i < label_num; i++) { - /*Calculate the position a scale label*/ - int16_t angle = (i * scale_angle) / (label_num - 1) + angle_ofs; - - lv_coord_t y = (int32_t)((int32_t)lv_trigo_sin(angle) * r) / LV_TRIGO_SIN_MAX; - y += y_ofs; - - lv_coord_t x = (int32_t)((int32_t)lv_trigo_sin(angle + 90) * r) / LV_TRIGO_SIN_MAX; - x += x_ofs; - - int16_t scale_act = (int32_t)((int32_t)(max - min) * i) / (label_num - 1); - scale_act += min; - lv_utils_num_to_str(scale_act, scale_txt); - - lv_area_t label_cord; - lv_point_t label_size; - lv_txt_get_size(&label_size, scale_txt, style->text.font, style->text.letter_space, style->text.line_space, - LV_COORD_MAX, LV_TXT_FLAG_NONE); - - /*Draw the label*/ - label_cord.x1 = x - label_size.x / 2; - label_cord.y1 = y - label_size.y / 2; - 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, NULL, NULL, lv_obj_get_base_dir(gauge)); - } -} -/** - * Draw the needles of a gauge - * @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) -{ - lv_style_t style_needle; - lv_gauge_ext_t * ext = lv_obj_get_ext_attr(gauge); - const lv_style_t * style = lv_gauge_get_style(gauge, LV_GAUGE_STYLE_MAIN); - lv_opa_t opa_scale = lv_obj_get_opa_scale(gauge); - - lv_coord_t r = lv_obj_get_width(gauge) / 2 - style->body.padding.left; - lv_coord_t x_ofs = lv_obj_get_width(gauge) / 2 + gauge->coords.x1; - lv_coord_t y_ofs = lv_obj_get_height(gauge) / 2 + gauge->coords.y1; - uint16_t angle = lv_lmeter_get_scale_angle(gauge); - int16_t angle_ofs = 90 + (360 - angle) / 2; - int16_t min = lv_gauge_get_min_value(gauge); - 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); - - 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); - - int16_t needle_angle_low = (needle_angle >> LV_GAUGE_INTERPOLATE_SHIFT) + angle_ofs; - int16_t needle_angle_high = needle_angle_low + 1; - - 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; - - 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; - - 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; - - 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; - - 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); - } - - /*Draw the needle middle area*/ - lv_style_t style_neddle_mid; - lv_style_copy(&style_neddle_mid, &lv_style_plain); - style_neddle_mid.body.main_color = style->body.border.color; - style_neddle_mid.body.grad_color = style->body.border.color; - style_neddle_mid.body.radius = LV_RADIUS_CIRCLE; - - lv_area_t nm_cord; - nm_cord.x1 = x_ofs - style->body.radius; - nm_cord.y1 = y_ofs - style->body.radius; - 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)); -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_gauge.h b/src/libs/lvgl/src/lv_objx/lv_gauge.h deleted file mode 100644 index 408c1125..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_gauge.h +++ /dev/null @@ -1,233 +0,0 @@ -/** - * @file lv_gauge.h - * - */ - -#ifndef LV_GAUGE_H -#define LV_GAUGE_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_GAUGE != 0 - -/*Testing of dependencies*/ -#if LV_USE_LMETER == 0 -#error "lv_gauge: lv_lmeter is required. Enable it in lv_conf.h (LV_USE_LMETER 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "lv_lmeter.h" -#include "lv_label.h" -#include "lv_line.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*Data of gauge*/ -typedef struct -{ - lv_lmeter_ext_t lmeter; /*Ext. of ancestor*/ - /*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])*/ - uint8_t needle_count; /*Number of needles*/ - uint8_t label_count; /*Number of labels on the scale*/ -} lv_gauge_ext_t; - -/*Styles*/ -enum { - LV_GAUGE_STYLE_MAIN, -}; -typedef uint8_t lv_gauge_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a gauge objects - * @param par pointer to an object, it will be the parent of the new gauge - * @param copy pointer to a gauge object, if not NULL then the new object will be copied from it - * @return pointer to the created gauge - */ -lv_obj_t * lv_gauge_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the number of needles - * @param gauge pointer to gauge object - * @param needle_cnt new count of needles - * @param colors an array of colors for needles (with 'num' elements) - */ -void lv_gauge_set_needle_count(lv_obj_t * gauge, uint8_t needle_cnt, const lv_color_t colors[]); - -/** - * Set the value of a needle - * @param gauge pointer to a gauge - * @param needle_id the id of the needle - * @param value the new value - */ -void lv_gauge_set_value(lv_obj_t * gauge, uint8_t needle_id, int16_t value); - -/** - * Set minimum and the maximum values of a gauge - * @param gauge pointer to he gauge object - * @param min minimum value - * @param max maximum value - */ -static inline void lv_gauge_set_range(lv_obj_t * gauge, int16_t min, int16_t max) -{ - lv_lmeter_set_range(gauge, min, max); -} - -/** - * Set a critical value on the scale. After this value 'line.color' scale lines will be drawn - * @param gauge pointer to a gauge object - * @param value the critical value - */ -static inline void lv_gauge_set_critical_value(lv_obj_t * gauge, int16_t value) -{ - lv_lmeter_set_value(gauge, value); -} - -/** - * Set the scale settings of a gauge - * @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 - * @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 the styles of a gauge - * @param gauge pointer to a gauge object - * @param type which style should be set (can be only `LV_GAUGE_STYLE_MAIN`) - * @param style set the style of the gauge - * */ -static inline void lv_gauge_set_style(lv_obj_t * gauge, lv_gauge_style_t type, lv_style_t * style) -{ - (void)type; /*Unused*/ - lv_obj_set_style(gauge, style); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the value of a needle - * @param gauge pointer to gauge object - * @param needle the id of the needle - * @return the value of the needle [min,max] - */ -int16_t lv_gauge_get_value(const lv_obj_t * gauge, uint8_t needle); - -/** - * Get the count of needles on a gauge - * @param gauge pointer to gauge - * @return count of needles - */ -uint8_t lv_gauge_get_needle_count(const lv_obj_t * gauge); - -/** - * Get the minimum value of a gauge - * @param gauge pointer to a gauge object - * @return the minimum value of the gauge - */ -static inline int16_t lv_gauge_get_min_value(const lv_obj_t * lmeter) -{ - return lv_lmeter_get_min_value(lmeter); -} - -/** - * Get the maximum value of a gauge - * @param gauge pointer to a gauge object - * @return the maximum value of the gauge - */ -static inline int16_t lv_gauge_get_max_value(const lv_obj_t * lmeter) -{ - return lv_lmeter_get_max_value(lmeter); -} - -/** - * Get a critical value on the scale. - * @param gauge pointer to a gauge object - * @return the critical value - */ -static inline int16_t lv_gauge_get_critical_value(const lv_obj_t * gauge) -{ - return lv_lmeter_get_value(gauge); -} - -/** - * Set the number of labels (and the thicker lines too) - * @param gauge pointer to a gauge object - * @return count of labels - */ -uint8_t lv_gauge_get_label_count(const lv_obj_t * gauge); - -/** - * Get the scale number of a gauge - * @param gauge pointer to a gauge object - * @return number of the scale units - */ -static inline uint16_t lv_gauge_get_line_count(const lv_obj_t * gauge) -{ - return lv_lmeter_get_line_count(gauge); -} - -/** - * Get the scale angle of a gauge - * @param gauge pointer to a gauge object - * @return angle of the scale - */ -static inline uint16_t lv_gauge_get_scale_angle(const lv_obj_t * gauge) -{ - return lv_lmeter_get_scale_angle(gauge); -} - -/** - * Get the style of a gauge - * @param gauge pointer to a gauge object - * @param type which style should be get (can be only `LV_GAUGE_STYLE_MAIN`) - * @return pointer to the gauge's style - */ -static inline const lv_style_t * lv_gauge_get_style(const lv_obj_t * gauge, lv_gauge_style_t type) -{ - (void)type; /*Unused*/ - return lv_obj_get_style(gauge); -} - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_GAUGE*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_GAUGE_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_img.c b/src/libs/lvgl/src/lv_objx/lv_img.c deleted file mode 100644 index bf0269f9..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_img.c +++ /dev/null @@ -1,435 +0,0 @@ -/** - * @file lv_img.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_img.h" -#if LV_USE_IMG != 0 - -/*Testing of dependencies*/ -#if LV_USE_LABEL == 0 -#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_log.h" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_img" - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_img_design(lv_obj_t * img, const lv_area_t * mask, lv_design_mode_t mode); -static lv_res_t lv_img_signal(lv_obj_t * img, lv_signal_t sign, void * param); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create an image objects - * @param par pointer to an object, it will be the parent of the new button - * @param copy pointer to a image object, if not NULL then the new object will be copied from it - * @return pointer to the created image - */ -lv_obj_t * lv_img_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("image create started"); - - lv_obj_t * new_img = NULL; - - /*Create a basic object*/ - new_img = lv_obj_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) 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->auto_size = 1; - ext->offset.x = 0; - ext->offset.y = 0; - - /*Init the new object*/ - lv_obj_set_signal_cb(new_img, lv_img_signal); - lv_obj_set_design_cb(new_img, lv_img_design); - - if(copy == NULL) { - lv_obj_set_click(new_img, false); - /* Enable auto size for non screens - * because image screens are wallpapers - * and must be screen sized*/ - if(par != NULL) { - ext->auto_size = 1; - lv_obj_set_style(new_img, NULL); /*Inherit the style by default*/ - } else { - ext->auto_size = 0; - lv_obj_set_style(new_img, &lv_style_plain); /*Set a style for screens*/ - } - } else { - lv_img_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->auto_size = copy_ext->auto_size; - lv_img_set_src(new_img, copy_ext->src); - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_img); - } - - LV_LOG_INFO("image created"); - - return new_img; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the pixel map to display by the image - * @param img pointer to an image object - * @param data the image data - */ -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); - -#if LV_USE_LOG && LV_LOG_LEVEL >= LV_LOG_LEVEL_INFO - switch(src_type) { - case LV_IMG_SRC_FILE: LV_LOG_TRACE("lv_img_set_src: `LV_IMG_SRC_FILE` type found"); break; - case LV_IMG_SRC_VARIABLE: LV_LOG_TRACE("lv_img_set_src: `LV_IMG_SRC_VARIABLE` type found"); break; - case LV_IMG_SRC_SYMBOL: LV_LOG_TRACE("lv_img_set_src: `LV_IMG_SRC_SYMBOL` type found"); break; - default: LV_LOG_WARN("lv_img_set_src: unknown type"); - } -#endif - - /*If the new source type is unknown free the memories of the old source*/ - if(src_type == LV_IMG_SRC_UNKNOWN) { - LV_LOG_WARN("lv_img_set_src: unknown image type"); - if(ext->src_type == LV_IMG_SRC_SYMBOL || ext->src_type == LV_IMG_SRC_FILE) { - lv_mem_free(ext->src); - } - ext->src = NULL; - ext->src_type = LV_IMG_SRC_UNKNOWN; - return; - } - - lv_img_header_t header; - lv_img_decoder_get_info(src_img, &header); - - /*Save the source*/ - if(src_type == LV_IMG_SRC_VARIABLE) { - LV_LOG_INFO("lv_img_set_src: `LV_IMG_SRC_VARIABLE` type found"); - - /*If memory was allocated because of the previous `src_type` then free it*/ - if(ext->src_type == LV_IMG_SRC_FILE || ext->src_type == LV_IMG_SRC_SYMBOL) { - lv_mem_free(ext->src); - } - ext->src = 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) { - 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) { - old_src = ext->src; - } - char * new_str = lv_mem_alloc(strlen(src_img) + 1); - 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); - } - } - - if(src_type == LV_IMG_SRC_SYMBOL) { - /*`lv_img_dsc_get_info` couldn't set the with and height of a font so set it here*/ - const lv_style_t * style = lv_img_get_style(img, LV_IMG_STYLE_MAIN); - lv_point_t size; - lv_txt_get_size(&size, src_img, style->text.font, style->text.letter_space, style->text.line_space, - LV_COORD_MAX, LV_TXT_FLAG_NONE); - header.w = size.x; - header.h = size.y; - } - - ext->src_type = src_type; - ext->w = header.w; - ext->h = header.h; - ext->cf = header.cf; - - if(lv_img_get_auto_size(img) != false) { - lv_obj_set_size(img, ext->w, ext->h); - } - - lv_obj_invalidate(img); -} - -/** - * Enable the auto size feature. - * If enabled the object size will be same as the picture size. - * @param img pointer to an image - * @param en true: auto size enable, false: auto size disable - */ -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); -} - -/** - * Set an offset for the source of an image. - * so the image will be displayed from the new origin. - * @param img pointer to an image - * @param x: the new offset along x axis. - */ -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); - } -} - -/** - * Set an offset for the source of an image. - * so the image will be displayed from the new origin. - * @param img pointer to an image - * @param y: the new offset along y axis. - */ -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); - } -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the source of the image - * @param img pointer to an image object - * @return the image source (symbol, file name or C array) - */ -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; -} - -/** - * Get the name of the file set for an image - * @param img pointer to an image - * @return file name - */ -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) - return ext->src; - else - return ""; -} - -/** - * Get the auto size enable attribute - * @param img pointer to an image - * @return true: auto size is enabled, false: auto size is disabled - */ -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; -} - -/** - * Get the offset.x attribute of the img object. - * @param img pointer to an image - * @return offset.x value. - */ -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; -} - -/** - * Get the offset.y attribute of the img object. - * @param img pointer to an image - * @return offset.y value. - */ -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; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_img_design(lv_obj_t * img, const lv_area_t * mask, 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; - - if(ext->cf == LV_IMG_CF_TRUE_COLOR || ext->cf == LV_IMG_CF_RAW) cover = lv_area_is_in(mask, &img->coords); - - const lv_style_t * style = lv_img_get_style(img, LV_IMG_STYLE_MAIN); - if(style->image.opa < LV_OPA_MAX) return false; - - return cover; - } else if(mode == LV_DESIGN_DRAW_MAIN) { - if(ext->h == 0 || ext->w == 0) return true; - lv_area_t coords; - lv_opa_t opa_scale = lv_obj_get_opa_scale(img); - - 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; - - 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) { - 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); - } - } - } else if(ext->src_type == LV_IMG_SRC_SYMBOL) { - LV_LOG_TRACE("lv_img_design: start to draw symbol"); - 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, 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); - } - } - - return true; -} - -/** - * Signal function of the image - * @param img pointer to an image 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_img_signal(lv_obj_t * img, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* Include the ancient signal function */ - 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) { - lv_mem_free(ext->src); - ext->src = NULL; - ext->src_type = LV_IMG_SRC_UNKNOWN; - } - } else if(sign == LV_SIGNAL_STYLE_CHG) { - /*Refresh the file name to refresh the symbol text size*/ - if(ext->src_type == LV_IMG_SRC_SYMBOL) { - lv_img_set_src(img, ext->src); - } - } - - return res; -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_img.h b/src/libs/lvgl/src/lv_objx/lv_img.h deleted file mode 100644 index d1e14d20..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_img.h +++ /dev/null @@ -1,179 +0,0 @@ -/** - * @file lv_img.h - * - */ - -#ifndef LV_IMG_H -#define LV_IMG_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_IMG != 0 - -#include "../lv_core/lv_obj.h" -#include "../lv_misc/lv_fs.h" -#include "lv_label.h" -#include "../lv_draw/lv_draw.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -/*Data of image*/ -typedef struct -{ - /*No inherited ext. because inherited from the base object*/ /*Ext. of ancestor*/ - /*New data for this type */ - const void * src; /*Image source: Pointer to an array or a file or a symbol*/ - 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)*/ - 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`*/ -} lv_img_ext_t; - -/*Styles*/ -enum { - LV_IMG_STYLE_MAIN, -}; -typedef uint8_t lv_img_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create an image objects - * @param par pointer to an object, it will be the parent of the new button - * @param copy pointer to a image object, if not NULL then the new object will be copied from it - * @return pointer to the created image - */ -lv_obj_t * lv_img_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the pixel map to display by the image - * @param img pointer to an image object - * @param data the image data - */ -void lv_img_set_src(lv_obj_t * img, const void * src_img); - -/** - * Enable the auto size feature. - * If enabled the object size will be same as the picture size. - * @param img pointer to an image - * @param en true: auto size enable, false: auto size disable - */ -void lv_img_set_auto_size(lv_obj_t * img, bool autosize_en); - -/** - * Set an offset for the source of an image. - * so the image will be displayed from the new origin. - * @param img pointer to an image - * @param x: the new offset along x axis. - */ -void lv_img_set_offset_x(lv_obj_t * img, lv_coord_t x); - -/** - * Set an offset for the source of an image. - * so the image will be displayed from the new origin. - * @param img pointer to an image - * @param y: the new offset along y axis. - */ -void lv_img_set_offset_y(lv_obj_t * img, lv_coord_t y); - -/** - * Set the style of an image - * @param img pointer to an image object - * @param type which style should be set (can be only `LV_IMG_STYLE_MAIN`) - * @param style pointer to a style - */ -static inline void lv_img_set_style(lv_obj_t * img, lv_img_style_t type, const lv_style_t * style) -{ - (void)type; /*Unused*/ - lv_obj_set_style(img, style); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the source of the image - * @param img pointer to an image object - * @return the image source (symbol, file name or C array) - */ -const void * lv_img_get_src(lv_obj_t * img); - -/** - * Get the name of the file set for an image - * @param img pointer to an image - * @return file name - */ -const char * lv_img_get_file_name(const lv_obj_t * img); - -/** - * Get the auto size enable attribute - * @param img pointer to an image - * @return true: auto size is enabled, false: auto size is disabled - */ -bool lv_img_get_auto_size(const lv_obj_t * img); - -/** - * Get the offset.x attribute of the img object. - * @param img pointer to an image - * @return offset.x value. - */ -lv_coord_t lv_img_get_offset_x(lv_obj_t * img); - -/** - * Get the offset.y attribute of the img object. - * @param img pointer to an image - * @return offset.y value. - */ -lv_coord_t lv_img_get_offset_y(lv_obj_t * img); - -/** - * Get the style of an image object - * @param img pointer to an image object - * @param type which style should be get (can be only `LV_IMG_STYLE_MAIN`) - * @return pointer to the image's style - */ -static inline const lv_style_t * lv_img_get_style(const lv_obj_t * img, lv_img_style_t type) -{ - (void)type; /*Unused*/ - return lv_obj_get_style(img); -} - -/********************** - * MACROS - **********************/ - -/*Use this macro to declare an image in a c file*/ -#define LV_IMG_DECLARE(var_name) extern const lv_img_dsc_t var_name; - -#endif /*LV_USE_IMG*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_IMG_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_imgbtn.c b/src/libs/lvgl/src/lv_objx/lv_imgbtn.c deleted file mode 100644 index 522df301..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_imgbtn.c +++ /dev/null @@ -1,437 +0,0 @@ -/** - * @file lv_imgbtn.c - * - */ - -/********************* - * 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 - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * mask, 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); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_design_cb_t ancestor_design; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a image button object - * @param par pointer to an object, it will be the parent of the new image button - * @param copy pointer to a image button object, if not NULL then the new object will be copied from - * it - * @return pointer to the created image button - */ -lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("image button create started"); - - /*Create the ancestor of image button*/ - lv_obj_t * new_imgbtn = lv_btn_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) 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((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)); - memset(ext->img_src_right, 0, sizeof(ext->img_src_right)); -#endif - - ext->act_cf = LV_IMG_CF_UNKNOWN; - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_imgbtn, lv_imgbtn_signal); - lv_obj_set_design_cb(new_imgbtn, lv_imgbtn_design); - - /*Init the new image button image button*/ - if(copy == NULL) { - - } - /*Copy an existing image button*/ - else { - lv_imgbtn_ext_t * copy_ext = lv_obj_get_ext_attr(copy); -#if LV_IMGBTN_TILED == 0 - memcpy((void*)ext->img_src, copy_ext->img_src, sizeof(ext->img_src)); -#else - memcpy((void*)ext->img_src_left, copy_ext->img_src_left, sizeof(ext->img_src_left)); - memcpy((void*)ext->img_src_mid, copy_ext->img_src_mid, sizeof(ext->img_src_mid)); - memcpy((void*)ext->img_src_right, copy_ext->img_src_right, sizeof(ext->img_src_right)); -#endif - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_imgbtn); - } - - LV_LOG_INFO("image button created"); - - return new_imgbtn; -} - -/*===================== - * Setter functions - *====================*/ - -#if LV_IMGBTN_TILED == 0 -/** - * Set images for a state of the image button - * @param imgbtn pointer to an image button object - * @param state for which state set the new image (from `lv_btn_state_t`) ` - * @param src pointer to an image source (a C array or path to a file) - */ -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; - - refr_img(imgbtn); -} - -#else -/** - * Set images for a state of the image button - * @param imgbtn pointer to an image button object - * @param state for which state set the new image (from `lv_btn_state_t`) ` - * @param src_left pointer to an image source for the left side of the button (a C array or path to - * a file) - * @param src_mid pointer to an image source for the middle of the button (ideally 1px wide) (a C - * array or path to a file) - * @param src_right pointer to an image source for the right side of the button (a C array or path - * to a file) - */ -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; - ext->img_src_mid[state] = src_mid; - ext->img_src_right[state] = src_right; - - refr_img(imgbtn); -} - -#endif - -/** - * Set a style of a image button. - * @param imgbtn pointer to image button object - * @param type which style should be set - * @param style pointer to a style - */ -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); -} - -/*===================== - * Getter functions - *====================*/ - -#if LV_IMGBTN_TILED == 0 -/** - * Get the images in a given state - * @param imgbtn pointer to an image button object - * @param state the state where to get the image (from `lv_btn_state_t`) ` - * @return pointer to an image source (a C array or path to a file) - */ -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]; -} -#else - -/** - * Get the left image in a given state - * @param imgbtn pointer to an image button object - * @param state the state where to get the image (from `lv_btn_state_t`) ` - * @return pointer to the left image source (a C array or path to a file) - */ -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]; -} - -/** - * Get the middle image in a given state - * @param imgbtn pointer to an image button object - * @param state the state where to get the image (from `lv_btn_state_t`) ` - * @return pointer to the middle image source (a C array or path to a file) - */ -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]; -} - -/** - * Get the right image in a given state - * @param imgbtn pointer to an image button object - * @param state the state where to get the image (from `lv_btn_state_t`) ` - * @return pointer to the left image source (a C array or path to a file) - */ -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]; -} - -#endif - -/** - * Get style of a image button. - * @param imgbtn pointer to image button object - * @param type which style should be get - * @return style pointer to the style - */ -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); -} - -/*===================== - * Other functions - *====================*/ - -/* - * New object specific "other" functions come here - */ - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_imgbtn_design(lv_obj_t * imgbtn, const lv_area_t * mask, 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; - if(ext->act_cf == LV_IMG_CF_TRUE_COLOR || ext->act_cf == LV_IMG_CF_RAW) { - cover = lv_area_is_in(mask, &imgbtn->coords); - } - - return cover; - } - /*Draw the object*/ - else if(mode == LV_DESIGN_DRAW_MAIN) { - /*Just draw an image*/ - lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); - 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]; - if(lv_img_src_get_type(src) == LV_IMG_SRC_SYMBOL) { - lv_draw_label(&imgbtn->coords, mask, style, opa_scale, src, LV_TXT_FLAG_NONE, NULL, NULL, NULL, lv_obj_get_base_dir(imgbtn)); - } else { - lv_draw_img(&imgbtn->coords, mask, src, style, opa_scale); - } -#else - const void * src; - 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 true; - } - - lv_img_header_t header; - lv_area_t coords; - lv_coord_t left_w = 0; - lv_coord_t right_w = 0; - - if(src) { - lv_img_decoder_get_info(src, &header); - left_w = header.w; - coords.x1 = imgbtn->coords.x1; - 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); - } - - src = ext->img_src_right[state]; - if(src) { - lv_img_decoder_get_info(src, &header); - right_w = header.w; - coords.x1 = imgbtn->coords.x2 - header.w + 1; - 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); - } - - 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); - - 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, mask, src, style, opa_scale); - coords.x1 = coords.x2 + 1; - coords.x2 += header.w; - } - } - -#endif - - } - /*Post draw when the children are drawn*/ - else if(mode == LV_DESIGN_DRAW_POST) { - } - - return true; -} - -/** - * Signal function of the image button - * @param imgbtn pointer to a image button 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_imgbtn_signal(lv_obj_t * imgbtn, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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 - * changed as well Set the new image for the new state.*/ - refr_img(imgbtn); - } else if(sign == LV_SIGNAL_CLEANUP) { - /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ - } - - return res; -} - -static void refr_img(lv_obj_t * imgbtn) -{ - lv_imgbtn_ext_t * ext = lv_obj_get_ext_attr(imgbtn); - lv_btn_state_t state = lv_imgbtn_get_state(imgbtn); - lv_img_header_t header; - -#if LV_IMGBTN_TILED == 0 - const void * src = ext->img_src[state]; -#else - const void * src = ext->img_src_mid[state]; -#endif - - 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 - lv_obj_set_size(imgbtn, header.w, header.h); -#else - lv_obj_set_height(imgbtn, header.h); -#endif - } else { - ext->act_cf = LV_IMG_CF_UNKNOWN; - } - - lv_obj_invalidate(imgbtn); -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_imgbtn.h b/src/libs/lvgl/src/lv_objx/lv_imgbtn.h deleted file mode 100644 index b28b74ff..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_imgbtn.h +++ /dev/null @@ -1,230 +0,0 @@ -/** - * @file lv_imgbtn.h - * - */ - -#ifndef LV_IMGBTN_H -#define LV_IMGBTN_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_IMGBTN != 0 - -/*Testing of dependencies*/ -#if LV_USE_BTN == 0 -#error "lv_imgbtn: lv_btn is required. Enable it in lv_conf.h (LV_USE_BTN 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "lv_btn.h" -#include "../lv_draw/lv_draw_img.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -/*Data of image button*/ -typedef struct -{ - lv_btn_ext_t btn; /*Ext. of ancestor*/ - /*New data for this type */ -#if LV_IMGBTN_TILED == 0 - const void * img_src[_LV_BTN_STATE_NUM]; /*Store images to each state*/ -#else - const void * img_src_left[_LV_BTN_STATE_NUM]; /*Store left side images to each state*/ - const void * img_src_mid[_LV_BTN_STATE_NUM]; /*Store center images to each state*/ - const void * img_src_right[_LV_BTN_STATE_NUM]; /*Store right side images to each state*/ -#endif - lv_img_cf_t act_cf; /*Color format of the currently active image*/ -} lv_imgbtn_ext_t; - -/*Styles*/ -enum { - LV_IMGBTN_STYLE_REL, /**< Same meaning as ordinary button styles. */ - LV_IMGBTN_STYLE_PR, - LV_IMGBTN_STYLE_TGL_REL, - LV_IMGBTN_STYLE_TGL_PR, - LV_IMGBTN_STYLE_INA, -}; -typedef uint8_t lv_imgbtn_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a image button objects - * @param par pointer to an object, it will be the parent of the new image button - * @param copy pointer to a image button object, if not NULL then the new object will be copied from - * it - * @return pointer to the created image button - */ -lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy); - -/*====================== - * Add/remove functions - *=====================*/ - -/*===================== - * Setter functions - *====================*/ - -#if LV_IMGBTN_TILED == 0 -/** - * Set images for a state of the image button - * @param imgbtn pointer to an image button object - * @param state for which state set the new image (from `lv_btn_state_t`) ` - * @param src pointer to an image source (a C array or path to a file) - */ -void lv_imgbtn_set_src(lv_obj_t * imgbtn, lv_btn_state_t state, const void * src); -#else -/** - * Set images for a state of the image button - * @param imgbtn pointer to an image button object - * @param state for which state set the new image (from `lv_btn_state_t`) ` - * @param src_left pointer to an image source for the left side of the button (a C array or path to - * a file) - * @param src_mid pointer to an image source for the middle of the button (ideally 1px wide) (a C - * array or path to a file) - * @param src_right pointer to an image source for the right side of the button (a C array or path - * to a file) - */ -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); - -#endif - -/** - * Enable the toggled states. On release the button will change from/to toggled state. - * @param imgbtn pointer to an image button object - * @param tgl true: enable toggled states, false: disable - */ -static inline void lv_imgbtn_set_toggle(lv_obj_t * imgbtn, bool tgl) -{ - lv_btn_set_toggle(imgbtn, tgl); -} - -/** - * Set the state of the image button - * @param imgbtn pointer to an image button object - * @param state the new state of the button (from lv_btn_state_t enum) - */ -static inline void lv_imgbtn_set_state(lv_obj_t * imgbtn, lv_btn_state_t state) -{ - lv_btn_set_state(imgbtn, state); -} - -/** - * Toggle the state of the image button (ON->OFF, OFF->ON) - * @param imgbtn pointer to a image button object - */ -static inline void lv_imgbtn_toggle(lv_obj_t * imgbtn) -{ - lv_btn_toggle(imgbtn); -} - -/** - * Set a style of a image button. - * @param imgbtn pointer to image button object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_imgbtn_set_style(lv_obj_t * imgbtn, lv_imgbtn_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -#if LV_IMGBTN_TILED == 0 -/** - * Get the images in a given state - * @param imgbtn pointer to an image button object - * @param state the state where to get the image (from `lv_btn_state_t`) ` - * @return pointer to an image source (a C array or path to a file) - */ -const void * lv_imgbtn_get_src(lv_obj_t * imgbtn, lv_btn_state_t state); - -#else - -/** - * Get the left image in a given state - * @param imgbtn pointer to an image button object - * @param state the state where to get the image (from `lv_btn_state_t`) ` - * @return pointer to the left image source (a C array or path to a file) - */ -const void * lv_imgbtn_get_src_left(lv_obj_t * imgbtn, lv_btn_state_t state); - -/** - * Get the middle image in a given state - * @param imgbtn pointer to an image button object - * @param state the state where to get the image (from `lv_btn_state_t`) ` - * @return pointer to the middle image source (a C array or path to a file) - */ -const void * lv_imgbtn_get_src_middle(lv_obj_t * imgbtn, lv_btn_state_t state); - -/** - * Get the right image in a given state - * @param imgbtn pointer to an image button object - * @param state the state where to get the image (from `lv_btn_state_t`) ` - * @return pointer to the left image source (a C array or path to a file) - */ -const void * lv_imgbtn_get_src_right(lv_obj_t * imgbtn, lv_btn_state_t state); - -#endif -/** - * Get the current state of the image button - * @param imgbtn pointer to a image button object - * @return the state of the button (from lv_btn_state_t enum) - */ -static inline lv_btn_state_t lv_imgbtn_get_state(const lv_obj_t * imgbtn) -{ - return lv_btn_get_state(imgbtn); -} - -/** - * Get the toggle enable attribute of the image button - * @param imgbtn pointer to a image button object - * @return ture: toggle enabled, false: disabled - */ -static inline bool lv_imgbtn_get_toggle(const lv_obj_t * imgbtn) -{ - return lv_btn_get_toggle(imgbtn); -} - -/** - * Get style of a image button. - * @param imgbtn pointer to image button object - * @param type which style should be get - * @return style pointer to the style - */ -const lv_style_t * lv_imgbtn_get_style(const lv_obj_t * imgbtn, lv_imgbtn_style_t type); - -/*===================== - * Other functions - *====================*/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_IMGBTN*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_IMGBTN_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_kb.c b/src/libs/lvgl/src/lv_objx/lv_kb.c deleted file mode 100644 index 1913316a..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_kb.c +++ /dev/null @@ -1,471 +0,0 @@ - -/** - * @file lv_kb.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_kb.h" -#if LV_USE_KB != 0 - -#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) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_res_t lv_kb_signal(lv_obj_t * kb, lv_signal_t sign, void * param); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -/* clang-format off */ -static const char * 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, ""}; - -static const lv_btnm_ctrl_t kb_ctrl_lc_map[] = { - LV_KB_CTRL_BTN_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, - LV_KB_CTRL_BTN_FLAGS | 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, - 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 * 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, ""}; - -static const lv_btnm_ctrl_t kb_ctrl_uc_map[] = { - LV_KB_CTRL_BTN_FLAGS | 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, - LV_KB_CTRL_BTN_FLAGS | 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, - 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 * kb_map_spec[] = {"0", "1", "2", "3", "4" ,"5", "6", "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n", - "abc", "+", "-", "/", "*", "=", "%", "!", "?", "#", "<", ">", "\n", - "\\", "@", "$", "(", ")", "{", "}", "[", "]", ";", "\"", "'", "\n", - LV_SYMBOL_CLOSE, LV_SYMBOL_LEFT, " ", LV_SYMBOL_RIGHT, LV_SYMBOL_OK, ""}; - -static const lv_btnm_ctrl_t kb_ctrl_spec_map[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, - LV_KB_CTRL_BTN_FLAGS | 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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 * kb_map_num[] = {"1", "2", "3", LV_SYMBOL_CLOSE, "\n", - "4", "5", "6", LV_SYMBOL_OK, "\n", - "7", "8", "9", LV_SYMBOL_BACKSPACE, "\n", - "+/-", "0", ".", LV_SYMBOL_LEFT, LV_SYMBOL_RIGHT, ""}; - -static const lv_btnm_ctrl_t kb_ctrl_num_map[] = { - 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, - 1, 1, 1, LV_KB_CTRL_BTN_FLAGS | 2, - 1, 1, 1, 2, - 1, 1, 1, 1, 1}; -/* clang-format on */ - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a keyboard objects - * @param par pointer to an object, it will be the parent of the new keyboard - * @param copy pointer to a keyboard object, if not NULL then the new object will be copied from it - * @return pointer to the created keyboard - */ -lv_obj_t * lv_kb_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("keyboard create started"); - - /*Create the ancestor of keyboard*/ - lv_obj_t * new_kb = lv_btnm_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - /*Initialize the allocated 'ext' */ - - ext->ta = NULL; - ext->mode = LV_KB_MODE_TEXT; - ext->cursor_mng = 0; - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_kb, lv_kb_signal); - - /*Init the new keyboard keyboard*/ - if(copy == NULL) { - /* Set a size which fits into the parent. - * Don't use `par` directly because if the window is created on a page it is moved to the - * scrollable so the parent has changed */ - lv_obj_set_size(new_kb, lv_obj_get_width_fit(lv_obj_get_parent(new_kb)), - 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_lc); - lv_btnm_set_ctrl_map(new_kb, kb_ctrl_lc_map); - lv_obj_set_base_dir(new_kb, LV_BIDI_DIR_LTR); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_kb_set_style(new_kb, LV_KB_STYLE_BG, th->style.kb.bg); - lv_kb_set_style(new_kb, LV_KB_STYLE_BTN_REL, th->style.kb.btn.rel); - lv_kb_set_style(new_kb, LV_KB_STYLE_BTN_PR, th->style.kb.btn.pr); - lv_kb_set_style(new_kb, LV_KB_STYLE_BTN_TGL_REL, th->style.kb.btn.tgl_rel); - lv_kb_set_style(new_kb, LV_KB_STYLE_BTN_TGL_PR, th->style.kb.btn.tgl_pr); - lv_kb_set_style(new_kb, LV_KB_STYLE_BTN_INA, th->style.kb.btn.ina); - } else { - /*Let the button matrix's styles*/ - } - } - /*Copy an existing keyboard*/ - else { - lv_kb_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->ta = NULL; - ext->ta = copy_ext->ta; - ext->mode = copy_ext->mode; - ext->cursor_mng = copy_ext->cursor_mng; - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_kb); - } - - LV_LOG_INFO("keyboard created"); - - return new_kb; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Assign a Text Area to the Keyboard. The pressed characters will be put there. - * @param kb pointer to a Keyboard object - * @param ta pointer to a Text Area object to write there - */ -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; - - /*Hide the cursor of the old Text area if cursor management is enabled*/ - if(ext->ta && ext->cursor_mng) { - cur_type = lv_ta_get_cursor_type(ext->ta); - lv_ta_set_cursor_type(ext->ta, cur_type | LV_CURSOR_HIDDEN); - } - - ext->ta = ta; - - /*Show the cursor of the new Text area if cursor management is enabled*/ - if(ext->ta && ext->cursor_mng) { - cur_type = lv_ta_get_cursor_type(ext->ta); - lv_ta_set_cursor_type(ext->ta, cur_type & (~LV_CURSOR_HIDDEN)); - } -} - -/** - * Set a new a mode (text or number map) - * @param kb pointer to a Keyboard object - * @param mode the mode from 'lv_kb_mode_t' - */ -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; - - ext->mode = mode; - if(mode == LV_KB_MODE_TEXT) { - lv_btnm_set_map(kb, kb_map_lc); - lv_btnm_set_ctrl_map(kb, kb_ctrl_lc_map); - } else if(mode == LV_KB_MODE_NUM) { - lv_btnm_set_map(kb, kb_map_num); - lv_btnm_set_ctrl_map(kb, kb_ctrl_num_map); - } else if(mode == LV_KB_MODE_TEXT_UPPER) { - lv_btnm_set_map(kb, kb_map_uc); - lv_btnm_set_ctrl_map(kb, kb_ctrl_uc_map); - } -} - -/** - * Automatically hide or show the cursor of Text Area - * @param kb pointer to a Keyboard object - * @param en true: show cursor on the current text area, false: hide cursor - */ -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; - - ext->cursor_mng = en == false ? 0 : 1; - - if(ext->ta) { - lv_cursor_type_t cur_type; - cur_type = lv_ta_get_cursor_type(ext->ta); - - if(ext->cursor_mng) { - lv_ta_set_cursor_type(ext->ta, cur_type & (~LV_CURSOR_HIDDEN)); - } else { - lv_ta_set_cursor_type(ext->ta, cur_type | LV_CURSOR_HIDDEN); - } - } -} - -/** - * Set a style of a keyboard - * @param kb pointer to a keyboard object - * @param type which style should be set - * @param style pointer to a style - */ -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; - case LV_KB_STYLE_BTN_PR: lv_btnm_set_style(kb, LV_BTNM_STYLE_BTN_PR, style); break; - case LV_KB_STYLE_BTN_TGL_REL: lv_btnm_set_style(kb, LV_BTNM_STYLE_BTN_TGL_REL, style); break; - case LV_KB_STYLE_BTN_TGL_PR: lv_btnm_set_style(kb, LV_BTNM_STYLE_BTN_TGL_PR, style); break; - case LV_KB_STYLE_BTN_INA: lv_btnm_set_style(kb, LV_BTNM_STYLE_BTN_INA, style); break; - } -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Assign a Text Area to the Keyboard. The pressed characters will be put there. - * @param kb pointer to a Keyboard object - * @return pointer to the assigned Text Area object - */ -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; -} - -/** - * Set a new a mode (text or number map) - * @param kb pointer to a Keyboard object - * @return the current mode from 'lv_kb_mode_t' - */ -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; -} - -/** - * Get the current cursor manage mode. - * @param kb pointer to a Keyboard object - * @return true: show cursor on the current text area, false: hide cursor - */ -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; -} - -/** - * Get a style of a keyboard - * @param kb pointer to a keyboard object - * @param type which style should be get - * @return style pointer to a style - */ -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) { - case LV_KB_STYLE_BG: style = lv_btnm_get_style(kb, LV_BTNM_STYLE_BG); break; - case LV_KB_STYLE_BTN_REL: style = lv_btnm_get_style(kb, LV_BTNM_STYLE_BTN_REL); break; - case LV_KB_STYLE_BTN_PR: style = lv_btnm_get_style(kb, LV_BTNM_STYLE_BTN_PR); break; - case LV_KB_STYLE_BTN_TGL_REL: style = lv_btnm_get_style(kb, LV_BTNM_STYLE_BTN_TGL_REL); break; - case LV_KB_STYLE_BTN_TGL_PR: style = lv_btnm_get_style(kb, LV_BTNM_STYLE_BTN_TGL_PR); break; - case LV_KB_STYLE_BTN_INA: style = lv_btnm_get_style(kb, LV_BTNM_STYLE_BTN_INA); break; - default: style = NULL; break; - } - - return style; -} - -/*===================== - * Other functions - *====================*/ - -/** - * Default keyboard event to add characters to the Text area and change the map. - * If a custom `event_cb` is added to the keyboard this function be called from it to handle the - * button clicks - * @param kb pointer to a keyboard - * @param event the triggering event - */ -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); - uint16_t btn_id = lv_btnm_get_active_btn(kb); - if(btn_id == LV_BTNM_BTN_NONE) return; - if(lv_btnm_get_btn_ctrl(kb, btn_id, LV_BTNM_CTRL_HIDDEN | LV_BTNM_CTRL_INACTIVE)) return; - if(lv_btnm_get_btn_ctrl(kb, btn_id, LV_BTNM_CTRL_NO_REPEAT) && event == LV_EVENT_LONG_PRESSED_REPEAT) return; - - const char * txt = lv_btnm_get_active_btn_text(kb); - if(txt == NULL) return; - - /*Do the corresponding action according to the text of the button*/ - if(strcmp(txt, "abc") == 0) { - lv_btnm_set_map(kb, kb_map_lc); - lv_btnm_set_ctrl_map(kb, kb_ctrl_lc_map); - return; - } else if(strcmp(txt, "ABC") == 0) { - lv_btnm_set_map(kb, kb_map_uc); - lv_btnm_set_ctrl_map(kb, kb_ctrl_uc_map); - return; - } else if(strcmp(txt, "1#") == 0) { - lv_btnm_set_map(kb, kb_map_spec); - lv_btnm_set_ctrl_map(kb, kb_ctrl_spec_map); - return; - } else if(strcmp(txt, LV_SYMBOL_CLOSE) == 0) { - if(kb->event_cb != lv_kb_def_event_cb) { - lv_res_t res = lv_event_send(kb, LV_EVENT_CANCEL, NULL); - if(res != LV_RES_OK) return; - } else { - lv_kb_set_ta(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ - lv_obj_del(kb); - return; - } - return; - } else if(strcmp(txt, LV_SYMBOL_OK) == 0) { - if(kb->event_cb != lv_kb_def_event_cb) { - lv_res_t res = lv_event_send(kb, LV_EVENT_APPLY, NULL); - if(res != LV_RES_OK) return; - } else { - lv_kb_set_ta(kb, NULL); /*De-assign the text area to hide it cursor if needed*/ - } - return; - } - - /*Add the characters to the text area if set*/ - if(ext->ta == NULL) return; - - 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, 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); - const char * ta_txt = lv_ta_get_text(ext->ta); - if(ta_txt[0] == '-') { - lv_ta_set_cursor_pos(ext->ta, 1); - lv_ta_del_char(ext->ta); - lv_ta_add_char(ext->ta, '+'); - lv_ta_set_cursor_pos(ext->ta, cur); - } else if(ta_txt[0] == '+') { - lv_ta_set_cursor_pos(ext->ta, 1); - lv_ta_del_char(ext->ta); - lv_ta_add_char(ext->ta, '-'); - lv_ta_set_cursor_pos(ext->ta, cur); - } else { - lv_ta_set_cursor_pos(ext->ta, 0); - lv_ta_add_char(ext->ta, '-'); - lv_ta_set_cursor_pos(ext->ta, cur + 1); - } - } else { - lv_ta_add_text(ext->ta, txt); - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Signal function of the keyboard - * @param kb pointer to a keyboard 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_kb_signal(lv_obj_t * kb, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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')*/ - } else if(sign == LV_SIGNAL_FOCUS) { - lv_kb_ext_t * ext = lv_obj_get_ext_attr(kb); - /*Show the cursor of the new Text area if cursor management is enabled*/ - if(ext->ta && ext->cursor_mng) { - 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_DEFOCUS) { - lv_kb_ext_t * ext = lv_obj_get_ext_attr(kb); - /*Show the cursor of the new Text area if cursor management is enabled*/ - if(ext->ta && ext->cursor_mng) { - 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); - } - } - - return res; -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_kb.h b/src/libs/lvgl/src/lv_objx/lv_kb.h deleted file mode 100644 index 74d9c1f0..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_kb.h +++ /dev/null @@ -1,207 +0,0 @@ -/** - * @file lv_kb.h - * - */ - -#ifndef LV_KB_H -#define LV_KB_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_KB != 0 - -/*Testing of dependencies*/ -#if LV_USE_BTNM == 0 -#error "lv_kb: lv_btnm is required. Enable it in lv_conf.h (LV_USE_BTNM 1) " -#endif - -#if LV_USE_TA == 0 -#error "lv_kb: lv_ta is required. Enable it in lv_conf.h (LV_USE_TA 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "lv_btnm.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Current keyboard mode. */ -enum { - LV_KB_MODE_TEXT, - LV_KB_MODE_NUM, - LV_KB_MODE_TEXT_UPPER, -}; -typedef uint8_t lv_kb_mode_t; - -/*Data of keyboard*/ -typedef struct -{ - lv_btnm_ext_t btnm; /*Ext. of ancestor*/ - /*New data for this type */ - lv_obj_t * ta; /*Pointer to the assigned text area*/ - lv_kb_mode_t mode; /*Key map type*/ - uint8_t cursor_mng : 1; /*1: automatically show/hide cursor when a text area is assigned or left*/ -} lv_kb_ext_t; - -enum { - LV_KB_STYLE_BG, - LV_KB_STYLE_BTN_REL, - LV_KB_STYLE_BTN_PR, - LV_KB_STYLE_BTN_TGL_REL, - LV_KB_STYLE_BTN_TGL_PR, - LV_KB_STYLE_BTN_INA, -}; -typedef uint8_t lv_kb_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a keyboard objects - * @param par pointer to an object, it will be the parent of the new keyboard - * @param copy pointer to a keyboard object, if not NULL then the new object will be copied from it - * @return pointer to the created keyboard - */ -lv_obj_t * lv_kb_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Assign a Text Area to the Keyboard. The pressed characters will be put there. - * @param kb pointer to a Keyboard object - * @param ta pointer to a Text Area object to write there - */ -void lv_kb_set_ta(lv_obj_t * kb, lv_obj_t * ta); - -/** - * Set a new a mode (text or number map) - * @param kb pointer to a Keyboard object - * @param mode the mode from 'lv_kb_mode_t' - */ -void lv_kb_set_mode(lv_obj_t * kb, lv_kb_mode_t mode); - -/** - * Automatically hide or show the cursor of the current Text Area - * @param kb pointer to a Keyboard object - * @param en true: show cursor on the current text area, false: hide cursor - */ -void lv_kb_set_cursor_manage(lv_obj_t * kb, bool en); - -/** - * Set a new map for the keyboard - * @param kb pointer to a Keyboard object - * @param map pointer to a string array to describe the map. - * See 'lv_btnm_set_map()' for more info. - */ -static inline void lv_kb_set_map(lv_obj_t * kb, const char * map[]) -{ - lv_btnm_set_map(kb, map); -} - -/** - * Set the button control map (hidden, disabled etc.) for the keyboard. The - * control map array will be copied and so may be deallocated after this - * function returns. - * @param kb pointer to a keyboard object - * @param ctrl_map pointer to an array of `lv_btn_ctrl_t` control bytes. - * See: `lv_btnm_set_ctrl_map` for more details. - */ -static inline void lv_kb_set_ctrl_map(lv_obj_t * kb, const lv_btnm_ctrl_t ctrl_map[]) -{ - lv_btnm_set_ctrl_map(kb, ctrl_map); -} - -/** - * Set a style of a keyboard - * @param kb pointer to a keyboard object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_kb_set_style(lv_obj_t * kb, lv_kb_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Assign a Text Area to the Keyboard. The pressed characters will be put there. - * @param kb pointer to a Keyboard object - * @return pointer to the assigned Text Area object - */ -lv_obj_t * lv_kb_get_ta(const lv_obj_t * kb); - -/** - * Set a new a mode (text or number map) - * @param kb pointer to a Keyboard object - * @return the current mode from 'lv_kb_mode_t' - */ -lv_kb_mode_t lv_kb_get_mode(const lv_obj_t * kb); - -/** - * Get the current cursor manage mode. - * @param kb pointer to a Keyboard object - * @return true: show cursor on the current text area, false: hide cursor - */ -bool lv_kb_get_cursor_manage(const lv_obj_t * kb); - -/** - * Get the current map of a keyboard - * @param kb pointer to a keyboard object - * @return the current map - */ -static inline const char ** lv_kb_get_map_array(const lv_obj_t * kb) -{ - return lv_btnm_get_map_array(kb); -} - -/** - * Get a style of a keyboard - * @param kb pointer to a keyboard object - * @param type which style should be get - * @return style pointer to a style - */ -const lv_style_t * lv_kb_get_style(const lv_obj_t * kb, lv_kb_style_t type); - -/*===================== - * Other functions - *====================*/ - -/** - * Default keyboard event to add characters to the Text area and change the map. - * If a custom `event_cb` is added to the keyboard this function be called from it to handle the - * button clicks - * @param kb pointer to a keyboard - * @param event the triggering event - */ -void lv_kb_def_event_cb(lv_obj_t * kb, lv_event_t event); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_KB*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_KB_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_label.c b/src/libs/lvgl/src/lv_objx/lv_label.c deleted file mode 100644 index 5c870d05..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_label.c +++ /dev/null @@ -1,1441 +0,0 @@ -/** - * @file lv_rect.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_label.h" -#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_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) -#endif - -#define LV_LABEL_DOT_END_INV 0xFFFF -#define LV_LABEL_HINT_HEIGHT_LIMIT \ - 1024 /*Enable "hint" to buffer info about labels larger than this. (Speed up their drawing)*/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * 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 void lv_label_refr_text(lv_obj_t * label); -static void lv_label_revert_dots(lv_obj_t * label); - -#if LV_USE_ANIMATION -static void lv_label_set_offset_x(lv_obj_t * label, lv_coord_t x); -static void lv_label_set_offset_y(lv_obj_t * label, lv_coord_t y); -#endif - -static bool lv_label_set_dot_tmp(lv_obj_t * label, char * data, uint16_t len); -static char * lv_label_get_dot_tmp(lv_obj_t * label); -static void lv_label_dot_tmp_free(lv_obj_t * label); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a label objects - * @param par pointer to an object, it will be the parent of the new label - * @param copy pointer to a button object, if not NULL then the new object will be copied from it - * @return pointer to the created button - */ -lv_obj_t * lv_label_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("label create started"); - - /*Create a basic object*/ - lv_obj_t * new_label = lv_obj_create(par, copy); - LV_ASSERT_MEM(new_label); - if(new_label == NULL) return NULL; - - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_label); - - /*Extend the basic object to a label object*/ - 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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - ext->text = NULL; - ext->static_txt = 0; - ext->recolor = 0; - ext->body_draw = 0; - 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 - ext->anim_speed = LV_LABEL_DEF_SCROLL_SPEED; -#endif - ext->offset.x = 0; - ext->offset.y = 0; - -#if LV_LABEL_LONG_TXT_HINT - ext->hint.line_start = -1; - ext->hint.coord_y = 0; - ext->hint.y = 0; -#endif - -#if LV_LABEL_TEXT_SEL - 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; - - lv_obj_set_design_cb(new_label, lv_label_design); - lv_obj_set_signal_cb(new_label, lv_label_signal); - - /*Init the new label*/ - if(copy == NULL) { - lv_obj_set_click(new_label, false); - lv_label_set_long_mode(new_label, LV_LABEL_LONG_EXPAND); - lv_label_set_text(new_label, "Text"); - lv_label_set_style(new_label, LV_LABEL_STYLE_MAIN, NULL); /*Inherit parent's style*/ - } - /*Copy 'copy' if not NULL*/ - else { - lv_label_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - lv_label_set_long_mode(new_label, lv_label_get_long_mode(copy)); - lv_label_set_recolor(new_label, lv_label_get_recolor(copy)); - lv_label_set_body_draw(new_label, lv_label_get_body_draw(copy)); - lv_label_set_align(new_label, lv_label_get_align(copy)); - if(copy_ext->static_txt == 0) - lv_label_set_text(new_label, lv_label_get_text(copy)); - else - lv_label_set_static_text(new_label, lv_label_get_text(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_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) { - 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)); - } - ext->dot_tmp_alloc = copy_ext->dot_tmp_alloc; - ext->dot_end = copy_ext->dot_end; - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_label); - } - - LV_LOG_INFO("label created"); - - return new_label; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new text for a label. Memory will be allocated to store the text by the label. - * @param label pointer to a label object - * @param text '\0' terminated character string. NULL to refresh with the current text. - */ -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); - - /*If text is NULL then refresh */ - if(text == NULL) { - lv_label_refr_text(label); - 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_ASSERT_MEM(ext->text); - if(ext->text == NULL) return; - } else { - /*Allocate space for the new text*/ - 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_ASSERT_MEM(ext->text); - if(ext->text == NULL) return; - - strcpy(ext->text, text); - - /*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. - * @param label pointer to a label object - * @param array array of characters or NULL to refresh the label - * @param size the size of 'array' in bytes - */ -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); - - /*If trying to set its own text or the array is NULL then refresh */ - if(array == ext->text || array == NULL) { - lv_label_refr_text(label); - return; - } - - /*Allocate space for the new text*/ - if(ext->text != NULL && ext->static_txt == 0) { - lv_mem_free(ext->text); - ext->text = NULL; - } - ext->text = lv_mem_alloc(size + 1); - LV_ASSERT_MEM(ext->text); - if(ext->text == NULL) return; - - memcpy(ext->text, array, size); - ext->text[size] = '\0'; - ext->static_txt = 0; /*Now the text is dynamically allocated*/ - - lv_label_refr_text(label); -} - -/** - * Set a static text. It will not be saved by the label so the 'text' variable - * has to be 'alive' while the label exist. - * @param label pointer to a label object - * @param text pointer to a text. NULL to refresh with the current text. - */ -void lv_label_set_static_text(lv_obj_t * label, const char * text) -{ - LV_ASSERT_OBJ(label, LV_OBJX_NAME); - - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - if(ext->static_txt == 0 && ext->text != NULL) { - lv_mem_free(ext->text); - ext->text = NULL; - } - - if(text != NULL) { - ext->static_txt = 1; - ext->text = (char *)text; - } - - lv_label_refr_text(label); -} - -/** - * Set the behavior of the label with longer text then the object size - * @param label pointer to a label object - * @param long_mode the new mode from 'lv_label_long_mode' enum. - * In LV_LONG_BREAK/LONG/ROLL the size of the label should be set AFTER this - * function - */ -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 - /*Delete the old animation (if exists)*/ - lv_anim_del(label, (lv_anim_exec_xcb_t)lv_obj_set_x); - lv_anim_del(label, (lv_anim_exec_xcb_t)lv_obj_set_y); - lv_anim_del(label, (lv_anim_exec_xcb_t)lv_label_set_offset_x); - lv_anim_del(label, (lv_anim_exec_xcb_t)lv_label_set_offset_y); -#endif - ext->offset.x = 0; - ext->offset.y = 0; - - if(long_mode == LV_LABEL_LONG_SROLL || long_mode == LV_LABEL_LONG_SROLL_CIRC || long_mode == LV_LABEL_LONG_CROP) - ext->expand = 1; - else - ext->expand = 0; - - /*Restore the character under the dots*/ - if(ext->long_mode == LV_LABEL_LONG_DOT && ext->dot_end != LV_LABEL_DOT_END_INV) { - lv_label_revert_dots(label); - } - - ext->long_mode = long_mode; - lv_label_refr_text(label); -} - -/** - * Set the align of the label (left or center) - * @param label pointer to a label object - * @param align 'LV_LABEL_ALIGN_LEFT' or 'LV_LABEL_ALIGN_LEFT' - */ -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; - - ext->align = align; - - lv_obj_invalidate(label); /*Enough to invalidate because alignment is only drawing related - (lv_refr_label_text() not required)*/ -} - -/** - * Enable the recoloring by in-line commands - * @param label pointer to a label object - * @param en true: enable recoloring, false: disable - */ -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; - - ext->recolor = en == false ? 0 : 1; - - lv_label_refr_text(label); /*Refresh the text because the potential colo codes in text needs to - be hided or revealed*/ -} - -/** - * Set the label to draw (or not draw) background specified in its style's body - * @param label pointer to a label object - * @param en true: draw body; false: don't draw body - */ -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; - - ext->body_draw = en == false ? 0 : 1; - - lv_obj_refresh_ext_draw_pad(label); - - lv_obj_invalidate(label); -} - -/** - * Set the label's animation speed in LV_LABEL_LONG_SROLL/SCROLL_CIRC modes - * @param label pointer to a label object - * @param anim_speed speed of animation in px/sec unit - */ -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; - - ext->anim_speed = anim_speed; - - if(ext->long_mode == LV_LABEL_LONG_SROLL || ext->long_mode == LV_LABEL_LONG_SROLL_CIRC) { - lv_label_refr_text(label); - } -#else - (void)label; /*Unused*/ - (void)anim_speed; /*Unused*/ -#endif -} - -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; - lv_obj_invalidate(label); -#else - (void)label; /*Unused*/ - (void)index; /*Unused*/ -#endif -} - -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; - lv_obj_invalidate(label); -#else - (void)label; /*Unused*/ - (void)index; /*Unused*/ -#endif -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the text of a label - * @param label pointer to a label object - * @return the text of the label - */ -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; -} - -/** - * Get the long mode of a label - * @param label pointer to a label object - * @return the long mode - */ -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; -} - -/** - * Get the align attribute - * @param label pointer to a label object - * @return LV_LABEL_ALIGN_LEFT or LV_LABEL_ALIGN_CENTER - */ -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); - - 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; -} - -/** - * Get the recoloring attribute - * @param label pointer to a label object - * @return true: recoloring is enabled, false: disable - */ -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; -} - -/** - * Get the body draw attribute - * @param label pointer to a label object - * @return true: draw body; false: don't draw body - */ -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; -} - -/** - * Get the label's animation speed in LV_LABEL_LONG_ROLL and SCROLL modes - * @param label pointer to a label object - * @return speed of animation in px/sec unit - */ -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; -#else - (void)label; /*Unused*/ - return 0; -#endif -} - -/** - * Get the relative x and y coordinates of a letter - * @param label pointer to a label object - * @param index index of the letter [0 ... text length]. Expressed in character index, not byte - * 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 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; - uint32_t new_line_start = 0; - 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 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; - - 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; - } - - 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(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; - line_start = new_line_start; - } - - /*If the last character is line break then go to the next line*/ - 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 = byte_id; - } - } - - const char *bidi_txt; - uint16_t visual_byte_pos; -#if LV_USE_BIDI - /*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; - char *mutable_bidi_txt; - 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(bidi_txt, visual_byte_pos, font, style->text.letter_space, flag); - - if(char_id != line_start) x += style->text.letter_space; - - if(align == LV_LABEL_ALIGN_CENTER) { - 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) / 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; - } - pos->x = x; - pos->y = y; -} - -/** - * Get the index of letter on a relative point of a label - * @param label pointer to label object - * @param pos pointer to point with coordinates on a the label - * @return the index of the letter on the 'pos_p' point (E.g. on 0;0 is the 0. letter) - * Expressed in character index and not byte index (different in UTF-8) - */ -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; - uint32_t new_line_start = 0; - 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 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; - - 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) { - max_w = LV_COORD_MAX; - } - - /*Search the line of the index letter */; - 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) { - /*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_draw_get_buf(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(align == LV_LABEL_ALIGN_CENTER) { - 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) / 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 = 0; - uint32_t i_act = i; - uint32_t letter; - uint32_t letter_next; - - if(new_line_start > 0) { - while(i + line_start < new_line_start) { - /* Get the current letter.*/ - letter = lv_txt_encoded_next(bidi_txt, &i); - - /*Get the next letter too for kerning*/ - 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, bidi_txt[i]) != false) { - continue; /*Skip the letter is it is part of a command*/ - } - } - - 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 + line_start == new_line_start) { - i = i_act; - break; - } - x += style->text.letter_space; - i_act = i; - } - } - -#if LV_USE_BIDI - /*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); -} - -/** - * @brief Get the selection start index. - * @param label pointer to a label object. - * @return selection start index. `LV_LABEL_TXT_SEL_OFF` if nothing is selected. - */ -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; - -#else - (void)label; /*Unused*/ - return LV_LABEL_TEXT_SEL_OFF; -#endif -} - -/** - * @brief Get the selection end index. - * @param label pointer to a label object. - * @return selection end index. `LV_LABEL_TXT_SEL_OFF` if nothing is selected. - */ -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; -#else - (void)label; /*Unused*/ - return LV_LABEL_TEXT_SEL_OFF; -#endif -} - -/** - * Check if a character is drawn under a point. - * @param label Label object - * @param pos Point to check for characte under - * @return whether a character is drawn under the point - */ -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; - uint32_t new_line_start = 0; - 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 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(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) { - max_w = LV_COORD_MAX; - } - - /*Search the line of the index letter */; - 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')*/ - y += letter_height + style->text.line_space; - - line_start = new_line_start; - } - - /*Calculate the x coordinate*/ - lv_coord_t x = 0; - lv_coord_t last_x = 0; - 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; - - uint32_t i = line_start; - uint32_t i_current = i; - uint32_t letter = '\0'; - uint32_t letter_next = '\0'; - - if(new_line_start > 0) { - while(i <= new_line_start - 1) { - /* Get the current letter - * Be careful 'i' already points to the next character */ - letter = lv_txt_encoded_next(txt, &i); - - /*Get the next letter for kerning*/ - letter_next = lv_txt_encoded_next(&txt[i], NULL); - - /*Handle the recolor command*/ - if((flag & LV_TXT_FLAG_RECOLOR) != 0) { - if(lv_txt_is_cmd(&cmd_state, txt[i]) != false) { - continue; /*Skip the letter is it is part of a command*/ - } - } - last_x = x; - x += lv_font_get_glyph_width(font, letter, letter_next); - if(pos->x < x) { - i = i_current; - break; - } - x += style->text.letter_space; - i_current = i; - } - } - - int32_t max_diff = lv_font_get_glyph_width(font, letter, letter_next) + style->text.letter_space + 1; - return (pos->x >= (last_x - style->text.letter_space) && pos->x <= (last_x + max_diff)); -} - -/*===================== - * Other functions - *====================*/ - -/** - * Insert a text to the label. The label text can not be static. - * @param label pointer to a label object - * @param pos character index to insert. Expressed in character index and not byte index (Different - * in UTF-8) 0: before first char. LV_LABEL_POS_LAST: after last char. - * @param txt pointer to the text to insert - */ -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*/ - if(ext->static_txt != 0) return; - - lv_obj_invalidate(label); - - /*Allocate space for the new text*/ - 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_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); - lv_label_refr_text(label); -} - -/** - * Delete characters from a label. The label text can not be static. - * @param label pointer to a label object - * @param pos character index to insert. Expressed in character index and not byte index (Different - * in UTF-8) 0: before first char. - * @param cnt number of characters to cut - */ -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*/ - if(ext->static_txt != 0) return; - - lv_obj_invalidate(label); - - char * label_txt = lv_label_get_text(label); - /*Delete the characters*/ - lv_txt_cut(label_txt, pos, cnt); - - /*Refresh the label*/ - lv_label_refr_text(label); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_label_design(lv_obj_t * label, const lv_area_t * mask, lv_design_mode_t mode) -{ - /* A label never covers an area */ - if(mode == LV_DESIGN_COVER_CHK) - return false; - else if(mode == LV_DESIGN_DRAW_MAIN) { - lv_area_t coords; - const lv_style_t * style = lv_obj_get_style(label); - lv_opa_t opa_scale = lv_obj_get_opa_scale(label); - lv_obj_get_coords(label, &coords); - -#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); - } -#endif - - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - - if(ext->body_draw) { - lv_area_t bg; - lv_obj_get_coords(label, &bg); - bg.x1 -= style->body.padding.left; - bg.x2 += style->body.padding.right; - 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_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(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)*/ - if((ext->long_mode == LV_LABEL_LONG_SROLL || ext->long_mode == LV_LABEL_LONG_SROLL_CIRC) && - (ext->align == LV_LABEL_ALIGN_CENTER || ext->align == LV_LABEL_ALIGN_RIGHT)) { - lv_point_t size; - lv_txt_get_size(&size, ext->text, style->text.font, style->text.letter_space, style->text.line_space, - LV_COORD_MAX, flag); - if(size.x > lv_obj_get_width(label)) { - flag &= ~LV_TXT_FLAG_RIGHT; - flag &= ~LV_TXT_FLAG_CENTER; - } - } -#if LV_LABEL_LONG_TXT_HINT - lv_draw_label_hint_t * hint = &ext->hint; - if(ext->long_mode == LV_LABEL_LONG_SROLL_CIRC || lv_obj_get_height(label) < LV_LABEL_HINT_HEIGHT_LIMIT) - hint = NULL; - -#else - /*Just for compatibility*/ - lv_draw_label_hint_t * hint = NULL; -#endif - 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, mask, 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; - lv_txt_get_size(&size, ext->text, style->text.font, style->text.letter_space, style->text.line_space, - LV_COORD_MAX, flag); - - lv_point_t ofs; - - /*Draw the text again next to the original to make an circular effect */ - if(size.x > lv_obj_get_width(label)) { - ofs.x = ext->offset.x + size.x + - 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, &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, &sel, NULL, lv_obj_get_base_dir(label)); - } - } - } - return true; -} - -/** - * Signal function of the label - * @param label pointer to a label 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_label_signal(lv_obj_t * label, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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) { - if(ext->static_txt == 0) { - lv_mem_free(ext->text); - ext->text = NULL; - } - lv_label_dot_tmp_free(label); - } else if(sign == LV_SIGNAL_STYLE_CHG) { - /*Revert dots for proper refresh*/ - lv_label_revert_dots(label); - - lv_label_refr_text(label); - } else if(sign == LV_SIGNAL_CORD_CHG) { - if(lv_area_get_width(&label->coords) != lv_area_get_width(param) || - lv_area_get_height(&label->coords) != lv_area_get_height(param)) { - lv_label_revert_dots(label); - lv_label_refr_text(label); - } - } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { - if(ext->body_draw) { - const lv_style_t * style = lv_label_get_style(label, LV_LABEL_STYLE_MAIN); - - label->ext_draw_pad = LV_MATH_MAX(label->ext_draw_pad, style->body.padding.left); - label->ext_draw_pad = LV_MATH_MAX(label->ext_draw_pad, style->body.padding.right); - 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; - 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_label"; - } - - return res; -} - -/** - * Refresh the label with its text stored in its extended data - * @param label pointer to a label object - */ -static void lv_label_refr_text(lv_obj_t * label) -{ - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - - if(ext->text == NULL) return; -#if LV_LABEL_LONG_TXT_HINT - ext->hint.line_start = -1; /*The hint is invalid if the text changes*/ -#endif - - 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; - - /*If the width will be expanded set the max length to very big */ - if(ext->long_mode == LV_LABEL_LONG_EXPAND) { - max_w = LV_COORD_MAX; - } - - /*Calc. the height and longest line*/ - lv_point_t size; - 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; - lv_txt_get_size(&size, ext->text, font, style->text.letter_space, style->text.line_space, max_w, flag); - - /*Set the full size in expand mode*/ - if(ext->long_mode == LV_LABEL_LONG_EXPAND) { - lv_obj_set_size(label, size.x, size.y); - } - /*In roll mode keep the size but start offset animations*/ - else if(ext->long_mode == LV_LABEL_LONG_SROLL) { -#if LV_USE_ANIMATION - lv_anim_t anim; - anim.var = label; - anim.repeat = 1; - anim.playback = 1; - anim.start = 0; - anim.ready_cb = NULL; - anim.path_cb = lv_anim_path_linear; - anim.playback_pause = - (((lv_font_get_glyph_width(style->text.font, ' ', ' ') + style->text.letter_space) * 1000) / - ext->anim_speed) * - LV_LABEL_WAIT_CHAR_COUNT; - anim.repeat_pause = anim.playback_pause; - anim.act_time = -anim.playback_pause; - - bool hor_anim = false; - if(size.x > lv_obj_get_width(label)) { - anim.end = lv_obj_get_width(label) - size.x; - 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); - hor_anim = true; - } else { - /*Delete the offset animation if not required*/ - lv_anim_del(label, (lv_anim_exec_xcb_t)lv_label_set_offset_x); - ext->offset.x = 0; - } - - if(size.y > lv_obj_get_height(label) && hor_anim == false) { - anim.end = lv_obj_get_height(label) - 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); - } else { - /*Delete the offset animation if not required*/ - lv_anim_del(label, (lv_anim_exec_xcb_t)lv_label_set_offset_y); - ext->offset.y = 0; - } -#endif - } - /*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.act_time = -(((lv_font_get_glyph_width(style->text.font, ' ', ' ') + style->text.letter_space) * 1000) / - ext->anim_speed) * - LV_LABEL_WAIT_CHAR_COUNT; - anim.ready_cb = NULL; - anim.path_cb = lv_anim_path_linear; - anim.playback_pause = 0; - anim.repeat_pause = 0; - - bool hor_anim = false; - if(size.x > lv_obj_get_width(label)) { - 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); - hor_anim = true; - } else { - /*Delete the offset animation if not required*/ - lv_anim_del(label, (lv_anim_exec_xcb_t)lv_label_set_offset_x); - ext->offset.x = 0; - } - - if(size.y > lv_obj_get_height(label) && hor_anim == false) { - 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); - } else { - /*Delete the offset animation if not required*/ - lv_anim_del(label, (lv_anim_exec_xcb_t)lv_label_set_offset_y); - ext->offset.y = 0; - } -#endif - } else if(ext->long_mode == LV_LABEL_LONG_DOT) { - if(size.y <= lv_obj_get_height(label)) { /*No dots are required, the text is short enough*/ - ext->dot_end = LV_LABEL_DOT_END_INV; - } else if(lv_txt_get_encoded_length(ext->text) <= LV_LABEL_DOT_NUM) { /*Don't turn to dots all the characters*/ - ext->dot_end = LV_LABEL_DOT_END_INV; - } else { - lv_point_t p; - p.x = lv_obj_get_width(label) - - (lv_font_get_glyph_width(style->text.font, '.', '.') + style->text.letter_space) * - LV_LABEL_DOT_NUM; /*Shrink with dots*/ - p.y = lv_obj_get_height(label); - p.y -= p.y % - (lv_font_get_line_height(style->text.font) + style->text.line_space); /*Round down to the last line*/ - p.y -= style->text.line_space; /*Trim the last line space*/ - uint32_t letter_id = lv_label_get_letter_on(label, &p); - - - /*Be sure there is space for the dots*/ - size_t txt_len = strlen(ext->text); - uint32_t byte_id = lv_txt_encoded_get_byte_id(ext->text, letter_id); - while(byte_id + LV_LABEL_DOT_NUM > txt_len) { - byte_id -= lv_txt_encoded_size(&ext->text[byte_id]); - letter_id--; - } - - /*Save letters under the dots and replace them with dots*/ - uint32_t byte_id_ori = byte_id; - uint32_t i; - uint8_t len = 0; - for(i = 0; i <= LV_LABEL_DOT_NUM; i++) { - len += lv_txt_encoded_size(&ext->text[byte_id]); - lv_txt_encoded_next(ext->text, &byte_id); - } - - if(lv_label_set_dot_tmp(label, &ext->text[byte_id_ori], len)) { - for(i = 0; i < LV_LABEL_DOT_NUM; i++) { - ext->text[byte_id_ori + i] = '.'; - } - ext->text[byte_id_ori + LV_LABEL_DOT_NUM] = '\0'; - ext->dot_end = letter_id + LV_LABEL_DOT_NUM; - } - } - } - /*In break mode only the height can change*/ - else if(ext->long_mode == LV_LABEL_LONG_BREAK) { - lv_obj_set_height(label, size.y); - } - /*Do not set the size in Clip mode*/ - else if(ext->long_mode == LV_LABEL_LONG_CROP) { - /*Do nothing*/ - } - - lv_obj_invalidate(label); -} - -static void lv_label_revert_dots(lv_obj_t * label) -{ - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - if(ext->long_mode != LV_LABEL_LONG_DOT) return; - if(ext->dot_end == LV_LABEL_DOT_END_INV) return; - uint32_t letter_i = ext->dot_end - LV_LABEL_DOT_NUM; - uint32_t byte_i = lv_txt_encoded_get_byte_id(ext->text, letter_i); - - /*Restore the characters*/ - uint8_t i = 0; - char * dot_tmp = lv_label_get_dot_tmp(label); - while(ext->text[byte_i + i] != '\0') { - ext->text[byte_i + i] = dot_tmp[i]; - i++; - } - ext->text[byte_i + i] = dot_tmp[i]; - lv_label_dot_tmp_free(label); - - ext->dot_end = LV_LABEL_DOT_END_INV; -} - -#if LV_USE_ANIMATION -static void lv_label_set_offset_x(lv_obj_t * label, lv_coord_t x) -{ - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - ext->offset.x = x; - lv_obj_invalidate(label); -} - -static void lv_label_set_offset_y(lv_obj_t * label, lv_coord_t y) -{ - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - ext->offset.y = y; - lv_obj_invalidate(label); -} -#endif - -/** - * Store `len` characters from `data`. Allocates space if necessary. - * - * @param label pointer to label object - * @param len Number of characters to store. - * @return true on success. - */ -static bool lv_label_set_dot_tmp(lv_obj_t * label, char * data, uint16_t len) -{ - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - lv_label_dot_tmp_free(label); /* Deallocate any existing space */ - if(len > sizeof(char *)) { - /* Memory needs to be allocated. Allocates an additional byte - * for a NULL-terminator so it can be copied. */ - ext->dot.tmp_ptr = lv_mem_alloc(len + 1); - if(ext->dot.tmp_ptr == NULL) { - LV_LOG_ERROR("Failed to allocate memory for dot_tmp_ptr"); - return false; - } - memcpy(ext->dot.tmp_ptr, data, len); - ext->dot.tmp_ptr[len] = '\0'; - ext->dot_tmp_alloc = true; - } else { - /* Characters can be directly stored in object */ - ext->dot_tmp_alloc = false; - memcpy(ext->dot.tmp, data, len); - } - return true; -} - -/** - * Get the stored dot_tmp characters - * @param label pointer to label object - * @return char pointer to a stored characters. Is *not* necessarily NULL-terminated. - */ -static char * lv_label_get_dot_tmp(lv_obj_t * label) -{ - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - if(ext->dot_tmp_alloc) { - return ext->dot.tmp_ptr; - } else { - return ext->dot.tmp; - } -} - -/** - * Free the dot_tmp_ptr field if it was previously allocated. - * Always clears the field - * @param label pointer to label object. - */ -static void lv_label_dot_tmp_free(lv_obj_t * label) -{ - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - if(ext->dot_tmp_alloc && ext->dot.tmp_ptr) { - lv_mem_free(ext->dot.tmp_ptr); - } - ext->dot_tmp_alloc = false; - ext->dot.tmp_ptr = NULL; -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_label.h b/src/libs/lvgl/src/lv_objx/lv_label.h deleted file mode 100644 index faa21684..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_label.h +++ /dev/null @@ -1,351 +0,0 @@ -/** - * @file lv_rect.h - * - */ - -#ifndef LV_LABEL_H -#define LV_LABEL_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_LABEL != 0 - -#include <stdarg.h> -#include "../lv_core/lv_obj.h" -#include "../lv_font/lv_font.h" -#include "../lv_font/lv_symbol_def.h" -#include "../lv_misc/lv_txt.h" -#include "../lv_draw/lv_draw.h" - -/********************* - * DEFINES - *********************/ -#define LV_LABEL_DOT_NUM 3 -#define LV_LABEL_POS_LAST 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 - **********************/ - -/** Long mode behaviors. Used in 'lv_label_ext_t' */ -enum { - LV_LABEL_LONG_EXPAND, /**< Expand the object size to the text size*/ - LV_LABEL_LONG_BREAK, /**< Keep the object width, break the too long lines and expand the object - height*/ - LV_LABEL_LONG_DOT, /**< Keep the size and write dots at the end if the text is too long*/ - LV_LABEL_LONG_SROLL, /**< Keep the size and roll the text back and forth*/ - LV_LABEL_LONG_SROLL_CIRC, /**< Keep the size and roll the text circularly*/ - LV_LABEL_LONG_CROP, /**< Keep the size and crop the text out of it*/ -}; -typedef uint8_t lv_label_long_mode_t; - -/** Label align policy*/ -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; - -/** Data of label*/ -typedef struct -{ - /*Inherited from 'base_obj' so no inherited ext.*/ /*Ext. of ancestor*/ - /*New data for this type */ - 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[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 - -#if LV_LABEL_TEXT_SEL - uint16_t txt_sel_start; /*Left-most selection character*/ - uint16_t txt_sel_end; /*Right-most selection character*/ -#endif - - lv_label_long_mode_t long_mode : 3; /*Determinate what to do with the long texts*/ - uint8_t static_txt : 1; /*Flag to indicate the text is static*/ - uint8_t align : 2; /*Align type from 'lv_label_align_t'*/ - uint8_t recolor : 1; /*Enable in-line letter re-coloring*/ - uint8_t expand : 1; /*Ignore real width (used by the library with LV_LABEL_LONG_ROLL)*/ - uint8_t body_draw : 1; /*Draw background body*/ - uint8_t dot_tmp_alloc : 1; /*True if dot_tmp has been allocated. False if dot_tmp directly holds up to 4 bytes of - characters */ -} lv_label_ext_t; - -/** Label styles*/ -enum { - LV_LABEL_STYLE_MAIN, -}; -typedef uint8_t lv_label_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a label objects - * @param par pointer to an object, it will be the parent of the new label - * @param copy pointer to a button object, if not NULL then the new object will be copied from it - * @return pointer to the created button - */ -lv_obj_t * lv_label_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new text for a label. Memory will be allocated to store the text by the label. - * @param label pointer to a label object - * @param text '\0' terminated character string. NULL to refresh with the current text. - */ -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. - * @param label pointer to a label object - * @param array array of characters or NULL to refresh the label - * @param size the size of 'array' in bytes - */ -void lv_label_set_array_text(lv_obj_t * label, const char * array, uint16_t size); - -/** - * Set a static text. It will not be saved by the label so the 'text' variable - * has to be 'alive' while the label exist. - * @param label pointer to a label object - * @param text pointer to a text. NULL to refresh with the current text. - */ -void lv_label_set_static_text(lv_obj_t * label, const char * text); - -/** - * Set the behavior of the label with longer text then the object size - * @param label pointer to a label object - * @param long_mode the new mode from 'lv_label_long_mode' enum. - * In LV_LONG_BREAK/LONG/ROLL the size of the label should be set AFTER this - * function - */ -void lv_label_set_long_mode(lv_obj_t * label, lv_label_long_mode_t long_mode); - -/** - * Set the align of the label (left or center) - * @param label pointer to a label object - * @param align 'LV_LABEL_ALIGN_LEFT' or 'LV_LABEL_ALIGN_LEFT' - */ -void lv_label_set_align(lv_obj_t * label, lv_label_align_t align); - -/** - * Enable the recoloring by in-line commands - * @param label pointer to a label object - * @param en true: enable recoloring, false: disable - */ -void lv_label_set_recolor(lv_obj_t * label, bool en); - -/** - * Set the label to draw (or not draw) background specified in its style's body - * @param label pointer to a label object - * @param en true: draw body; false: don't draw body - */ -void lv_label_set_body_draw(lv_obj_t * label, bool en); - -/** - * Set the label's animation speed in LV_LABEL_LONG_SROLL/SCROLL_CIRC modes - * @param label pointer to a label object - * @param anim_speed speed of animation in px/sec unit - */ -void lv_label_set_anim_speed(lv_obj_t * label, uint16_t anim_speed); - -/** - * Set the style of an label - * @param label pointer to an label object - * @param type which style should be get (can be only `LV_LABEL_STYLE_MAIN`) - * @param style pointer to a style - */ -static inline void lv_label_set_style(lv_obj_t * label, lv_label_style_t type, const lv_style_t * style) -{ - (void)type; /*Unused*/ - lv_obj_set_style(label, style); -} - -/** - * @brief Set the selection start index. - * @param label pointer to a label object. - * @param index index to set. `LV_LABEL_TXT_SEL_OFF` to select nothing. - */ -void lv_label_set_text_sel_start(lv_obj_t * label, uint16_t index); - -/** - * @brief Set the selection end index. - * @param label pointer to a label object. - * @param index index to set. `LV_LABEL_TXT_SEL_OFF` to select nothing. - */ -void lv_label_set_text_sel_end(lv_obj_t * label, uint16_t index); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the text of a label - * @param label pointer to a label object - * @return the text of the label - */ -char * lv_label_get_text(const lv_obj_t * label); - -/** - * Get the long mode of a label - * @param label pointer to a label object - * @return the long mode - */ -lv_label_long_mode_t lv_label_get_long_mode(const lv_obj_t * label); - -/** - * Get the align attribute - * @param label pointer to a label object - * @return LV_LABEL_ALIGN_LEFT or LV_LABEL_ALIGN_CENTER - */ -lv_label_align_t lv_label_get_align(const lv_obj_t * label); - -/** - * Get the recoloring attribute - * @param label pointer to a label object - * @return true: recoloring is enabled, false: disable - */ -bool lv_label_get_recolor(const lv_obj_t * label); - -/** - * Get the body draw attribute - * @param label pointer to a label object - * @return true: draw body; false: don't draw body - */ -bool lv_label_get_body_draw(const lv_obj_t * label); - -/** - * Get the label's animation speed in LV_LABEL_LONG_ROLL and SCROLL modes - * @param label pointer to a label object - * @return speed of animation in px/sec unit - */ -uint16_t lv_label_get_anim_speed(const lv_obj_t * label); - -/** - * Get the relative x and y coordinates of a letter - * @param label pointer to a label object - * @param index index of the letter [0 ... text length]. Expressed in character index, not byte - * 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); - -/** - * Get the index of letter on a relative point of a label - * @param label pointer to label object - * @param pos pointer to point with coordinates on a the label - * @return the index of the letter on the 'pos_p' point (E.g. on 0;0 is the 0. letter) - * Expressed in character index and not byte index (different in UTF-8) - */ -uint16_t lv_label_get_letter_on(const lv_obj_t * label, lv_point_t * pos); - -/** - * Check if a character is drawn under a point. - * @param label Label object - * @param pos Point to check for characte under - * @return whether a character is drawn under the point - */ -bool lv_label_is_char_under_pos(const lv_obj_t * label, lv_point_t * pos); - -/** - * Get the style of an label object - * @param label pointer to an label object - * @param type which style should be get (can be only `LV_LABEL_STYLE_MAIN`) - * @return pointer to the label's style - */ -static inline const lv_style_t * lv_label_get_style(const lv_obj_t * label, lv_label_style_t type) -{ - (void)type; /*Unused*/ - return lv_obj_get_style(label); -} - -/** - * @brief Get the selection start index. - * @param label pointer to a label object. - * @return selection start index. `LV_LABEL_TXT_SEL_OFF` if nothing is selected. - */ -uint16_t lv_label_get_text_sel_start(const lv_obj_t * label); - -/** - * @brief Get the selection end index. - * @param label pointer to a label object. - * @return selection end index. `LV_LABEL_TXT_SEL_OFF` if nothing is selected. - */ -uint16_t lv_label_get_text_sel_end(const lv_obj_t * label); - -/*===================== - * Other functions - *====================*/ - -/** - * Insert a text to the label. The label text can not be static. - * @param label pointer to a label object - * @param pos character index to insert. Expressed in character index and not byte index (Different - * in UTF-8) 0: before first char. LV_LABEL_POS_LAST: after last char. - * @param txt pointer to the text to insert - */ -void lv_label_ins_text(lv_obj_t * label, uint32_t pos, const char * txt); - -/** - * Delete characters from a label. The label text can not be static. - * @param label pointer to a label object - * @param pos character index to insert. Expressed in character index and not byte index (Different - * in UTF-8) 0: before first char. - * @param cnt number of characters to cut - */ -void lv_label_cut_text(lv_obj_t * label, uint32_t pos, uint32_t cnt); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LABEL*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_LABEL_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_led.c b/src/libs/lvgl/src/lv_objx/lv_led.c deleted file mode 100644 index 133ccc8b..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_led.c +++ /dev/null @@ -1,258 +0,0 @@ -/** - * @file lv_led.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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 -#define LV_LED_BRIGHT_ON 255 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_led_design(lv_obj_t * led, const lv_area_t * mask, 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_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a led objects - * @param par pointer to an object, it will be the parent of the new led - * @param copy pointer to a led object, if not NULL then the new object will be copied from it - * @return pointer to the created led - */ -lv_obj_t * lv_led_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("led create started"); - - /*Create the ancestor basic object*/ - lv_obj_t * new_led = lv_obj_create(par, copy); - 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); - - /*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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - ext->bright = LV_LED_BRIGHT_ON; - - lv_obj_set_signal_cb(new_led, lv_led_signal); - lv_obj_set_design_cb(new_led, lv_led_design); - - /*Init the new led object*/ - if(copy == NULL) { - lv_obj_set_size(new_led, LV_LED_WIDTH_DEF, LV_LED_HEIGHT_DEF); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_led_set_style(new_led, LV_LED_STYLE_MAIN, th->style.led); - } else { - lv_led_set_style(new_led, LV_LED_STYLE_MAIN, &lv_style_pretty_color); - } - } - /*Copy an existing object*/ - else { - lv_led_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->bright = copy_ext->bright; - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_led); - } - - LV_LOG_INFO("led created"); - - return new_led; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the brightness of a LED object - * @param led pointer to a LED object - * @param bright 0 (max. dark) ... 255 (max. light) - */ -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; - - ext->bright = bright; - - /*Invalidate the object there fore it will be redrawn*/ - lv_obj_invalidate(led); -} - -/** - * Light on a LED - * @param led pointer to a LED object - */ -void lv_led_on(lv_obj_t * led) -{ - LV_ASSERT_OBJ(led, LV_OBJX_NAME); - - lv_led_set_bright(led, LV_LED_BRIGHT_ON); -} - -/** - * Light off a LED - * @param led pointer to a LED object - */ -void lv_led_off(lv_obj_t * led) -{ - LV_ASSERT_OBJ(led, LV_OBJX_NAME); - - lv_led_set_bright(led, LV_LED_BRIGHT_OFF); -} - -/** - * Toggle the state of a LED - * @param led pointer to a LED object - */ -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); - else - lv_led_on(led); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the brightness of a LEd object - * @param led pointer to LED object - * @return bright 0 (max. dark) ... 255 (max. light) - */ -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; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_led_design(lv_obj_t * led, const lv_area_t * mask, 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); - } 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); - const lv_style_t * style = lv_obj_get_style(led); - - /* Store the real pointer because of 'lv_group' - * If the object is in focus 'lv_obj_get_style()' will give a pointer to tmp style - * and to the real object style. It is important because of style change tricks below*/ - const lv_style_t * style_ori_p = led->style_p; - - /*Create a temporal style*/ - lv_style_t leds_tmp; - memcpy(&leds_tmp, style, sizeof(leds_tmp)); - - /*Mix. the color with black proportionally with brightness*/ - leds_tmp.body.main_color = lv_color_mix(leds_tmp.body.main_color, LV_COLOR_BLACK, ext->bright); - leds_tmp.body.grad_color = lv_color_mix(leds_tmp.body.grad_color, LV_COLOR_BLACK, ext->bright); - leds_tmp.body.border.color = lv_color_mix(leds_tmp.body.border.color, LV_COLOR_BLACK, ext->bright); - - /*Set the current swidth according to brightness proportionally between LV_LED_BRIGHT_OFF - * and LV_LED_BRIGHT_ON*/ - uint16_t bright_tmp = ext->bright; - leds_tmp.body.shadow.width = - ((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); - led->style_p = style_ori_p; /*Restore the ORIGINAL style pointer*/ - } - return true; -} - -/** - * Signal function of the led - * @param led pointer to a led 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_led_signal(lv_obj_t * led, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* Include the ancient signal function */ - res = ancestor_signal(led, sign, param); - if(res != LV_RES_OK) return res; - - 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_led"; - } - - return res; -} -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_led.h b/src/libs/lvgl/src/lv_objx/lv_led.h deleted file mode 100644 index a0c9125e..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_led.h +++ /dev/null @@ -1,126 +0,0 @@ -/** - * @file lv_led.h - * - */ - -#ifndef LV_LED_H -#define LV_LED_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_LED != 0 - -#include "../lv_core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*Data of led*/ -typedef struct -{ - /*No inherited ext.*/ - /*New data for this type */ - uint8_t bright; /*Current brightness of the LED (0..255)*/ -} lv_led_ext_t; - -/*Styles*/ -enum { - LV_LED_STYLE_MAIN, -}; -typedef uint8_t lv_led_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a led objects - * @param par pointer to an object, it will be the parent of the new led - * @param copy pointer to a led object, if not NULL then the new object will be copied from it - * @return pointer to the created led - */ -lv_obj_t * lv_led_create(lv_obj_t * par, const lv_obj_t * copy); - -/** - * Set the brightness of a LED object - * @param led pointer to a LED object - * @param bright 0 (max. dark) ... 255 (max. light) - */ -void lv_led_set_bright(lv_obj_t * led, uint8_t bright); - -/** - * Light on a LED - * @param led pointer to a LED object - */ -void lv_led_on(lv_obj_t * led); - -/** - * Light off a LED - * @param led pointer to a LED object - */ -void lv_led_off(lv_obj_t * led); - -/** - * Toggle the state of a LED - * @param led pointer to a LED object - */ -void lv_led_toggle(lv_obj_t * led); - -/** - * Set the style of a led - * @param led pointer to a led object - * @param type which style should be set (can be only `LV_LED_STYLE_MAIN`) - * @param style pointer to a style - */ -static inline void lv_led_set_style(lv_obj_t * led, lv_led_style_t type, const lv_style_t * style) -{ - (void)type; /*Unused*/ - lv_obj_set_style(led, style); -} - -/** - * Get the brightness of a LEd object - * @param led pointer to LED object - * @return bright 0 (max. dark) ... 255 (max. light) - */ -uint8_t lv_led_get_bright(const lv_obj_t * led); - -/** - * Get the style of an led object - * @param led pointer to an led object - * @param type which style should be get (can be only `LV_CHART_STYLE_MAIN`) - * @return pointer to the led's style - */ -static inline const lv_style_t * lv_led_get_style(const lv_obj_t * led, lv_led_style_t type) -{ - (void)type; /*Unused*/ - return lv_obj_get_style(led); -} - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LED*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_LED_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_line.c b/src/libs/lvgl/src/lv_objx/lv_line.c deleted file mode 100644 index ec9e35da..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_line.c +++ /dev/null @@ -1,308 +0,0 @@ -/** - * @file lv_line.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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 <stdbool.h> -#include <stdint.h> -#include <string.h> - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_line" - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_line_design(lv_obj_t * line, const lv_area_t * mask, lv_design_mode_t mode); -static lv_res_t lv_line_signal(lv_obj_t * line, lv_signal_t sign, void * param); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a line objects - * @param par pointer to an object, it will be the parent of the new line - * @return pointer to the created line - */ -lv_obj_t * lv_line_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("line create started"); - - /*Create a basic object*/ - lv_obj_t * new_line = lv_obj_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - ext->point_num = 0; - ext->point_array = NULL; - ext->auto_size = 1; - ext->y_inv = 0; - - lv_obj_set_design_cb(new_line, lv_line_design); - lv_obj_set_signal_cb(new_line, lv_line_signal); - - /*Init the new line*/ - if(copy == NULL) { - lv_obj_set_size(new_line, LV_DPI, - LV_DPI); /*Auto size is enables, but set default size until no points are added*/ - lv_obj_set_style(new_line, NULL); /*Inherit parent's style*/ - lv_obj_set_click(new_line, false); - } - /*Copy an existing object*/ - else { - lv_line_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - lv_line_set_auto_size(new_line, lv_line_get_auto_size(copy)); - lv_line_set_y_invert(new_line, lv_line_get_y_invert(copy)); - lv_line_set_auto_size(new_line, lv_line_get_auto_size(copy)); - lv_line_set_points(new_line, copy_ext->point_array, copy_ext->point_num); - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_line); - } - - LV_LOG_INFO("line created"); - - return new_line; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set an array of points. The line object will connect these points. - * @param line pointer to a line object - * @param point_a an array of points. Only the address is saved, - * so the array can NOT be a local variable which will be destroyed - * @param point_num number of points in 'point_a' - */ -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; - - if(point_num > 0 && ext->auto_size != 0) { - uint16_t i; - lv_coord_t xmax = LV_COORD_MIN; - lv_coord_t ymax = LV_COORD_MIN; - for(i = 0; i < point_num; i++) { - xmax = LV_MATH_MAX(point_a[i].x, xmax); - ymax = LV_MATH_MAX(point_a[i].y, ymax); - } - - const lv_style_t * style = lv_line_get_style(line, LV_LINE_STYLE_MAIN); - lv_obj_set_size(line, xmax + style->line.width, ymax + style->line.width); - } - - lv_obj_invalidate(line); -} - -/** - * Enable (or disable) the auto-size option. The size of the object will fit to its points. - * (set width to x max and height to y max) - * @param line pointer to a line object - * @param en true: auto size is enabled, false: auto size is disabled - */ -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; - - ext->auto_size = en == false ? 0 : 1; - - /*Refresh the object*/ - if(en) lv_line_set_points(line, ext->point_array, ext->point_num); -} - -/** - * Enable (or disable) the y coordinate inversion. - * If enabled then y will be subtracted from the height of the object, - * therefore the y=0 coordinate will be on the bottom. - * @param line pointer to a line object - * @param en true: enable the y inversion, false:disable the y inversion - */ -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; - - ext->y_inv = en == false ? 0 : 1; - - lv_obj_invalidate(line); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the auto size attribute - * @param line pointer to a line object - * @return true: auto size is enabled, false: disabled - */ -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; -} - -/** - * Get the y inversion attribute - * @param line pointer to a line object - * @return true: y inversion is enabled, false: disabled - */ -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; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_line_design(lv_obj_t * line, const lv_area_t * mask, lv_design_mode_t mode) -{ - /*A line never covers an area*/ - if(mode == LV_DESIGN_COVER_CHK) - return false; - else if(mode == LV_DESIGN_DRAW_MAIN) { - lv_line_ext_t * ext = lv_obj_get_ext_attr(line); - - if(ext->point_num == 0 || ext->point_array == NULL) return false; - - const lv_style_t * style = lv_obj_get_style(line); - lv_opa_t opa_scale = lv_obj_get_opa_scale(line); - lv_area_t area; - lv_obj_get_coords(line, &area); - lv_coord_t x_ofs = area.x1; - lv_coord_t y_ofs = area.y1; - lv_point_t p1; - lv_point_t p2; - lv_coord_t h = lv_obj_get_height(line); - uint16_t i; - - 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; - - /*Read all points and draw the lines*/ - for(i = 0; i < ext->point_num - 1; i++) { - - p1.x = ext->point_array[i].x + x_ofs; - p2.x = ext->point_array[i + 1].x + x_ofs; - - if(ext->y_inv == 0) { - p1.y = ext->point_array[i].y + y_ofs; - p2.y = ext->point_array[i + 1].y + y_ofs; - } else { - 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); - - /*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); - } - } - - /*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); - } - } - return true; -} - -/** - * Signal function of the line - * @param line pointer to a line object - * @param sign a signal type from lv_signal_t enum - * @return LV_RES_OK: the object is not deleted in the function; LV_RES_INV: the object is deleted - */ -static lv_res_t lv_line_signal(lv_obj_t * line, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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_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; - } - - return res; -} -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_line.h b/src/libs/lvgl/src/lv_objx/lv_line.h deleted file mode 100644 index cfea7368..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_line.h +++ /dev/null @@ -1,147 +0,0 @@ -/** - * @file lv_line.h - * - */ - -#ifndef LV_LINE_H -#define LV_LINE_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_LINE != 0 - -#include "../lv_core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*Data of line*/ -typedef struct -{ - /*Inherited from 'base_obj' so no inherited ext.*/ /*Ext. of ancestor*/ - const lv_point_t * point_array; /*Pointer to an array with the points of the line*/ - uint16_t point_num; /*Number of points in 'point_array' */ - uint8_t auto_size : 1; /*1: set obj. width to x max and obj. height to y max */ - uint8_t y_inv : 1; /*1: y == 0 will be on the bottom*/ -} lv_line_ext_t; - -/*Styles*/ -enum { - LV_LINE_STYLE_MAIN, -}; -typedef uint8_t lv_line_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a line objects - * @param par pointer to an object, it will be the parent of the new line - * @return pointer to the created line - */ -lv_obj_t * lv_line_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set an array of points. The line object will connect these points. - * @param line pointer to a line object - * @param point_a an array of points. Only the address is saved, - * so the array can NOT be a local variable which will be destroyed - * @param point_num number of points in 'point_a' - */ -void lv_line_set_points(lv_obj_t * line, const lv_point_t point_a[], uint16_t point_num); - -/** - * Enable (or disable) the auto-size option. The size of the object will fit to its points. - * (set width to x max and height to y max) - * @param line pointer to a line object - * @param en true: auto size is enabled, false: auto size is disabled - */ -void lv_line_set_auto_size(lv_obj_t * line, bool en); - -/** - * Enable (or disable) the y coordinate inversion. - * If enabled then y will be subtracted from the height of the object, - * therefore the y=0 coordinate will be on the bottom. - * @param line pointer to a line object - * @param en true: enable the y inversion, false:disable the y inversion - */ -void lv_line_set_y_invert(lv_obj_t * line, bool en); - -#define lv_line_set_y_inv \ - lv_line_set_y_invert /*The name was inconsistent. In v.6.0 only `lv_line_set_y_invert`will \ - work */ - -/** - * Set the style of a line - * @param line pointer to a line object - * @param type which style should be set (can be only `LV_LINE_STYLE_MAIN`) - * @param style pointer to a style - */ -static inline void lv_line_set_style(lv_obj_t * line, lv_line_style_t type, const lv_style_t * style) -{ - (void)type; /*Unused*/ - lv_obj_set_style(line, style); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the auto size attribute - * @param line pointer to a line object - * @return true: auto size is enabled, false: disabled - */ -bool lv_line_get_auto_size(const lv_obj_t * line); - -/** - * Get the y inversion attribute - * @param line pointer to a line object - * @return true: y inversion is enabled, false: disabled - */ -bool lv_line_get_y_invert(const lv_obj_t * line); - -/** - * Get the style of an line object - * @param line pointer to an line object - * @param type which style should be get (can be only `LV_LINE_STYLE_MAIN`) - * @return pointer to the line's style - */ -static inline const lv_style_t * lv_line_get_style(const lv_obj_t * line, lv_line_style_t type) -{ - (void)type; /*Unused*/ - return lv_obj_get_style(line); -} - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LINE*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_LINE_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_list.c b/src/libs/lvgl/src/lv_objx/lv_list.c deleted file mode 100644 index 54fe16a2..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_list.c +++ /dev/null @@ -1,1067 +0,0 @@ -/** - * @file lv_list.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" -#include "../lv_misc/lv_math.h" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_list" - -#define LV_LIST_LAYOUT_DEF LV_LAYOUT_COL_M - -#if LV_USE_ANIMATION == 0 -#undef LV_LIST_DEF_ANIM_TIME -#define LV_LIST_DEF_ANIM_TIME 0 -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_res_t lv_list_signal(lv_obj_t * list, lv_signal_t sign, void * param); -static lv_res_t lv_list_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * param); -static void lv_list_btn_single_select(lv_obj_t * btn); -static bool lv_list_is_list_btn(lv_obj_t * list_btn); -static bool lv_list_is_list_img(lv_obj_t * list_btn); -static bool lv_list_is_list_label(lv_obj_t * list_btn); - -/********************** - * STATIC VARIABLES - **********************/ -#if LV_USE_IMG -static lv_signal_cb_t img_signal; -#endif -static lv_signal_cb_t label_signal; -static lv_signal_cb_t ancestor_page_signal; -static lv_signal_cb_t ancestor_btn_signal; - - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a list objects - * @param par pointer to an object, it will be the parent of the new list - * @param copy pointer to a list object, if not NULL then the new object will be copied from it - * @return pointer to the created list - */ -lv_obj_t * lv_list_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("list create started"); - - /*Create the ancestor basic object*/ - lv_obj_t * new_list = lv_page_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - ext->style_img = NULL; - ext->styles_btn[LV_BTN_STATE_REL] = &lv_style_btn_rel; - ext->styles_btn[LV_BTN_STATE_PR] = &lv_style_btn_pr; - ext->styles_btn[LV_BTN_STATE_TGL_REL] = &lv_style_btn_tgl_rel; - ext->styles_btn[LV_BTN_STATE_TGL_PR] = &lv_style_btn_tgl_pr; - ext->styles_btn[LV_BTN_STATE_INA] = &lv_style_btn_ina; - ext->single_mode = false; - ext->size = 0; - -#if LV_USE_GROUP - ext->last_sel = NULL; - ext->selected_btn = NULL; - ext->last_clicked_btn = NULL; -#endif - - lv_obj_set_signal_cb(new_list, lv_list_signal); - - /*Init the new list object*/ - if(copy == NULL) { - lv_page_set_anim_time(new_list, LV_LIST_DEF_ANIM_TIME); - lv_page_set_scrl_fit2(new_list, LV_FIT_FLOOD, LV_FIT_TIGHT); - lv_obj_set_size(new_list, 2 * LV_DPI, 3 * LV_DPI); - lv_page_set_scrl_layout(new_list, LV_LIST_LAYOUT_DEF); - lv_list_set_sb_mode(new_list, LV_SB_MODE_DRAG); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_list_set_style(new_list, LV_LIST_STYLE_BG, th->style.list.bg); - lv_list_set_style(new_list, LV_LIST_STYLE_SCRL, th->style.list.scrl); - lv_list_set_style(new_list, LV_LIST_STYLE_SB, th->style.list.sb); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_REL, th->style.list.btn.rel); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_PR, th->style.list.btn.pr); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_TGL_REL, th->style.list.btn.tgl_rel); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_TGL_PR, th->style.list.btn.tgl_pr); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_INA, th->style.list.btn.ina); - } else { - lv_list_set_style(new_list, LV_LIST_STYLE_BG, &lv_style_transp_fit); - lv_list_set_style(new_list, LV_LIST_STYLE_SCRL, &lv_style_pretty); - } - } else { - lv_list_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - - lv_obj_t * copy_btn = lv_list_get_next_btn(copy, NULL); - while(copy_btn) { - const void * img_src = NULL; -#if LV_USE_IMG - lv_obj_t * copy_img = lv_list_get_btn_img(copy_btn); - if(copy_img) img_src = lv_img_get_src(copy_img); -#endif - lv_list_add_btn(new_list, img_src, lv_list_get_btn_text(copy_btn)); - copy_btn = lv_list_get_next_btn(copy, copy_btn); - } - - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_REL, copy_ext->styles_btn[LV_BTN_STATE_REL]); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_PR, copy_ext->styles_btn[LV_BTN_STATE_PR]); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_TGL_REL, copy_ext->styles_btn[LV_BTN_STATE_TGL_REL]); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_TGL_PR, copy_ext->styles_btn[LV_BTN_STATE_TGL_REL]); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_INA, copy_ext->styles_btn[LV_BTN_STATE_INA]); - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_list); - } - - LV_LOG_INFO("list created"); - - return new_list; -} - -/** - * Delete all children of the scrl object, without deleting scrl child. - * @param list pointer to an object - */ -void lv_list_clean(lv_obj_t * list) -{ - 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(list); - ext->size = 0; -} - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Add a list element to the list - * @param list pointer to list object - * @param img_fn file name of an image before the text (NULL if unused) - * @param txt text of the list element (NULL if unused) - * @return pointer to the new list element which can be customized (a button) - */ -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_obj_t * last_btn = lv_list_get_prev_btn(list, NULL); - - /*The coordinates may changed due to autofit so revert them at the end*/ - lv_coord_t pos_x_ori = lv_obj_get_x(list); - lv_coord_t pos_y_ori = lv_obj_get_y(list); - - - lv_list_ext_t * ext = lv_obj_get_ext_attr(list); - ext->size++; - /*Create a list element with the image an the text*/ - lv_obj_t * liste; - liste = lv_btn_create(list, NULL); - - /*Save the original signal function because it will be required in `lv_list_btn_signal`*/ - if(ancestor_btn_signal == NULL) ancestor_btn_signal = lv_obj_get_signal_cb(liste); - - /*Set the default styles*/ - lv_btn_set_style(liste, LV_BTN_STYLE_REL, ext->styles_btn[LV_BTN_STATE_REL]); - lv_btn_set_style(liste, LV_BTN_STYLE_PR, ext->styles_btn[LV_BTN_STATE_PR]); - lv_btn_set_style(liste, LV_BTN_STYLE_TGL_REL, ext->styles_btn[LV_BTN_STATE_TGL_REL]); - lv_btn_set_style(liste, LV_BTN_STYLE_TGL_PR, ext->styles_btn[LV_BTN_STATE_TGL_PR]); - lv_btn_set_style(liste, LV_BTN_STYLE_INA, ext->styles_btn[LV_BTN_STATE_INA]); - - lv_page_glue_obj(liste, true); - lv_btn_set_layout(liste, LV_LAYOUT_ROW_M); - - lv_layout_t list_layout = lv_list_get_layout(list); - bool layout_ver = false; - if(list_layout == LV_LAYOUT_COL_M || list_layout == LV_LAYOUT_COL_L || list_layout == LV_LAYOUT_COL_R) { - layout_ver = true; - } - - if(layout_ver) { - lv_btn_set_fit2(liste, LV_FIT_FLOOD, LV_FIT_TIGHT); - } else { - lv_coord_t w = last_btn ? lv_obj_get_width(last_btn) : (LV_DPI * 3) / 2; - lv_btn_set_fit2(liste, LV_FIT_NONE, LV_FIT_TIGHT); - lv_obj_set_width(liste, w); - } - - - lv_obj_set_protect(liste, LV_PROTECT_PRESS_LOST); - lv_obj_set_signal_cb(liste, lv_list_btn_signal); - -#if LV_USE_IMG != 0 - lv_obj_t * img = NULL; - if(img_src) { - img = lv_img_create(liste, NULL); - lv_img_set_src(img, img_src); - lv_obj_set_style(img, ext->style_img); - lv_obj_set_click(img, false); - if(img_signal == NULL) img_signal = lv_obj_get_signal_cb(img); - } -#endif - if(txt != NULL) { - lv_coord_t btn_hor_pad = ext->styles_btn[LV_BTN_STYLE_REL]->body.padding.left - - ext->styles_btn[LV_BTN_STYLE_REL]->body.padding.right; - lv_obj_t * label = lv_label_create(liste, NULL); - lv_label_set_text(label, txt); - lv_obj_set_click(label, false); - lv_label_set_long_mode(label, LV_LABEL_LONG_SROLL_CIRC); - 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 - /* If this is the first item to be added to the list and the list is - * focused, select it */ - { - lv_group_t * g = lv_obj_get_group(list); - if(ext->size == 1 && lv_group_get_focused(g) == list) { - lv_list_set_btn_selected(list, liste); - } - } -#endif - - lv_obj_set_pos(list, pos_x_ori, pos_y_ori); - - return liste; -} - -/** - * Remove the index of the button in the list - * @param list pointer to a list object - * @param index pointer to a the button's index in the list, index must be 0 <= index < - * lv_list_ext_t.size - * @return true: successfully deleted - */ -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; - lv_obj_t * e = lv_list_get_next_btn(list, NULL); - while(e != NULL) { - if(count == index) { - lv_obj_del(e); - ext->size--; - return true; - } - e = lv_list_get_next_btn(list, e); - count++; - } - return false; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set single button selected mode, only one button will be selected if enabled. - * @param list pointer to the currently pressed list object - * @param mode, enable(true)/disable(false) single selected mode. - */ -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; -} - -#if LV_USE_GROUP - -/** - * Make a button selected - * @param list pointer to a list object - * @param btn pointer to a button to select - * NULL to not select any buttons - */ -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) { - lv_btn_state_t s = lv_btn_get_state(ext->selected_btn); - if(s == LV_BTN_STATE_PR) - lv_btn_set_state(ext->selected_btn, LV_BTN_STATE_REL); - else if(s == LV_BTN_STATE_TGL_PR) - lv_btn_set_state(ext->selected_btn, LV_BTN_STATE_TGL_REL); - } - - ext->selected_btn = btn; - - /*Don't forget which button was selected. - * It will be restored when the list is focused.*/ - if(btn != NULL) { - ext->last_sel = btn; - } - - if(ext->selected_btn) { - lv_btn_state_t s = lv_btn_get_state(ext->selected_btn); - if(s == LV_BTN_STATE_REL) - lv_btn_set_state(ext->selected_btn, LV_BTN_STATE_PR); - 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_ANIM_ON); - } -} - -#endif - -/** - * Set a style of a list - * @param list pointer to a list object - * @param type which style should be set - * @param style pointer to a style - */ -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; - - switch(type) { - case LV_LIST_STYLE_BG: - lv_page_set_style(list, LV_PAGE_STYLE_BG, style); - /*style change signal will call 'refr_btn_width' */ - break; - case LV_LIST_STYLE_SCRL: lv_page_set_style(list, LV_PAGE_STYLE_SCRL, style); break; - case LV_LIST_STYLE_SB: lv_page_set_style(list, LV_PAGE_STYLE_SB, style); break; - case LV_LIST_STYLE_EDGE_FLASH: lv_page_set_style(list, LV_PAGE_STYLE_EDGE_FLASH, style); break; - case LV_LIST_STYLE_BTN_REL: - ext->styles_btn[LV_BTN_STATE_REL] = style; - btn_style_refr = LV_BTN_STYLE_REL; - break; - case LV_LIST_STYLE_BTN_PR: - ext->styles_btn[LV_BTN_STATE_PR] = style; - btn_style_refr = LV_BTN_STYLE_PR; - break; - case LV_LIST_STYLE_BTN_TGL_REL: - ext->styles_btn[LV_BTN_STATE_TGL_REL] = style; - btn_style_refr = LV_BTN_STYLE_TGL_REL; - break; - case LV_LIST_STYLE_BTN_TGL_PR: - ext->styles_btn[LV_BTN_STATE_TGL_PR] = style; - btn_style_refr = LV_BTN_STYLE_TGL_PR; - break; - case LV_LIST_STYLE_BTN_INA: - ext->styles_btn[LV_BTN_STATE_INA] = style; - btn_style_refr = LV_BTN_STYLE_INA; - break; - } - - /*Refresh existing buttons' style*/ - if(type == LV_LIST_STYLE_BTN_PR || type == LV_LIST_STYLE_BTN_REL || type == LV_LIST_STYLE_BTN_TGL_REL || - type == LV_LIST_STYLE_BTN_TGL_PR || type == LV_LIST_STYLE_BTN_INA) { - btn = lv_list_get_prev_btn(list, NULL); - while(btn != NULL) { - lv_btn_set_style(btn, btn_style_refr, ext->styles_btn[btn_style_refr]); - btn = lv_list_get_prev_btn(list, btn); - } - } -} - -/** - * 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(btn, 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(btn, LV_FIT_TIGHT); - } - - btn = lv_list_get_prev_btn(list, btn); - } - - if(layout == LV_LAYOUT_COL_M || layout == LV_LAYOUT_COL_L || layout == LV_LAYOUT_COL_R) { - lv_page_set_scrl_fit2(list, LV_FIT_FLOOD, LV_FIT_TIGHT); - } else if (layout == LV_LAYOUT_ROW_M || layout == LV_LAYOUT_ROW_T || layout == LV_LAYOUT_ROW_B) { - lv_page_set_scrl_fit2(list, LV_FIT_TIGHT, LV_FIT_TIGHT); - lv_cont_set_fit2(list, LV_FIT_NONE, LV_FIT_TIGHT); - } - - lv_page_set_scrl_layout(list, layout); - } - -/*===================== - * Getter functions - *====================*/ - -/** - * Get single button selected mode. - * @param list pointer to the currently pressed list object. - */ -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); -} - -/** - * Get the text of a list element - * @param btn pointer to list element - * @return pointer to the text - */ -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); -} - -/** - * Get the label object from a list element - * @param btn pointer to a list element (button) - * @return pointer to the label from the list element or NULL if not found - */ -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; - - while(lv_list_is_list_label(label) == false) { - label = lv_obj_get_child(btn, label); - if(label == NULL) break; - } - - return label; -} - -/** - * Get the image object from a list element - * @param btn pointer to a list element (button) - * @return pointer to the image from the list element or NULL if not found - */ -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; - - while(lv_list_is_list_img(img) == false) { - img = lv_obj_get_child(btn, img); - if(img == NULL) break; - } - - return img; -#else - return NULL; -#endif -} - -/** - * Get the previous button from list. (Starts from the bottom button) - * @param list pointer to a list object - * @param prev_btn pointer to button. Search the previous before it. - * @return pointer to the previous button or NULL when no more buttons - */ -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 */ - - lv_obj_t * btn; - lv_obj_t * scrl = lv_page_get_scrl(list); - - btn = lv_obj_get_child(scrl, prev_btn); - if(btn == NULL) return NULL; - - while(lv_list_is_list_btn(btn) == false) { - btn = lv_obj_get_child(scrl, btn); - if(btn == NULL) break; - } - - return btn; -} - -/** - * Get the next button from list. (Starts from the top button) - * @param list pointer to a list object - * @param prev_btn pointer to button. Search the next after it. - * @return pointer to the next button or NULL when no more buttons - */ -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 */ - - lv_obj_t * btn; - lv_obj_t * scrl = lv_page_get_scrl(list); - - btn = lv_obj_get_child_back(scrl, prev_btn); - if(btn == NULL) return NULL; - - while(lv_list_is_list_btn(btn) == false) { - btn = lv_obj_get_child_back(scrl, btn); - if(btn == NULL) break; - } - - return btn; -} - -/** - * Get the index of the button in the list - * @param list pointer to a list object. If NULL, assumes btn is part of a list. - * @param btn pointer to a list element (button) - * @return the index of the button in the list, or -1 of the button not in this list - */ -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 */ - list = lv_obj_get_parent(lv_obj_get_parent(btn)); - } - lv_obj_t * e = lv_list_get_next_btn(list, NULL); - while(e != NULL) { - if(e == btn) { - return index; - } - index++; - e = lv_list_get_next_btn(list, e); - } - return -1; -} - -/** - * Get the number of buttons in the list - * @param list pointer to a list object - * @return the number of buttons in the list - */ -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; -} - -#if LV_USE_GROUP -/** - * Get the currently selected button - * @param list pointer to a list object - * @return pointer to the selected button - */ -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); - - switch(type) { - case LV_LIST_STYLE_BG: style = lv_page_get_style(list, LV_PAGE_STYLE_BG); break; - case LV_LIST_STYLE_SCRL: style = lv_page_get_style(list, LV_PAGE_STYLE_SCRL); break; - case LV_LIST_STYLE_SB: style = lv_page_get_style(list, LV_PAGE_STYLE_SB); break; - case LV_LIST_STYLE_EDGE_FLASH: style = lv_page_get_style(list, LV_PAGE_STYLE_EDGE_FLASH); break; - case LV_LIST_STYLE_BTN_REL: style = ext->styles_btn[LV_BTN_STATE_REL]; break; - case LV_LIST_STYLE_BTN_PR: style = ext->styles_btn[LV_BTN_STATE_PR]; break; - case LV_LIST_STYLE_BTN_TGL_REL: style = ext->styles_btn[LV_BTN_STATE_TGL_REL]; break; - case LV_LIST_STYLE_BTN_TGL_PR: style = ext->styles_btn[LV_BTN_STATE_TGL_PR]; break; - case LV_LIST_STYLE_BTN_INA: style = ext->styles_btn[LV_BTN_STATE_INA]; break; - default: style = NULL; break; - } - - return style; -} - -/*===================== - * Other functions - *====================*/ - -/** - * Move the list elements up by one - * @param list pointer a to list object - */ -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); - lv_obj_t * e; - lv_obj_t * e_prev = NULL; - - e = lv_list_get_prev_btn(list, NULL); - while(e != NULL) { - if(e->coords.y2 <= list->coords.y2) { - if(e_prev != NULL) { - lv_coord_t new_y = lv_obj_get_height(list) - (lv_obj_get_y(e_prev) + lv_obj_get_height(e_prev)); - if(lv_list_get_anim_time(list) == 0) { - lv_obj_set_y(scrl, new_y); - } else { -#if LV_USE_ANIMATION - lv_anim_t a; - a.var = scrl; - a.start = lv_obj_get_y(scrl); - a.end = new_y; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_y; - a.path_cb = lv_anim_path_linear; - a.ready_cb = NULL; - a.act_time = 0; - a.time = LV_LIST_DEF_ANIM_TIME; - a.playback = 0; - a.playback_pause = 0; - a.repeat = 0; - a.repeat_pause = 0; - lv_anim_create(&a); -#endif - } - } - break; - } - e_prev = e; - e = lv_list_get_prev_btn(list, e); - } -} - -/** - * Move the list elements down by one - * @param list pointer to a list object - */ -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); - lv_obj_t * e; - e = lv_list_get_prev_btn(list, NULL); - while(e != NULL) { - if(e->coords.y1 < list->coords.y1) { - lv_coord_t new_y = -lv_obj_get_y(e); - if(lv_list_get_anim_time(list) == 0) { - lv_obj_set_y(scrl, new_y); - } else { -#if LV_USE_ANIMATION - lv_anim_t a; - a.var = scrl; - a.start = lv_obj_get_y(scrl); - a.end = new_y; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_y; - a.path_cb = lv_anim_path_linear; - a.ready_cb = NULL; - a.act_time = 0; - a.time = LV_LIST_DEF_ANIM_TIME; - a.playback = 0; - a.playback_pause = 0; - a.repeat = 0; - a.repeat_pause = 0; - lv_anim_create(&a); -#endif - } - break; - } - e = lv_list_get_prev_btn(list, e); - } -} - -/** - * Focus on a list button. It ensures that the button will be visible on the list. - * @param btn pointer to a list button to focus - * @param anim_en LV_ANIM_ON: scroll with animation, LV_ANOM_OFF: without animation - */ -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; -#endif - - lv_obj_t * list = lv_obj_get_parent(lv_obj_get_parent(btn)); - - lv_page_focus(list, btn, anim == LV_ANIM_OFF ? 0 : lv_list_get_anim_time(list)); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Signal function of the list - * @param list pointer to a list 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_list_signal(lv_obj_t * list, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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) { -#if LV_USE_GROUP - /*If pressed/released etc by a KEYPAD or ENCODER delegate signal to the button*/ - 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(list)))) { - /*Get the 'pressed' button*/ - lv_obj_t * btn = NULL; - btn = lv_list_get_prev_btn(list, btn); - while(btn != NULL) { - if(lv_btn_get_state(btn) == LV_BTN_STATE_PR) break; - btn = lv_list_get_prev_btn(list, btn); - } - lv_list_ext_t * ext = lv_obj_get_ext_attr(list); - - /*The page receives the key presses so the events should be propagated to the selected - * button*/ - if(btn) { - if(sign == LV_SIGNAL_PRESSED) { - res = lv_event_send(btn, LV_EVENT_PRESSED, NULL); - } else if(sign == LV_SIGNAL_PRESSING) { - res = lv_event_send(btn, LV_EVENT_PRESSING, NULL); - } else if(sign == LV_SIGNAL_LONG_PRESS) { - res = lv_event_send(btn, LV_EVENT_LONG_PRESSED, NULL); - } else if(sign == LV_SIGNAL_LONG_PRESS_REP) { - res = lv_event_send(btn, LV_EVENT_LONG_PRESSED_REPEAT, NULL); - } else if(sign == LV_SIGNAL_RELEASED) { -#if LV_USE_GROUP - ext->last_sel = btn; -#endif - if(indev->proc.long_pr_sent == 0) { - res = lv_event_send(btn, LV_EVENT_SHORT_CLICKED, NULL); - } - if(lv_indev_is_dragging(indev) == false && res == LV_RES_OK) { - res = lv_event_send(btn, LV_EVENT_CLICKED, NULL); - } - if(res == LV_RES_OK) { - res = lv_event_send(btn, LV_EVENT_RELEASED, NULL); - } - } - } - } -#endif - } else if(sign == LV_SIGNAL_FOCUS) { - -#if LV_USE_GROUP - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); - /*With ENCODER select the first button only in edit mode*/ - if(indev_type == LV_INDEV_TYPE_ENCODER) { - lv_group_t * g = lv_obj_get_group(list); - if(lv_group_get_editing(g)) { - lv_list_ext_t * ext = lv_obj_get_ext_attr(list); - if(ext->last_sel) { - /* Select the last used button */ - lv_list_set_btn_selected(list, ext->last_sel); - } else { - /*Get the first button and mark it as selected*/ - lv_list_set_btn_selected(list, lv_list_get_next_btn(list, NULL)); - } - } else { - lv_list_set_btn_selected(list, NULL); - } - } - /*Else select the clicked button*/ - else { - /*Mark the last clicked button (if any) as selected because it triggered the focus*/ - lv_list_ext_t * ext = lv_obj_get_ext_attr(list); - if(ext->last_clicked_btn) { - lv_list_set_btn_selected(list, ext->last_clicked_btn); - ext->last_clicked_btn = NULL; - - } else { - if(ext->last_sel) { - /* Select the last used button */ - lv_list_set_btn_selected(list, ext->last_sel); - } else { - /*Get the first button and mark it as selected*/ - lv_list_set_btn_selected(list, lv_list_get_next_btn(list, NULL)); - } - } - } -#endif - } else if(sign == LV_SIGNAL_DEFOCUS) { - -#if LV_USE_GROUP - /*De-select the selected btn*/ - lv_list_set_btn_selected(list, NULL); - lv_list_ext_t * ext = lv_obj_get_ext_attr(list); - ext->last_clicked_btn = NULL; /*button click will be set if click happens before focus*/ - ext->selected_btn = NULL; -#endif - } else if(sign == LV_SIGNAL_GET_EDITABLE) { - bool * editable = (bool *)param; - *editable = true; - } else if(sign == LV_SIGNAL_CONTROL) { - -#if LV_USE_GROUP - char c = *((char *)param); - if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) { - lv_list_ext_t * ext = lv_obj_get_ext_attr(list); - /*If there is a valid selected button the make the previous selected*/ - if(ext->selected_btn) { - lv_obj_t * btn_prev = lv_list_get_next_btn(list, ext->selected_btn); - if(btn_prev) lv_list_set_btn_selected(list, btn_prev); - } - /*If there is no selected button the make the first selected*/ - else { - lv_obj_t * btn = lv_list_get_next_btn(list, NULL); - if(btn) - lv_list_set_btn_selected(list, - btn); /*If there are no buttons on the list then there is no first button*/ - } - } else if(c == LV_KEY_LEFT || c == LV_KEY_UP) { - lv_list_ext_t * ext = lv_obj_get_ext_attr(list); - /*If there is a valid selected button the make the next selected*/ - if(ext->selected_btn != NULL) { - lv_obj_t * btn_next = lv_list_get_prev_btn(list, ext->selected_btn); - if(btn_next) lv_list_set_btn_selected(list, btn_next); - } - /*If there is no selected button the make the first selected*/ - else { - lv_obj_t * btn = lv_list_get_next_btn(list, NULL); - if(btn) lv_list_set_btn_selected(list, btn); - } - } -#endif - } - return res; -} - -/** - * Signal function of the list buttons - * @param btn pointer to a button on the list - * @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_list_btn_signal(lv_obj_t * btn, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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); - if(lv_group_get_focused(g) == list && lv_indev_is_dragging(lv_indev_get_act()) == false) { - /* Is the list is focused then be sure only the button being released - * has a pressed state to indicate the selected state on the list*/ - lv_obj_t * btn_i = lv_list_get_prev_btn(list, NULL); - while(btn_i) { - lv_btn_state_t s = lv_btn_get_state(btn_i); - if(s == LV_BTN_STATE_PR) - lv_btn_set_state(btn_i, LV_BTN_STATE_REL); - else if(s == LV_BTN_STATE_TGL_PR) - lv_btn_set_state(btn_i, LV_BTN_STATE_TGL_REL); - btn_i = lv_list_get_prev_btn(list, btn_i); - } - - /*Make the released button "selected"*/ - lv_list_set_btn_selected(list, btn); - } - - /* If `click_focus == 1` then LV_SIGNAL_FOCUS need to know which button triggered the focus - * to mark it as selected (pressed state)*/ - ext->last_clicked_btn = btn; -#endif - 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 - lv_obj_t * list = lv_obj_get_parent(lv_obj_get_parent(btn)); - lv_obj_t * sel = lv_list_get_btn_selected(list); - if(sel == btn) lv_list_set_btn_selected(list, lv_list_get_next_btn(list, btn)); -#endif - } - - return res; -} - -/** - * Make a single button selected in the list, deselect others. - * @param btn pointer to the currently pressed list btn object - */ -static void lv_list_btn_single_select(lv_obj_t * btn) -{ - lv_obj_t * list = lv_obj_get_parent(lv_obj_get_parent(btn)); - - lv_obj_t * e = lv_list_get_next_btn(list, NULL); - do { - if(e == btn) { - lv_btn_set_state(e, LV_BTN_STATE_TGL_REL); - } else { - lv_btn_set_state(e, LV_BTN_STATE_REL); - } - e = lv_list_get_next_btn(list, e); - } while(e != NULL); -} - -/** - * Check if this is really a list button or another object. - * @param list_btn List button - */ -static bool lv_list_is_list_btn(lv_obj_t * list_btn) -{ - lv_obj_type_t type; - - lv_obj_get_type(list_btn, &type); - uint8_t cnt; - for(cnt = 0; cnt < LV_MAX_ANCESTOR_NUM; cnt++) { - if(type.type[cnt] == NULL) break; - if(!strcmp(type.type[cnt], "lv_btn")) return true; - } - return false; -} - -/** - * Check if this is really a list label or another object. - * @param list_label List label - */ -static bool lv_list_is_list_label(lv_obj_t * list_label) -{ - lv_obj_type_t type; - - lv_obj_get_type(list_label, &type); - uint8_t cnt; - for(cnt = 0; cnt < LV_MAX_ANCESTOR_NUM; cnt++) { - if(type.type[cnt] == NULL) break; - if(!strcmp(type.type[cnt], "lv_label")) return true; - } - return false; -} - -/** - * Check if this is really a list image or another object. - * @param list_image List image - */ -static bool lv_list_is_list_img(lv_obj_t * list_img) -{ - lv_obj_type_t type; - - lv_obj_get_type(list_img, &type); - uint8_t cnt; - for(cnt = 0; cnt < LV_MAX_ANCESTOR_NUM; cnt++) { - if(type.type[cnt] == NULL) break; - if(!strcmp(type.type[cnt], "lv_img")) return true; - } - return false; -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_list.h b/src/libs/lvgl/src/lv_objx/lv_list.h deleted file mode 100644 index e17bc87d..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_list.h +++ /dev/null @@ -1,359 +0,0 @@ -/** - * @file lv_list.h - * - */ - -#ifndef LV_LIST_H -#define LV_LIST_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_LIST != 0 - -/*Testing of dependencies*/ -#if LV_USE_PAGE == 0 -#error "lv_list: lv_page is required. Enable it in lv_conf.h (LV_USE_PAGE 1) " -#endif - -#if LV_USE_BTN == 0 -#error "lv_list: lv_btn is required. Enable it in lv_conf.h (LV_USE_BTN 1) " -#endif - -#if LV_USE_LABEL == 0 -#error "lv_list: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "lv_page.h" -#include "lv_btn.h" -#include "lv_label.h" -#include "lv_img.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -/*Data of list*/ -typedef struct -{ - lv_page_ext_t page; /*Ext. of ancestor*/ - /*New data for this type */ - const lv_style_t * styles_btn[_LV_BTN_STATE_NUM]; /*Styles of the list element buttons*/ - const lv_style_t * style_img; /*Style of the list element images on buttons*/ - uint16_t size; /*the number of items(buttons) in the list*/ - - uint8_t single_mode : 1; /* whether single selected mode is enabled */ - -#if LV_USE_GROUP - lv_obj_t * last_sel; /* The last selected button. It will be reverted when the list is focused again */ - lv_obj_t * selected_btn; /* The button is currently being selected*/ - /*Used to make the last clicked button pressed (selected) when the list become focused and - * `click_focus == 1`*/ - lv_obj_t * last_clicked_btn; -#endif -} lv_list_ext_t; - -/** List styles. */ -enum { - LV_LIST_STYLE_BG, /**< List background style */ - LV_LIST_STYLE_SCRL, /**< List scrollable area style. */ - LV_LIST_STYLE_SB, /**< List scrollbar style. */ - LV_LIST_STYLE_EDGE_FLASH, /**< List edge flash style. */ - LV_LIST_STYLE_BTN_REL, /**< Same meaning as the ordinary button styles. */ - LV_LIST_STYLE_BTN_PR, - LV_LIST_STYLE_BTN_TGL_REL, - LV_LIST_STYLE_BTN_TGL_PR, - LV_LIST_STYLE_BTN_INA, -}; -typedef uint8_t lv_list_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a list objects - * @param par pointer to an object, it will be the parent of the new list - * @param copy pointer to a list object, if not NULL then the new object will be copied from it - * @return pointer to the created list - */ -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 list pointer to an object - */ -void lv_list_clean(lv_obj_t * list); - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Add a list element to the list - * @param list pointer to list object - * @param img_fn file name of an image before the text (NULL if unused) - * @param txt text of the list element (NULL if unused) - * @return pointer to the new list element which can be customized (a button) - */ -lv_obj_t * lv_list_add_btn(lv_obj_t * list, const void * img_src, const char * txt); - -/** - * Remove the index of the button in the list - * @param list pointer to a list object - * @param index pointer to a the button's index in the list, index must be 0 <= index < - * lv_list_ext_t.size - * @return true: successfully deleted - */ -bool lv_list_remove(const lv_obj_t * list, uint16_t index); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set single button selected mode, only one button will be selected if enabled. - * @param list pointer to the currently pressed list object - * @param mode enable(true)/disable(false) single selected mode. - */ -void lv_list_set_single_mode(lv_obj_t * list, bool mode); - -#if LV_USE_GROUP - -/** - * Make a button selected - * @param list pointer to a list object - * @param btn pointer to a button to select - * NULL to not select any buttons - */ -void lv_list_set_btn_selected(lv_obj_t * list, lv_obj_t * btn); -#endif - -/** - * Set the scroll bar mode of a list - * @param list pointer to a list object - * @param sb_mode the new mode from 'lv_page_sb_mode_t' enum - */ -static inline void lv_list_set_sb_mode(lv_obj_t * list, lv_sb_mode_t mode) -{ - lv_page_set_sb_mode(list, mode); -} - -/** - * Enable the scroll propagation feature. If enabled then the List will move its parent if there is - * no more space to scroll. - * @param list pointer to a List - * @param en true or false to enable/disable scroll propagation - */ -static inline void lv_list_set_scroll_propagation(lv_obj_t * list, bool en) -{ - lv_page_set_scroll_propagation(list, en); -} - -/** - * Enable the edge flash effect. (Show an arc when the an edge is reached) - * @param list pointer to a List - * @param en true or false to enable/disable end flash - */ -static inline void lv_list_set_edge_flash(lv_obj_t * list, bool en) -{ - lv_page_set_edge_flash(list, en); -} - -/** - * Set scroll animation duration on 'list_up()' 'list_down()' 'list_focus()' - * @param list pointer to a list object - * @param anim_time duration of animation [ms] - */ -static inline void lv_list_set_anim_time(lv_obj_t * list, uint16_t anim_time) -{ - lv_page_set_anim_time(list, anim_time); -} - -/** - * Set a style of a list - * @param list pointer to a list object - * @param type which style should be set - * @param style pointer to a style - */ -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 - *====================*/ - -/** - * Get single button selected mode. - * @param list pointer to the currently pressed list object. - */ -bool lv_list_get_single_mode(lv_obj_t * list); - -/** - * Get the text of a list element - * @param btn pointer to list element - * @return pointer to the text - */ -const char * lv_list_get_btn_text(const lv_obj_t * btn); -/** - * Get the label object from a list element - * @param btn pointer to a list element (button) - * @return pointer to the label from the list element or NULL if not found - */ -lv_obj_t * lv_list_get_btn_label(const lv_obj_t * btn); - -/** - * Get the image object from a list element - * @param btn pointer to a list element (button) - * @return pointer to the image from the list element or NULL if not found - */ -lv_obj_t * lv_list_get_btn_img(const lv_obj_t * btn); - -/** - * Get the next button from list. (Starts from the bottom button) - * @param list pointer to a list object - * @param prev_btn pointer to button. Search the next after it. - * @return pointer to the next button or NULL when no more buttons - */ -lv_obj_t * lv_list_get_prev_btn(const lv_obj_t * list, lv_obj_t * prev_btn); - -/** - * Get the previous button from list. (Starts from the top button) - * @param list pointer to a list object - * @param prev_btn pointer to button. Search the previous before it. - * @return pointer to the previous button or NULL when no more buttons - */ -lv_obj_t * lv_list_get_next_btn(const lv_obj_t * list, lv_obj_t * prev_btn); - -/** - * Get the index of the button in the list - * @param list pointer to a list object. If NULL, assumes btn is part of a list. - * @param btn pointer to a list element (button) - * @return the index of the button in the list, or -1 of the button not in this list - */ -int32_t lv_list_get_btn_index(const lv_obj_t * list, const lv_obj_t * btn); - -/** - * Get the number of buttons in the list - * @param list pointer to a list object - * @return the number of buttons in the list - */ -uint16_t lv_list_get_size(const lv_obj_t * list); - -#if LV_USE_GROUP -/** - * Get the currently selected button. Can be used while navigating in the list with a keypad. - * @param list pointer to a list object - * @return pointer to the selected button - */ -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 - * @return scrollbar mode from 'lv_page_sb_mode_t' enum - */ -static inline lv_sb_mode_t lv_list_get_sb_mode(const lv_obj_t * list) -{ - return lv_page_get_sb_mode(list); -} - -/** - * Get the scroll propagation property - * @param list pointer to a List - * @return true or false - */ -static inline bool lv_list_get_scroll_propagation(lv_obj_t * list) -{ - return lv_page_get_scroll_propagation(list); -} - -/** - * Get the scroll propagation property - * @param list pointer to a List - * @return true or false - */ -static inline bool lv_list_get_edge_flash(lv_obj_t * list) -{ - return lv_page_get_edge_flash(list); -} - -/** - * Get scroll animation duration - * @param list pointer to a list object - * @return duration of animation [ms] - */ -static inline uint16_t lv_list_get_anim_time(const lv_obj_t * list) -{ - return lv_page_get_anim_time(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); - -/*===================== - * Other functions - *====================*/ - -/** - * Move the list elements up by one - * @param list pointer a to list object - */ -void lv_list_up(const lv_obj_t * list); -/** - * Move the list elements down by one - * @param list pointer to a list object - */ -void lv_list_down(const lv_obj_t * list); - -/** - * Focus on a list button. It ensures that the button will be visible on the list. - * @param btn pointer to a list button to focus - * @param anim LV_ANOM_ON: scroll with animation, LV_ANIM_OFF: without animation - */ -void lv_list_focus(const lv_obj_t * btn, lv_anim_enable_t anim); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LIST*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_LIST_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_lmeter.c b/src/libs/lvgl/src/lv_objx/lv_lmeter.c deleted file mode 100644 index d1f21014..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_lmeter.c +++ /dev/null @@ -1,422 +0,0 @@ -/** - * @file lv_lmeter.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" -#include "../lv_misc/lv_math.h" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_lmeter" - -#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) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_lmeter_design(lv_obj_t * lmeter, const lv_area_t * mask, 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 - **********************/ -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a line meter objects - * @param par pointer to an object, it will be the parent of the new line meter - * @param copy pointer to a line meter object, if not NULL then the new object will be copied from - * it - * @return pointer to the created line meter - */ -lv_obj_t * lv_lmeter_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("line meter create started"); - - /*Create the ancestor of line meter*/ - lv_obj_t * new_lmeter = lv_obj_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - /*Initialize the allocated 'ext' */ - ext->min_value = 0; - ext->max_value = 100; - 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); - lv_obj_set_design_cb(new_lmeter, lv_lmeter_design); - - /*Init the new line meter line meter*/ - if(copy == NULL) { - lv_obj_set_size(new_lmeter, LV_DPI, LV_DPI); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_lmeter_set_style(new_lmeter, LV_LMETER_STYLE_MAIN, th->style.lmeter); - } else { - lv_lmeter_set_style(new_lmeter, LV_LMETER_STYLE_MAIN, &lv_style_pretty_color); - } - } - /*Copy an existing line meter*/ - else { - lv_lmeter_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->scale_angle = copy_ext->scale_angle; - ext->line_cnt = copy_ext->line_cnt; - ext->min_value = copy_ext->min_value; - ext->max_value = copy_ext->max_value; - ext->cur_value = copy_ext->cur_value; - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_lmeter); - } - - LV_LOG_INFO("line meter created"); - - return new_lmeter; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new value on the line meter - * @param lmeter pointer to a line meter object - * @param value new value - */ -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; - - ext->cur_value = value > ext->max_value ? ext->max_value : value; - ext->cur_value = ext->cur_value < ext->min_value ? ext->min_value : ext->cur_value; - lv_obj_invalidate(lmeter); -} - -/** - * Set minimum and the maximum values of a line meter - * @param lmeter pointer to he line meter object - * @param min minimum value - * @param max maximum 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; - - ext->max_value = max; - ext->min_value = min; - if(ext->cur_value > max) { - ext->cur_value = max; - lv_lmeter_set_value(lmeter, ext->cur_value); - } - if(ext->cur_value < min) { - ext->cur_value = min; - lv_lmeter_set_value(lmeter, ext->cur_value); - } - lv_obj_invalidate(lmeter); -} - -/** - * Set the scale settings of a line meter - * @param lmeter pointer to a line meter object - * @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, 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; - - ext->scale_angle = angle; - ext->line_cnt = 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 - *====================*/ - -/** - * Get the value of a line meter - * @param lmeter pointer to a line meter object - * @return the value of the line meter - */ -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; -} - -/** - * Get the minimum value of a line meter - * @param lmeter pointer to a line meter object - * @return the minimum value of the line meter - */ -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; -} - -/** - * Get the maximum value of a line meter - * @param lmeter pointer to a line meter object - * @return the maximum value of the line meter - */ -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; -} - -/** - * Get the scale number of a line meter - * @param lmeter pointer to a line meter object - * @return number of the scale units - */ -uint16_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; -} - -/** - * Get the scale angle of a line meter - * @param lmeter pointer to a line meter object - * @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 - **********************/ - -/** - * 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 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' - */ -static bool lv_lmeter_design(lv_obj_t * lmeter, const lv_area_t * mask, 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; - } - /*Draw the object*/ - else if(mode == LV_DESIGN_DRAW_MAIN) { - lv_lmeter_ext_t * ext = lv_obj_get_ext_attr(lmeter); - const lv_style_t * style = lv_obj_get_style(lmeter); - lv_opa_t opa_scale = lv_obj_get_opa_scale(lmeter); - lv_style_t style_tmp; - lv_style_copy(&style_tmp, style); - -#if LV_USE_GROUP - lv_group_t * g = lv_obj_get_group(lmeter); - if(lv_group_get_focused(g) == lmeter) { - style_tmp.line.width += 1; - } -#endif - - lv_coord_t r_out = lv_obj_get_width(lmeter) / 2; - lv_coord_t r_in = r_out - style->body.padding.left; - if(r_in < 1) r_in = 1; - - 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 = 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; - - /*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); - - lv_point_t p1; - lv_point_t p2; - - p2.x = x_in + x_ofs; - p2.y = y_in + y_ofs; - - p1.x = x_out + x_ofs; - p1.y = y_out + y_ofs; - - if(i >= level) - style_tmp.line.color = style->line.color; - else { - style_tmp.line.color = - 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); - } - - } - /*Post draw when the children are drawn*/ - else if(mode == LV_DESIGN_DRAW_POST) { - } - - return true; -} - -/** - * Signal function of the line meter - * @param lmeter pointer to a line meter 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_lmeter_signal(lv_obj_t * lmeter, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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')*/ - } else if(sign == LV_SIGNAL_STYLE_CHG) { - lv_obj_refresh_ext_draw_pad(lmeter); - } 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); - } - - return res; -} - -/** - * Round a coordinate which is upscaled (>=x.5 -> x + 1; <x.5 -> 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/libs/lvgl/src/lv_objx/lv_lmeter.h b/src/libs/lvgl/src/lv_objx/lv_lmeter.h deleted file mode 100644 index 6deac8ce..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_lmeter.h +++ /dev/null @@ -1,179 +0,0 @@ -/** - * @file lv_lmeter.h - * - */ - -#ifndef LV_LMETER_H -#define LV_LMETER_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_LMETER != 0 - -#include "../lv_core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -/*Data of line meter*/ -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)*/ - uint16_t angle_ofs; - uint16_t line_cnt; /*Count of lines */ - int16_t cur_value; - int16_t min_value; - int16_t max_value; -} lv_lmeter_ext_t; - -/*Styles*/ -enum { - LV_LMETER_STYLE_MAIN, -}; -typedef uint8_t lv_lmeter_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a line meter objects - * @param par pointer to an object, it will be the parent of the new line meter - * @param copy pointer to a line meter object, if not NULL then the new object will be copied from - * it - * @return pointer to the created line meter - */ -lv_obj_t * lv_lmeter_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new value on the line meter - * @param lmeter pointer to a line meter object - * @param value new value - */ -void lv_lmeter_set_value(lv_obj_t * lmeter, int16_t value); - -/** - * Set minimum and the maximum values of a line meter - * @param lmeter pointer to he line meter object - * @param min minimum value - * @param max maximum value - */ -void lv_lmeter_set_range(lv_obj_t * lmeter, int16_t min, int16_t max); - -/** - * Set the scale settings of a line meter - * @param lmeter pointer to a line meter object - * @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, 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 - * @param lmeter pointer to a line meter object - * @param type which style should be set (can be only `LV_LMETER_STYLE_MAIN`) - * @param style set the style of the line meter - */ -static inline void lv_lmeter_set_style(lv_obj_t * lmeter, lv_lmeter_style_t type, lv_style_t * style) -{ - (void)type; /*Unused*/ - lv_obj_set_style(lmeter, style); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the value of a line meter - * @param lmeter pointer to a line meter object - * @return the value of the line meter - */ -int16_t lv_lmeter_get_value(const lv_obj_t * lmeter); - -/** - * Get the minimum value of a line meter - * @param lmeter pointer to a line meter object - * @return the minimum value of the line meter - */ -int16_t lv_lmeter_get_min_value(const lv_obj_t * lmeter); - -/** - * Get the maximum value of a line meter - * @param lmeter pointer to a line meter object - * @return the maximum value of the line meter - */ -int16_t lv_lmeter_get_max_value(const lv_obj_t * lmeter); - -/** - * Get the scale number of a line meter - * @param lmeter pointer to a line meter object - * @return number of the scale units - */ -uint16_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 - */ -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 - * @param type which style should be get (can be only `LV_LMETER_STYLE_MAIN`) - * @return pointer to the line meter's style - */ -static inline const lv_style_t * lv_lmeter_get_style(const lv_obj_t * lmeter, lv_lmeter_style_t type) -{ - (void)type; /*Unused*/ - return lv_obj_get_style(lmeter); -} - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_LMETER*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_LMETER_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_mbox.c b/src/libs/lvgl/src/lv_objx/lv_mbox.c deleted file mode 100644 index f56904cb..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_mbox.c +++ /dev/null @@ -1,573 +0,0 @@ -/** - * @file lv_mbox.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" -#include "../lv_misc/lv_math.h" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_mbos" - -#if LV_USE_ANIMATION -#ifndef LV_MBOX_CLOSE_ANIM_TIME -#define LV_MBOX_CLOSE_ANIM_TIME 200 /*List close animation time) */ -#endif -#else -#undef LV_MBOX_CLOSE_ANIM_TIME -#define LV_MBOX_CLOSE_ANIM_TIME 0 /*No animations*/ -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_res_t lv_mbox_signal(lv_obj_t * mbox, lv_signal_t sign, void * param); -static void mbox_realign(lv_obj_t * mbox); -#if LV_USE_ANIMATION -static void lv_mbox_close_ready_cb(lv_anim_t * a); -#endif -static void lv_mbox_default_event_cb(lv_obj_t * mbox, lv_event_t event); -static void lv_mbox_btnm_event_cb(lv_obj_t * btnm, lv_event_t event); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a message box objects - * @param par pointer to an object, it will be the parent of the new message box - * @param copy pointer to a message box object, if not NULL then the new object will be copied from - * it - * @return pointer to the created message box - */ -lv_obj_t * lv_mbox_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("mesasge box create started"); - - /*Create the ancestor message box*/ - lv_obj_t * new_mbox = lv_cont_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - ext->text = NULL; - ext->btnm = NULL; -#if LV_USE_ANIMATION - ext->anim_time = LV_MBOX_CLOSE_ANIM_TIME; -#endif - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_mbox, lv_mbox_signal); - - /*Init the new message box message box*/ - if(copy == NULL) { - ext->text = lv_label_create(new_mbox, NULL); - lv_label_set_align(ext->text, LV_LABEL_ALIGN_CENTER); - lv_label_set_long_mode(ext->text, LV_LABEL_LONG_BREAK); - lv_label_set_text(ext->text, "Message"); - - lv_cont_set_layout(new_mbox, LV_LAYOUT_COL_M); - lv_cont_set_fit2(new_mbox, LV_FIT_NONE, LV_FIT_TIGHT); - lv_obj_set_width(new_mbox, LV_DPI * 2); - lv_obj_align(new_mbox, NULL, LV_ALIGN_CENTER, 0, 0); - lv_obj_set_event_cb(new_mbox, lv_mbox_default_event_cb); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_mbox_set_style(new_mbox, LV_MBOX_STYLE_BG, th->style.mbox.bg); - } else { - lv_mbox_set_style(new_mbox, LV_MBOX_STYLE_BG, &lv_style_pretty); - } - - } - /*Copy an existing message box*/ - else { - lv_mbox_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - - ext->text = lv_label_create(new_mbox, copy_ext->text); - - /*Copy the buttons and the label on them*/ - if(copy_ext->btnm) ext->btnm = lv_btnm_create(new_mbox, copy_ext->btnm); - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_mbox); - } - - LV_LOG_INFO("mesasge box created"); - - return new_mbox; -} - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Add button to the message box - * @param mbox pointer to message box object - * @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[]) -{ - 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*/ - if(ext->btnm == NULL) { - ext->btnm = lv_btnm_create(mbox, NULL); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_mbox_set_style(mbox, LV_MBOX_STYLE_BTN_BG, th->style.mbox.btn.bg); - lv_mbox_set_style(mbox, LV_MBOX_STYLE_BTN_REL, th->style.mbox.btn.rel); - lv_mbox_set_style(mbox, LV_MBOX_STYLE_BTN_PR, th->style.mbox.btn.pr); - } else { - lv_btnm_set_style(ext->btnm, LV_BTNM_STYLE_BG, &lv_style_transp_fit); - } - } - - lv_btnm_set_map(ext->btnm, btn_map); - lv_btnm_set_btn_ctrl_all(ext->btnm, LV_BTNM_CTRL_CLICK_TRIG | LV_BTNM_CTRL_NO_REPEAT); - lv_obj_set_event_cb(ext->btnm, lv_mbox_btnm_event_cb); - - mbox_realign(mbox); -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the text of the message box - * @param mbox pointer to a message box - * @param txt a '\0' terminated character string which will be the message box text - */ -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); - - mbox_realign(mbox); -} - -/** - * Set animation duration - * @param mbox pointer to a message box object - * @param anim_time animation length in milliseconds (0: no animation) - */ -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; - ext->anim_time = anim_time; -#else - (void)mbox; - (void)anim_time; -#endif -} - -/** - * Automatically delete the message box after a given time - * @param mbox pointer to a message box object - * @param delay a time (in milliseconds) to wait before delete the message box - */ -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*/ - lv_anim_t a; - a.var = mbox; - a.start = lv_obj_get_height(mbox); - a.end = 0; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_height; - a.path_cb = lv_anim_path_linear; - a.ready_cb = NULL; - a.act_time = -delay; - a.time = lv_mbox_get_anim_time(mbox); - a.playback = 0; - a.playback_pause = 0; - a.repeat = 0; - a.repeat_pause = 0; - lv_anim_create(&a); - - a.start = lv_obj_get_width(mbox); - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_width; - a.ready_cb = lv_mbox_close_ready_cb; - lv_anim_create(&a); - - /*Disable fit to let shrinking work*/ - lv_cont_set_fit(mbox, LV_FIT_NONE); - } else { - /*Create an animation to delete the mbox `delay` ms later*/ - lv_anim_t a; - a.var = mbox; - a.start = 0; - a.end = 1; - a.exec_cb = (lv_anim_exec_xcb_t)NULL; - a.path_cb = lv_anim_path_linear; - a.ready_cb = lv_mbox_close_ready_cb; - a.act_time = -delay; - a.time = 0; - a.playback = 0; - a.playback_pause = 0; - a.repeat = 0; - a.repeat_pause = 0; - lv_anim_create(&a); - } -#else - (void)delay; /*Unused*/ - lv_obj_del(mbox); -#endif -} - -/** - * Stop the auto. closing of message box - * @param mbox pointer to a message box object - */ -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 - (void)mbox; /*Unused*/ -#endif -} - -/** - * Set a style of a message box - * @param mbox pointer to a message box object - * @param type which style should be set - * @param style pointer to a style - */ -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) { - case LV_MBOX_STYLE_BG: lv_obj_set_style(mbox, style); break; - case LV_MBOX_STYLE_BTN_BG: lv_btnm_set_style(ext->btnm, LV_BTNM_STYLE_BG, style); break; - case LV_MBOX_STYLE_BTN_REL: lv_btnm_set_style(ext->btnm, LV_BTNM_STYLE_BTN_REL, style); break; - case LV_MBOX_STYLE_BTN_PR: lv_btnm_set_style(ext->btnm, LV_BTNM_STYLE_BTN_PR, style); break; - case LV_MBOX_STYLE_BTN_TGL_REL: lv_btnm_set_style(ext->btnm, LV_BTNM_STYLE_BTN_TGL_REL, style); break; - case LV_MBOX_STYLE_BTN_TGL_PR: lv_btnm_set_style(ext->btnm, LV_BTNM_STYLE_BTN_TGL_PR, style); break; - case LV_MBOX_STYLE_BTN_INA: lv_btnm_set_style(ext->btnm, LV_BTNM_STYLE_BTN_INA, style); break; - } - - mbox_realign(mbox); -} - -/** - * Set whether recoloring is enabled - * @param btnm pointer to button matrix object - * @param en whether recoloring is enabled - */ -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); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the text of the message box - * @param mbox pointer to a message box object - * @return pointer to the text of the message box - */ -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); -} - -/** - * Get the index of the lastly "activated" button by the user (pressed, released etc) - * Useful in the the `event_cb`. - * @param btnm pointer to button matrix object - * @return index of the last released button (LV_BTNM_BTN_NONE: if unset) - */ -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); - else - return LV_BTNM_BTN_NONE; -} - -/** - * Get the text of the lastly "activated" button by the user (pressed, released etc) - * Useful in the the `event_cb`. - * @param btnm pointer to button matrix object - * @return text of the last released button (NULL: if unset) - */ -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); - else - return NULL; -} - -/** - * Get the animation duration (close animation time) - * @param mbox pointer to a message box object - * @return animation length in milliseconds (0: no animation) - */ -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; -#else - (void)mbox; - return 0; -#endif -} - -/** - * Get a style of a message box - * @param mbox pointer to a message box object - * @param type which style should be get - * @return style pointer to a style - */ -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); - - switch(type) { - case LV_MBOX_STYLE_BG: style = lv_obj_get_style(mbox); break; - case LV_MBOX_STYLE_BTN_BG: style = lv_btnm_get_style(ext->btnm, LV_BTNM_STYLE_BG); break; - case LV_MBOX_STYLE_BTN_REL: style = lv_btnm_get_style(ext->btnm, LV_BTNM_STYLE_BTN_REL); break; - case LV_MBOX_STYLE_BTN_PR: style = lv_btnm_get_style(ext->btnm, LV_BTNM_STYLE_BTN_PR); break; - case LV_MBOX_STYLE_BTN_TGL_REL: style = lv_btnm_get_style(ext->btnm, LV_BTNM_STYLE_BTN_TGL_REL); break; - case LV_MBOX_STYLE_BTN_TGL_PR: style = lv_btnm_get_style(ext->btnm, LV_BTNM_STYLE_BTN_TGL_PR); break; - case LV_MBOX_STYLE_BTN_INA: style = lv_btnm_get_style(ext->btnm, LV_BTNM_STYLE_BTN_INA); break; - default: style = NULL; break; - } - - return style; -} - -/** - * Get whether recoloring is enabled - * @param mbox pointer to a message box object - * @return whether recoloring is enabled - */ -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; - - return lv_btnm_get_recolor(ext->btnm); -} - -/** - * Get message box button matrix - * @param mbox pointer to a message box object - * @return pointer to button matrix object - * @remarks return value will be NULL unless `lv_mbox_add_btns` has been already called - */ -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; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Signal function of the message box - * @param mbox pointer to a message box 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_mbox_signal(lv_obj_t * mbox, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /*Translate LV_KEY_UP/DOWN to LV_KEY_LEFT/RIGHT */ - char c_trans = 0; - if(sign == LV_SIGNAL_CONTROL) { - c_trans = *((char *)param); - if(c_trans == LV_KEY_DOWN) c_trans = LV_KEY_LEFT; - if(c_trans == LV_KEY_UP) c_trans = LV_KEY_RIGHT; - - param = &c_trans; - } - - /* 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) { - if(lv_obj_get_width(mbox) != lv_area_get_width(param)) { - mbox_realign(mbox); - } - } else if(sign == LV_SIGNAL_STYLE_CHG) { - mbox_realign(mbox); - } else if(sign == LV_SIGNAL_RELEASED) { - if(ext->btnm) { - uint32_t btn_id = lv_btnm_get_active_btn(ext->btnm); - if(btn_id != LV_BTNM_BTN_NONE) lv_event_send(mbox, LV_EVENT_VALUE_CHANGED, &btn_id); - } - } else if(sign == LV_SIGNAL_FOCUS || sign == LV_SIGNAL_DEFOCUS || sign == LV_SIGNAL_CONTROL || - sign == LV_SIGNAL_GET_EDITABLE) { - if(ext->btnm) { - ext->btnm->signal_cb(ext->btnm, sign, param); - } - - /* The button matrix with ENCODER input supposes it's in a group but in this case it isn't - * (Only the message box's container) So so some actions here instead*/ - if(sign == LV_SIGNAL_FOCUS) { -#if LV_USE_GROUP - 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_ENCODER) { - /*In navigation mode don't select any button but in edit mode select the fist*/ - lv_btnm_ext_t * btnm_ext = lv_obj_get_ext_attr(ext->btnm); - if(lv_group_get_editing(lv_obj_get_group(mbox))) - btnm_ext->btn_id_pr = 0; - else - btnm_ext->btn_id_pr = LV_BTNM_BTN_NONE; - } -#endif - } - } - - return res; -} - -/** - * Resize the button holder to fit - * @param mbox pointer to message box object - */ -static void mbox_realign(lv_obj_t * mbox) -{ - lv_mbox_ext_t * ext = lv_obj_get_ext_attr(mbox); - - const lv_style_t * style = lv_mbox_get_style(mbox, LV_MBOX_STYLE_BG); - lv_coord_t w = lv_obj_get_width(mbox) - style->body.padding.left - style->body.padding.right; - - if(ext->text) { - lv_obj_set_width(ext->text, w); - } - - if(ext->btnm) { - const lv_style_t * btn_bg_style = lv_mbox_get_style(mbox, LV_MBOX_STYLE_BTN_BG); - const lv_style_t * btn_rel_style = lv_mbox_get_style(mbox, LV_MBOX_STYLE_BTN_REL); - lv_coord_t font_h = lv_font_get_line_height(btn_rel_style->text.font); - lv_obj_set_size(ext->btnm, w, - font_h + btn_rel_style->body.padding.top + btn_rel_style->body.padding.bottom + - btn_bg_style->body.padding.top + btn_bg_style->body.padding.bottom); - } -} - -#if LV_USE_ANIMATION -static void lv_mbox_close_ready_cb(lv_anim_t * a) -{ - lv_obj_del(a->var); -} -#endif - -static void lv_mbox_default_event_cb(lv_obj_t * mbox, lv_event_t event) -{ - if(event != LV_EVENT_VALUE_CHANGED) return; - - uint32_t btn_id = lv_mbox_get_active_btn(mbox); - if(btn_id == LV_BTNM_BTN_NONE) return; - - lv_mbox_start_auto_close(mbox, 0); -} - -static void lv_mbox_btnm_event_cb(lv_obj_t * btnm, lv_event_t event) -{ - lv_obj_t * mbox = lv_obj_get_parent(btnm); - - /*clang-format off*/ - if(event == LV_EVENT_PRESSED || event == LV_EVENT_PRESSING || event == LV_EVENT_PRESS_LOST || - event == LV_EVENT_RELEASED || event == LV_EVENT_SHORT_CLICKED || event == LV_EVENT_CLICKED || - event == LV_EVENT_LONG_PRESSED || event == LV_EVENT_LONG_PRESSED_REPEAT || - event == LV_EVENT_VALUE_CHANGED) { - lv_event_send(mbox, event, lv_event_get_data()); - } - /*clang-format on*/ -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_mbox.h b/src/libs/lvgl/src/lv_objx/lv_mbox.h deleted file mode 100644 index 2068b373..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_mbox.h +++ /dev/null @@ -1,212 +0,0 @@ -/** - * @file lv_mbox.h - * - */ - -#ifndef LV_MBOX_H -#define LV_MBOX_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_MBOX != 0 - -/*Testing of dependencies*/ -#if LV_USE_CONT == 0 -#error "lv_mbox: lv_cont is required. Enable it in lv_conf.h (LV_USE_CONT 1) " -#endif - -#if LV_USE_BTNM == 0 -#error "lv_mbox: lv_btnm is required. Enable it in lv_conf.h (LV_USE_BTNM 1) " -#endif - -#if LV_USE_LABEL == 0 -#error "lv_mbox: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "lv_cont.h" -#include "lv_btnm.h" -#include "lv_label.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*Data of message box*/ -typedef struct -{ - lv_cont_ext_t bg; /*Ext. of ancestor*/ - /*New data for this type */ - lv_obj_t * text; /*Text of the message box*/ - lv_obj_t * btnm; /*Button matrix for the buttons*/ -#if LV_USE_ANIMATION - uint16_t anim_time; /*Duration of close animation [ms] (0: no animation)*/ -#endif -} lv_mbox_ext_t; - -/** Message box styles. */ -enum { - LV_MBOX_STYLE_BG, - LV_MBOX_STYLE_BTN_BG, /**< Same meaning as ordinary button styles. */ - LV_MBOX_STYLE_BTN_REL, - LV_MBOX_STYLE_BTN_PR, - LV_MBOX_STYLE_BTN_TGL_REL, - LV_MBOX_STYLE_BTN_TGL_PR, - LV_MBOX_STYLE_BTN_INA, -}; -typedef uint8_t lv_mbox_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a message box objects - * @param par pointer to an object, it will be the parent of the new message box - * @param copy pointer to a message box object, if not NULL then the new object will be copied from - * it - * @return pointer to the created message box - */ -lv_obj_t * lv_mbox_create(lv_obj_t * par, const lv_obj_t * copy); - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Add button to the message box - * @param mbox pointer to message box object - * @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[]); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the text of the message box - * @param mbox pointer to a message box - * @param txt a '\0' terminated character string which will be the message box text - */ -void lv_mbox_set_text(lv_obj_t * mbox, const char * txt); - -/** - * Set animation duration - * @param mbox pointer to a message box object - * @param anim_time animation length in milliseconds (0: no animation) - */ -void lv_mbox_set_anim_time(lv_obj_t * mbox, uint16_t anim_time); - -/** - * Automatically delete the message box after a given time - * @param mbox pointer to a message box object - * @param delay a time (in milliseconds) to wait before delete the message box - */ -void lv_mbox_start_auto_close(lv_obj_t * mbox, uint16_t delay); - -/** - * Stop the auto. closing of message box - * @param mbox pointer to a message box object - */ -void lv_mbox_stop_auto_close(lv_obj_t * mbox); - -/** - * Set a style of a message box - * @param mbox pointer to a message box object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_mbox_set_style(lv_obj_t * mbox, lv_mbox_style_t type, const lv_style_t * style); - -/** - * Set whether recoloring is enabled. Must be called after `lv_mbox_add_btns`. - * @param btnm pointer to button matrix object - * @param en whether recoloring is enabled - */ -void lv_mbox_set_recolor(lv_obj_t * mbox, bool en); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the text of the message box - * @param mbox pointer to a message box object - * @return pointer to the text of the message box - */ -const char * lv_mbox_get_text(const lv_obj_t * mbox); - -/** - * Get the index of the lastly "activated" button by the user (pressed, released etc) - * Useful in the the `event_cb`. - * @param btnm pointer to button matrix object - * @return index of the last released button (LV_BTNM_BTN_NONE: if unset) - */ -uint16_t lv_mbox_get_active_btn(lv_obj_t * mbox); - -/** - * Get the text of the lastly "activated" button by the user (pressed, released etc) - * Useful in the the `event_cb`. - * @param btnm pointer to button matrix object - * @return text of the last released button (NULL: if unset) - */ -const char * lv_mbox_get_active_btn_text(lv_obj_t * mbox); - -/** - * Get the animation duration (close animation time) - * @param mbox pointer to a message box object - * @return animation length in milliseconds (0: no animation) - */ -uint16_t lv_mbox_get_anim_time(const lv_obj_t * mbox); - -/** - * Get a style of a message box - * @param mbox pointer to a message box object - * @param type which style should be get - * @return style pointer to a style - */ -const lv_style_t * lv_mbox_get_style(const lv_obj_t * mbox, lv_mbox_style_t type); - -/** - * Get whether recoloring is enabled - * @param mbox pointer to a message box object - * @return whether recoloring is enabled - */ -bool lv_mbox_get_recolor(const lv_obj_t * mbox); - -/** - * Get message box button matrix - * @param mbox pointer to a message box object - * @return pointer to button matrix object - * @remarks return value will be NULL unless `lv_mbox_add_btns` has been already called - */ -lv_obj_t * lv_mbox_get_btnm(lv_obj_t * mbox); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_MBOX*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_MBOX_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_objx.mk b/src/libs/lvgl/src/lv_objx/lv_objx.mk deleted file mode 100644 index fde2ac77..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_objx.mk +++ /dev/null @@ -1,37 +0,0 @@ -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 -CSRCS += lv_mbox.c -CSRCS += lv_preload.c -CSRCS += lv_roller.c -CSRCS += lv_table.c -CSRCS += lv_tabview.c -CSRCS += lv_tileview.c -CSRCS += lv_btn.c -CSRCS += lv_calendar.c -CSRCS += lv_chart.c -CSRCS += lv_canvas.c -CSRCS += lv_gauge.c -CSRCS += lv_label.c -CSRCS += lv_list.c -CSRCS += lv_slider.c -CSRCS += lv_ta.c -CSRCS += lv_spinbox.c -CSRCS += lv_btnm.c -CSRCS += lv_cont.c -CSRCS += lv_img.c -CSRCS += lv_imgbtn.c -CSRCS += lv_led.c -CSRCS += lv_lmeter.c -CSRCS += lv_page.c -CSRCS += lv_sw.c -CSRCS += lv_win.c - -DEPPATH += --dep-path $(LVGL_DIR)/lvgl/src/lv_objx -VPATH += :$(LVGL_DIR)/lvgl/src/lv_objx - -CFLAGS += "-I$(LVGL_DIR)/lvgl/src/lv_objx" diff --git a/src/libs/lvgl/src/lv_objx/lv_objx_templ.c b/src/libs/lvgl/src/lv_objx/lv_objx_templ.c deleted file mode 100644 index d23dcb46..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_objx_templ.c +++ /dev/null @@ -1,229 +0,0 @@ -/** - * @file lv_templ.c - * - */ - -/* TODO Remove these instructions - * Search an replace: template -> object normal name with lower case (e.g. button, label etc.) - * templ -> object short name with lower case(e.g. btn, label etc) - * TEMPL -> object short name with upper case (e.g. BTN, LABEL etc.) - * - * You can remove the defined() clause from the #if statement below. This exists because - * LV_USE_TEMPL is not in lv_conf.h or lv_conf_templ.h by default. - */ - -/********************* - * INCLUDES - *********************/ -#include "../lv_core/lv_debug.h" -//#include "lv_templ.h" /*TODO uncomment this*/ - -#if defined(LV_USE_TEMPL) && LV_USE_TEMPL != 0 - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_templ" - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_templ_design(lv_obj_t * templ, const lv_area_t * mask, 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; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a template object - * @param par pointer to an object, it will be the parent of the new template - * @param copy pointer to a template object, if not NULL then the new object will be copied from it - * @return pointer to the created template - */ -lv_obj_t * lv_templ_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("template create started"); - - /*Create the ancestor of template*/ - /*TODO modify it to the ancestor create function */ - lv_obj_t * new_templ = lv_ANCESTOR_create(par, copy); - lv_mem_assert(new_templ); - if(new_templ == NULL) return NULL; - - /*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); - - /*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); - - /*Init the new template template*/ - if(copy == NULL) { - - } - /*Copy an existing template*/ - else { - lv_templ_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_templ); - } - - LV_LOG_INFO("template created"); - - return new_templ; -} - -/*====================== - * Add/remove functions - *=====================*/ - -/* - * New object specific "add" or "remove" functions come here - */ - -/*===================== - * Setter functions - *====================*/ - -/* - * New object specific "set" functions come here - */ - -/** - * Set a style of a template. - * @param templ pointer to template object - * @param type which style should be set - * @param style pointer to a style - */ -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) { - case LV_TEMPL_STYLE_X: break; - case LV_TEMPL_STYLE_Y: break; - } -} - -/*===================== - * Getter functions - *====================*/ - -/* - * New object specific "get" functions come here - */ - -/** - * Get style of a template. - * @param templ pointer to template object - * @param type which style should be get - * @return style pointer to the 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; - - switch(type) { - case LV_TEMPL_STYLE_X: style = NULL; /*Replace NULL with a pointer to the style*/ - case LV_TEMPL_STYLE_Y: style = NULL; /*Replace NULL with a pointer to the style*/ - default: style = NULL; - } - - return style; -} - -/*===================== - * Other functions - *====================*/ - -/* - * New object specific "other" functions come here - */ - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Handle the drawing related tasks of the templates - * @param templ 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 - * @param return true/false, depends on 'mode' - */ -static bool lv_templ_design(lv_obj_t * templ, const lv_area_t * mask, 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; - } - /*Draw the object*/ - else if(mode == LV_DESIGN_DRAW_MAIN) { - - } - /*Post draw when the children are drawn*/ - else if(mode == LV_DESIGN_DRAW_POST) { - } - - return true; -} - -/** - * Signal function of the template - * @param templ pointer to a template 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_templ_signal(lv_obj_t * templ, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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')*/ - } - - return res; -} - -#else /* Enable this file at the top */ - -/* This dummy typedef exists purely to silence -Wpedantic. */ -typedef int keep_pedantic_happy; -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_objx_templ.h b/src/libs/lvgl/src/lv_objx/lv_objx_templ.h deleted file mode 100644 index 82918253..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_objx_templ.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @file lv_templ.h - * - */ - -/* TODO Remove these instructions - * Search an replace: template -> object normal name with lower case (e.g. button, label etc.) - * templ -> object short name with lower case(e.g. btn, label etc) - * TEMPL -> object short name with upper case (e.g. BTN, LABEL etc.) - * - */ - -#ifndef LV_TEMPL_H -#define LV_TEMPL_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_TEMPL != 0 - -#include "../lv_core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -/*Data of template*/ -typedef struct -{ - lv_ANCESTOR_ext_t ANCESTOR; /*Ext. of ancestor*/ - /*New data for this type */ -} lv_templ_ext_t; - -/*Styles*/ -enum { - LV_TEMPL_STYLE_X, - LV_TEMPL_STYLE_Y, -}; -typedef uint8_t lv_templ_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a template objects - * @param par pointer to an object, it will be the parent of the new template - * @param copy pointer to a template object, if not NULL then the new object will be copied from it - * @return pointer to the created template - */ -lv_obj_t * lv_templ_create(lv_obj_t * par, const lv_obj_t * copy); - -/*====================== - * Add/remove functions - *=====================*/ - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a style of a template. - * @param templ pointer to template object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_templ_set_style(lv_obj_t * templ, lv_templ_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get style of a template. - * @param templ pointer to template object - * @param type which style should be get - * @return style pointer to the style - */ -lv_style_t * lv_templ_get_style(const lv_obj_t * templ, lv_templ_style_t type); - -/*===================== - * Other functions - *====================*/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_TEMPL*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_TEMPL_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_page.c b/src/libs/lvgl/src/lv_objx/lv_page.c deleted file mode 100644 index b39eab51..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_page.c +++ /dev/null @@ -1,1263 +0,0 @@ -/** - * @file lv_page.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" -#include "../lv_core/lv_refr.h" -#include "../lv_misc/lv_anim.h" -#include "../lv_misc/lv_math.h" - -/********************* - * 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`*/ -#define LV_PAGE_SCROLL_ANIM_TIME 200 - -#define LV_PAGE_END_FLASH_SIZE (LV_DPI / 4) -#define LV_PAGE_END_ANIM_TIME 300 -#define LV_PAGE_END_ANIM_WAIT_TIME 300 - -#if LV_USE_ANIMATION == 0 -#undef LV_PAGE_DEF_ANIM_TIME -#define LV_PAGE_DEF_ANIM_TIME 0 /*No animation*/ -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * 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_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); -#if LV_USE_ANIMATION -static void edge_flash_anim(void * page, lv_anim_value_t v); -static void edge_flash_anim_end(lv_anim_t * a); -#endif - -/********************** - * STATIC VARIABLES - **********************/ -static lv_design_cb_t ancestor_design; -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a page objects - * @param par pointer to an object, it will be the parent of the new page - * @param copy pointer to a page object, if not NULL then the new object will be copied from it - * @return pointer to the created page - */ -lv_obj_t * lv_page_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("page create started"); - - /*Create the ancestor object*/ - lv_obj_t * new_page = lv_cont_create(par, copy); - LV_ASSERT_MEM(new_page); - if(new_page == NULL) return NULL; - - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_page); - if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_page); - - /*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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - ext->scrl = NULL; - ext->sb.hor_draw = 0; - ext->sb.ver_draw = 0; - ext->sb.style = &lv_style_pretty; - ext->sb.mode = LV_SB_MODE_AUTO; -#if LV_USE_ANIMATION - ext->edge_flash.enabled = 0; - ext->edge_flash.bottom_ip = 0; - ext->edge_flash.top_ip = 0; - ext->edge_flash.left_ip = 0; - ext->edge_flash.right_ip = 0; - ext->edge_flash.state = 0; - ext->edge_flash.style = &lv_style_plain_color; - ext->anim_time = LV_PAGE_DEF_ANIM_TIME; -#endif - ext->scroll_prop = 0; - ext->scroll_prop_ip = 0; - - /*Init the new page object*/ - if(copy == NULL) { - ext->scrl = lv_cont_create(new_page, NULL); - lv_obj_set_signal_cb(ext->scrl, lv_page_scrollable_signal); - lv_obj_set_design_cb(ext->scrl, lv_scrl_design); - lv_obj_set_drag(ext->scrl, true); - lv_obj_set_drag_throw(ext->scrl, true); - lv_obj_set_protect(ext->scrl, LV_PROTECT_PARENT | LV_PROTECT_PRESS_LOST); - lv_cont_set_fit4(ext->scrl, LV_FIT_FILL, LV_FIT_FILL, LV_FIT_FILL, LV_FIT_FILL); - lv_obj_set_event_cb(ext->scrl, scrl_def_event_cb); /*Propagate some event to the background - object by default for convenience */ - - /* Add the signal function only if 'scrolling' is created - * because everything has to be ready before any signal is received*/ - lv_obj_set_signal_cb(new_page, lv_page_signal); - lv_obj_set_design_cb(new_page, lv_page_design); - - lv_page_set_sb_mode(new_page, ext->sb.mode); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - if(par == NULL) { /*Different styles if it is screen*/ - lv_page_set_style(new_page, LV_PAGE_STYLE_BG, th->style.bg); - lv_page_set_style(new_page, LV_PAGE_STYLE_SCRL, &lv_style_transp); - } else { - lv_page_set_style(new_page, LV_PAGE_STYLE_BG, th->style.page.bg); - lv_page_set_style(new_page, LV_PAGE_STYLE_SCRL, th->style.page.scrl); - } - lv_page_set_style(new_page, LV_PAGE_STYLE_SB, th->style.page.sb); - } else { - lv_page_set_style(new_page, LV_PAGE_STYLE_BG, &lv_style_pretty_color); - lv_page_set_style(new_page, LV_PAGE_STYLE_SCRL, &lv_style_pretty); - lv_page_set_style(new_page, LV_PAGE_STYLE_SB, &lv_style_pretty_color); - } - - } else { - lv_page_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->scrl = lv_cont_create(new_page, copy_ext->scrl); - lv_obj_set_signal_cb(ext->scrl, lv_page_scrollable_signal); - - /* Add the signal function only if 'scrolling' is created - * because everything has to be ready before any signal is received*/ - lv_obj_set_signal_cb(new_page, lv_page_signal); - lv_obj_set_design_cb(new_page, lv_page_design); - - lv_page_set_style(new_page, LV_PAGE_STYLE_BG, lv_page_get_style(copy, LV_PAGE_STYLE_BG)); - lv_page_set_style(new_page, LV_PAGE_STYLE_SCRL, lv_page_get_style(copy, LV_PAGE_STYLE_SCRL)); - lv_page_set_style(new_page, LV_PAGE_STYLE_SB, lv_page_get_style(copy, LV_PAGE_STYLE_SB)); - - lv_page_set_sb_mode(new_page, copy_ext->sb.mode); - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_page); - } - - lv_page_sb_refresh(new_page); - - LV_LOG_INFO("page created"); - - return new_page; -} - -/** - * Delete all children of the scrl object, without deleting scrl child. - * @param page pointer to an object - */ -void lv_page_clean(lv_obj_t * page) -{ - LV_ASSERT_OBJ(page, LV_OBJX_NAME); - - lv_obj_t * scrl = lv_page_get_scrl(page); - lv_obj_clean(scrl); -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the scroll bar mode on a page - * @param page pointer to a page object - * @param sb_mode the new mode from 'lv_page_sb.mode_t' enum - */ -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; - - if(sb_mode == LV_SB_MODE_HIDE) - ext->sb.mode |= LV_SB_MODE_HIDE; /*Set the hidden flag*/ - else if(sb_mode == LV_SB_MODE_UNHIDE) - ext->sb.mode &= (~LV_SB_MODE_HIDE); /*Clear the hidden flag*/ - else { - if(ext->sb.mode & LV_SB_MODE_HIDE) sb_mode |= LV_SB_MODE_HIDE; - ext->sb.mode = sb_mode; - } - - ext->sb.hor_draw = 0; - ext->sb.ver_draw = 0; - - lv_page_sb_refresh(page); - lv_obj_invalidate(page); -} - -/** - * Set the animation time for the page - * @param page pointer to a page object - * @param anim_time animation time in milliseconds - */ -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; -#else - (void)page; /*Unused*/ - (void)anim_time; /*Unused*/ -#endif -} - -/** - * Enable the scroll propagation feature. If enabled then the page will move its parent if there is - * no more space to scroll. - * @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); - ext->scroll_prop = en ? 1 : 0; -} - -/** - * Enable the edge flash effect. (Show an arc when the an edge is reached) - * @param page pointer to a Page - * @param en true or false to enable/disable end flash - */ -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; -#else - (void)page; - (void)en; -#endif -} - -/** - * Set a style of a page - * @param page pointer to a page object - * @param type which style should be set - * @param style pointer to a style - * */ -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) { - case LV_PAGE_STYLE_BG: lv_obj_set_style(page, style); break; - case LV_PAGE_STYLE_SCRL: lv_obj_set_style(ext->scrl, style); break; - case LV_PAGE_STYLE_SB: - ext->sb.style = style; - lv_area_set_height(&ext->sb.hor_area, ext->sb.style->body.padding.inner); - lv_area_set_width(&ext->sb.ver_area, ext->sb.style->body.padding.inner); - lv_page_sb_refresh(page); - lv_obj_refresh_ext_draw_pad(page); - lv_obj_invalidate(page); - break; -#if LV_USE_ANIMATION - case LV_PAGE_STYLE_EDGE_FLASH: ext->edge_flash.style = style; break; -#endif - } -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the scrollable object of a page - * @param page pointer to a page object - * @return pointer to a container which is the scrollable part of the page - */ -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; -} - -/** - * Get the animation time - * @param page pointer to a page object - * @return the animation time in milliseconds - */ -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; -#else - (void)page; /*Unused*/ - return 0; -#endif -} - -/** - * Set the scroll bar mode on a page - * @param page pointer to a page object - * @return the mode from 'lv_page_sb.mode_t' enum - */ -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; -} - -/** - * Get the scroll propagation property - * @param page pointer to a Page - * @return true or false - */ -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; -} - -/** - * Get the edge flash effect property. - * @param page pointer to a Page - * return true or false - */ -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; -#else - (void)page; - return false; -#endif -} - -/** - * Get that width which can be set to the children to still not cause overflow (show scrollbars) - * @param page pointer to a page object - * @return the width which still fits into the 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); - - return lv_obj_get_width(page) - bg_style->body.padding.left - bg_style->body.padding.right - - scrl_style->body.padding.left - scrl_style->body.padding.right; -} - -/** - * Get that height which can be set to the children to still not cause overflow (show scrollbars) - * @param page pointer to a page object - * @return the height which still fits into the 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); - - return lv_obj_get_height(page) - bg_style->body.padding.top - bg_style->body.padding.bottom - - scrl_style->body.padding.top - scrl_style->body.padding.bottom; -} - -/** - * Get a style of a page - * @param page pointer to page object - * @param type which style should be get - * @return style pointer to a style - * */ -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); - - switch(type) { - case LV_PAGE_STYLE_BG: style = lv_obj_get_style(page); break; - case LV_PAGE_STYLE_SCRL: style = lv_obj_get_style(ext->scrl); break; - case LV_PAGE_STYLE_SB: style = ext->sb.style; break; -#if LV_USE_ANIMATION - case LV_PAGE_STYLE_EDGE_FLASH: style = ext->edge_flash.style; break; -#endif - default: style = NULL; break; - } - - return style; -} - -/*===================== - * Other functions - *====================*/ - -/** - * Find whether the page has been scrolled to a certain edge. - * @param page Page object - * @param edge Edge to check - * @return true if the page is on the specified edge - */ -bool lv_page_on_edge(lv_obj_t * page, lv_page_edge_t edge) -{ - const lv_style_t * page_style = lv_obj_get_style(page); - lv_obj_t * scrl = lv_page_get_scrl(page); - lv_area_t page_coords; - lv_area_t scrl_coords; - - lv_obj_get_coords(scrl, &scrl_coords); - lv_obj_get_coords(page, &page_coords); - - if((edge & LV_PAGE_EDGE_TOP) && scrl_coords.y1 == page_coords.y1 + page_style->body.padding.top) return true; - if((edge & LV_PAGE_EDGE_BOTTOM) && scrl_coords.y2 == page_coords.y2 - page_style->body.padding.bottom) return true; - if((edge & LV_PAGE_EDGE_LEFT) && scrl_coords.x1 == page_coords.x1 + page_style->body.padding.left) return true; - if((edge & LV_PAGE_EDGE_RIGHT) && scrl_coords.x2 == page_coords.x2 - page_style->body.padding.right) return true; - - return false; -} - -/** - * Glue the object to the page. After it the page can be moved (dragged) with this object too. - * @param obj pointer to an object on a page - * @param glue true: enable glue, false: disable glue - */ -void lv_page_glue_obj(lv_obj_t * obj, bool glue) -{ - lv_obj_set_drag_parent(obj, glue); - lv_obj_set_drag(obj, glue); -} - -/** - * Focus on an object. It ensures that the object will be visible on the page. - * @param page pointer to a page object - * @param obj pointer to an object to focus (must be on the page) - * @param anim_en LV_ANIM_ON to focus with animation; LV_ANIM_OFF to focus without animation - */ -void lv_page_focus(lv_obj_t * page, const lv_obj_t * obj, lv_anim_enable_t anim_en) -{ - lv_page_ext_t * ext = lv_obj_get_ext_attr(page); - -#if LV_USE_ANIMATION - /* Be sure there is no position changing animation in progress - * because it can overide the current changes*/ - lv_anim_del(page, (lv_anim_exec_xcb_t)lv_obj_set_x); - lv_anim_del(page, (lv_anim_exec_xcb_t)lv_obj_set_y); - lv_anim_del(ext->scrl, (lv_anim_exec_xcb_t)lv_obj_set_x); - lv_anim_del(ext->scrl, (lv_anim_exec_xcb_t)lv_obj_set_y); -#endif - - const lv_style_t * style = lv_page_get_style(page, LV_PAGE_STYLE_BG); - const lv_style_t * style_scrl = lv_page_get_style(page, LV_PAGE_STYLE_SCRL); - - /*If obj is higher then the page focus where the "error" is smaller*/ - lv_coord_t obj_y = obj->coords.y1 - ext->scrl->coords.y1; - lv_coord_t obj_h = lv_obj_get_height(obj); - lv_coord_t scrlable_y = lv_obj_get_y(ext->scrl); - lv_coord_t page_h = lv_obj_get_height(page); - - lv_coord_t top_err = -(scrlable_y + obj_y); - lv_coord_t bot_err = scrlable_y + obj_y + obj_h - page_h; - - /*Out of the page on the top*/ - if((obj_h <= page_h && top_err > 0) || (obj_h > page_h && top_err < bot_err)) { - /*Calculate a new position and let some space above*/ - scrlable_y = -(obj_y - style_scrl->body.padding.top - style->body.padding.top); - scrlable_y += style_scrl->body.padding.top; - } - /*Out of the page on the bottom*/ - else if((obj_h <= page_h && bot_err > 0) || (obj_h > page_h && top_err >= bot_err)) { - /*Calculate a new position and let some space below*/ - scrlable_y = -(obj_y + style_scrl->body.padding.bottom + style->body.padding.bottom); - scrlable_y -= style_scrl->body.padding.bottom; - scrlable_y += page_h - obj_h; - } - - /*If obj is wider then the page focus where the "error" is smaller*/ - lv_coord_t obj_x = obj->coords.x1 - ext->scrl->coords.x1; - lv_coord_t obj_w = lv_obj_get_width(obj); - lv_coord_t scrlable_x = lv_obj_get_x(ext->scrl); - lv_coord_t page_w = lv_obj_get_width(page); - - lv_coord_t left_err = -(scrlable_x + obj_x); - lv_coord_t right_err = scrlable_x + obj_x + obj_w - page_w; - - /*Out of the page on the left*/ - if((obj_w <= page_w && left_err > 0) || (obj_w > page_w && left_err < right_err)) { - /*Calculate a new position and let some space above*/ - scrlable_x = -(obj_x - style_scrl->body.padding.left - style->body.padding.left); - scrlable_x += style_scrl->body.padding.left; - } - /*Out of the page on the rigth*/ - else if((obj_w <= page_w && right_err > 0) || (obj_w > page_w && left_err >= right_err)) { - /*Calculate a new position and let some space below*/ - scrlable_x = -(obj_x + style_scrl->body.padding.right + style->body.padding.right); - scrlable_x -= style_scrl->body.padding.right; - scrlable_x += page_w - obj_w; - } - - if(anim_en == LV_ANIM_OFF || lv_page_get_anim_time(page) == 0) { - lv_obj_set_y(ext->scrl, scrlable_y); - lv_obj_set_x(ext->scrl, scrlable_x); - } else { -#if LV_USE_ANIMATION - lv_anim_t a; - a.act_time = 0; - a.start = lv_obj_get_y(ext->scrl); - a.end = scrlable_y; - a.time = lv_page_get_anim_time(page); - a.ready_cb = NULL; - a.playback = 0; - a.repeat = 0; - a.var = ext->scrl; - a.path_cb = lv_anim_path_linear; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_y; - lv_anim_create(&a); - - a.start = lv_obj_get_x(ext->scrl); - a.end = scrlable_x; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_x; - lv_anim_create(&a); -#endif - } -} - -/** - * Scroll the page horizontally - * @param page pointer to a page object - * @param dist the distance to scroll (< 0: scroll right; > 0 scroll left) - */ -void lv_page_scroll_hor(lv_obj_t * page, lv_coord_t dist) -{ - lv_obj_t * scrl = lv_page_get_scrl(page); - -#if LV_USE_ANIMATION - lv_anim_t a; - a.var = scrl; - a.start = lv_obj_get_x(scrl); - a.end = a.start + dist; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_x; - a.path_cb = lv_anim_path_linear; - a.ready_cb = NULL; - a.act_time = 0; - a.time = LV_PAGE_SCROLL_ANIM_TIME; - a.playback = 0; - a.playback_pause = 0; - a.repeat = 0; - a.repeat_pause = 0; - lv_anim_create(&a); -#else - lv_obj_set_x(scrl, lv_obj_get_x(scrl) + dist); -#endif -} - -/** - * Scroll the page vertically - * @param page pointer to a page object - * @param dist the distance to scroll (< 0: scroll down; > 0 scroll up) - */ -void lv_page_scroll_ver(lv_obj_t * page, lv_coord_t dist) -{ - lv_obj_t * scrl = lv_page_get_scrl(page); - -#if LV_USE_ANIMATION - lv_anim_t a; - a.var = scrl; - a.start = lv_obj_get_y(scrl); - a.end = a.start + dist; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_y; - a.path_cb = lv_anim_path_linear; - a.ready_cb = NULL; - a.act_time = 0; - a.time = LV_PAGE_SCROLL_ANIM_TIME; - a.playback = 0; - a.playback_pause = 0; - a.repeat = 0; - a.repeat_pause = 0; - lv_anim_create(&a); -#else - lv_obj_set_y(scrl, lv_obj_get_y(scrl) + dist); -#endif -} - -/** - * 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 - * @param page - */ -void lv_page_start_edge_flash(lv_obj_t * page) -{ -#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); - } -#else - (void)page; /*Unused*/ -#endif -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_page_design(lv_obj_t * page, const lv_area_t * mask, lv_design_mode_t mode) -{ - if(mode == LV_DESIGN_COVER_CHK) { - return ancestor_design(page, mask, mode); - } - /*Cache page bg style for temporary modification*/ - const lv_style_t * style = lv_page_get_style(page, LV_PAGE_STYLE_BG); - lv_style_t style_tmp; - lv_style_copy(&style_tmp, style); - - 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)); - - } 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_page_ext_t * ext = lv_obj_get_ext_attr(page); - - /*Draw the scrollbars*/ - lv_area_t sb_area; - if(ext->sb.hor_draw && (ext->sb.mode & LV_SB_MODE_HIDE) == 0) { - /*Convert the relative coordinates to absolute*/ - lv_area_copy(&sb_area, &ext->sb.hor_area); - sb_area.x1 += page->coords.x1; - 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)); - } - - if(ext->sb.ver_draw && (ext->sb.mode & LV_SB_MODE_HIDE) == 0) { - /*Convert the relative coordinates to absolute*/ - lv_area_copy(&sb_area, &ext->sb.ver_area); - sb_area.x1 += page->coords.x1; - 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)); - } - -#if LV_USE_ANIMATION - { - lv_coord_t page_w = lv_obj_get_width(page); - lv_coord_t page_h = lv_obj_get_height(page); - - lv_area_t flash_area; - - if(ext->edge_flash.top_ip) { - flash_area.x1 = page->coords.x1 - page_w; - flash_area.x2 = page->coords.x2 + page_w; - flash_area.y1 = page->coords.y1 - 3 * page_w + ext->edge_flash.state; - flash_area.y2 = page->coords.y1 + ext->edge_flash.state; - } else if(ext->edge_flash.bottom_ip) { - flash_area.x1 = page->coords.x1 - page_w; - flash_area.x2 = page->coords.x2 + page_w; - flash_area.y1 = page->coords.y2 - ext->edge_flash.state; - flash_area.y2 = page->coords.y2 + 3 * page_w - ext->edge_flash.state; - } else if(ext->edge_flash.right_ip) { - flash_area.x1 = page->coords.x2 - ext->edge_flash.state; - flash_area.x2 = page->coords.x2 + 3 * page_h - ext->edge_flash.state; - flash_area.y1 = page->coords.y1 - page_h; - flash_area.y2 = page->coords.y2 + page_h; - } else if(ext->edge_flash.left_ip) { - flash_area.x1 = page->coords.x1 - 3 * page_h + ext->edge_flash.state; - flash_area.x2 = page->coords.x1 + ext->edge_flash.state; - flash_area.y1 = page->coords.y1 - page_h; - flash_area.y2 = page->coords.y2 + page_h; - } - - if(ext->edge_flash.left_ip || ext->edge_flash.right_ip || ext->edge_flash.top_ip || - ext->edge_flash.bottom_ip) { - lv_style_t flash_style; - lv_style_copy(&flash_style, ext->edge_flash.style); - 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)); - } - } -#endif - } - - return true; -} - -/** - * 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 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' - */ -static bool lv_scrl_design(lv_obj_t * scrl, const lv_area_t * mask, lv_design_mode_t mode) -{ - if(mode == LV_DESIGN_COVER_CHK) { - return ancestor_design(scrl, mask, mode); - } else if(mode == LV_DESIGN_DRAW_MAIN) { -#if LV_USE_GROUP - /* If the page is focused in a group and - * the background object is not visible (transparent) - * then "activate" the style of the scrollable*/ - const lv_style_t * style_scrl_ori = lv_obj_get_style(scrl); - lv_obj_t * page = lv_obj_get_parent(scrl); - const lv_style_t * style_page = lv_obj_get_style(page); - lv_group_t * g = lv_obj_get_group(page); - if((style_page->body.opa == LV_OPA_TRANSP) && - style_page->body.border.width == 0) { /*Is the background visible?*/ - if(lv_group_get_focused(g) == page) { - lv_style_t * style_mod; - style_mod = lv_group_mod_style(g, style_scrl_ori); - /*If still not visible modify the style a littel bit*/ - if((style_mod->body.opa == LV_OPA_TRANSP) && style_mod->body.border.width == 0) { - style_mod->body.opa = LV_OPA_50; - style_mod->body.border.width = 1; - style_mod = lv_group_mod_style(g, style_mod); - } - - scrl->style_p = style_mod; /*Temporally change the style to the activated */ - } - } -#endif - ancestor_design(scrl, mask, 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); - } - - return true; -} - -/** - * Signal function of the page - * @param page pointer to a 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 lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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*/ - if(ext->scrl == NULL) return LV_RES_OK; - const lv_style_t * style_bg = lv_page_get_style(page, LV_PAGE_STYLE_BG); - 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); - 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) 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_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)) { - tmp->coords.x1 -= style_scrl->body.padding.right + style_bg->body.padding.right; - tmp->coords.x2 -= style_scrl->body.padding.right + style_bg->body.padding.right; - } - if((tmp->coords.y1 == page->coords.y1) && (fit_top == LV_FIT_TIGHT || fit_top == LV_FIT_FILL)) { - tmp->coords.y1 += style_scrl->body.padding.top; - tmp->coords.y2 += style_scrl->body.padding.top; - } - lv_obj_set_parent(tmp, ext->scrl); - } else { - child = lv_obj_get_child(page, child); - } - } - } else if(sign == LV_SIGNAL_STYLE_CHG) { - ext->scrl->signal_cb(ext->scrl, LV_SIGNAL_CORD_CHG, &ext->scrl->coords); - - /*The scrollbars are important only if they are visible now*/ - if(ext->sb.hor_draw || ext->sb.ver_draw) lv_page_sb_refresh(page); - - /*Refresh the ext. size because the scrollbars might be positioned out of the page*/ - lv_obj_refresh_ext_draw_pad(page); - } else if(sign == LV_SIGNAL_CORD_CHG) { - /*Refresh the scrollbar and notify the scrl if the size is changed*/ - if(ext->scrl != NULL && (lv_obj_get_width(page) != lv_area_get_width(param) || - lv_obj_get_height(page) != lv_area_get_height(param))) { - /*If no hor_fit enabled set the scrollable's width to the page's width*/ - ext->scrl->signal_cb(ext->scrl, LV_SIGNAL_CORD_CHG, &ext->scrl->coords); - - /*The scrollbars are important only if they are visible now*/ - if(ext->sb.hor_draw || ext->sb.ver_draw) lv_page_sb_refresh(page); - } - } else if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { - /*Ensure ext. size for the scrollbars if they are out of the page*/ - if(page->ext_draw_pad < (-ext->sb.style->body.padding.right)) - page->ext_draw_pad = -ext->sb.style->body.padding.right; - if(page->ext_draw_pad < (-ext->sb.style->body.padding.bottom)) - page->ext_draw_pad = -ext->sb.style->body.padding.bottom; - } else if(sign == LV_SIGNAL_CONTROL) { - uint32_t c = *((uint32_t *)param); - - if(c == LV_KEY_DOWN) { - lv_page_scroll_ver(page, -lv_obj_get_height(page) / 4); - } else if(c == LV_KEY_UP) { - lv_page_scroll_ver(page, lv_obj_get_height(page) / 4); - } else if(c == LV_KEY_RIGHT) { - /*If the page can't be scrolled horizontally because it's not wide enough then scroll it - * vertically*/ - if(lv_page_get_scrl_width(page) <= lv_obj_get_width(page)) - lv_page_scroll_ver(page, -lv_obj_get_height(page) / 4); - else - lv_page_scroll_hor(page, -lv_obj_get_width(page) / 4); - } else if(c == LV_KEY_LEFT) { - /*If the page can't be scrolled horizontally because it's not wide enough then scroll it - * vertically*/ - if(lv_page_get_scrl_width(page) <= lv_obj_get_width(page)) - lv_page_scroll_ver(page, lv_obj_get_height(page) / 4); - else - lv_page_scroll_hor(page, lv_obj_get_width(page) / 4); - } - } else if(sign == LV_SIGNAL_GET_EDITABLE) { - bool * editable = (bool *)param; - *editable = true; - } - - return res; -} - -/** - * Signal function of the scrollable part of a page - * @param scrl pointer to the 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 lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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); - lv_page_ext_t * page_ext = lv_obj_get_ext_attr(page); - - if(sign == LV_SIGNAL_CORD_CHG) { - /*Limit the position of the scrollable object to be always visible - * (Do not let its edge inner then its parent respective edge)*/ - lv_coord_t new_x = lv_obj_get_x(scrl); - lv_coord_t new_y = lv_obj_get_y(scrl); - bool refr_x = false; - bool refr_y = false; - lv_area_t page_coords; - lv_area_t scrl_coords; - 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); - - 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; - } - } - } - - /*scrollable width smaller then page width? -> align to left*/ - if(lv_area_get_width(&scrl_coords) + hpad <= lv_area_get_width(&page_coords)) { - if(scrl_coords.x1 != page_coords.x1 + page_style->body.padding.left) { - new_x = page_style->body.padding.left; - 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) { - 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 - } 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 - } - } - - /*scrollable height smaller then page height? -> align to top*/ - if(lv_area_get_height(&scrl_coords) + vpad <= lv_area_get_height(&page_coords)) { - if(scrl_coords.y1 != page_coords.y1 + page_style->body.padding.top) { - new_y = page_style->body.padding.top; - 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) { - 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 - } 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 - } - } - - 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; - - /*Hide scrollbars if required*/ - if(page_ext->sb.mode == LV_SB_MODE_DRAG) { - lv_area_t sb_area_tmp; - if(page_ext->sb.hor_draw) { - lv_area_copy(&sb_area_tmp, &page_ext->sb.hor_area); - sb_area_tmp.x1 += page->coords.x1; - sb_area_tmp.y1 += page->coords.y1; - sb_area_tmp.x2 += page->coords.x1; - sb_area_tmp.y2 += page->coords.y1; - lv_obj_invalidate_area(page, &sb_area_tmp); - page_ext->sb.hor_draw = 0; - } - if(page_ext->sb.ver_draw) { - lv_area_copy(&sb_area_tmp, &page_ext->sb.ver_area); - sb_area_tmp.x1 += page->coords.x1; - sb_area_tmp.y1 += page->coords.y1; - sb_area_tmp.x2 += page->coords.x1; - sb_area_tmp.y2 += page->coords.y1; - lv_obj_invalidate_area(page, &sb_area_tmp); - page_ext->sb.ver_draw = 0; - } - } - } else if(sign == LV_SIGNAL_CLEANUP) { - page_ext->scrl = NULL; - } - - return res; -} - -/** - * Propagate the input device related event of the scrollable to the parent page background - * It is used by default if the scrollable's event is not specified - * @param scrl pointer to the page's scrollable object - * @param event type of the event - * @param data data of the event - */ -static void scrl_def_event_cb(lv_obj_t * scrl, lv_event_t event) -{ - lv_obj_t * page = lv_obj_get_parent(scrl); - - /*clang-format off*/ - if(event == LV_EVENT_PRESSED || event == LV_EVENT_PRESSING || event == LV_EVENT_PRESS_LOST || - event == LV_EVENT_RELEASED || event == LV_EVENT_SHORT_CLICKED || event == LV_EVENT_CLICKED || - event == LV_EVENT_LONG_PRESSED || event == LV_EVENT_LONG_PRESSED_REPEAT || - event == LV_EVENT_DRAG_BEGIN || event == LV_EVENT_DRAG_END || event == LV_EVENT_DRAG_THROW_BEGIN) { - lv_event_send(page, event, lv_event_get_data()); - } - /*clang-format on*/ -} - -/** - * Refresh the position and size of the scroll bars. - * @param page pointer to a page object - */ -static void lv_page_sb_refresh(lv_obj_t * page) -{ - lv_page_ext_t * ext = lv_obj_get_ext_attr(page); - const lv_style_t * style = lv_obj_get_style(page); - lv_obj_t * scrl = ext->scrl; - lv_coord_t size_tmp; - lv_coord_t scrl_w = lv_obj_get_width(scrl); - lv_coord_t scrl_h = lv_obj_get_height(scrl); - lv_coord_t obj_w = lv_obj_get_width(page); - lv_coord_t obj_h = lv_obj_get_height(page); - - /*Always let 'scrollbar width' padding above, under, left and right to the scrollbars - * else: - * - horizontal and vertical scrollbars can overlap on the corners - * - if the page has radius the scrollbar can be out of the radius */ - lv_coord_t sb_hor_pad = LV_MATH_MAX(ext->sb.style->body.padding.inner, style->body.padding.right); - lv_coord_t sb_ver_pad = LV_MATH_MAX(ext->sb.style->body.padding.inner, style->body.padding.bottom); - - if(ext->sb.mode == LV_SB_MODE_OFF) return; - - if(ext->sb.mode == LV_SB_MODE_ON) { - ext->sb.hor_draw = 1; - ext->sb.ver_draw = 1; - } - - /*Invalidate the current (old) scrollbar areas*/ - lv_area_t sb_area_tmp; - if(ext->sb.hor_draw != 0) { - lv_area_copy(&sb_area_tmp, &ext->sb.hor_area); - sb_area_tmp.x1 += page->coords.x1; - sb_area_tmp.y1 += page->coords.y1; - sb_area_tmp.x2 += page->coords.x1; - sb_area_tmp.y2 += page->coords.y1; - lv_obj_invalidate_area(page, &sb_area_tmp); - } - if(ext->sb.ver_draw != 0) { - lv_area_copy(&sb_area_tmp, &ext->sb.ver_area); - sb_area_tmp.x1 += page->coords.x1; - sb_area_tmp.y1 += page->coords.y1; - sb_area_tmp.x2 += page->coords.x1; - sb_area_tmp.y2 += page->coords.y1; - lv_obj_invalidate_area(page, &sb_area_tmp); - } - - if(ext->sb.mode == LV_SB_MODE_DRAG && lv_indev_is_dragging(lv_indev_get_act()) == false) { - ext->sb.hor_draw = 0; - ext->sb.ver_draw = 0; - return; - } - - /*Full sized horizontal scrollbar*/ - if(scrl_w <= obj_w - style->body.padding.left - style->body.padding.right) { - lv_area_set_width(&ext->sb.hor_area, obj_w - 2 * sb_hor_pad); - lv_area_set_pos(&ext->sb.hor_area, sb_hor_pad, - obj_h - ext->sb.style->body.padding.inner - ext->sb.style->body.padding.bottom); - if(ext->sb.mode == LV_SB_MODE_AUTO || ext->sb.mode == LV_SB_MODE_DRAG) ext->sb.hor_draw = 0; - } - /*Smaller horizontal scrollbar*/ - else { - size_tmp = - (obj_w * (obj_w - (2 * sb_hor_pad))) / (scrl_w + style->body.padding.left + style->body.padding.right); - if(size_tmp < LV_PAGE_SB_MIN_SIZE) size_tmp = LV_PAGE_SB_MIN_SIZE; - lv_area_set_width(&ext->sb.hor_area, size_tmp); - - lv_area_set_pos(&ext->sb.hor_area, - sb_hor_pad + - (-(lv_obj_get_x(scrl) - style->body.padding.left) * (obj_w - size_tmp - 2 * sb_hor_pad)) / - (scrl_w + style->body.padding.left + style->body.padding.right - obj_w), - obj_h - ext->sb.style->body.padding.inner - ext->sb.style->body.padding.bottom); - - if(ext->sb.mode == LV_SB_MODE_AUTO || ext->sb.mode == LV_SB_MODE_DRAG) ext->sb.hor_draw = 1; - } - - /*Full sized vertical scroll bar*/ - if(scrl_h <= obj_h - style->body.padding.top - style->body.padding.bottom) { - lv_area_set_height(&ext->sb.ver_area, obj_h - 2 * sb_ver_pad); - lv_area_set_pos(&ext->sb.ver_area, - obj_w - ext->sb.style->body.padding.inner - ext->sb.style->body.padding.right, sb_ver_pad); - if(ext->sb.mode == LV_SB_MODE_AUTO || ext->sb.mode == LV_SB_MODE_DRAG) ext->sb.ver_draw = 0; - } - /*Smaller vertical scroll bar*/ - else { - size_tmp = - (obj_h * (obj_h - (2 * sb_ver_pad))) / (scrl_h + style->body.padding.top + style->body.padding.bottom); - if(size_tmp < LV_PAGE_SB_MIN_SIZE) size_tmp = LV_PAGE_SB_MIN_SIZE; - lv_area_set_height(&ext->sb.ver_area, size_tmp); - - lv_area_set_pos(&ext->sb.ver_area, - obj_w - ext->sb.style->body.padding.inner - ext->sb.style->body.padding.right, - sb_ver_pad + (-(lv_obj_get_y(scrl) - ext->sb.style->body.padding.bottom) * - (obj_h - size_tmp - 2 * sb_ver_pad)) / - (scrl_h + style->body.padding.top + style->body.padding.bottom - obj_h)); - - if(ext->sb.mode == LV_SB_MODE_AUTO || ext->sb.mode == LV_SB_MODE_DRAG) ext->sb.ver_draw = 1; - } - - /*Invalidate the new scrollbar areas*/ - if(ext->sb.hor_draw != 0) { - lv_area_copy(&sb_area_tmp, &ext->sb.hor_area); - sb_area_tmp.x1 += page->coords.x1; - sb_area_tmp.y1 += page->coords.y1; - sb_area_tmp.x2 += page->coords.x1; - sb_area_tmp.y2 += page->coords.y1; - lv_obj_invalidate_area(page, &sb_area_tmp); - } - if(ext->sb.ver_draw != 0) { - lv_area_copy(&sb_area_tmp, &ext->sb.ver_area); - sb_area_tmp.x1 += page->coords.x1; - sb_area_tmp.y1 += page->coords.y1; - sb_area_tmp.x2 += page->coords.x1; - sb_area_tmp.y2 += page->coords.y1; - lv_obj_invalidate_area(page, &sb_area_tmp); - } -} - -#if LV_USE_ANIMATION -static void edge_flash_anim(void * page, lv_anim_value_t v) -{ - lv_page_ext_t * ext = lv_obj_get_ext_attr(page); - ext->edge_flash.state = v; - lv_obj_invalidate(page); -} - -static void edge_flash_anim_end(lv_anim_t * a) -{ - lv_page_ext_t * ext = lv_obj_get_ext_attr(a->var); - ext->edge_flash.top_ip = 0; - ext->edge_flash.bottom_ip = 0; - ext->edge_flash.left_ip = 0; - ext->edge_flash.right_ip = 0; - lv_obj_invalidate(a->var); -} -#endif - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_page.h b/src/libs/lvgl/src/lv_objx/lv_page.h deleted file mode 100644 index 6715c92f..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_page.h +++ /dev/null @@ -1,416 +0,0 @@ -/** - * @file lv_page.h - * - */ - -#ifndef LV_PAGE_H -#define LV_PAGE_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_PAGE != 0 - -/*Testing of dependencies*/ -#if LV_USE_CONT == 0 -#error "lv_page: lv_cont is required. Enable it in lv_conf.h (LV_USE_CONT 1) " -#endif - -#include "lv_cont.h" -#include "../lv_core/lv_indev.h" -#include "../lv_misc/lv_anim.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Scrollbar modes: shows when should the scrollbars be visible*/ -enum { - LV_SB_MODE_OFF = 0x0, /**< Never show scrollbars*/ - LV_SB_MODE_ON = 0x1, /**< Always show scrollbars*/ - LV_SB_MODE_DRAG = 0x2, /**< Show scrollbars when page is being dragged*/ - LV_SB_MODE_AUTO = 0x3, /**< Show scrollbars when the scrollable container is large enough to be scrolled*/ - LV_SB_MODE_HIDE = 0x4, /**< Hide the scroll bar temporally*/ - LV_SB_MODE_UNHIDE = 0x5, /**< Unhide the previously hidden scrollbar. Recover it's type too*/ -}; -typedef uint8_t lv_sb_mode_t; - -/** Edges: describes the four edges of the page*/ -enum { LV_PAGE_EDGE_LEFT = 0x1, LV_PAGE_EDGE_TOP = 0x2, LV_PAGE_EDGE_RIGHT = 0x4, LV_PAGE_EDGE_BOTTOM = 0x8 }; -typedef uint8_t lv_page_edge_t; - -/*Data of page*/ -typedef struct -{ - lv_cont_ext_t bg; /*Ext. of ancestor*/ - /*New data for this type */ - lv_obj_t * scrl; /*The scrollable object on the background*/ - struct - { - const lv_style_t * style; /*Style of scrollbars*/ - lv_area_t hor_area; /*Horizontal scrollbar area relative to the page. (Handled by the library) */ - lv_area_t ver_area; /*Vertical scrollbar area relative to the page (Handled by the library)*/ - uint8_t hor_draw : 1; /*1: horizontal scrollbar is visible now (Handled by the library)*/ - uint8_t ver_draw : 1; /*1: vertical scrollbar is visible now (Handled by the library)*/ - lv_sb_mode_t mode : 3; /*Scrollbar visibility from 'lv_page_sb_mode_t'*/ - } sb; -#if LV_USE_ANIMATION - struct - { - lv_anim_value_t state; /*Store the current size of the edge flash effect*/ - const lv_style_t * style; /*Style of edge flash effect (usually homogeneous circle)*/ - uint8_t enabled : 1; /*1: Show a flash animation on the edge*/ - uint8_t top_ip : 1; /*Used internally to show that top most position is reached (flash is In - Progress)*/ - uint8_t bottom_ip : 1; /*Used internally to show that bottom most position is reached (flash - is In Progress)*/ - uint8_t right_ip : 1; /*Used internally to show that right most position is reached (flash - is In Progress)*/ - uint8_t left_ip : 1; /*Used internally to show that left most position is reached (flash is - In Progress)*/ - } edge_flash; - - 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_page_ext_t; - -enum { - LV_PAGE_STYLE_BG, - LV_PAGE_STYLE_SCRL, - LV_PAGE_STYLE_SB, - LV_PAGE_STYLE_EDGE_FLASH, -}; -typedef uint8_t lv_page_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a page objects - * @param par pointer to an object, it will be the parent of the new page - * @param copy pointer to a page object, if not NULL then the new object will be copied from it - * @return pointer to the created page - */ -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 page pointer to an object - */ -void lv_page_clean(lv_obj_t * page); - -/** - * Get the scrollable object of a page - * @param page pointer to a page object - * @return pointer to a container which is the scrollable part of the page - */ -lv_obj_t * lv_page_get_scrl(const lv_obj_t * page); - -/** - * Get the animation time - * @param page pointer to a page object - * @return the animation time in milliseconds - */ -uint16_t lv_page_get_anim_time(const lv_obj_t * page); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the scroll bar mode on a page - * @param page pointer to a page object - * @param sb_mode the new mode from 'lv_page_sb.mode_t' enum - */ -void lv_page_set_sb_mode(lv_obj_t * page, lv_sb_mode_t sb_mode); - -/** - * Set the animation time for the page - * @param page pointer to a page object - * @param anim_time animation time in milliseconds - */ -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. - * @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); - -/** - * Enable the edge flash effect. (Show an arc when the an edge is reached) - * @param page pointer to a Page - * @param en true or false to enable/disable end flash - */ -void lv_page_set_edge_flash(lv_obj_t * page, bool en); - -/** - * Set the fit policy in all 4 directions separately. - * It tell how to change the page size automatically. - * @param page pointer to a page object - * @param left left fit policy from `lv_fit_t` - * @param right right fit policy from `lv_fit_t` - * @param top bottom fit policy from `lv_fit_t` - * @param bottom bottom fit policy from `lv_fit_t` - */ -static inline void lv_page_set_scrl_fit4(lv_obj_t * page, lv_fit_t left, lv_fit_t right, lv_fit_t top, lv_fit_t bottom) -{ - lv_cont_set_fit4(lv_page_get_scrl(page), left, right, top, bottom); -} - -/** - * Set the fit policy horizontally and vertically separately. - * It tell how to change the page size automatically. - * @param page pointer to a page object - * @param hot horizontal fit policy from `lv_fit_t` - * @param ver vertical fit policy from `lv_fit_t` - */ -static inline void lv_page_set_scrl_fit2(lv_obj_t * page, lv_fit_t hor, lv_fit_t ver) -{ - lv_cont_set_fit2(lv_page_get_scrl(page), hor, ver); -} - -/** - * Set the fit policyin all 4 direction at once. - * It tell how to change the page size automatically. - * @param page pointer to a button object - * @param fit fit policy from `lv_fit_t` - */ -static inline void lv_page_set_scrl_fit(lv_obj_t * page, lv_fit_t fit) -{ - lv_cont_set_fit(lv_page_get_scrl(page), fit); -} - -/** - * Set width of the scrollable part of a page - * @param page pointer to a page object - * @param w the new width of the scrollable (it ha no effect is horizontal fit is enabled) - */ -static inline void lv_page_set_scrl_width(lv_obj_t * page, lv_coord_t w) -{ - lv_obj_set_width(lv_page_get_scrl(page), w); -} - -/** - * Set height of the scrollable part of a page - * @param page pointer to a page object - * @param h the new height of the scrollable (it ha no effect is vertical fit is enabled) - */ -static inline void lv_page_set_scrl_height(lv_obj_t * page, lv_coord_t h) -{ - lv_obj_set_height(lv_page_get_scrl(page), h); -} - -/** - * Set the layout of the scrollable part of the page - * @param page pointer to a page object - * @param layout a layout from 'lv_cont_layout_t' - */ -static inline void lv_page_set_scrl_layout(lv_obj_t * page, lv_layout_t layout) -{ - lv_cont_set_layout(lv_page_get_scrl(page), layout); -} - -/** - * Set a style of a page - * @param page pointer to a page object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_page_set_style(lv_obj_t * page, lv_page_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Set the scroll bar mode on a page - * @param page pointer to a page object - * @return the mode from 'lv_page_sb.mode_t' enum - */ -lv_sb_mode_t lv_page_get_sb_mode(const lv_obj_t * page); - -/** - * Get the scroll propagation property - * @param page pointer to a Page - * @return true or false - */ -bool lv_page_get_scroll_propagation(lv_obj_t * page); - -/** - * Get the edge flash effect property. - * @param page pointer to a Page - * return true or false - */ -bool lv_page_get_edge_flash(lv_obj_t * page); - -/** - * Get that width which can be set to the children to still not cause overflow (show scrollbars) - * @param page pointer to a page object - * @return the width which still fits into the page - */ -lv_coord_t lv_page_get_fit_width(lv_obj_t * page); - -/** - * Get that height which can be set to the children to still not cause overflow (show scrollbars) - * @param page pointer to a page object - * @return the height which still fits into the page - */ -lv_coord_t lv_page_get_fit_height(lv_obj_t * page); - -/** - * Get width of the scrollable part of a page - * @param page pointer to a page object - * @return the width of the scrollable - */ -static inline lv_coord_t lv_page_get_scrl_width(const lv_obj_t * page) -{ - return lv_obj_get_width(lv_page_get_scrl(page)); -} - -/** - * Get height of the scrollable part of a page - * @param page pointer to a page object - * @return the height of the scrollable - */ -static inline lv_coord_t lv_page_get_scrl_height(const lv_obj_t * page) -{ - return lv_obj_get_height(lv_page_get_scrl(page)); -} - -/** - * Get the layout of the scrollable part of a page - * @param page pointer to page object - * @return the layout from 'lv_cont_layout_t' - */ -static inline lv_layout_t lv_page_get_scrl_layout(const lv_obj_t * page) -{ - return lv_cont_get_layout(lv_page_get_scrl(page)); -} - -/** - * Get the left fit mode - * @param page pointer to a page object - * @return an element of `lv_fit_t` - */ -static inline lv_fit_t lv_page_get_scrl_fit_left(const lv_obj_t * page) -{ - return lv_cont_get_fit_left(lv_page_get_scrl(page)); -} - -/** - * Get the right fit mode - * @param page pointer to a page object - * @return an element of `lv_fit_t` - */ -static inline lv_fit_t lv_page_get_scrl_fit_right(const lv_obj_t * page) -{ - return lv_cont_get_fit_right(lv_page_get_scrl(page)); -} - -/** - * Get the top fit mode - * @param page pointer to a page object - * @return an element of `lv_fit_t` - */ -static inline lv_fit_t lv_page_get_scrl_fit_top(const lv_obj_t * page) -{ - return lv_cont_get_fit_top(lv_page_get_scrl(page)); -} - -/** - * Get the bottom fit mode - * @param page pointer to a page object - * @return an element of `lv_fit_t` - */ -static inline lv_fit_t lv_page_get_scrl_fit_bottom(const lv_obj_t * page) -{ - return lv_cont_get_fit_bottom(lv_page_get_scrl(page)); -} - -/** - * Get a style of a page - * @param page pointer to page object - * @param type which style should be get - * @return style pointer to a style - */ -const lv_style_t * lv_page_get_style(const lv_obj_t * page, lv_page_style_t type); - -/*===================== - * Other functions - *====================*/ - -/** - * Find whether the page has been scrolled to a certain edge. - * @param page Page object - * @param edge Edge to check - * @return true if the page is on the specified edge - */ -bool lv_page_on_edge(lv_obj_t * page, lv_page_edge_t edge); - -/** - * Glue the object to the page. After it the page can be moved (dragged) with this object too. - * @param obj pointer to an object on a page - * @param glue true: enable glue, false: disable glue - */ -void lv_page_glue_obj(lv_obj_t * obj, bool glue); - -/** - * Focus on an object. It ensures that the object will be visible on the page. - * @param page pointer to a page object - * @param obj pointer to an object to focus (must be on the page) - * @param anim_en LV_ANIM_ON to focus with animation; LV_ANIM_OFF to focus without animation - */ -void lv_page_focus(lv_obj_t * page, const lv_obj_t * obj, lv_anim_enable_t anim_en); - -/** - * Scroll the page horizontally - * @param page pointer to a page object - * @param dist the distance to scroll (< 0: scroll left; > 0 scroll right) - */ -void lv_page_scroll_hor(lv_obj_t * page, lv_coord_t dist); - -/** - * Scroll the page vertically - * @param page pointer to a page object - * @param dist the distance to scroll (< 0: scroll down; > 0 scroll up) - */ -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 - * @param page - */ -void lv_page_start_edge_flash(lv_obj_t * page); -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_PAGE*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_PAGE_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_preload.c b/src/libs/lvgl/src/lv_objx/lv_preload.c deleted file mode 100644 index 2de9ebb1..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_preload.c +++ /dev/null @@ -1,444 +0,0 @@ -/** - * @file lv_preload.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" -#include "../lv_themes/lv_theme.h" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_preloader" - -#ifndef LV_PRELOAD_DEF_ARC_LENGTH -#define LV_PRELOAD_DEF_ARC_LENGTH 60 /*[deg]*/ -#endif - -#ifndef LV_PRELOAD_DEF_SPIN_TIME -#define LV_PRELOAD_DEF_SPIN_TIME 1000 /*[ms]*/ -#endif - -#ifndef LV_PRELOAD_DEF_ANIM -#define LV_PRELOAD_DEF_ANIM LV_PRELOAD_TYPE_SPINNING_ARC /*animation type*/ -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_preload_design(lv_obj_t * preload, const lv_area_t * mask, lv_design_mode_t mode); -static lv_res_t lv_preload_signal(lv_obj_t * preload, lv_signal_t sign, void * param); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_design_cb_t ancestor_design; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a pre loader object - * @param par pointer to an object, it will be the parent of the new pre loader - * @param copy pointer to a pre loader object, if not NULL then the new object will be copied from - * it - * @return pointer to the created pre loader - */ -lv_obj_t * lv_preload_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("preload create started"); - - /*Create the ancestor of pre loader*/ - lv_obj_t * new_preload = lv_arc_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) 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); - - /*Initialize the allocated 'ext' */ - ext->arc_length = LV_PRELOAD_DEF_ARC_LENGTH; - ext->anim_type = LV_PRELOAD_DEF_ANIM; - ext->anim_dir = LV_PRELOAD_DIR_FORWARD; - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_preload, lv_preload_signal); - lv_obj_set_design_cb(new_preload, lv_preload_design); - - /*Init the new pre loader pre loader*/ - if(copy == NULL) { - lv_obj_set_size(new_preload, LV_DPI / 2, LV_DPI / 2); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_preload_set_style(new_preload, LV_PRELOAD_STYLE_MAIN, th->style.preload); - } else { - lv_obj_set_style(new_preload, &lv_style_pretty_color); - } - - ext->time = LV_PRELOAD_DEF_SPIN_TIME; - - } - /*Copy an existing pre loader*/ - else { - lv_preload_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->arc_length = copy_ext->arc_length; - ext->time = copy_ext->time; - ext->anim_dir = copy_ext->anim_dir; - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_preload); - } - - lv_preload_set_type(new_preload, ext->anim_type); - - LV_LOG_INFO("preload created"); - - return new_preload; -} - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Set the length of the spinning arc in degrees - * @param preload pointer to a preload object - * @param deg length of the arc - */ -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; -} - -/** - * Set the spin time of the arc - * @param preload pointer to a preload object - * @param time time of one round in milliseconds - */ -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; - lv_preload_set_type(preload, ext->anim_type); -} -/*===================== - * Setter functions - *====================*/ - -/** - * Set a style of a pre loader. - * @param preload pointer to pre loader object - * @param type which style should be set - * @param style pointer to a style - * */ -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; - } -} - -/** - * Set the animation type of a preloadeer. - * @param preload pointer to pre loader object - * @param type animation type of the preload - * */ -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*/ - lv_anim_del(preload, NULL); - switch(type) { - case LV_PRELOAD_TYPE_FILLSPIN_ARC: { - ext->anim_type = LV_PRELOAD_TYPE_FILLSPIN_ARC; - 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; - } - a.exec_cb = (lv_anim_exec_xcb_t)lv_preload_spinner_anim; - a.path_cb = lv_anim_path_ease_in_out; - a.ready_cb = NULL; - a.act_time = 0; - a.time = ext->time; - a.playback = 0; - a.playback_pause = 0; - a.repeat = 1; - a.repeat_pause = 0; - lv_anim_create(&a); - - lv_anim_t b; - 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; - } - b.exec_cb = (lv_anim_exec_xcb_t)lv_preload_set_arc_length; - b.path_cb = lv_anim_path_ease_in_out; - b.ready_cb = NULL; - b.act_time = 0; - b.time = ext->time; - b.playback = 1; - b.playback_pause = 0; - b.repeat = 1; - b.repeat_pause = 0; - lv_anim_create(&b); - break; - } - case LV_PRELOAD_TYPE_CONSTANT_ARC: - case LV_PRELOAD_TYPE_SPINNING_ARC: - default: { - 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; - } - a.exec_cb = (lv_anim_exec_xcb_t)lv_preload_spinner_anim; - 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; - a.playback = 0; - a.playback_pause = 0; - a.repeat = 1; - a.repeat_pause = 0; - lv_anim_create(&a); - break; - } - } -} - -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; - lv_preload_set_type(preload, ext->anim_type); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the arc length [degree] of the a pre loader - * @param preload pointer to a pre loader object - */ -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; -} - -/** - * Get the spin time of the arc - * @param preload pointer to a pre loader object [milliseconds] - */ -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; -} - -/** - * Get style of a pre loader. - * @param preload pointer to pre loader object - * @param type which style should be get - * @return style pointer to the style - * */ -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) { - case LV_PRELOAD_STYLE_MAIN: style = lv_arc_get_style(preload, LV_ARC_STYLE_MAIN); break; - default: style = NULL; break; - } - - return style; -} - -/** - * Get the animation type of a preloadeer. - * @param preload pointer to pre loader object - * @return animation type - * */ -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; -} - -lv_preload_dir_t lv_preload_get_dir(lv_obj_t * preload) -{ - lv_preload_ext_t * ext = lv_obj_get_ext_attr(preload); - return ext->anim_dir; -} - -/*===================== - * Other functions - *====================*/ - -/** - * Animator function (exec_cb) to rotate the arc of spinner. - * @param ptr pointer to preloader - * @param val the current desired value [0..360] - */ -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_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); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_preload_design(lv_obj_t * preload, const lv_area_t * mask, 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; - } - /*Draw the object*/ - else if(mode == LV_DESIGN_DRAW_MAIN) { - - /*Draw a circle as background*/ - const lv_style_t * style = lv_arc_get_style(preload, LV_ARC_STYLE_MAIN); - if(style->body.border.width > 0) { - lv_coord_t r = (LV_MATH_MIN(lv_obj_get_width(preload), lv_obj_get_height(preload))) / 2; - r -= LV_MATH_MIN(style->body.padding.left, style->body.padding.top); - - lv_coord_t x = preload->coords.x1 + lv_obj_get_width(preload) / 2; - lv_coord_t y = preload->coords.y1 + lv_obj_get_height(preload) / 2; - - lv_style_t bg_style; - lv_style_copy(&bg_style, &lv_style_plain); - bg_style.body.opa = LV_OPA_TRANSP; - 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; - - lv_area_t bg_area; - bg_area.x1 = x - r; - bg_area.y1 = y - r; - bg_area.x2 = x + r; - bg_area.y2 = y + r; - - lv_draw_rect(&bg_area, mask, &bg_style, lv_obj_get_opa_scale(preload)); - } - /*Draw the arc above the background circle */ - ancestor_design(preload, mask, mode); - } - /*Post draw when the children are drawn*/ - else if(mode == LV_DESIGN_DRAW_POST) { - } - - return true; -} - -/** - * Signal function of the pre loader - * @param preload pointer to a pre loader 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_preload_signal(lv_obj_t * preload, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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')*/ - } - - return res; -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_preload.h b/src/libs/lvgl/src/lv_objx/lv_preload.h deleted file mode 100644 index 22b87f32..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_preload.h +++ /dev/null @@ -1,197 +0,0 @@ -/** - * @file lv_preload.h - * - */ - -#ifndef LV_PRELOAD_H -#define LV_PRELOAD_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_PRELOAD != 0 - -/*Testing of dependencies*/ -#if LV_USE_ARC == 0 -#error "lv_preload: lv_arc is required. Enable it in lv_conf.h (LV_USE_ARC 1) " -#endif - -#if LV_USE_ANIMATION == 0 -#error "lv_preload: animations are required. Enable it in lv_conf.h (LV_USE_ANIMATION 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "../lv_misc/lv_anim.h" -#include "lv_arc.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * Type of preloader. - */ -enum { - LV_PRELOAD_TYPE_SPINNING_ARC, - LV_PRELOAD_TYPE_FILLSPIN_ARC, - LV_PRELOAD_TYPE_CONSTANT_ARC, -}; -typedef uint8_t lv_preload_type_t; - -/** - * Direction the preloader should spin. - */ -enum { - LV_PRELOAD_DIR_FORWARD, - LV_PRELOAD_DIR_BACKWARD, -}; -typedef uint8_t lv_preload_dir_t; - -/*Data of pre loader*/ -typedef struct -{ - lv_arc_ext_t arc; /*Ext. of ancestor*/ - /*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 : 2; /*Type of the arc animation*/ - lv_preload_dir_t anim_dir : 1; /*Animation Direction*/ -} lv_preload_ext_t; - -/*Styles*/ -enum { - LV_PRELOAD_STYLE_MAIN, -}; -typedef uint8_t lv_preload_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a pre loader objects - * @param par pointer to an object, it will be the parent of the new pre loader - * @param copy pointer to a pre loader object, if not NULL then the new object will be copied from - * it - * @return pointer to the created pre loader - */ -lv_obj_t * lv_preload_create(lv_obj_t * par, const lv_obj_t * copy); - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Set the length of the spinning arc in degrees - * @param preload pointer to a preload object - * @param deg length of the arc - */ -void lv_preload_set_arc_length(lv_obj_t * preload, lv_anim_value_t deg); - -/** - * Set the spin time of the arc - * @param preload pointer to a preload object - * @param time time of one round in milliseconds - */ -void lv_preload_set_spin_time(lv_obj_t * preload, uint16_t time); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a style of a pre loader. - * @param preload pointer to pre loader object - * @param type which style should be set - * @param style pointer to a style - * */ -void lv_preload_set_style(lv_obj_t * preload, lv_preload_style_t type, const lv_style_t * style); - -/** - * Set the animation type of a preloader. - * @param preload pointer to pre loader object - * @param type animation type of the preload - * */ -void lv_preload_set_type(lv_obj_t * preload, lv_preload_type_t type); - -/** - * Set the animation direction of a preloader - * @param preload pointer to pre loader object - * @param direction animation direction of the preload - */ -void lv_preload_set_dir(lv_obj_t * preload, lv_preload_dir_t dir); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the arc length [degree] of the a pre loader - * @param preload pointer to a pre loader object - */ -lv_anim_value_t lv_preload_get_arc_length(const lv_obj_t * preload); - -/** - * Get the spin time of the arc - * @param preload pointer to a pre loader object [milliseconds] - */ -uint16_t lv_preload_get_spin_time(const lv_obj_t * preload); - -/** - * Get style of a pre loader. - * @param preload pointer to pre loader object - * @param type which style should be get - * @return style pointer to the style - * */ -const lv_style_t * lv_preload_get_style(const lv_obj_t * preload, lv_preload_style_t type); - -/** - * Get the animation type of a preloader. - * @param preload pointer to pre loader object - * @return animation type - * */ -lv_preload_type_t lv_preload_get_type(lv_obj_t * preload); - -/** - * Get the animation direction of a preloader - * @param preload pointer to pre loader object - * @return animation direction - */ -lv_preload_dir_t lv_preload_get_dir(lv_obj_t * preload); - -/*===================== - * Other functions - *====================*/ - -/** - * Animator function (exec_cb) to rotate the arc of spinner. - * @param ptr pointer to preloader - * @param val the current desired value [0..360] - */ -void lv_preload_spinner_anim(void * ptr, lv_anim_value_t val); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_PRELOAD*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_PRELOAD_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_roller.c b/src/libs/lvgl/src/lv_objx/lv_roller.c deleted file mode 100644 index 4d21bbad..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_roller.c +++ /dev/null @@ -1,733 +0,0 @@ -/** - * @file lv_roller.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" - -/********************* - * 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*/ -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_roller_design(lv_obj_t * roller, const lv_area_t * mask, 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); -static void refr_height(lv_obj_t * roller); -static void inf_normalize(void * roller_scrl); -#if LV_USE_ANIMATION -static void scroll_anim_ready_cb(lv_anim_t * a); -#endif -static void draw_bg(lv_obj_t * roller, const lv_area_t * mask); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_signal_cb_t ancestor_scrl_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a roller object - * @param par pointer to an object, it will be the parent of the new roller - * @param copy pointer to a roller object, if not NULL then the new object will be copied from it - * @return pointer to the created roller - */ -lv_obj_t * lv_roller_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("roller create started"); - - /*Create the ancestor of roller*/ - lv_obj_t * new_roller = lv_ddlist_create(par, copy); - 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)); - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_roller); - - /*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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - ext->ddlist.draw_arrow = 0; /*Do not draw arrow by default*/ - 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); - lv_obj_set_design_cb(new_roller, lv_roller_design); - - /*Init the new roller roller*/ - if(copy == NULL) { - lv_obj_t * scrl = lv_page_get_scrl(new_roller); - lv_obj_set_drag(scrl, true); /*In ddlist it might be disabled*/ - lv_page_set_scrl_fit2(new_roller, LV_FIT_TIGHT, LV_FIT_NONE); /*Height is specified directly*/ - 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_roller_set_visible_row_count(new_roller, 3); - lv_label_set_align(ext->ddlist.label, LV_LABEL_ALIGN_CENTER); - - lv_obj_set_signal_cb(scrl, lv_roller_scrl_signal); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_roller_set_style(new_roller, LV_ROLLER_STYLE_BG, th->style.roller.bg); - lv_roller_set_style(new_roller, LV_ROLLER_STYLE_SEL, th->style.roller.sel); - } else { - /*Refresh the roller's style*/ - lv_obj_refresh_style(new_roller); /*To set scrollable size automatically*/ - } - } - /*Copy an existing roller*/ - else { - lv_roller_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->mode = copy_ext->mode; - - lv_obj_t * scrl = lv_page_get_scrl(new_roller); - lv_ddlist_open(new_roller, false); - lv_obj_set_signal_cb(scrl, lv_roller_scrl_signal); - - /*Refresh the roller's style*/ - lv_obj_refresh_style(new_roller); /*Refresh the style with new signal function*/ - } - - LV_LOG_INFO("roller created"); - - return new_roller; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the options on a roller - * @param roller pointer to roller object - * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" - * @param mode `LV_ROLLER_MODE_NORMAL` or `LV_ROLLER_MODE_INFINITE` - */ -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) { - ext->mode = LV_ROLLER_MODE_NORMAL; - lv_ddlist_set_options(roller, options); - - /* Make sure the roller's height and the scrollable's height is refreshed. - * They are refreshed in `LV_SIGNAL_COORD_CHG` but if the new options has the same width - * that signal won't be called. (It's called because of LV_FIT_TIGHT hor fit)*/ - refr_height(roller); - refr_position(roller, LV_ANIM_OFF); - } else { - ext->mode = LV_ROLLER_MODE_INIFINITE; - - 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++) { - strcpy(&opt_extra[opt_len * i], options); - opt_extra[opt_len * (i + 1) - 1] = '\n'; - } - opt_extra[opt_len * LV_ROLLER_INF_PAGES - 1] = '\0'; - lv_ddlist_set_options(roller, opt_extra); - lv_mem_free(opt_extra); - - /* Make sure the roller's height and the scrollable's height is refreshed. - * They are refreshed in `LV_SIGNAL_COORD_CHG` but if the new options has the same width - * that signal won't be called. (It called because LV_FIT_TIGHT hor fit)*/ - refr_height(roller); - - uint16_t real_id_cnt = ext->ddlist.option_cnt / LV_ROLLER_INF_PAGES; - lv_roller_set_selected(roller, ((LV_ROLLER_INF_PAGES / 2) + 1) * real_id_cnt, false); /*Select the middle page*/ - } -} - -/** - * Set the align of the roller's options (left or center) - * @param roller - pointer to a roller object - * @param align - one of lv_label_align_t values (left, right, center) - */ -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; - - if(label == NULL) return; /*Probably the roller is being deleted if the label is NULL.*/ - lv_label_set_align(label, align); - - switch(lv_label_get_align(label)) { - case LV_LABEL_ALIGN_LEFT: lv_obj_align(label, NULL, LV_ALIGN_IN_LEFT_MID, 0, 0); break; - case LV_LABEL_ALIGN_CENTER: lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0); break; - case LV_LABEL_ALIGN_RIGHT: lv_obj_align(label, NULL, LV_ALIGN_IN_RIGHT_MID, 0, 0); break; - } -} - -/** - * Set the selected option - * @param roller pointer to a roller object - * @param sel_opt id of the selected option (0 ... number of option - 1); - * @param anim_en LV_ANIM_ON: set with animation; LV_ANOM_OFF set immediately - */ -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 - - if(lv_roller_get_selected(roller) == sel_opt) return; - - lv_ddlist_set_selected(roller, sel_opt); - refr_position(roller, anim); -} - -/** - * Set the height to show the given number of rows (options) - * @param roller pointer to a roller object - * @param row_cnt number of desired visible rows - */ -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; - lv_ddlist_set_fix_height(roller, lv_font_get_line_height(style_label->text.font) * row_cnt + - style_label->text.line_space * n_line_space); -} - -/** - * Set a style of a roller - * @param roller pointer to a roller object - * @param type which style should be set - * @param style pointer to a style - */ -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; - } -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the id of the selected option - * @param roller pointer to a roller object - * @return id of the selected option (0 ... number of option - 1); - */ -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; - return lv_ddlist_get_selected(roller) % real_id_cnt; - } else { - return lv_ddlist_get_selected(roller); - } -} - -/** - * Get the align attribute. Default alignment after _create is LV_LABEL_ALIGN_CENTER - * @param roller pointer to a roller object - * @return LV_LABEL_ALIGN_LEFT, LV_LABEL_ALIGN_RIGHT or LV_LABEL_ALIGN_CENTER - */ -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_ASSERT_MEM(ext); - LV_ASSERT_MEM(ext->ddlist.label); - return lv_label_get_align(ext->ddlist.label); -} - -/** - * Get the auto width set attribute - * @param roller pointer to a roller object - * @return true: auto size enabled; false: manual width settings enabled - */ -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); -} - -/** - * Get a style of a roller - * @param roller pointer to a roller object - * @param type which style should be get - * @return style pointer to a style - * */ -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); - - 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; - } - - /*To avoid warning*/ - return NULL; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_roller_design(lv_obj_t * roller, const lv_area_t * mask, 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; - } - /*Draw the object*/ - else if(mode == LV_DESIGN_DRAW_MAIN) { - draw_bg(roller, mask); - - 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); - const lv_font_t * font = style->text.font; - lv_roller_ext_t * ext = lv_obj_get_ext_attr(roller); - lv_coord_t font_h = lv_font_get_line_height(font); - lv_area_t rect_area; - rect_area.y1 = roller->coords.y1 + lv_obj_get_height(roller) / 2 - font_h / 2 - style->text.line_space / 2; - if((font_h & 0x1) && (style->text.line_space & 0x1)) rect_area.y1--; /*Compensate the two rounding error*/ - rect_area.y2 = rect_area.y1 + font_h + style->text.line_space - 1; - lv_area_t roller_coords; - lv_obj_get_coords(roller, &roller_coords); - lv_obj_get_inner_coords(roller, &roller_coords); - - rect_area.x1 = roller_coords.x1; - rect_area.x2 = roller_coords.x2; - - lv_draw_rect(&rect_area, mask, ext->ddlist.sel_style, opa_scale); - } - /*Post draw when the children are drawn*/ - else if(mode == LV_DESIGN_DRAW_POST) { - const lv_style_t * style = lv_roller_get_style(roller, LV_ROLLER_STYLE_BG); - lv_roller_ext_t * ext = lv_obj_get_ext_attr(roller); - const lv_font_t * font = style->text.font; - lv_coord_t font_h = lv_font_get_line_height(font); - lv_opa_t opa_scale = lv_obj_get_opa_scale(roller); - - /*Redraw the text on the selected area with a different color*/ - lv_area_t rect_area; - rect_area.y1 = roller->coords.y1 + lv_obj_get_height(roller) / 2 - font_h / 2 - style->text.line_space / 2; - if((font_h & 0x1) && (style->text.line_space & 0x1)) rect_area.y1--; /*Compensate the two rounding error*/ - rect_area.y2 = rect_area.y1 + font_h + style->text.line_space - 1; - rect_area.x1 = roller->coords.x1; - rect_area.x2 = roller->coords.x2; - lv_area_t mask_sel; - bool area_ok; - area_ok = lv_area_intersect(&mask_sel, mask, &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; - lv_txt_flag_t txt_align = LV_TXT_FLAG_NONE; - - { - lv_label_align_t label_align = lv_label_get_align(ext->ddlist.label); - - if(LV_LABEL_ALIGN_CENTER == label_align) { - txt_align |= LV_TXT_FLAG_CENTER; - } else if(LV_LABEL_ALIGN_RIGHT == label_align) { - txt_align |= LV_TXT_FLAG_RIGHT; - } - } - - lv_style_copy(&new_style, style); - 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, NULL, NULL, lv_obj_get_base_dir(ext->ddlist.label)); - } - } - - return true; -} - -/** - * Signal function of the roller - * @param roller pointer to a roller 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_roller_signal(lv_obj_t * roller, lv_signal_t sign, void * param) -{ - lv_res_t res = LV_RES_OK; - - /*Don't let the drop down list to handle the control signals. It works differently*/ - if(sign != LV_SIGNAL_CONTROL && sign != LV_SIGNAL_FOCUS && sign != LV_SIGNAL_DEFOCUS) { - /* Include the ancient signal function */ - 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); - - if(sign == LV_SIGNAL_STYLE_CHG) { - refr_height(roller); - - refr_position(roller, false); - } else if(sign == LV_SIGNAL_CORD_CHG) { - - if(lv_obj_get_width(roller) != lv_area_get_width(param) || - lv_obj_get_height(roller) != lv_area_get_height(param)) { - - refr_height(roller); -#if LV_USE_ANIMATION - lv_anim_del(lv_page_get_scrl(roller), (lv_anim_exec_xcb_t)lv_obj_set_y); -#endif - lv_ddlist_set_selected(roller, ext->ddlist.sel_opt_id); - refr_position(roller, false); - } - } else if(sign == LV_SIGNAL_FOCUS) { -#if LV_USE_GROUP - lv_group_t * g = lv_obj_get_group(roller); - bool editing = lv_group_get_editing(g); - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); - - /*Encoders need special handling*/ - if(indev_type == LV_INDEV_TYPE_ENCODER) { - /*In navigate mode revert the original value*/ - if(!editing) { - if(ext->ddlist.sel_opt_id != ext->ddlist.sel_opt_id_ori) { - ext->ddlist.sel_opt_id = ext->ddlist.sel_opt_id_ori; - refr_position(roller, true); - } - } - /*Save the current state when entered to edit mode*/ - else { - ext->ddlist.sel_opt_id_ori = ext->ddlist.sel_opt_id; - } - } else { - ext->ddlist.sel_opt_id_ori = ext->ddlist.sel_opt_id; /*Save the current value. Used to revert this state if - ENER wont't be pressed*/ - } -#endif - } else if(sign == LV_SIGNAL_DEFOCUS) { -#if LV_USE_GROUP - /*Revert the original state*/ - if(ext->ddlist.sel_opt_id != ext->ddlist.sel_opt_id_ori) { - ext->ddlist.sel_opt_id = ext->ddlist.sel_opt_id_ori; - refr_position(roller, true); - } -#endif - } else if(sign == LV_SIGNAL_CONTROL) { - char c = *((char *)param); - if(c == LV_KEY_RIGHT || c == LV_KEY_DOWN) { - if(ext->ddlist.sel_opt_id + 1 < ext->ddlist.option_cnt) { - uint16_t ori_id = ext->ddlist.sel_opt_id_ori; /*lv_roller_set_selceted will overwrite this*/ - lv_roller_set_selected(roller, ext->ddlist.sel_opt_id + 1, true); - ext->ddlist.sel_opt_id_ori = ori_id; - } - } else if(c == LV_KEY_LEFT || c == LV_KEY_UP) { - if(ext->ddlist.sel_opt_id > 0) { - uint16_t ori_id = ext->ddlist.sel_opt_id_ori; /*lv_roller_set_selceted will overwrite this*/ - lv_roller_set_selected(roller, ext->ddlist.sel_opt_id - 1, true); - ext->ddlist.sel_opt_id_ori = ori_id; - } - } - } - - return res; -} - -/** - * Signal function of the scrollable part of the roller. - * @param roller_scrl ointer to the scrollable part of roller (page) - * @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_roller_scrl_signal(lv_obj_t * roller_scrl, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* Include the ancient signal function */ - res = ancestor_scrl_signal(roller_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_OBJX_NAME); - - lv_indev_t * indev = lv_indev_get_act(); - int32_t id = -1; - lv_obj_t * roller = lv_obj_get_parent(roller_scrl); - lv_roller_ext_t * ext = lv_obj_get_ext_attr(roller); - - if(ext->ddlist.label == NULL) - return LV_RES_INV; /*On delete the ddlist signal deletes the label so nothing left to do - here*/ - - const lv_style_t * style_label = lv_obj_get_style(ext->ddlist.label); - const lv_font_t * font = style_label->text.font; - lv_coord_t font_h = lv_font_get_line_height(font); - - if(sign == LV_SIGNAL_DRAG_END) { - /*If dragged then align the list to have an element in the middle*/ - lv_coord_t label_y1 = ext->ddlist.label->coords.y1 - roller->coords.y1; - lv_coord_t label_unit = font_h + style_label->text.line_space; - lv_coord_t mid = (roller->coords.y2 - roller->coords.y1) / 2; - - id = (mid - label_y1 + style_label->text.line_space / 2) / label_unit; - - if(id < 0) id = 0; - if(id >= ext->ddlist.option_cnt) id = ext->ddlist.option_cnt - 1; - - ext->ddlist.sel_opt_id = id; - ext->ddlist.sel_opt_id_ori = id; - res = lv_event_send(roller, LV_EVENT_VALUE_CHANGED, &id); - if(res != LV_RES_OK) return res; - } - /*If picked an option by clicking then set it*/ - else if(sign == LV_SIGNAL_RELEASED) { - if(!lv_indev_is_dragging(indev)) { - id = ext->ddlist.sel_opt_id; -#if LV_USE_GROUP - /*In edit mode go to navigate mode if an option is selected*/ - lv_group_t * g = lv_obj_get_group(roller); - bool editing = lv_group_get_editing(g); - if(editing) lv_group_set_editing(g, false); -#endif - } - } else if(sign == LV_SIGNAL_PRESSED) { -#if LV_USE_ANIMATION - lv_anim_del(roller_scrl, (lv_anim_exec_xcb_t)lv_obj_set_y); -#endif - } - - /*Position the scrollable according to the new selected option*/ - if(id != -1) { - refr_position(roller, true); - } - - return res; -} - -/** - * Draw a rectangle which has gradient on its top and bottom - * @param roller pointer to a roller object - * @param mask pointer to the current mask (from the design function) - */ -static void draw_bg(lv_obj_t * roller, const lv_area_t * mask) -{ - const lv_style_t * style = lv_roller_get_style(roller, LV_ROLLER_STYLE_BG); - lv_area_t half_mask; - lv_area_t half_roller; - lv_coord_t h = lv_obj_get_height(roller); - bool union_ok; - lv_area_copy(&half_roller, &roller->coords); - - half_roller.x1 -= roller->ext_draw_pad; /*Add ext size too (e.g. because of shadow draw) */ - half_roller.x2 += roller->ext_draw_pad; - half_roller.y1 -= roller->ext_draw_pad; - half_roller.y2 = roller->coords.y1 + h / 2; - - union_ok = lv_area_intersect(&half_mask, &half_roller, mask); - - half_roller.x1 += roller->ext_draw_pad; /*Revert ext. size adding*/ - half_roller.x2 -= roller->ext_draw_pad; - half_roller.y1 += roller->ext_draw_pad; - half_roller.y2 += style->body.radius; - - if(union_ok) { - lv_draw_rect(&half_roller, &half_mask, style, lv_obj_get_opa_scale(roller)); - } - - half_roller.x1 -= roller->ext_draw_pad; /*Add ext size too (e.g. because of shadow draw) */ - half_roller.x2 += roller->ext_draw_pad; - half_roller.y2 = roller->coords.y2 + roller->ext_draw_pad; - half_roller.y1 = roller->coords.y1 + h / 2; - if((h & 0x1) == 0) half_roller.y1++; /*With even height the pixels in the middle would be drawn twice*/ - - union_ok = lv_area_intersect(&half_mask, &half_roller, mask); - - half_roller.x1 += roller->ext_draw_pad; /*Revert ext. size adding*/ - half_roller.x2 -= roller->ext_draw_pad; - half_roller.y2 -= roller->ext_draw_pad; - half_roller.y1 -= style->body.radius; - - if(union_ok) { - lv_style_t style_tmp; - memcpy(&style_tmp, style, sizeof(lv_style_t)); - style_tmp.body.main_color = style->body.grad_color; - style_tmp.body.grad_color = style->body.main_color; - lv_draw_rect(&half_roller, &half_mask, &style_tmp, lv_obj_get_opa_scale(roller)); - } -} - -/** - * Refresh the position of the roller. It uses the id stored in: ext->ddlist.selected_option_id - * @param roller pointer to a roller object - * @param anim_en LV_ANIM_ON: refresh with animation; LV_ANOM_OFF: without animation - */ -static void refr_position(lv_obj_t * roller, lv_anim_enable_t anim_en) -{ -#if LV_USE_ANIMATION == 0 - anim_en = LV_ANIM_OFF; -#endif - - lv_obj_t * roller_scrl = lv_page_get_scrl(roller); - lv_roller_ext_t * ext = lv_obj_get_ext_attr(roller); - const lv_style_t * style_label = lv_obj_get_style(ext->ddlist.label); - const lv_font_t * font = style_label->text.font; - lv_coord_t font_h = lv_font_get_line_height(font); - lv_coord_t h = lv_obj_get_height(roller); - uint16_t anim_time = lv_roller_get_anim_time(roller); - - /* Normally the animtaion's `end_cb` sets correct position of the roller is infinite. - * But without animations do it manually*/ - if(anim_en == LV_ANIM_OFF || anim_time == 0) { - inf_normalize(roller_scrl); - } - - int32_t id = ext->ddlist.sel_opt_id; - lv_coord_t line_y1 = - id * (font_h + style_label->text.line_space) + ext->ddlist.label->coords.y1 - roller_scrl->coords.y1; - lv_coord_t new_y = -line_y1 + (h - font_h) / 2; - - if(anim_en == LV_ANIM_OFF || anim_time == 0) { - lv_obj_set_y(roller_scrl, new_y); - } else { -#if LV_USE_ANIMATION - lv_anim_t a; - a.var = roller_scrl; - a.start = lv_obj_get_y(roller_scrl); - a.end = new_y; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_y; - a.path_cb = lv_anim_path_linear; - a.ready_cb = scroll_anim_ready_cb; - a.act_time = 0; - a.time = anim_time; - a.playback = 0; - a.playback_pause = 0; - a.repeat = 0; - a.repeat_pause = 0; - lv_anim_create(&a); -#endif - } -} - -/** - * Refresh the height of the roller and the scrolable - * @param roller pointer to roller - */ -static void refr_height(lv_obj_t * roller) -{ - lv_roller_ext_t * ext = lv_obj_get_ext_attr(roller); - lv_align_t obj_align = LV_ALIGN_IN_LEFT_MID; - if(ext->ddlist.label) { - lv_label_align_t label_align = lv_label_get_align(ext->ddlist.label); - if(LV_LABEL_ALIGN_CENTER == label_align) - obj_align = LV_ALIGN_CENTER; - else if(LV_LABEL_ALIGN_RIGHT == label_align) - obj_align = LV_ALIGN_IN_RIGHT_MID; - } - - lv_obj_set_height(lv_page_get_scrl(roller), lv_obj_get_height(ext->ddlist.label) + lv_obj_get_height(roller)); - lv_obj_align(ext->ddlist.label, NULL, obj_align, 0, 0); -#if LV_USE_ANIMATION - lv_anim_del(lv_page_get_scrl(roller), (lv_anim_exec_xcb_t)lv_obj_set_y); -#endif - lv_ddlist_set_selected(roller, ext->ddlist.sel_opt_id); -} - -/** - * Set the middle page for the roller if inifinte is enabled - * @param scrl pointer to the roller's scrollable (lv_obj_t *) - */ -static void inf_normalize(void * scrl) -{ - lv_obj_t * roller_scrl = (lv_obj_t *)scrl; - lv_obj_t * roller = lv_obj_get_parent(roller_scrl); - 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; - - ext->ddlist.sel_opt_id = ext->ddlist.sel_opt_id % real_id_cnt; - - ext->ddlist.sel_opt_id += (LV_ROLLER_INF_PAGES / 2) * real_id_cnt; /*Select the middle page*/ - - /*Move to the new id*/ - const lv_style_t * style_label = lv_obj_get_style(ext->ddlist.label); - const lv_font_t * font = style_label->text.font; - lv_coord_t font_h = lv_font_get_line_height(font); - lv_coord_t h = lv_obj_get_height(roller); - - lv_coord_t line_y1 = ext->ddlist.sel_opt_id * (font_h + style_label->text.line_space) + - ext->ddlist.label->coords.y1 - roller_scrl->coords.y1; - lv_coord_t new_y = -line_y1 + (h - font_h) / 2; - lv_obj_set_y(roller_scrl, new_y); - } -} - -#if LV_USE_ANIMATION -static void scroll_anim_ready_cb(lv_anim_t * a) -{ - inf_normalize(a->var); -} -#endif - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_roller.h b/src/libs/lvgl/src/lv_objx/lv_roller.h deleted file mode 100644 index 5303c3aa..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_roller.h +++ /dev/null @@ -1,212 +0,0 @@ -/** - * @file lv_roller.h - * - */ - -#ifndef LV_ROLLER_H -#define LV_ROLLER_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_ROLLER != 0 - -/*Testing of dependencies*/ -#if LV_USE_DDLIST == 0 -#error "lv_roller: lv_ddlist is required. Enable it in lv_conf.h (LV_USE_DDLIST 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "lv_ddlist.h" -#include "lv_label.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** Roller mode. */ -enum { - LV_ROLLER_MODE_NORMAL, /**< Normal mode (roller ends at the end of the options). */ - LV_ROLLER_MODE_INIFINITE, /**< Infinite mode (roller can be scrolled forever). */ -}; - -typedef uint8_t lv_roller_mode_t; - - - -/*Data of roller*/ -typedef struct -{ - lv_ddlist_ext_t ddlist; /*Ext. of ancestor*/ - /*New data for this type */ - lv_roller_mode_t mode : 1; -} lv_roller_ext_t; - -enum { - LV_ROLLER_STYLE_BG, - LV_ROLLER_STYLE_SEL, -}; -typedef uint8_t lv_roller_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a roller object - * @param par pointer to an object, it will be the parent of the new roller - * @param copy pointer to a roller object, if not NULL then the new object will be copied from it - * @return pointer to the created roller - */ -lv_obj_t * lv_roller_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the options on a roller - * @param roller pointer to roller object - * @param options a string with '\n' separated options. E.g. "One\nTwo\nThree" - * @param mode `LV_ROLLER_MODE_NORMAL` or `LV_ROLLER_MODE_INFINITE` - */ -void lv_roller_set_options(lv_obj_t * roller, const char * options, lv_roller_mode_t mode); - -/** - * Set the align of the roller's options (left, right or center[default]) - * @param roller - pointer to a roller object - * @param align - one of lv_label_align_t values (left, right, center) - */ -void lv_roller_set_align(lv_obj_t * roller, lv_label_align_t align); - -/** - * Set the selected option - * @param roller pointer to a roller object - * @param sel_opt id of the selected option (0 ... number of option - 1); - * @param anim LV_ANOM_ON: set with animation; LV_ANIM_OFF set immediately - */ -void lv_roller_set_selected(lv_obj_t * roller, uint16_t sel_opt, lv_anim_enable_t anim); - -/** - * Set the height to show the given number of rows (options) - * @param roller pointer to a roller object - * @param row_cnt number of desired visible rows - */ -void lv_roller_set_visible_row_count(lv_obj_t * roller, uint8_t row_cnt); - -/** - * Set a fix width for the drop down list - * @param roller pointer to a roller obejct - * @param w the width when the list is opened (0: auto size) - */ -static inline void lv_roller_set_fix_width(lv_obj_t * roller, lv_coord_t w) -{ - lv_ddlist_set_fix_width(roller, w); -} - -/** - * Set the open/close animation time. - * @param roller pointer to a roller object - * @param anim_time: open/close animation time [ms] - */ -static inline void lv_roller_set_anim_time(lv_obj_t * roller, uint16_t anim_time) -{ - lv_ddlist_set_anim_time(roller, anim_time); -} - -/** - * Set a style of a roller - * @param roller pointer to a roller object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_roller_set_style(lv_obj_t * roller, lv_roller_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ -/** - * Get the id of the selected option - * @param roller pointer to a roller object - * @return id of the selected option (0 ... number of option - 1); - */ -uint16_t lv_roller_get_selected(const lv_obj_t * roller); - -/** - * Get the current selected option as a string - * @param roller pointer to roller object - * @param buf pointer to an array to store the string - * @param buf_size size of `buf` in bytes. 0: to ignore it. - */ -static inline void lv_roller_get_selected_str(const lv_obj_t * roller, char * buf, uint16_t buf_size) -{ - lv_ddlist_get_selected_str(roller, buf, buf_size); -} - -/** - * Get the align attribute. Default alignment after _create is LV_LABEL_ALIGN_CENTER - * @param roller pointer to a roller object - * @return LV_LABEL_ALIGN_LEFT, LV_LABEL_ALIGN_RIGHT or LV_LABEL_ALIGN_CENTER - */ -lv_label_align_t lv_roller_get_align(const lv_obj_t * roller); - -/** - * Get the options of a roller - * @param roller pointer to roller object - * @return the options separated by '\n'-s (E.g. "Option1\nOption2\nOption3") - */ -static inline const char * lv_roller_get_options(const lv_obj_t * roller) -{ - return lv_ddlist_get_options(roller); -} - -/** - * Get the open/close animation time. - * @param roller pointer to a roller - * @return open/close animation time [ms] - */ -static inline uint16_t lv_roller_get_anim_time(const lv_obj_t * roller) -{ - return lv_ddlist_get_anim_time(roller); -} - -/** - * Get the auto width set attribute - * @param roller pointer to a roller object - * @return true: auto size enabled; false: manual width settings enabled - */ -bool lv_roller_get_hor_fit(const lv_obj_t * roller); - -/** - * Get a style of a roller - * @param roller pointer to a roller object - * @param type which style should be get - * @return style pointer to a style - * */ -const lv_style_t * lv_roller_get_style(const lv_obj_t * roller, lv_roller_style_t type); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_ROLLER*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_ROLLER_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_slider.c b/src/libs/lvgl/src/lv_objx/lv_slider.c deleted file mode 100644 index 6e94973d..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_slider.c +++ /dev/null @@ -1,620 +0,0 @@ - -/** - * @file lv_slider.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_slider" - -#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 - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_slider_design(lv_obj_t * slider, const lv_area_t * mask, lv_design_mode_t mode); -static lv_res_t lv_slider_signal(lv_obj_t * slider, lv_signal_t sign, void * param); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_design_cb_t ancestor_design_f; -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a slider objects - * @param par pointer to an object, it will be the parent of the new slider - * @param copy pointer to a slider object, if not NULL then the new object will be copied from it - * @return pointer to the created slider - */ -lv_obj_t * lv_slider_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("slider create started"); - - /*Create the ancestor slider*/ - lv_obj_t * new_slider = lv_bar_create(par, copy); - 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); - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_slider); - - /*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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - /*Initialize the allocated 'ext' */ - ext->drag_value = LV_SLIDER_NOT_PRESSED; - ext->style_knob = &lv_style_pretty; - ext->knob_in = 0; - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_slider, lv_slider_signal); - lv_obj_set_design_cb(new_slider, lv_slider_design); - - /*Init the new slider slider*/ - if(copy == NULL) { - lv_obj_set_click(new_slider, true); - lv_obj_set_protect(new_slider, LV_PROTECT_PRESS_LOST); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_slider_set_style(new_slider, LV_SLIDER_STYLE_BG, th->style.slider.bg); - lv_slider_set_style(new_slider, LV_SLIDER_STYLE_INDIC, th->style.slider.indic); - lv_slider_set_style(new_slider, LV_SLIDER_STYLE_KNOB, th->style.slider.knob); - } else { - lv_slider_set_style(new_slider, LV_SLIDER_STYLE_KNOB, ext->style_knob); - } - } - /*Copy an existing slider*/ - 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); - } - - LV_LOG_INFO("slider created"); - - return new_slider; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * 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 - */ -void lv_slider_set_knob_in(lv_obj_t * slider, bool in) -{ - LV_ASSERT_OBJ(slider, LV_OBJX_NAME); - - lv_slider_ext_t * ext = lv_obj_get_ext_attr(slider); - if(ext->knob_in == in) return; - - ext->knob_in = in == false ? 0 : 1; - lv_obj_invalidate(slider); -} - -/** - * Set a style of a slider - * @param slider pointer to a slider object - * @param type which style should be set - * @param style pointer to a style - */ -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) { - case LV_SLIDER_STYLE_BG: lv_bar_set_style(slider, LV_BAR_STYLE_BG, style); break; - case LV_SLIDER_STYLE_INDIC: lv_bar_set_style(slider, LV_BAR_STYLE_INDIC, style); break; - case LV_SLIDER_STYLE_KNOB: - ext->style_knob = style; - lv_obj_refresh_ext_draw_pad(slider); - break; - } -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the value of a slider - * @param slider pointer to a slider object - * @return the value of the slider - */ -int16_t lv_slider_get_value(const lv_obj_t * slider) -{ - LV_ASSERT_OBJ(slider, LV_OBJX_NAME); - - 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); -} - -/** - * Give the slider is being dragged or not - * @param slider pointer to a slider object - * @return true: drag in progress false: not dragged - */ -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; -} - -/** - * 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 - */ -bool lv_slider_get_knob_in(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->knob_in == 0 ? false : true; -} - -/** - * Get a style of a slider - * @param slider pointer to a slider object - * @param type which style should be get - * @return style pointer to a style - */ -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); - - switch(type) { - case LV_SLIDER_STYLE_BG: style = lv_bar_get_style(slider, LV_BAR_STYLE_BG); break; - case LV_SLIDER_STYLE_INDIC: style = lv_bar_get_style(slider, LV_BAR_STYLE_INDIC); break; - case LV_SLIDER_STYLE_KNOB: style = ext->style_knob; break; - default: style = NULL; break; - } - - return style; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_slider_design(lv_obj_t * slider, const lv_area_t * mask, 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; - } - /*Draw the object*/ - else if(mode == LV_DESIGN_DRAW_MAIN) { - 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_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; - bool sym = false; - if(ext->bar.sym && ext->bar.min_value < 0 && ext->bar.max_value > 0) sym = true; - - 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; - if(sym) { - /*Calculate the coordinate of the zero point*/ - lv_coord_t zero; - zero = area_indic.x1 + (-ext->bar.min_value * slider_w) / (ext->bar.max_value - ext->bar.min_value); - if(area_indic.x2 > zero) - area_indic.x1 = zero; - else { - area_indic.x1 = area_indic.x2; - area_indic.x2 = zero; - } - } - - /*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; - - if(sym) { - /*Calculate the coordinate of the zero point*/ - lv_coord_t zero; - zero = area_indic.y2 - (-ext->bar.min_value * slider_h) / (ext->bar.max_value - ext->bar.min_value); - if(area_indic.y1 < zero) - area_indic.y2 = zero; - else { - area_indic.y2 = area_indic.y1; - area_indic.y1 = zero; - } - } - - /*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) { - if(sym == false) { - knob_area.x1 = area_indic.x2 - slider_h / 2; - } else { - if(cur_value > 0) knob_area.x1 = area_indic.x2 - slider_h / 2; - else knob_area.x1 = area_indic.x1 - slider_h / 2; - } - knob_area.x2 = knob_area.x1 + slider_h - 1; - } 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); - } - - 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) { - if(sym == false) { - knob_area.y1 = area_indic.y1 - slider_w / 2; - } else { - if(cur_value > 0) knob_area.y1 = area_indic.y1 - slider_w / 2; - else knob_area.y1 = area_indic.y2 - 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); - } - /*Post draw when the children are drawn*/ - else if(mode == LV_DESIGN_DRAW_POST) { - } - - return true; -} - -/** - * Signal function of the slider - * @param slider pointer to a slider 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_slider_signal(lv_obj_t * slider, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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) { - 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; - - 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; - } - } 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; - -#if LV_USE_GROUP - /*Leave edit mode if released. (No need to wait for LONG_PRESS) */ - lv_group_t * g = lv_obj_get_group(slider); - bool editing = lv_group_get_editing(g); - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); - if(indev_type == LV_INDEV_TYPE_ENCODER) { - if(editing) lv_group_set_editing(g, false); - } -#endif - - } else if(sign == LV_SIGNAL_CORD_CHG) { - /* The knob size depends on slider size. - * During the drawing method the ext. size is used by the knob so refresh the ext. size.*/ - if(lv_obj_get_width(slider) != lv_area_get_width(param) || - lv_obj_get_height(slider) != lv_area_get_height(param)) { - 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 * 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; - - if(slider->ext_draw_pad < shadow_w) slider->ext_draw_pad = shadow_w; - } - } 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); - if(res != LV_RES_OK) return res; - } else if(c == LV_KEY_LEFT || c == LV_KEY_DOWN) { - lv_slider_set_value(slider, lv_slider_get_value(slider) - 1, true); - res = lv_event_send(slider, LV_EVENT_VALUE_CHANGED, NULL); - if(res != LV_RES_OK) return res; - } - } else if(sign == LV_SIGNAL_GET_EDITABLE) { - bool * editable = (bool *)param; - *editable = true; - } - - return res; -} -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_slider.h b/src/libs/lvgl/src/lv_objx/lv_slider.h deleted file mode 100644 index 967c8b68..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_slider.h +++ /dev/null @@ -1,216 +0,0 @@ -/** - * @file lv_slider.h - * - */ - -#ifndef LV_SLIDER_H -#define LV_SLIDER_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_SLIDER != 0 - -/*Testing of dependencies*/ -#if LV_USE_BAR == 0 -#error "lv_slider: lv_bar is required. Enable it in lv_conf.h (LV_USE_BAR 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "lv_bar.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ -/*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_slider_ext_t; - -/** Built-in styles of slider*/ -enum { - LV_SLIDER_STYLE_BG, /** Slider background style. */ - LV_SLIDER_STYLE_INDIC, /** Slider indicator (filled area) style. */ - LV_SLIDER_STYLE_KNOB, /** Slider knob style. */ -}; -typedef uint8_t lv_slider_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a slider objects - * @param par pointer to an object, it will be the parent of the new slider - * @param copy pointer to a slider object, if not NULL then the new object will be copied from it - * @return pointer to the created slider - */ -lv_obj_t * lv_slider_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new value on the slider - * @param slider pointer to a slider object - * @param 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_value(lv_obj_t * slider, int16_t value, lv_anim_enable_t anim) -{ - lv_bar_set_value(slider, value, anim); -} - -/** - * Set minimum and the maximum values of a bar - * @param slider pointer to the slider object - * @param min minimum value - * @param max maximum value - */ -static inline void lv_slider_set_range(lv_obj_t * slider, int16_t min, int16_t max) -{ - lv_bar_set_range(slider, min, max); -} - -/** - * 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) -{ - lv_bar_set_anim_time(slider, anim_time); -} - -/** - * 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_sym(lv_obj_t * slider, bool en) -{ - lv_bar_set_sym(slider, en); -} - -/** - * 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 - */ -void lv_slider_set_knob_in(lv_obj_t * slider, bool in); - -/** - * Set a style of a slider - * @param slider pointer to a slider object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_slider_set_style(lv_obj_t * slider, lv_slider_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the value of a slider - * @param slider pointer to a slider object - * @return the value of the slider - */ -int16_t lv_slider_get_value(const lv_obj_t * slider); - -/** - * Get the minimum value of a slider - * @param slider pointer to a slider object - * @return the minimum value of the slider - */ -static inline int16_t lv_slider_get_min_value(const lv_obj_t * slider) -{ - return lv_bar_get_min_value(slider); -} - -/** - * Get the maximum value of a slider - * @param slider pointer to a slider object - * @return the maximum value of the slider - */ -static inline int16_t lv_slider_get_max_value(const lv_obj_t * slider) -{ - return lv_bar_get_max_value(slider); -} - -/** - * Give the slider is being dragged or not - * @param slider pointer to a slider object - * @return true: drag in progress false: not dragged - */ -bool lv_slider_is_dragged(const lv_obj_t * slider); - -/** - * 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 bool lv_slider_get_sym(lv_obj_t * slider) -{ - return lv_bar_get_sym(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 - */ -bool lv_slider_get_knob_in(const lv_obj_t * slider); - -/** - * Get a style of a slider - * @param slider pointer to a slider object - * @param type which style should be get - * @return style pointer to a style - */ -const lv_style_t * lv_slider_get_style(const lv_obj_t * slider, lv_slider_style_t type); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SLIDER*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_SLIDER_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_spinbox.c b/src/libs/lvgl/src/lv_objx/lv_spinbox.c deleted file mode 100644 index 6873085a..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_spinbox.c +++ /dev/null @@ -1,479 +0,0 @@ -/** - * @file lv_spinbox.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_spinbox" - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_res_t lv_spinbox_signal(lv_obj_t * spinbox, lv_signal_t sign, void * param); -static void lv_spinbox_updatevalue(lv_obj_t * spinbox); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_design_cb_t ancestor_design; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a spinbox object - * @param par pointer to an object, it will be the parent of the new spinbox - * @param copy pointer to a spinbox object, if not NULL then the new object will be copied from it - * @return pointer to the created spinbox - */ -lv_obj_t * lv_spinbox_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("spinbox create started"); - - /*Create the ancestor of spinbox*/ - lv_obj_t * new_spinbox = lv_ta_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) 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); - - /*Initialize the allocated 'ext'*/ - ext->value = 0; - ext->dec_point_pos = 0; - ext->digit_count = 5; - ext->digit_padding_left = 0; - ext->step = 1; - ext->range_max = 99999; - ext->range_min = -99999; - - lv_ta_set_cursor_type(new_spinbox, LV_CURSOR_BLOCK); - lv_ta_set_one_line(new_spinbox, true); - lv_ta_set_cursor_click_pos(new_spinbox, false); - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_spinbox, lv_spinbox_signal); - lv_obj_set_design_cb(new_spinbox, ancestor_design); /*Leave the Text area's design function*/ - - /*Init the new spinbox spinbox*/ - if(copy == NULL) { - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_spinbox_set_style(new_spinbox, LV_SPINBOX_STYLE_BG, th->style.spinbox.bg); - lv_spinbox_set_style(new_spinbox, LV_SPINBOX_STYLE_CURSOR, th->style.spinbox.cursor); - lv_spinbox_set_style(new_spinbox, LV_SPINBOX_STYLE_SB, th->style.spinbox.sb); - } - } - /*Copy an existing spinbox*/ - else { - lv_spinbox_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - - lv_spinbox_set_value(new_spinbox, copy_ext->value); - lv_spinbox_set_digit_format(new_spinbox, (uint8_t)copy_ext->digit_count, (uint8_t)copy_ext->dec_point_pos); - lv_spinbox_set_range(new_spinbox, copy_ext->range_min, copy_ext->range_max); - lv_spinbox_set_step(new_spinbox, copy_ext->step); - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_spinbox); - } - - lv_spinbox_updatevalue(new_spinbox); - - LV_LOG_INFO("spinbox created"); - - return new_spinbox; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set spinbox value - * @param spinbox pointer to spinbox - * @param i value to be set - */ -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; - - if(i > ext->range_max) i = ext->range_max; - if(i < ext->range_min) i = ext->range_min; - - ext->value = i; - - lv_spinbox_updatevalue(spinbox); -} - -/** - * Set spinbox digit format (digit count and decimal format) - * @param spinbox pointer to spinbox - * @param digit_count number of digit excluding the decimal separator and the sign - * @param separator_position number of digit before the decimal point. If 0, decimal point is not - * shown - */ -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; - - if(digit_count > LV_SPINBOX_MAX_DIGIT_COUNT) digit_count = LV_SPINBOX_MAX_DIGIT_COUNT; - - if(separator_position > LV_SPINBOX_MAX_DIGIT_COUNT) separator_position = LV_SPINBOX_MAX_DIGIT_COUNT; - - ext->digit_count = digit_count; - ext->dec_point_pos = separator_position; - - lv_spinbox_updatevalue(spinbox); -} - -/** - * Set spinbox step - * @param spinbox pointer to spinbox - * @param step steps on increment/decrement - */ -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; - - ext->step = step; -} - -/** - * Set spinbox value range - * @param spinbox pointer to spinbox - * @param range_min maximum value, inclusive - * @param range_max minimum value, inclusive - */ -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; - - ext->range_max = range_max; - ext->range_min = range_min; - - if(ext->value > ext->range_max) { - ext->value = ext->range_max; - lv_obj_invalidate(spinbox); - } - if(ext->value < ext->range_min) { - ext->value = ext->range_min; - lv_obj_invalidate(spinbox); - } -} - -/** - * Set spinbox left padding in digits count (added between sign and first digit) - * @param spinbox pointer to spinbox - * @param cb Callback function called on value change event - */ -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); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the spinbox numeral value (user has to convert to float according to its digit format) - * @param spinbox pointer to spinbox - * @return value integer value of the spinbox - */ -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; -} - -/*===================== - * Other functions - *====================*/ - -/** - * Select next lower digit for edition - * @param spinbox pointer to 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; - if((new_step) > 0) - ext->step = new_step; - else - ext->step = 1; - - lv_spinbox_updatevalue(spinbox); -} - -/** - * Select next higher digit for edition - * @param spinbox pointer to 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)); - int32_t new_step = ext->step * 10; - if(new_step <= step_limit) ext->step = new_step; - - lv_spinbox_updatevalue(spinbox); -} - -/** - * Increment spinbox value by one step - * @param spinbox pointer to 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) { - /*Special mode when zero crossing*/ - if((ext->value + ext->step) > 0 && ext->value < 0) ext->value = -ext->value; - ext->value += ext->step; - - } else { - ext->value = ext->range_max; - } - - lv_spinbox_updatevalue(spinbox); -} - -/** - * Decrement spinbox value by one step - * @param spinbox pointer to 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) { - /*Special mode when zero crossing*/ - if((ext->value - ext->step) < 0 && ext->value > 0) ext->value = -ext->value; - ext->value -= ext->step; - } else { - ext->value = ext->range_min; - } - - lv_spinbox_updatevalue(spinbox); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Signal function of the spinbox - * @param spinbox pointer to a spinbox 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_spinbox_signal(lv_obj_t * spinbox, lv_signal_t sign, void * param) -{ - - lv_res_t res = LV_RES_OK; - - /* Include the ancient signal function */ - if(sign != LV_SIGNAL_CONTROL) { - 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) { - 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_spinbox"; - } else if(sign == LV_SIGNAL_RELEASED) { - /*If released with an ENCODER then move to the next digit*/ -#if LV_USE_GROUP - lv_indev_t * indev = lv_indev_get_act(); - if(lv_indev_get_type(indev) == LV_INDEV_TYPE_ENCODER) { - if(lv_group_get_editing(lv_obj_get_group(spinbox))) { - if(ext->step > 1) { - lv_spinbox_step_next(spinbox); - } else { - /*Restart from the MSB*/ - ext->step = 1; - uint32_t i; - for(i = 0; i < ext->digit_count; i++) { - int32_t new_step = ext->step * 10; - if(new_step >= ext->range_max) break; - ext->step = new_step; - } - lv_spinbox_step_prev(spinbox); - } - } - } -#endif - } else if(sign == LV_SIGNAL_CONTROL) { - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); - - uint32_t c = *((uint32_t *)param); /*uint32_t because can be UTF-8*/ - if(c == LV_KEY_RIGHT) { - if(indev_type == LV_INDEV_TYPE_ENCODER) - lv_spinbox_increment(spinbox); - else - lv_spinbox_step_next(spinbox); - } else if(c == LV_KEY_LEFT) { - if(indev_type == LV_INDEV_TYPE_ENCODER) - lv_spinbox_decrement(spinbox); - else - lv_spinbox_step_prev(spinbox); - } else if(c == LV_KEY_UP) { - lv_spinbox_increment(spinbox); - } else if(c == LV_KEY_DOWN) { - lv_spinbox_decrement(spinbox); - } else { - lv_ta_add_char(spinbox, c); - } - } - - return res; -} - -static void lv_spinbox_updatevalue(lv_obj_t * spinbox) -{ - lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); - - char buf[LV_SPINBOX_MAX_DIGIT_COUNT + 8]; - memset(buf, 0, sizeof(buf)); - char * buf_p = buf; - uint8_t cur_shift_left = 0; - - if (ext->range_min < 0) { // hide sign if there are only positive values - /*Add the sign*/ - (*buf_p) = ext->value >= 0 ? '+' : '-'; - buf_p++; - } else { - /*Cursor need shift to left*/ - cur_shift_left++; - } - - int32_t i; - /*padding left*/ - for(i = 0; i < ext->digit_padding_left; i++) { - (*buf_p) = ' '; - buf_p++; - } - - char digits[64]; - /*Convert the numbers to string (the sign is already handled so always covert positive number)*/ - lv_utils_num_to_str(ext->value < 0 ? -ext->value : ext->value, digits); - - /*Add leading zeros*/ - int lz_cnt = ext->digit_count - (int)strlen(digits); - if(lz_cnt > 0) { - for(i = (uint16_t)strlen(digits); i >= 0; i--) { - digits[i + lz_cnt] = digits[i]; - } - for(i = 0; i < lz_cnt; i++) { - digits[i] = '0'; - } - } - - int32_t intDigits; - intDigits = (ext->dec_point_pos == 0) ? ext->digit_count : ext->dec_point_pos; - - /*Add the decimal part*/ - for(i = 0; i < intDigits && digits[i] != '\0'; i++) { - (*buf_p) = digits[i]; - buf_p++; - } - - if(ext->dec_point_pos != 0) { - /*Insert the decimal point*/ - (*buf_p) = '.'; - buf_p++; - - for(/*Leave i*/; i < ext->digit_count && digits[i] != '\0'; i++) { - (*buf_p) = digits[i]; - buf_p++; - } - } - - /*Refresh the text*/ - lv_ta_set_text(spinbox, (char *)buf); - - /*Set the cursor position*/ - int32_t step = ext->step; - uint8_t cur_pos = (uint8_t)ext->digit_count; - while(step >= 10) { - step /= 10; - cur_pos--; - } - - if(cur_pos > intDigits) cur_pos++; /*Skip teh decimal point*/ - - cur_pos += (ext->digit_padding_left - cur_shift_left); - - lv_ta_set_cursor_pos(spinbox, cur_pos); -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_spinbox.h b/src/libs/lvgl/src/lv_objx/lv_spinbox.h deleted file mode 100644 index ea60169e..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_spinbox.h +++ /dev/null @@ -1,188 +0,0 @@ -/** - * @file lv_spinbox.h - * - */ - -#ifndef LV_SPINBOX_H -#define LV_SPINBOX_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_SPINBOX != 0 - -/*Testing of dependencies*/ -#if LV_USE_TA == 0 -#error "lv_spinbox: lv_ta is required. Enable it in lv_conf.h (LV_USE_TA 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "../lv_objx/lv_ta.h" - -/********************* - * DEFINES - *********************/ -#define LV_SPINBOX_MAX_DIGIT_COUNT 16 - -/********************** - * TYPEDEFS - **********************/ - -/*Data of spinbox*/ -typedef struct -{ - lv_ta_ext_t ta; /*Ext. of ancestor*/ - /*New data for this type */ - int32_t value; - int32_t range_max; - int32_t range_min; - int32_t step; - uint16_t digit_count : 4; - uint16_t dec_point_pos : 4; /*if 0, there is no separator and the number is an integer*/ - uint16_t digit_padding_left : 4; -} lv_spinbox_ext_t; - -/*Styles*/ -enum { - LV_SPINBOX_STYLE_BG, - LV_SPINBOX_STYLE_SB, - LV_SPINBOX_STYLE_CURSOR, -}; -typedef uint8_t lv_spinbox_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a spinbox objects - * @param par pointer to an object, it will be the parent of the new spinbox - * @param copy pointer to a spinbox object, if not NULL then the new object will be copied from it - * @return pointer to the created spinbox - */ -lv_obj_t * lv_spinbox_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a style of a spinbox. - * @param templ pointer to template object - * @param type which style should be set - * @param style pointer to a style - */ -static inline void lv_spinbox_set_style(lv_obj_t * spinbox, lv_spinbox_style_t type, lv_style_t * style) -{ - lv_ta_set_style(spinbox, type, style); -} - -/** - * Set spinbox value - * @param spinbox pointer to spinbox - * @param i value to be set - */ -void lv_spinbox_set_value(lv_obj_t * spinbox, int32_t i); - -/** - * Set spinbox digit format (digit count and decimal format) - * @param spinbox pointer to spinbox - * @param digit_count number of digit excluding the decimal separator and the sign - * @param separator_position number of digit before the decimal point. If 0, decimal point is not - * shown - */ -void lv_spinbox_set_digit_format(lv_obj_t * spinbox, uint8_t digit_count, uint8_t separator_position); - -/** - * Set spinbox step - * @param spinbox pointer to spinbox - * @param step steps on increment/decrement - */ -void lv_spinbox_set_step(lv_obj_t * spinbox, uint32_t step); - -/** - * Set spinbox value range - * @param spinbox pointer to spinbox - * @param range_min maximum value, inclusive - * @param range_max minimum value, inclusive - */ -void lv_spinbox_set_range(lv_obj_t * spinbox, int32_t range_min, int32_t range_max); - -/** - * Set spinbox left padding in digits count (added between sign and first digit) - * @param spinbox pointer to spinbox - * @param cb Callback function called on value change event - */ -void lv_spinbox_set_padding_left(lv_obj_t * spinbox, uint8_t padding); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get style of a spinbox. - * @param templ pointer to template object - * @param type which style should be get - * @return style pointer to the style - */ -static inline const lv_style_t * lv_spinbox_get_style(lv_obj_t * spinbox, lv_spinbox_style_t type) -{ - return lv_ta_get_style(spinbox, type); -} - -/** - * Get the spinbox numeral value (user has to convert to float according to its digit format) - * @param spinbox pointer to spinbox - * @return value integer value of the spinbox - */ -int32_t lv_spinbox_get_value(lv_obj_t * spinbox); - -/*===================== - * Other functions - *====================*/ - -/** - * Select next lower digit for edition by dividing the step by 10 - * @param spinbox pointer to spinbox - */ -void lv_spinbox_step_next(lv_obj_t * spinbox); - -/** - * Select next higher digit for edition by multiplying the step by 10 - * @param spinbox pointer to spinbox - */ -void lv_spinbox_step_prev(lv_obj_t * spinbox); - -/** - * Increment spinbox value by one step - * @param spinbox pointer to spinbox - */ -void lv_spinbox_increment(lv_obj_t * spinbox); - -/** - * Decrement spinbox value by one step - * @param spinbox pointer to spinbox - */ -void lv_spinbox_decrement(lv_obj_t * spinbox); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_SPINBOX*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_SPINBOX_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_sw.c b/src/libs/lvgl/src/lv_objx/lv_sw.c deleted file mode 100644 index 428a4af1..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_sw.c +++ /dev/null @@ -1,403 +0,0 @@ -/** - * @file lv_sw.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_sw.h" - -#if LV_USE_SW != 0 - -/*Testing of dependencies*/ -#if LV_USE_SLIDER == 0 -#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" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_sw" - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -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; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a switch objects - * @param par pointer to an object, it will be the parent of the new switch - * @param copy pointer to a switch object, if not NULL then the new object will be copied from it - * @return pointer to the created switch - */ -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_ASSERT_MEM(new_sw); - if(new_sw == NULL) return NULL; - - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_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_ASSERT_MEM(ext); - if(ext == NULL) 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; - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_sw, lv_sw_signal); - - /*Init the new switch switch*/ - if(copy == NULL) { - 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); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_sw_set_style(new_sw, LV_SW_STYLE_BG, th->style.sw.bg); - lv_sw_set_style(new_sw, LV_SW_STYLE_INDIC, th->style.sw.indic); - lv_sw_set_style(new_sw, LV_SW_STYLE_KNOB_OFF, th->style.sw.knob_off); - lv_sw_set_style(new_sw, LV_SW_STYLE_KNOB_ON, th->style.sw.knob_on); - } 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); - } - - LV_LOG_INFO("switch created"); - - return new_sw; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Turn ON the switch - * @param sw pointer to a switch objec - * @param anim LV_ANOM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -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); -} - -/** - * Turn OFF the switch - * @param sw pointer to a switch object - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -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); -} - -/** - * Toggle the position of the switch - * @param sw pointer to a switch object - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - * @return resulting state of the switch. - */ -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 - - bool state = lv_sw_get_state(sw); - if(state) - lv_sw_off(sw, anim); - else - lv_sw_on(sw, anim); - - return !state; -} - -/** - * 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) -{ - 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_KNOB_OFF: - ext->style_knob_off = style; - if(lv_sw_get_state(sw) == 0) lv_slider_set_style(sw, LV_SLIDER_STYLE_KNOB, style); - 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); - break; - } -} - -void lv_sw_set_anim_time(lv_obj_t * sw, uint16_t anim_time) -{ - LV_ASSERT_OBJ(sw, LV_OBJX_NAME); - -#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 a style of a switch - * @param sw pointer to a switch object - * @param type which style should be get - * @return style pointer to a style - */ -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_KNOB_OFF: style = ext->style_knob_off; break; - case LV_SW_STYLE_KNOB_ON: style = ext->style_knob_on; break; - default: style = NULL; break; - } - - return style; -} - -uint16_t lv_sw_get_anim_time(const lv_obj_t * sw) -{ - LV_ASSERT_OBJ(sw, LV_OBJX_NAME); - -#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 - **********************/ - -/** - * Signal function of the switch - * @param sw pointer to a switch 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_sw_signal(lv_obj_t * sw, lv_signal_t sign, void * param) -{ - lv_res_t res; - if(sign == LV_SIGNAL_GET_TYPE) { - res = ancestor_signal(sw, sign, param); - if(res != LV_RES_OK) return res; - return lv_obj_handle_get_type_signal(param, LV_OBJX_NAME); - } - - 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; - - /* 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_CLEANUP) { - /*Nothing to cleanup. (No dynamically allocated memory in 'ext')*/ - } else if(sign == LV_SIGNAL_PRESSED) { - - /*Save the x coordinate of the pressed point to see if the switch was slid*/ - lv_indev_t * indev = lv_indev_get_act(); - if(indev) { - lv_point_t p; - lv_indev_get_point(indev, &p); - ext->start_x = p.x; - } - ext->slided = 0; - ext->changed = 0; - } 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(); - 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 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 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; - } - } 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; - } - } else if(sign == LV_SIGNAL_RELEASED) { - /*If not dragged then toggle the switch*/ - if(ext->changed == 0) { - int32_t state; - if(lv_sw_get_state(sw)) { - lv_sw_off(sw, LV_ANIM_ON); - state = 0; - } else { - lv_sw_on(sw, LV_ANIM_ON); - state = 1; - } - - res = lv_event_send(sw, LV_EVENT_VALUE_CHANGED, &state); - if(res != LV_RES_OK) return res; - } - /*If the switch was dragged then calculate the new state based on the current position*/ - else { - int16_t v = lv_slider_get_value(sw); - int32_t state; - if(v > LV_SW_MAX_VALUE / 2) { - lv_sw_on(sw, LV_ANIM_ON); - state = 1; - } else { - lv_sw_off(sw, 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_CONTROL) { - 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); - 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); - 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) { - bool * editable = (bool *)param; - *editable = false; /*The ancestor slider is editable the switch is not*/ - } - - return res; -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_sw.h b/src/libs/lvgl/src/lv_objx/lv_sw.h deleted file mode 100644 index f4b44aeb..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_sw.h +++ /dev/null @@ -1,159 +0,0 @@ -/** - * @file lv_sw.h - * - */ - -#ifndef LV_SW_H -#define LV_SW_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_SW != 0 - -/*Testing of dependencies*/ -#if LV_USE_SLIDER == 0 -#error "lv_sw: lv_slider is required. Enable it in lv_conf.h (LV_USE_SLIDER 1)" -#endif - -#include "../lv_core/lv_obj.h" -#include "lv_slider.h" - -/********************* - * DEFINES - *********************/ -#define LV_SW_MAX_VALUE 100 - -/********************** - * TYPEDEFS - **********************/ -/*Data of switch*/ -typedef struct -{ - lv_slider_ext_t slider; /*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)*/ - 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 -} lv_sw_ext_t; - -/** - * Switch styles. - */ -enum { - LV_SW_STYLE_BG, /**< Switch background. */ - LV_SW_STYLE_INDIC, /**< Switch fill area. */ - LV_SW_STYLE_KNOB_OFF, /**< Switch knob (when off). */ - LV_SW_STYLE_KNOB_ON, /**< Switch knob (when on). */ -}; -typedef uint8_t lv_sw_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a switch objects - * @param par pointer to an object, it will be the parent of the new switch - * @param copy pointer to a switch object, if not NULL then the new object will be copied from it - * @return pointer to the created switch - */ -lv_obj_t * lv_sw_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Turn ON the switch - * @param sw pointer to a switch object - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -void lv_sw_on(lv_obj_t * sw, lv_anim_enable_t anim); - -/** - * Turn OFF the switch - * @param sw pointer to a switch object - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -void lv_sw_off(lv_obj_t * sw, lv_anim_enable_t anim); - -/** - * Toggle the position of the switch - * @param sw pointer to a switch object - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - * @return resulting state of the switch. - */ -bool lv_sw_toggle(lv_obj_t * sw, lv_anim_enable_t anim); - -/** - * 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); - -/** - * Set the animation time of the switch - * @param sw pointer to a switch object - * @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); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the state of a switch - * @param sw pointer to a switch object - * @return false: OFF; true: ON - */ -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; -} - -/** - * Get a style of a switch - * @param sw pointer to a switch object - * @param type which style should be get - * @return style pointer to a style - */ -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 - **********************/ - -#endif /*LV_USE_SW*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_SW_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_ta.c b/src/libs/lvgl/src/lv_objx/lv_ta.c deleted file mode 100644 index 387e99b2..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_ta.c +++ /dev/null @@ -1,1948 +0,0 @@ -/** - * @file lv_ta.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_ta.h" -#if LV_USE_TA != 0 -#include <string.h> -#include "../lv_core/lv_debug.h" -#include "../lv_core/lv_group.h" -#include "../lv_core/lv_refr.h" -#include "../lv_draw/lv_draw.h" -#include "../lv_themes/lv_theme.h" -#include "../lv_misc/lv_anim.h" -#include "../lv_misc/lv_txt.h" -#include "../lv_misc/lv_math.h" - -/********************* - * DEFINES - *********************/ -#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 - -#ifndef LV_TA_DEF_PWD_SHOW_TIME -#define LV_TA_DEF_PWD_SHOW_TIME 1500 /*ms*/ -#endif - -#define LV_TA_DEF_WIDTH (2 * LV_DPI) -#define LV_TA_DEF_HEIGHT (1 * LV_DPI) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * 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_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 -static void cursor_blink_anim(lv_obj_t * ta, lv_anim_value_t show); -static void pwd_char_hider_anim(lv_obj_t * ta, lv_anim_value_t x); -static void pwd_char_hider_anim_ready(lv_anim_t * a); -#endif -static void pwd_char_hider(lv_obj_t * ta); -static bool char_is_accepted(lv_obj_t * ta, uint32_t c); -static void get_cursor_style(lv_obj_t * ta, lv_style_t * style_res); -static void refr_cursor_area(lv_obj_t * ta); -static void placeholder_update(lv_obj_t * ta); -static void update_cursor_position_on_click(lv_obj_t * ta, lv_signal_t sign, lv_indev_t * click_source); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_design_cb_t ancestor_design; -static lv_design_cb_t scrl_design; -static lv_signal_cb_t ancestor_signal; -static lv_signal_cb_t scrl_signal; -static const char * ta_insert_replace; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a text area objects - * @param par pointer to an object, it will be the parent of the new text area - * @param copy pointer to a text area object, if not NULL then the new object will be copied from it - * @return pointer to the created text area - */ -lv_obj_t * lv_ta_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("text area create started"); - - /*Create the ancestor object*/ - lv_obj_t * new_ta = lv_page_create(par, copy); - LV_ASSERT_MEM(new_ta); - if(new_ta == NULL) return NULL; - - if(ancestor_signal == NULL) ancestor_signal = lv_obj_get_signal_cb(new_ta); - if(ancestor_design == NULL) ancestor_design = lv_obj_get_design_cb(new_ta); - if(scrl_signal == NULL) scrl_signal = lv_obj_get_signal_cb(lv_page_get_scrl(new_ta)); - if(scrl_design == NULL) scrl_design = lv_obj_get_design_cb(lv_page_get_scrl(new_ta)); - - /*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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - ext->cursor.state = 1; - ext->pwd_mode = 0; - ext->pwd_tmp = NULL; - ext->pwd_show_time = LV_TA_DEF_PWD_SHOW_TIME; - ext->accapted_chars = NULL; - ext->max_length = 0; - ext->cursor.style = NULL; - ext->cursor.blink_time = LV_TA_DEF_CURSOR_BLINK_TIME; - ext->cursor.pos = 0; - ext->cursor.click_pos = 1; - ext->cursor.type = LV_CURSOR_LINE; - ext->cursor.valid_x = 0; - ext->one_line = 0; -#if LV_LABEL_TEXT_SEL - ext->text_sel_en = 0; -#endif - ext->label = NULL; - ext->placeholder = NULL; - -#if LV_USE_ANIMATION == 0 - ext->pwd_show_time = 0; - ext->cursor.blink_time = 0; -#endif - - lv_obj_set_signal_cb(new_ta, lv_ta_signal); - lv_obj_set_signal_cb(lv_page_get_scrl(new_ta), lv_ta_scrollable_signal); - lv_obj_set_design_cb(new_ta, lv_ta_design); - - /*Init the new text area object*/ - if(copy == NULL) { - lv_page_set_scrl_fit2(new_ta, LV_FIT_FLOOD, LV_FIT_TIGHT); - - ext->label = lv_label_create(new_ta, NULL); - - lv_obj_set_design_cb(ext->page.scrl, lv_ta_scrollable_design); - - lv_label_set_long_mode(ext->label, LV_LABEL_LONG_BREAK); - lv_label_set_text(ext->label, "Text area"); - lv_obj_set_click(ext->label, false); - lv_obj_set_size(new_ta, LV_TA_DEF_WIDTH, LV_TA_DEF_HEIGHT); - lv_ta_set_sb_mode(new_ta, LV_SB_MODE_DRAG); - lv_page_set_style(new_ta, LV_PAGE_STYLE_SCRL, &lv_style_transp_tight); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_ta_set_style(new_ta, LV_TA_STYLE_BG, th->style.ta.area); - lv_ta_set_style(new_ta, LV_TA_STYLE_SB, th->style.ta.sb); - } else { - lv_ta_set_style(new_ta, LV_TA_STYLE_BG, &lv_style_pretty); - } - } - /*Copy an existing object*/ - else { - lv_obj_set_design_cb(ext->page.scrl, lv_ta_scrollable_design); - lv_ta_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->label = lv_label_create(new_ta, copy_ext->label); - ext->pwd_mode = copy_ext->pwd_mode; - ext->accapted_chars = copy_ext->accapted_chars; - ext->max_length = copy_ext->max_length; - ext->cursor.style = copy_ext->cursor.style; - ext->cursor.pos = copy_ext->cursor.pos; - ext->cursor.valid_x = copy_ext->cursor.valid_x; - ext->cursor.type = copy_ext->cursor.type; - - if(ext->pwd_mode != 0) pwd_char_hider( new_ta); - - if(copy_ext->placeholder != NULL) - ext->placeholder = lv_label_create(new_ta, copy_ext->placeholder); - else - ext->placeholder = NULL; - - if(copy_ext->pwd_tmp) { - uint16_t len = lv_mem_get_size(copy_ext->pwd_tmp); - ext->pwd_tmp = lv_mem_alloc(len); - LV_ASSERT_MEM(ext->pwd_tmp); - if(ext->pwd_tmp == NULL) return NULL; - - memcpy(ext->pwd_tmp, copy_ext->pwd_tmp, len); - } - - if(copy_ext->one_line) lv_ta_set_one_line(new_ta, true); - - lv_ta_set_style(new_ta, LV_TA_STYLE_CURSOR, lv_ta_get_style(copy, LV_TA_STYLE_CURSOR)); - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_ta); - } - -#if LV_USE_ANIMATION - if(ext->cursor.blink_time) { - /*Create a cursor blinker animation*/ - lv_anim_t a; - a.var = new_ta; - a.exec_cb = (lv_anim_exec_xcb_t)cursor_blink_anim; - a.time = ext->cursor.blink_time; - a.act_time = 0; - a.ready_cb = NULL; - a.start = 1; - a.end = 0; - a.repeat = 1; - a.repeat_pause = 0; - a.playback = 1; - a.playback_pause = 0; - a.path_cb = lv_anim_path_step; - lv_anim_create(&a); - } -#endif - - LV_LOG_INFO("text area created"); - - return new_ta; -} - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Insert a character to the current cursor position. - * To add a wide char, e.g. 'Á' use `lv_txt_encoded_conv_wc('Á')` - * @param ta pointer to a text area object - * @param c a character (e.g. 'a') - */ -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]; - letter_buf[0] = c; - letter_buf[1] = '\0'; - - ta_insert_replace = NULL; - lv_event_send(ta, LV_EVENT_INSERT, letter_buf); - if(ta_insert_replace) { - if(ta_insert_replace[0] == '\0') return; /*Drop this text*/ - - /*Add the replaced text directly it's different from the original*/ - if(strcmp(ta_insert_replace, (char *)letter_buf)) { - lv_ta_add_text(ta, ta_insert_replace); - return; - } - } - - if(ext->one_line && (c == '\n' || c == '\r')) { - LV_LOG_INFO("Text area: line break ignored in one-line mode"); - return; - } - - uint32_t c_uni = lv_txt_encoded_next((const char *)&c, NULL); - - if(char_is_accepted(ta, c_uni) == false) { - LV_LOG_INFO("Character is no accepted by the text area (too long text or not in the " - "accepted list)"); - return; - } - - /*If a new line was added it shouldn't show edge flash effect*/ - bool edge_flash_en = lv_ta_get_edge_flash(ta); - lv_ta_set_edge_flash(ta, false); - - if(ext->pwd_mode != 0) pwd_char_hider(ta); /*Make sure all the current text contains only '*'*/ - - lv_label_ins_text(ext->label, ext->cursor.pos, (const char *)letter_buf); /*Insert the character*/ - lv_ta_clear_selection(ta); /*Clear selection*/ - - 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_ASSERT_MEM(ext->pwd_tmp); - if(ext->pwd_tmp == NULL) return; - - lv_txt_ins(ext->pwd_tmp, ext->cursor.pos, (const char *)letter_buf); - -#if LV_USE_ANIMATION - /*Auto hide characters*/ - lv_anim_t a; - a.var = ta; - a.exec_cb = (lv_anim_exec_xcb_t)pwd_char_hider_anim; - a.time = ext->pwd_show_time; - a.act_time = 0; - a.ready_cb = pwd_char_hider_anim_ready; - a.start = 0; - a.end = 1; - a.repeat = 0; - a.repeat_pause = 0; - a.playback = 0; - a.playback_pause = 0; - a.path_cb = lv_anim_path_step; - lv_anim_create(&a); - -#else - pwd_char_hider(ta); -#endif - } - - /*Move the cursor after the new character*/ - lv_ta_set_cursor_pos(ta, lv_ta_get_cursor_pos(ta) + 1); - - /*Revert the original edge flash state*/ - lv_ta_set_edge_flash(ta, edge_flash_en); - - placeholder_update(ta); - - lv_event_send(ta, LV_EVENT_VALUE_CHANGED, NULL); -} - -/** - * Insert a text to the current cursor position - * @param ta pointer to a text area object - * @param txt a '\0' terminated string to insert - */ -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; - lv_event_send(ta, LV_EVENT_INSERT, txt); - if(ta_insert_replace) { - if(ta_insert_replace[0] == '\0') return; /*Drop this text*/ - - /*Add the replaced text directly it's different from the original*/ - if(strcmp(ta_insert_replace, txt)) { - lv_ta_add_text(ta, ta_insert_replace); - return; - } - } - - if(ext->pwd_mode != 0) pwd_char_hider(ta); /*Make sure all the current text contains only '*'*/ - - /*Add the character one-by-one if not all characters are accepted or there is character limit.*/ - if(lv_ta_get_accepted_chars(ta) || lv_ta_get_max_length(ta)) { - uint32_t i = 0; - while(txt[i] != '\0') { - uint32_t c = lv_txt_encoded_next(txt, &i); - lv_ta_add_char(ta, lv_txt_unicode_to_encoded(c)); - } - return; - } - - /*If a new line was added it shouldn't show edge flash effect*/ - bool edge_flash_en = lv_ta_get_edge_flash(ta); - lv_ta_set_edge_flash(ta, false); - - /*Insert the text*/ - lv_label_ins_text(ext->label, ext->cursor.pos, txt); - lv_ta_clear_selection(ta); - - if(ext->pwd_mode != 0) { - ext->pwd_tmp = lv_mem_realloc(ext->pwd_tmp, strlen(ext->pwd_tmp) + strlen(txt) + 1); - LV_ASSERT_MEM(ext->pwd_tmp); - if(ext->pwd_tmp == NULL) return; - - lv_txt_ins(ext->pwd_tmp, ext->cursor.pos, txt); - -#if LV_USE_ANIMATION - /*Auto hide characters*/ - lv_anim_t a; - a.var = ta; - a.exec_cb = (lv_anim_exec_xcb_t)pwd_char_hider_anim; - a.time = ext->pwd_show_time; - a.act_time = 0; - a.ready_cb = pwd_char_hider_anim_ready; - a.start = 0; - a.end = 1; - a.repeat = 0; - a.repeat_pause = 0; - a.playback = 0; - a.playback_pause = 0; - a.path_cb = lv_anim_path_step; - lv_anim_create(&a); -#else - pwd_char_hider(ta); -#endif - } - - /*Move the cursor after the new text*/ - lv_ta_set_cursor_pos(ta, lv_ta_get_cursor_pos(ta) + lv_txt_get_encoded_length(txt)); - - /*Revert the original edge flash state*/ - lv_ta_set_edge_flash(ta, edge_flash_en); - - placeholder_update(ta); - - lv_event_send(ta, LV_EVENT_VALUE_CHANGED, NULL); -} - -/** - * Delete a the left character from the current cursor position - * @param ta pointer to a text area object - */ -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; - - if(cur_pos == 0) return; - - ta_insert_replace = NULL; - char del_buf[2] = {LV_KEY_DEL, '\0'}; - lv_event_send(ta, LV_EVENT_INSERT, del_buf); - if(ta_insert_replace) { - if(ta_insert_replace[0] == '\0') return; /*Drop this text*/ - - /*Add the replaced text directly it's different from the original*/ - if(strcmp(ta_insert_replace, del_buf)) { - lv_ta_add_text(ta, ta_insert_replace); - return; - } - } - - char * label_txt = lv_label_get_text(ext->label); - /*Delete a character*/ - lv_txt_cut(label_txt, ext->cursor.pos - 1, 1); - /*Refresh the label*/ - lv_label_set_text(ext->label, label_txt); - lv_ta_clear_selection(ta); - - /*Don't let 'width == 0' because cursor will not be visible*/ - if(lv_obj_get_width(ext->label) == 0) { - const lv_style_t * style = lv_obj_get_style(ext->label); - lv_obj_set_width(ext->label, style->line.width); - } - - if(ext->pwd_mode != 0) { - uint32_t byte_pos = lv_txt_encoded_get_byte_id(ext->pwd_tmp, ext->cursor.pos - 1); - 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_ASSERT_MEM(ext->pwd_tmp); - if(ext->pwd_tmp == NULL) return; - } - - /*Move the cursor to the place of the deleted character*/ - lv_ta_set_cursor_pos(ta, ext->cursor.pos - 1); - - placeholder_update(ta); - - lv_event_send(ta, LV_EVENT_VALUE_CHANGED, NULL); -} - -/** - * Delete the right character from the current cursor position - * @param ta pointer to a text area object - */ -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); -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the text of a text area - * @param ta pointer to a text area - * @param txt pointer to the text - */ -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*/ - lv_ta_clear_selection(ta); - - /*Add the character one-by-one if not all characters are accepted or there is character limit.*/ - if(lv_ta_get_accepted_chars(ta) || lv_ta_get_max_length(ta)) { - lv_label_set_text(ext->label, ""); - lv_ta_set_cursor_pos(ta, LV_TA_CURSOR_LAST); - if(ext->pwd_mode != 0) { - ext->pwd_tmp[0] = '\0'; /*Clear the password too*/ - } - uint32_t i = 0; - while(txt[i] != '\0') { - uint32_t c = lv_txt_encoded_next(txt, &i); - lv_ta_add_char(ta, lv_txt_unicode_to_encoded(c)); - } - } else { - lv_label_set_text(ext->label, txt); - lv_ta_set_cursor_pos(ta, LV_TA_CURSOR_LAST); - } - - /*Don't let 'width == 0' because the cursor will not be visible*/ - if(lv_obj_get_width(ext->label) == 0) { - const lv_style_t * style = lv_obj_get_style(ext->label); - lv_obj_set_width(ext->label, lv_font_get_glyph_width(style->text.font, ' ', '\0')); - } - - if(ext->pwd_mode != 0) { - ext->pwd_tmp = lv_mem_realloc(ext->pwd_tmp, strlen(txt) + 1); - LV_ASSERT_MEM(ext->pwd_tmp); - if(ext->pwd_tmp == NULL) return; - strcpy(ext->pwd_tmp, txt); - -#if LV_USE_ANIMATION - /*Auto hide characters*/ - lv_anim_t a; - a.var = ta; - a.exec_cb = (lv_anim_exec_xcb_t)pwd_char_hider_anim; - a.time = ext->pwd_show_time; - a.act_time = 0; - a.ready_cb = pwd_char_hider_anim_ready; - a.start = 0; - a.end = 1; - a.repeat = 0; - a.repeat_pause = 0; - a.playback = 0; - a.playback_pause = 0; - a.path_cb = lv_anim_path_step; - lv_anim_create(&a); -#else - pwd_char_hider(ta); -#endif - } - - placeholder_update(ta); - - lv_event_send(ta, LV_EVENT_VALUE_CHANGED, NULL); -} - -/** - * Set the placeholder text of a text area - * @param ta pointer to a text area - * @param txt pointer to the text - */ -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*/ - if(ext->placeholder == NULL) { - ext->placeholder = lv_label_create(ta, NULL); - - if(ext->one_line) { - lv_label_set_long_mode(ext->placeholder, LV_LABEL_LONG_EXPAND); - } else { - lv_label_set_long_mode(ext->placeholder, LV_LABEL_LONG_BREAK); - } - } - - 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); -} - -/** - * Set the cursor position - * @param obj pointer to a text area object - * @param pos the new cursor position in character index - * < 0 : index from the end of the text - * LV_TA_CURSOR_LAST: go after the last character - */ -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; - - uint16_t len = lv_txt_get_encoded_length(lv_label_get_text(ext->label)); - - if(pos < 0) pos = len + pos; - - if(pos > len || pos == LV_TA_CURSOR_LAST) pos = len; - - ext->cursor.pos = pos; - - /*Position the label to make the cursor visible*/ - lv_obj_t * label_par = lv_obj_get_parent(ext->label); - lv_point_t cur_pos; - const lv_style_t * style = lv_obj_get_style(ta); - const lv_font_t * font_p = style->text.font; - lv_area_t label_cords; - lv_area_t ta_cords; - lv_label_get_letter_pos(ext->label, pos, &cur_pos); - lv_obj_get_coords(ta, &ta_cords); - lv_obj_get_coords(ext->label, &label_cords); - - /*Check the top*/ - lv_coord_t font_h = lv_font_get_line_height(font_p); - if(lv_obj_get_y(label_par) + cur_pos.y < 0) { - lv_obj_set_y(label_par, -cur_pos.y + style->body.padding.top); - } - - /*Check the bottom*/ - if(label_cords.y1 + cur_pos.y + font_h + style->body.padding.bottom > ta_cords.y2) { - lv_obj_set_y(label_par, -(cur_pos.y - lv_obj_get_height(ta) + font_h + style->body.padding.top + - style->body.padding.bottom)); - } - /*Check the left (use the font_h as general unit)*/ - if(lv_obj_get_x(label_par) + cur_pos.x < font_h) { - lv_obj_set_x(label_par, -cur_pos.x + font_h); - } - - /*Check the right (use the font_h as general unit)*/ - if(label_cords.x1 + cur_pos.x + font_h + style->body.padding.right > ta_cords.x2) { - lv_obj_set_x(label_par, -(cur_pos.x - lv_obj_get_width(ta) + font_h + style->body.padding.left + - style->body.padding.right)); - } - - ext->cursor.valid_x = cur_pos.x; - -#if LV_USE_ANIMATION - if(ext->cursor.blink_time) { - /*Reset cursor blink animation*/ - lv_anim_t a; - a.var = ta; - a.exec_cb = (lv_anim_exec_xcb_t)cursor_blink_anim; - a.time = ext->cursor.blink_time; - a.act_time = 0; - a.ready_cb = NULL; - a.start = 1; - a.end = 0; - a.repeat = 1; - a.repeat_pause = 0; - a.playback = 1; - a.playback_pause = 0; - a.path_cb = lv_anim_path_step; - lv_anim_create(&a); - } -#endif - - refr_cursor_area(ta); -} - -/** - * Set the cursor type. - * @param ta pointer to a text area object - * @param cur_type: element of 'lv_ta_cursor_type_t' - */ -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; - - ext->cursor.type = cur_type; - - refr_cursor_area(ta); -} - -/** - * Enable/Disable the positioning of the the cursor by clicking the text on the text area. - * @param ta pointer to a text area object - * @param en true: enable click positions; false: disable - */ -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; -} - -/** - * Enable/Disable password mode - * @param ta pointer to a text area object - * @param en true: enable, false: disable - */ -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); - size_t len = strlen(txt); - ext->pwd_tmp = lv_mem_alloc(len + 1); - LV_ASSERT_MEM(ext->pwd_tmp); - if(ext->pwd_tmp == NULL) return; - - strcpy(ext->pwd_tmp, txt); - - uint16_t i; - uint16_t encoded_len = lv_txt_get_encoded_length(txt); - for(i = 0; i < encoded_len; i++) { - txt[i] = '*'; /*All char to '*'*/ - } - txt[i] = '\0'; - - lv_ta_clear_selection(ta); - - lv_label_set_text(ext->label, NULL); - } - /*Pwd mode is now disabled*/ - else if(ext->pwd_mode == 1 && en == false) { - lv_ta_clear_selection(ta); - lv_label_set_text(ext->label, ext->pwd_tmp); - lv_mem_free(ext->pwd_tmp); - ext->pwd_tmp = NULL; - } - - ext->pwd_mode = en == false ? 0 : 1; - - refr_cursor_area(ta); -} - -/** - * Configure the text area to one line or back to normal - * @param ta pointer to a Text area object - * @param en true: one line, false: normal - */ -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; - lv_label_align_t old_align = lv_label_get_align(ext->label); - - if(en) { - const lv_style_t * style_ta = lv_obj_get_style(ta); - const lv_style_t * style_scrl = lv_obj_get_style(lv_page_get_scrl(ta)); - 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); - - ext->one_line = 1; - lv_page_set_scrl_fit2(ta, LV_FIT_TIGHT, LV_FIT_FLOOD); - 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); - lv_label_set_long_mode(ext->label, LV_LABEL_LONG_EXPAND); - if(ext->placeholder) lv_label_set_long_mode(ext->placeholder, LV_LABEL_LONG_EXPAND); - lv_obj_set_pos(lv_page_get_scrl(ta), style_ta->body.padding.left, style_ta->body.padding.top); - } else { - const lv_style_t * style_ta = lv_obj_get_style(ta); - - ext->one_line = 0; - lv_page_set_scrl_fit2(ta, LV_FIT_FLOOD, LV_FIT_TIGHT); - lv_label_set_long_mode(ext->label, LV_LABEL_LONG_BREAK); - if(ext->placeholder) lv_label_set_long_mode(ext->placeholder, LV_LABEL_LONG_BREAK); - - lv_obj_set_height(ta, LV_TA_DEF_HEIGHT); - lv_obj_set_pos(lv_page_get_scrl(ta), style_ta->body.padding.left, style_ta->body.padding.top); - } - - placeholder_update(ta); - /* `refr_cursor_area` is called at the end of lv_ta_set_text_align */ - lv_ta_set_text_align(ta, old_align); -} - -/** - * Set the alignment of the text area. - * In one line mode the text can be scrolled only with `LV_LABEL_ALIGN_LEFT`. - * This function should be called if the size of text area changes. - * @param ta pointer to a text are object - * @param align the desired alignment from `lv_label_align_t`. (LV_LABEL_ALIGN_LEFT/CENTER/RIGHT) - */ -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*/ - else { - 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)); - } - } - - refr_cursor_area(ta); -} - -/** - * Set a list of characters. Only these characters will be accepted by the text area - * @param ta pointer to Text Area - * @param list list of characters. Only the pointer is saved. E.g. "+-.,0123456789" - */ -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; -} - -/** - * Set max length of a Text Area. - * @param ta pointer to Text Area - * @param num the maximal number of characters can be added (`lv_ta_set_text` ignores it) - */ -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; -} - -/** - * In `LV_EVENT_INSERT` the text which planned to be inserted can be replaced by an other text. - * It can be used to add automatic formatting to the text area. - * @param ta pointer to a text area. - * @param txt pointer to a new string to insert. If `""` no text will be added. - * The variable must be live after the `event_cb` exists. (Should be `global` or - * `static`) - */ -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; -} - -/** - * Set a style of a text area - * @param ta pointer to a text area object - * @param type which style should be set - * @param style pointer to a style - */ -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) { - case LV_TA_STYLE_BG: lv_page_set_style(ta, LV_PAGE_STYLE_BG, style); break; - case LV_TA_STYLE_SB: lv_page_set_style(ta, LV_PAGE_STYLE_SB, style); break; - case LV_TA_STYLE_EDGE_FLASH: lv_page_set_style(ta, LV_PAGE_STYLE_EDGE_FLASH, style); break; - case LV_TA_STYLE_CURSOR: - ext->cursor.style = style; - lv_obj_refresh_ext_draw_pad(lv_page_get_scrl(ta)); /*Refresh ext. size because of cursor drawing*/ - refr_cursor_area(ta); - break; - case LV_TA_STYLE_PLACEHOLDER: - if(ext->placeholder) lv_label_set_style(ext->placeholder, LV_LABEL_STYLE_MAIN, style); - break; - } -} - -/** - * Enable/disable selection mode. - * @param ta pointer to a text area object - * @param en true or false to enable/disable selection mode - */ -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); - - ext->text_sel_en = en; - - if(!en) lv_ta_clear_selection(ta); -#else - (void)ta; /*Unused*/ - (void)en; /*Unused*/ -#endif -} - -/** - * Set how long show the password before changing it to '*' - * @param ta pointer to Text area - * @param time show time in milliseconds. 0: hide immediately. - */ -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 - - lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); - ext->pwd_show_time = time; -} - -/** - * Set cursor blink animation time - * @param ta pointer to Text area - * @param time blink period. 0: disable blinking - */ -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 - - lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); - ext->cursor.blink_time = time; - -#if LV_USE_ANIMATION - if(ext->cursor.blink_time) { - /*Reset cursor blink animation*/ - lv_anim_t a; - a.var = ta; - a.exec_cb = (lv_anim_exec_xcb_t)cursor_blink_anim; - a.time = ext->cursor.blink_time; - a.act_time = 0; - a.ready_cb = NULL; - a.start = 1; - a.end = 0; - a.repeat = 1; - a.repeat_pause = 0; - a.playback = 1; - a.playback_pause = 0; - a.path_cb = lv_anim_path_step; - lv_anim_create(&a); - } else { - lv_anim_del(ta, (lv_anim_exec_xcb_t)cursor_blink_anim); - ext->cursor.state = 1; - } -#else - ext->cursor.state = 1; -#endif -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the text of a text area. In password mode it gives the real text (not '*'s). - * @param ta pointer to a text area object - * @return pointer to the text - */ -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; - if(ext->pwd_mode == 0) { - txt = lv_label_get_text(ext->label); - } else { - txt = ext->pwd_tmp; - } - - return txt; -} - -/** - * Get the placeholder text of a text area - * @param ta pointer to a text area object - * @return pointer to the text - */ -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; - - if(ext->placeholder) txt = lv_label_get_text(ext->placeholder); - - return txt; -} - -/** - * Get the label of a text area - * @param ta pointer to a text area object - * @return pointer to the label object - */ -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; -} - -/** - * Get the current cursor position in character index - * @param ta pointer to a text area object - * @return the cursor position - */ -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; -} - -/** - * Get the current cursor type. - * @param ta pointer to a text area object - * @return element of 'lv_ta_cursor_type_t' - */ -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; -} - -/** - * Get whether the cursor click positioning is enabled or not. - * @param ta pointer to a text area object - * @return true: enable click positions; false: disable - */ -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; -} - -/** - * Get the password mode attribute - * @param ta pointer to a text area object - * @return true: password mode is enabled, false: disabled - */ -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; -} - -/** - * Get the one line configuration attribute - * @param ta pointer to a text area object - * @return true: one line configuration is enabled, false: disabled - */ -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; -} - -/** - * Get a list of accepted characters. - * @param ta pointer to Text Area - * @return list of accented characters. - */ -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; -} - -/** - * Set max length of a Text Area. - * @param ta pointer to Text Area - * @return the maximal number of characters to be add - */ -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; -} - -/** - * Get a style of a text area - * @param ta pointer to a text area object - * @param type which style should be get - * @return style pointer to a style - */ -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); - - switch(type) { - case LV_TA_STYLE_BG: style = lv_page_get_style(ta, LV_PAGE_STYLE_BG); break; - case LV_TA_STYLE_SB: style = lv_page_get_style(ta, LV_PAGE_STYLE_SB); break; - case LV_TA_STYLE_EDGE_FLASH: style = lv_page_get_style(ta, LV_PAGE_STYLE_EDGE_FLASH); break; - case LV_TA_STYLE_CURSOR: style = ext->cursor.style; break; - case LV_TA_STYLE_PLACEHOLDER: - if(ext->placeholder) style = lv_label_get_style(ext->placeholder, LV_LABEL_STYLE_MAIN); - break; - default: style = NULL; break; - } - - return style; -} - -/** - * Find whether text is selected or not. - * @param ta Text area object - * @return whether text is selected or not - */ -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_DRAW_LABEL_NO_TXT_SEL || - lv_label_get_text_sel_end(ext->label) == LV_DRAW_LABEL_NO_TXT_SEL)) { - return true; - } else { - return false; - } -#else - (void)ta; /*Unused*/ - return false; -#endif -} - -/** - * Find whether selection mode is enabled. - * @param ta pointer to a text area object - * @return true: selection mode is enabled, false: disabled - */ -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; -#else - (void)ta; /*Unused*/ - return false; -#endif -} - -/** - * Set how long show the password before changing it to '*' - * @param ta pointer to Text area - * @return show time in milliseconds. 0: hide immediately. - */ -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; -} - -/** - * Set cursor blink animation time - * @param ta pointer to Text area - * @return time blink period. 0: disable blinking - */ -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; -} - -/*===================== - * Other functions - *====================*/ - -/** - * Clear the selection on the text area. - * @param ta Text area object - */ -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_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*/ -#endif -} - -/** - * Move the cursor one character right - * @param ta pointer to a text area object - */ -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); -} - -/** - * Move the cursor one character left - * @param ta pointer to a text area object - */ -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--; - lv_ta_set_cursor_pos(ta, cp); - } -} - -/** - * Move the cursor one line down - * @param ta pointer to a text area object - */ -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; - - /*Get the position of the current letter*/ - lv_label_get_letter_pos(ext->label, lv_ta_get_cursor_pos(ta), &pos); - - /*Increment the y with one line and keep the valid x*/ - const lv_style_t * label_style = lv_obj_get_style(ext->label); - const lv_font_t * font_p = label_style->text.font; - lv_coord_t font_h = lv_font_get_line_height(font_p); - pos.y += font_h + label_style->text.line_space + 1; - pos.x = ext->cursor.valid_x; - - /*Do not go below the last line*/ - if(pos.y < lv_obj_get_height(ext->label)) { - /*Get the letter index on the new cursor position and set it*/ - uint16_t new_cur_pos = lv_label_get_letter_on(ext->label, &pos); - - lv_coord_t cur_valid_x_tmp = ext->cursor.valid_x; /*Cursor position set overwrites the valid positon */ - lv_ta_set_cursor_pos(ta, new_cur_pos); - ext->cursor.valid_x = cur_valid_x_tmp; - } -} - -/** - * Move the cursor one line up - * @param ta pointer to a text area object - */ -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; - - /*Get the position of the current letter*/ - lv_label_get_letter_pos(ext->label, lv_ta_get_cursor_pos(ta), &pos); - - /*Decrement the y with one line and keep the valid x*/ - const lv_style_t * label_style = lv_obj_get_style(ext->label); - const lv_font_t * font = label_style->text.font; - lv_coord_t font_h = lv_font_get_line_height(font); - pos.y -= font_h + label_style->text.line_space - 1; - pos.x = ext->cursor.valid_x; - - /*Get the letter index on the new cursor position and set it*/ - uint16_t new_cur_pos = lv_label_get_letter_on(ext->label, &pos); - lv_coord_t cur_valid_x_tmp = ext->cursor.valid_x; /*Cursor position set overwrites the valid positon */ - lv_ta_set_cursor_pos(ta, new_cur_pos); - ext->cursor.valid_x = cur_valid_x_tmp; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_ta_design(lv_obj_t * ta, const lv_area_t * mask, 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); - } else if(mode == LV_DESIGN_DRAW_MAIN) { - /*Draw the object*/ - ancestor_design(ta, mask, mode); - - } else if(mode == LV_DESIGN_DRAW_POST) { - ancestor_design(ta, mask, mode); - } - return true; -} - -/** - * 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 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) -{ - if(mode == LV_DESIGN_COVER_CHK) { - /*Return false if the object is not covers the mask_p area*/ - return scrl_design(scrl, mask, mode); - } else if(mode == LV_DESIGN_DRAW_MAIN) { - /*Draw the object*/ - scrl_design(scrl, mask, mode); - } else if(mode == LV_DESIGN_DRAW_POST) { - scrl_design(scrl, mask, mode); - - /*Draw the cursor*/ - lv_obj_t * ta = lv_obj_get_parent(scrl); - lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); - - if(ext->cursor.type == LV_CURSOR_NONE || (ext->cursor.type & LV_CURSOR_HIDDEN) || ext->cursor.state == 0) { - return true; /*The cursor is not visible now*/ - } - - lv_style_t cur_style; - get_cursor_style(ta, &cur_style); - - const char * txt = lv_label_get_text(ext->label); - - /*Draw he cursor according to the type*/ - lv_area_t cur_area; - lv_area_copy(&cur_area, &ext->cursor.area); - - cur_area.x1 += ext->label->coords.x1; - cur_area.y1 += ext->label->coords.y1; - cur_area.x2 += ext->label->coords.x1; - cur_area.y2 += ext->label->coords.y1; - - 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); - } else if(ext->cursor.type == LV_CURSOR_BLOCK) { - lv_draw_rect(&cur_area, mask, &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, 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); - } else if(ext->cursor.type == LV_CURSOR_UNDERLINE) { - lv_draw_rect(&cur_area, mask, &cur_style, opa_scale); - } - } - - return true; -} - -/** - * Signal function of the text area - * @param ta pointer to a text area 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_ta_signal(lv_obj_t * ta, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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) { - if(ext->pwd_tmp != NULL) lv_mem_free(ext->pwd_tmp); - - /* (The created label will be deleted automatically) */ - } else if(sign == LV_SIGNAL_STYLE_CHG) { - if(ext->label) { - lv_obj_t * scrl = lv_page_get_scrl(ta); - const lv_style_t * style_ta = lv_obj_get_style(ta); - const lv_style_t * style_scrl = lv_obj_get_style(scrl); - if(ext->one_line) { - /*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 { - /*In not one line mode refresh the Label width because 'hpad' can modify it*/ - lv_obj_set_width(ext->label, lv_page_get_fit_width(ta)); - lv_obj_set_pos(ext->label, style_scrl->body.padding.left, - style_scrl->body.padding.right); /*Be sure the Label is in the correct position*/ - - if(ext->placeholder) { - lv_obj_set_width(ext->placeholder, lv_page_get_fit_width(ta)); - lv_obj_set_pos(ext->placeholder, style_scrl->body.padding.left, - style_scrl->body.padding.top); /*Be sure the placeholder is in the correct position*/ - } - } - lv_label_set_text(ext->label, NULL); - } - } else if(sign == LV_SIGNAL_CORD_CHG) { - /*Set the label width according to the text area width*/ - if(ext->label) { - if(lv_obj_get_width(ta) != lv_area_get_width(param) || lv_obj_get_height(ta) != lv_area_get_height(param)) { - lv_obj_t * scrl = lv_page_get_scrl(ta); - const lv_style_t * style_scrl = lv_obj_get_style(scrl); - lv_obj_set_width(ext->label, lv_page_get_fit_width(ta)); - lv_obj_set_pos(ext->label, style_scrl->body.padding.left, style_scrl->body.padding.top); - lv_label_set_text(ext->label, NULL); /*Refresh the label*/ - - refr_cursor_area(ta); - } - } - /*Set the placeholder width according to the text area width*/ - if(ext->placeholder) { - if(lv_obj_get_width(ta) != lv_area_get_width(param) || lv_obj_get_height(ta) != lv_area_get_height(param)) { - lv_obj_t * scrl = lv_page_get_scrl(ta); - const lv_style_t * style_scrl = lv_obj_get_style(scrl); - lv_obj_set_width(ext->placeholder, lv_page_get_fit_width(ta)); - lv_obj_set_pos(ext->placeholder, style_scrl->body.padding.left, style_scrl->body.padding.top); - lv_label_set_text(ext->placeholder, NULL); /*Refresh the label*/ - - refr_cursor_area(ta); - } - } - } else if(sign == LV_SIGNAL_CONTROL) { - uint32_t c = *((uint32_t *)param); /*uint32_t because can be UTF-8*/ - if(c == LV_KEY_RIGHT) - lv_ta_cursor_right(ta); - else if(c == LV_KEY_LEFT) - lv_ta_cursor_left(ta); - else if(c == LV_KEY_UP) - lv_ta_cursor_up(ta); - else if(c == LV_KEY_DOWN) - lv_ta_cursor_down(ta); - else if(c == LV_KEY_BACKSPACE) - lv_ta_del_char(ta); - else if(c == LV_KEY_DEL) - lv_ta_del_char_forward(ta); - else if(c == LV_KEY_HOME) - lv_ta_set_cursor_pos(ta, 0); - else if(c == LV_KEY_END) - lv_ta_set_cursor_pos(ta, LV_TA_CURSOR_LAST); - else { - lv_ta_add_char(ta, c); - } - } else if(sign == LV_SIGNAL_GET_EDITABLE) { - bool * editable = (bool *)param; - *editable = true; - } else if(sign == LV_SIGNAL_DEFOCUS) { - lv_cursor_type_t cur_type; - cur_type = lv_ta_get_cursor_type(ta); - lv_ta_set_cursor_type(ta, cur_type | LV_CURSOR_HIDDEN); - } else if(sign == LV_SIGNAL_FOCUS) { -#if LV_USE_GROUP - lv_cursor_type_t cur_type; - cur_type = lv_ta_get_cursor_type(ta); - lv_group_t * g = lv_obj_get_group(ta); - bool editing = lv_group_get_editing(g); - lv_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); - - /*Encoders need special handling*/ - if(indev_type == LV_INDEV_TYPE_ENCODER) { - if(editing) - lv_ta_set_cursor_type(ta, cur_type & (~LV_CURSOR_HIDDEN)); - else - lv_ta_set_cursor_type(ta, cur_type | LV_CURSOR_HIDDEN); - } else { - lv_ta_set_cursor_type(ta, cur_type & (~LV_CURSOR_HIDDEN)); - } -#endif - } else if(sign == LV_SIGNAL_PRESSED || sign == LV_SIGNAL_PRESSING || sign == LV_SIGNAL_PRESS_LOST || - sign == LV_SIGNAL_RELEASED) { - update_cursor_position_on_click(ta, sign, (lv_indev_t *)param); - } - return res; -} - -/** - * Signal function of the scrollable part of the text area - * @param scrl pointer to scrollable part of a text area 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_ta_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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); - - if(sign == LV_SIGNAL_REFR_EXT_DRAW_PAD) { - /*Set ext. size because the cursor might be out of this object*/ - 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); - scrl->ext_draw_pad = LV_MATH_MAX(scrl->ext_draw_pad, style_label->text.line_space + font_h); - } else if(sign == LV_SIGNAL_CORD_CHG) { - /*Set the label width according to the text area width*/ - if(ext->label) { - if(lv_obj_get_width(scrl) != lv_area_get_width(param) || - lv_obj_get_height(scrl) != lv_area_get_height(param)) { - - const lv_style_t * style_scrl = lv_obj_get_style(scrl); - lv_obj_set_width(ext->label, lv_page_get_fit_width(ta)); - lv_obj_set_pos(ext->label, style_scrl->body.padding.left, style_scrl->body.padding.top); - lv_label_set_text(ext->label, NULL); /*Refresh the label*/ - - refr_cursor_area(ta); - } - } - } else if(sign == LV_SIGNAL_PRESSING || sign == LV_SIGNAL_PRESSED || sign == LV_SIGNAL_PRESS_LOST || - sign == LV_SIGNAL_RELEASED) { - update_cursor_position_on_click(ta, sign, (lv_indev_t *)param); - } - - return res; -} - -#if LV_USE_ANIMATION - -/** - * Called to blink the cursor - * @param ta pointer to a text area - * @param hide 1: hide the cursor, 0: show it - */ -static void cursor_blink_anim(lv_obj_t * ta, lv_anim_value_t show) -{ - lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); - if(show != ext->cursor.state) { - ext->cursor.state = show == 0 ? 0 : 1; - if(ext->cursor.type != LV_CURSOR_NONE && (ext->cursor.type & LV_CURSOR_HIDDEN) == 0) { - lv_area_t area_tmp; - lv_area_copy(&area_tmp, &ext->cursor.area); - area_tmp.x1 += ext->label->coords.x1; - area_tmp.y1 += ext->label->coords.y1; - area_tmp.x2 += ext->label->coords.x1; - area_tmp.y2 += ext->label->coords.y1; - lv_obj_invalidate_area(ta, &area_tmp); - } - } -} - -/** - * Dummy function to animate char hiding in pwd mode. - * Does nothing, but a function is required in car hiding anim. - * (pwd_char_hider callback do the real job) - * @param ta unused - * @param x unused - */ -static void pwd_char_hider_anim(lv_obj_t * ta, lv_anim_value_t x) -{ - (void)ta; - (void)x; -} - -/** - * Call when an animation is ready to convert all characters to '*' - * @param a pointer to the animation - */ -static void pwd_char_hider_anim_ready(lv_anim_t * a) -{ - lv_obj_t * ta = a->var; - pwd_char_hider(ta); -} -#endif - -/** - * Hide all characters (convert them to '*') - * @param ta: pointer to text area object - */ -static void pwd_char_hider(lv_obj_t * ta) -{ - lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); - if(ext->pwd_mode != 0) { - char * txt = lv_label_get_text(ext->label); - int16_t len = lv_txt_get_encoded_length(txt); - bool refr = false; - uint16_t i; - for(i = 0; i < len; i++) { - txt[i] = '*'; - refr = true; - } - - txt[i] = '\0'; - - if(refr != false) lv_label_set_text(ext->label, txt); - } -} - -/** - * Test an unicode character if it is accepted or not. Checks max length and accepted char list. - * @param ta pointer to a test area object - * @param c an unicode character - * @return true: accapted; false: rejected - */ -static bool char_is_accepted(lv_obj_t * ta, uint32_t c) -{ - lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); - - /*If no restriction accept it*/ - if(ext->accapted_chars == NULL && ext->max_length == 0) return true; - - /*Too many characters?*/ - if(ext->max_length > 0 && lv_txt_get_encoded_length(lv_ta_get_text(ta)) >= ext->max_length) { - return false; - } - - /*Accepted character?*/ - if(ext->accapted_chars) { - uint32_t i = 0; - uint32_t a; - while(ext->accapted_chars[i] != '\0') { - a = lv_txt_encoded_next(ext->accapted_chars, &i); - if(a == c) return true; /*Accepted*/ - } - - return false; /*The character wasn't in the list*/ - } else { - return true; /*If the accepted char list in not specified the accept the character*/ - } -} - -static void get_cursor_style(lv_obj_t * ta, lv_style_t * style_res) -{ - lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); - const lv_style_t * label_style = lv_obj_get_style(ext->label); - - if(ext->cursor.style) { - lv_style_copy(style_res, ext->cursor.style); - } else { - /*If cursor style is not specified then use the modified label style */ - lv_style_copy(style_res, label_style); - lv_color_t clv_color_tmp = style_res->text.color; /*Make letter color to cursor color*/ - style_res->text.color = - style_res->body.main_color; /*In block mode the letter color will be current background color*/ - style_res->body.main_color = clv_color_tmp; - style_res->body.grad_color = clv_color_tmp; - style_res->body.border.color = clv_color_tmp; - style_res->body.border.opa = LV_OPA_COVER; - style_res->body.border.width = 1; - style_res->body.shadow.width = 0; - style_res->body.radius = 0; - style_res->body.opa = LV_OPA_COVER; - style_res->body.padding.left = 0; - style_res->body.padding.right = 0; - style_res->body.padding.top = 0; - style_res->body.padding.bottom = 0; - style_res->line.width = 1; - } -} - -static void refr_cursor_area(lv_obj_t * ta) -{ - lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); - - const lv_style_t * label_style = lv_obj_get_style(ext->label); - - lv_style_t cur_style; - get_cursor_style(ta, &cur_style); - - uint16_t cur_pos = lv_ta_get_cursor_pos(ta); - const char * txt = lv_label_get_text(ext->label); - - uint32_t byte_pos; - byte_pos = lv_txt_encoded_get_byte_id(txt, cur_pos); - - uint32_t letter = lv_txt_encoded_next(&txt[byte_pos], NULL); - - lv_coord_t letter_h = lv_font_get_line_height(label_style->text.font); - - /*Set letter_w (set not 0 on non printable but valid chars)*/ - lv_coord_t letter_w; - if(letter == '\0' || letter == '\n' || letter == '\r') { - letter_w = lv_font_get_glyph_width(label_style->text.font, ' ', '\0'); - } else { - /*`letter_next` parameter is '\0' to ignore kerning*/ - letter_w = lv_font_get_glyph_width(label_style->text.font, letter, '\0'); - } - - lv_point_t letter_pos; - lv_label_get_letter_pos(ext->label, cur_pos, &letter_pos); - - /*If the cursor is out of the text (most right) draw it to the next line*/ - if(letter_pos.x + ext->label->coords.x1 + letter_w > ext->label->coords.x2 && ext->one_line == 0 && - lv_label_get_align(ext->label) != LV_LABEL_ALIGN_RIGHT) { - letter_pos.x = 0; - letter_pos.y += letter_h + label_style->text.line_space; - - if(letter != '\0') { - byte_pos += lv_txt_encoded_size(&txt[byte_pos]); - letter = lv_txt_encoded_next(&txt[byte_pos], NULL); - } - - if(letter == '\0' || letter == '\n' || letter == '\r') { - letter_w = lv_font_get_glyph_width(label_style->text.font, ' ', '\0'); - } else { - letter_w = lv_font_get_glyph_width(label_style->text.font, letter, '\0'); - } - } - - /*Save the byte position. It is required to draw `LV_CURSOR_BLOCK`*/ - ext->cursor.txt_byte_pos = byte_pos; - - /*Draw he cursor according to the type*/ - lv_area_t cur_area; - - if(ext->cursor.type == LV_CURSOR_LINE) { - cur_area.x1 = - letter_pos.x + cur_style.body.padding.left - (cur_style.line.width >> 1) - (cur_style.line.width & 0x1); - cur_area.y1 = letter_pos.y + cur_style.body.padding.top; - cur_area.x2 = letter_pos.x + cur_style.body.padding.right + (cur_style.line.width >> 1); - cur_area.y2 = letter_pos.y + cur_style.body.padding.bottom + letter_h; - } else if(ext->cursor.type == LV_CURSOR_BLOCK) { - cur_area.x1 = letter_pos.x - cur_style.body.padding.left; - cur_area.y1 = letter_pos.y - cur_style.body.padding.top; - 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; - - } else if(ext->cursor.type == LV_CURSOR_OUTLINE) { - cur_area.x1 = letter_pos.x - cur_style.body.padding.left; - cur_area.y1 = letter_pos.y - cur_style.body.padding.top; - 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; - } else if(ext->cursor.type == LV_CURSOR_UNDERLINE) { - cur_area.x1 = letter_pos.x + cur_style.body.padding.left; - cur_area.y1 = letter_pos.y + cur_style.body.padding.top + letter_h - (cur_style.line.width >> 1); - 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); - } - - /*Save the new area*/ - lv_area_t area_tmp; - lv_area_copy(&area_tmp, &ext->cursor.area); - area_tmp.x1 += ext->label->coords.x1; - area_tmp.y1 += ext->label->coords.y1; - area_tmp.x2 += ext->label->coords.x1; - area_tmp.y2 += ext->label->coords.y1; - lv_obj_invalidate_area(ta, &area_tmp); - - lv_area_copy(&ext->cursor.area, &cur_area); - - lv_area_copy(&area_tmp, &ext->cursor.area); - area_tmp.x1 += ext->label->coords.x1; - area_tmp.y1 += ext->label->coords.y1; - area_tmp.x2 += ext->label->coords.x1; - area_tmp.y2 += ext->label->coords.y1; - lv_obj_invalidate_area(ta, &area_tmp); -} - -static void placeholder_update(lv_obj_t * ta) -{ - lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); - const char * ta_text; - - if(ext->placeholder == NULL) return; - - ta_text = lv_ta_get_text(ta); - - if(ta_text[0] == '\0') { - /*Be sure the main label and the placeholder has the same coordinates*/ - lv_obj_t * scrl = lv_page_get_scrl(ta); - const lv_style_t * style_scrl = lv_obj_get_style(scrl); - lv_obj_set_pos(ext->placeholder, style_scrl->body.padding.left, style_scrl->body.padding.top); - lv_obj_set_pos(ext->label, style_scrl->body.padding.left, style_scrl->body.padding.top); - - lv_obj_set_width(ext->placeholder, lv_page_get_fit_width(ta)); - lv_obj_set_hidden(ext->placeholder, false); - } else { - lv_obj_set_hidden(ext->placeholder, true); - } -} - -static void update_cursor_position_on_click(lv_obj_t * ta, lv_signal_t sign, lv_indev_t * click_source) -{ - - if(click_source == NULL) return; - - lv_ta_ext_t * ext = lv_obj_get_ext_attr(ta); - if(ext->cursor.click_pos == 0) return; - if(ext->cursor.type == LV_CURSOR_NONE) return; - - if(lv_indev_get_type(click_source) == LV_INDEV_TYPE_KEYPAD || - lv_indev_get_type(click_source) == LV_INDEV_TYPE_ENCODER) { - return; - } - - lv_area_t label_coords; - lv_obj_get_coords(ext->label, &label_coords); - - lv_point_t point_act, vect_act; - lv_indev_get_point(click_source, &point_act); - 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 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 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(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(rel_pos.x >= label_width) { - char_id_at_click = LV_TA_CURSOR_LAST; - click_outside_label = true; - } else { - 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->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->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, 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->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->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_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); - } - } - /*Finish selection if necessary */ - if(sign == LV_SIGNAL_PRESS_LOST || sign == LV_SIGNAL_RELEASED) { - ext->text_sel_in_prog = 0; - } - } -#else - /*Check if the click happened on the left side of the area outside the label*/ - 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(rel_pos.x >= label_width) { - char_id_at_click = LV_TA_CURSOR_LAST; - } else { - char_id_at_click = lv_label_get_letter_on(ext->label, &rel_pos); - } - - if(sign == LV_SIGNAL_PRESSED) lv_ta_set_cursor_pos(ta, char_id_at_click); -#endif -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_ta.h b/src/libs/lvgl/src/lv_objx/lv_ta.h deleted file mode 100644 index afbb94bc..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_ta.h +++ /dev/null @@ -1,478 +0,0 @@ -/** - * @file lv_ta.h - * - */ - -#ifndef LV_TA_H -#define LV_TA_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_TA != 0 - -/*Testing of dependencies*/ -#if LV_USE_PAGE == 0 -#error "lv_ta: lv_page is required. Enable it in lv_conf.h (LV_USE_PAGE 1) " -#endif - -#if LV_USE_LABEL == 0 -#error "lv_ta: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "lv_page.h" -#include "lv_label.h" - -/********************* - * DEFINES - *********************/ -#define LV_TA_CURSOR_LAST (0x7FFF) /*Put the cursor after the last character*/ - -LV_EXPORT_CONST_INT(LV_TA_CURSOR_LAST); - -/********************** - * TYPEDEFS - **********************/ - -/** Style of text area's cursor. */ -enum { - LV_CURSOR_NONE, /**< No cursor */ - LV_CURSOR_LINE, /**< Vertical line */ - LV_CURSOR_BLOCK, /**< Rectangle */ - LV_CURSOR_OUTLINE, /**< Outline around character */ - LV_CURSOR_UNDERLINE, /**< Horizontal line under character */ - LV_CURSOR_HIDDEN = 0x08, /**< This flag can be ORed to any of the other values to temporarily hide the cursor */ -}; -typedef uint8_t lv_cursor_type_t; - -/*Data of text area*/ -typedef struct -{ - lv_page_ext_t page; /*Ext. of ancestor*/ - /*New data for this type */ - lv_obj_t * label; /*Label of the text area*/ - lv_obj_t * placeholder; /*Place holder label. only visible if text is an empty string*/ - char * pwd_tmp; /*Used to store the original text in password mode*/ - const char * accapted_chars; /*Only these characters will be accepted. NULL: accept all*/ - uint16_t max_length; /*The max. number of characters. 0: no limit*/ - uint16_t pwd_show_time; /*Time to show characters in password mode before change them to '*' */ - struct - { - const lv_style_t * style; /* Style of the cursor (NULL to use label's style)*/ - lv_coord_t valid_x; /* Used when stepping up/down to a shorter line. - * (Used by the library)*/ - uint16_t pos; /* The current cursor position - * (0: before 1st letter; 1: before 2nd letter ...)*/ - uint16_t blink_time; /*Blink period*/ - lv_area_t area; /* Cursor area relative to the Text Area*/ - uint16_t txt_byte_pos; /* Byte index of the letter after (on) the cursor*/ - lv_cursor_type_t type : 4; /* Shape of the cursor*/ - uint8_t state : 1; /*Cursor is visible now or not (Handled by the library)*/ - uint8_t click_pos : 1; /*1: Enable positioning the cursor by clicking the text area*/ - } cursor; -#if LV_LABEL_TEXT_SEL - 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 - uint8_t pwd_mode : 1; /*Replace characters with '*' */ - uint8_t one_line : 1; /*One line mode (ignore line breaks)*/ -} lv_ta_ext_t; - -/** Possible text areas tyles. */ -enum { - LV_TA_STYLE_BG, /**< Text area background style */ - LV_TA_STYLE_SB, /**< Scrollbar style */ - LV_TA_STYLE_CURSOR, /**< Cursor style */ - LV_TA_STYLE_EDGE_FLASH, /**< Edge flash style */ - LV_TA_STYLE_PLACEHOLDER, /**< Placeholder style */ -}; -typedef uint8_t lv_ta_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a text area objects - * @param par pointer to an object, it will be the parent of the new text area - * @param copy pointer to a text area object, if not NULL then the new object will be copied from it - * @return pointer to the created text area - */ -lv_obj_t * lv_ta_create(lv_obj_t * par, const lv_obj_t * copy); - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Insert a character to the current cursor position. - * To add a wide char, e.g. 'Á' use `lv_txt_encoded_conv_wc('Á')` - * @param ta pointer to a text area object - * @param c a character (e.g. 'a') - */ -void lv_ta_add_char(lv_obj_t * ta, uint32_t c); - -/** - * Insert a text to the current cursor position - * @param ta pointer to a text area object - * @param txt a '\0' terminated string to insert - */ -void lv_ta_add_text(lv_obj_t * ta, const char * txt); - -/** - * Delete a the left character from the current cursor position - * @param ta pointer to a text area object - */ -void lv_ta_del_char(lv_obj_t * ta); - -/** - * Delete the right character from the current cursor position - * @param ta pointer to a text area object - */ -void lv_ta_del_char_forward(lv_obj_t * ta); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the text of a text area - * @param ta pointer to a text area - * @param txt pointer to the text - */ -void lv_ta_set_text(lv_obj_t * ta, const char * txt); - -/** - * Set the placeholder text of a text area - * @param ta pointer to a text area - * @param txt pointer to the text - */ -void lv_ta_set_placeholder_text(lv_obj_t * ta, const char * txt); - -/** - * Set the cursor position - * @param obj pointer to a text area object - * @param pos the new cursor position in character index - * < 0 : index from the end of the text - * LV_TA_CURSOR_LAST: go after the last character - */ -void lv_ta_set_cursor_pos(lv_obj_t * ta, int16_t pos); - -/** - * Set the cursor type. - * @param ta pointer to a text area object - * @param cur_type: element of 'lv_cursor_type_t' - */ -void lv_ta_set_cursor_type(lv_obj_t * ta, lv_cursor_type_t cur_type); - -/** - * Enable/Disable the positioning of the the cursor by clicking the text on the text area. - * @param ta pointer to a text area object - * @param en true: enable click positions; false: disable - */ -void lv_ta_set_cursor_click_pos(lv_obj_t * ta, bool en); - -/** - * Enable/Disable password mode - * @param ta pointer to a text area object - * @param en true: enable, false: disable - */ -void lv_ta_set_pwd_mode(lv_obj_t * ta, bool en); - -/** - * Configure the text area to one line or back to normal - * @param ta pointer to a Text area object - * @param en true: one line, false: normal - */ -void lv_ta_set_one_line(lv_obj_t * ta, bool en); - -/** - * Set the alignment of the text area. - * In one line mode the text can be scrolled only with `LV_LABEL_ALIGN_LEFT`. - * This function should be called if the size of text area changes. - * @param ta pointer to a text are object - * @param align the desired alignment from `lv_label_align_t`. (LV_LABEL_ALIGN_LEFT/CENTER/RIGHT) - */ -void lv_ta_set_text_align(lv_obj_t * ta, lv_label_align_t align); - -/** - * Set a list of characters. Only these characters will be accepted by the text area - * @param ta pointer to Text Area - * @param list list of characters. Only the pointer is saved. E.g. "+-.,0123456789" - */ -void lv_ta_set_accepted_chars(lv_obj_t * ta, const char * list); - -/** - * Set max length of a Text Area. - * @param ta pointer to Text Area - * @param num the maximal number of characters can be added (`lv_ta_set_text` ignores it) - */ -void lv_ta_set_max_length(lv_obj_t * ta, uint16_t num); - -/** - * In `LV_EVENT_INSERT` the text which planned to be inserted can be replaced by an other text. - * It can be used to add automatic formatting to the text area. - * @param ta pointer to a text area. - * @param txt pointer to a new string to insert. If `""` no text will be added. - * The variable must be live after the `event_cb` exists. (Should be `global` or - * `static`) - */ -void lv_ta_set_insert_replace(lv_obj_t * ta, const char * txt); - -/** - * Set the scroll bar mode of a text area - * @param ta pointer to a text area object - * @param sb_mode the new mode from 'lv_page_sb_mode_t' enum - */ -static inline void lv_ta_set_sb_mode(lv_obj_t * ta, lv_sb_mode_t mode) -{ - lv_page_set_sb_mode(ta, mode); -} - -/** - * Enable the scroll propagation feature. If enabled then the Text area will move its parent if - * there is no more space to scroll. - * @param ta pointer to a Text area - * @param en true or false to enable/disable scroll propagation - */ -static inline void lv_ta_set_scroll_propagation(lv_obj_t * ta, bool en) -{ - lv_page_set_scroll_propagation(ta, en); -} - -/** - * Enable the edge flash effect. (Show an arc when the an edge is reached) - * @param page pointer to a Text Area - * @param en true or false to enable/disable end flash - */ -static inline void lv_ta_set_edge_flash(lv_obj_t * ta, bool en) -{ - lv_page_set_edge_flash(ta, en); -} - -/** - * Set a style of a text area - * @param ta pointer to a text area object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_ta_set_style(lv_obj_t * ta, lv_ta_style_t type, const lv_style_t * style); - -/** - * Enable/disable selection mode. - * @param ta pointer to a text area object - * @param en true or false to enable/disable selection mode - */ -void lv_ta_set_text_sel(lv_obj_t * ta, bool en); - -/** - * Set how long show the password before changing it to '*' - * @param ta pointer to Text area - * @param time show time in milliseconds. 0: hide immediately. - */ -void lv_ta_set_pwd_show_time(lv_obj_t * ta, uint16_t time); - -/** - * Set cursor blink animation time - * @param ta pointer to Text area - * @param time blink period. 0: disable blinking - */ -void lv_ta_set_cursor_blink_time(lv_obj_t * ta, uint16_t time); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the text of a text area. In password mode it gives the real text (not '*'s). - * @param ta pointer to a text area object - * @return pointer to the text - */ -const char * lv_ta_get_text(const lv_obj_t * ta); - -/** - * Get the placeholder text of a text area - * @param ta pointer to a text area object - * @return pointer to the text - */ -const char * lv_ta_get_placeholder_text(lv_obj_t * ta); - -/** - * Get the label of a text area - * @param ta pointer to a text area object - * @return pointer to the label object - */ -lv_obj_t * lv_ta_get_label(const lv_obj_t * ta); - -/** - * Get the current cursor position in character index - * @param ta pointer to a text area object - * @return the cursor position - */ -uint16_t lv_ta_get_cursor_pos(const lv_obj_t * ta); - -/** - * Get the current cursor type. - * @param ta pointer to a text area object - * @return element of 'lv_cursor_type_t' - */ -lv_cursor_type_t lv_ta_get_cursor_type(const lv_obj_t * ta); - -/** - * Get whether the cursor click positioning is enabled or not. - * @param ta pointer to a text area object - * @return true: enable click positions; false: disable - */ -bool lv_ta_get_cursor_click_pos(lv_obj_t * ta); - -/** - * Get the password mode attribute - * @param ta pointer to a text area object - * @return true: password mode is enabled, false: disabled - */ -bool lv_ta_get_pwd_mode(const lv_obj_t * ta); - -/** - * Get the one line configuration attribute - * @param ta pointer to a text area object - * @return true: one line configuration is enabled, false: disabled - */ -bool lv_ta_get_one_line(const lv_obj_t * ta); - -/** - * Get a list of accepted characters. - * @param ta pointer to Text Area - * @return list of accented characters. - */ -const char * lv_ta_get_accepted_chars(lv_obj_t * ta); - -/** - * Set max length of a Text Area. - * @param ta pointer to Text Area - * @return the maximal number of characters to be add - */ -uint16_t lv_ta_get_max_length(lv_obj_t * ta); - -/** - * Get the scroll bar mode of a text area - * @param ta pointer to a text area object - * @return scrollbar mode from 'lv_page_sb_mode_t' enum - */ -static inline lv_sb_mode_t lv_ta_get_sb_mode(const lv_obj_t * ta) -{ - return lv_page_get_sb_mode(ta); -} - -/** - * Get the scroll propagation property - * @param ta pointer to a Text area - * @return true or false - */ -static inline bool lv_ta_get_scroll_propagation(lv_obj_t * ta) -{ - return lv_page_get_scroll_propagation(ta); -} - -/** - * Get the scroll propagation property - * @param ta pointer to a Text area - * @return true or false - */ -static inline bool lv_ta_get_edge_flash(lv_obj_t * ta) -{ - return lv_page_get_edge_flash(ta); -} - -/** - * Get a style of a text area - * @param ta pointer to a text area object - * @param type which style should be get - * @return style pointer to a style - */ -const lv_style_t * lv_ta_get_style(const lv_obj_t * ta, lv_ta_style_t type); - -/** - * Find whether text is selected or not. - * @param ta Text area object - * @return whether text is selected or not - */ -bool lv_ta_text_is_selected(const lv_obj_t * ta); - -/** - * Find whether selection mode is enabled. - * @param ta pointer to a text area object - * @return true: selection mode is enabled, false: disabled - */ -bool lv_ta_get_text_sel_en(lv_obj_t * ta); - -/** - * Set how long show the password before changing it to '*' - * @param ta pointer to Text area - * @return show time in milliseconds. 0: hide immediately. - */ -uint16_t lv_ta_get_pwd_show_time(lv_obj_t * ta); - -/** - * Set cursor blink animation time - * @param ta pointer to Text area - * @return time blink period. 0: disable blinking - */ -uint16_t lv_ta_get_cursor_blink_time(lv_obj_t * ta); - -/*===================== - * Other functions - *====================*/ - -/** - * Clear the selection on the text area. - * @param ta Text area object - */ -void lv_ta_clear_selection(lv_obj_t * ta); - -/** - * Move the cursor one character right - * @param ta pointer to a text area object - */ -void lv_ta_cursor_right(lv_obj_t * ta); - -/** - * Move the cursor one character left - * @param ta pointer to a text area object - */ -void lv_ta_cursor_left(lv_obj_t * ta); - -/** - * Move the cursor one line down - * @param ta pointer to a text area object - */ -void lv_ta_cursor_down(lv_obj_t * ta); - -/** - * Move the cursor one line up - * @param ta pointer to a text area object - */ -void lv_ta_cursor_up(lv_obj_t * ta); - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_TA_H*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_TA_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_table.c b/src/libs/lvgl/src/lv_objx/lv_table.c deleted file mode 100644 index 1410cc3a..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_table.c +++ /dev/null @@ -1,894 +0,0 @@ -/** - * @file lv_table.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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" -#include "../lv_themes/lv_theme.h" - -/********************* - * DEFINES - *********************/ -#define LV_OBJX_NAME "lv_table" - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static bool lv_table_design(lv_obj_t * table, const lv_area_t * mask, 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); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_design_cb_t ancestor_scrl_design; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a table object - * @param par pointer to an object, it will be the parent of the new table - * @param copy pointer to a table object, if not NULL then the new object will be copied from it - * @return pointer to the created table - */ -lv_obj_t * lv_table_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("table create started"); - - /*Create the ancestor of table*/ - lv_obj_t * new_table = lv_obj_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) 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); - - /*Initialize the allocated 'ext' */ - ext->cell_data = NULL; - ext->cell_style[0] = &lv_style_plain; - ext->cell_style[1] = &lv_style_plain; - ext->cell_style[2] = &lv_style_plain; - ext->cell_style[3] = &lv_style_plain; - ext->col_cnt = 0; - ext->row_cnt = 0; - - uint16_t i; - for(i = 0; i < LV_TABLE_COL_MAX; i++) { - ext->col_w[i] = LV_DPI; - } - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_table, lv_table_signal); - lv_obj_set_design_cb(new_table, lv_table_design); - - /*Init the new table table*/ - if(copy == NULL) { - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_table_set_style(new_table, LV_TABLE_STYLE_BG, th->style.table.bg); - lv_table_set_style(new_table, LV_TABLE_STYLE_CELL1, th->style.table.cell); - lv_table_set_style(new_table, LV_TABLE_STYLE_CELL2, th->style.table.cell); - lv_table_set_style(new_table, LV_TABLE_STYLE_CELL3, th->style.table.cell); - lv_table_set_style(new_table, LV_TABLE_STYLE_CELL4, th->style.table.cell); - } else { - lv_table_set_style(new_table, LV_TABLE_STYLE_BG, &lv_style_plain_color); - } - lv_obj_set_click(new_table, false); /*Can be removed if click support is added*/ - } - /*Copy an existing table*/ - else { - lv_table_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->cell_style[0] = copy_ext->cell_style[0]; - ext->cell_style[1] = copy_ext->cell_style[1]; - ext->cell_style[2] = copy_ext->cell_style[2]; - ext->cell_style[3] = copy_ext->cell_style[3]; - lv_table_set_row_cnt(new_table, copy_ext->row_cnt); - lv_table_set_col_cnt(new_table, copy_ext->col_cnt); - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_table); - } - - LV_LOG_INFO("table created"); - - return new_table; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the value of a cell. - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param txt text to display in the cell. It will be copied and saved so this variable is not - * required after this function call. - */ -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"); - return; - } - uint32_t cell = row * ext->col_cnt + col; - lv_table_cell_format_t format; - - /*Save the format byte*/ - if(ext->cell_data[cell]) { - format.format_byte = ext->cell_data[cell][0]; - } - /*Initialize the format byte*/ - else { -#if LV_USE_BIDI - 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) 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); /*+1 to skip the format byte*/ - - ext->cell_data[cell][0] = format.format_byte; - refr_size(table); -} - -/** - * Set the number of rows - * @param table table pointer to a Table object - * @param row_cnt number of rows - */ -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; - - if(ext->row_cnt > 0 && ext->col_cnt > 0) { - ext->cell_data = lv_mem_realloc(ext->cell_data, ext->row_cnt * ext->col_cnt * sizeof(char *)); - - /*Initilize the new fields*/ - if(old_row_cnt < row_cnt) { - uint16_t old_cell_cnt = old_row_cnt * ext->col_cnt; - uint32_t new_cell_cnt = ext->col_cnt * ext->row_cnt; - memset(&ext->cell_data[old_cell_cnt], 0, (new_cell_cnt - old_cell_cnt) * sizeof(ext->cell_data[0])); - } - } else { - lv_mem_free(ext->cell_data); - ext->cell_data = NULL; - } - - refr_size(table); -} - -/** - * Set the number of columns - * @param table table pointer to a Table object - * @param col_cnt number of columns. Must be < LV_TABLE_COL_MAX - */ -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."); - return; - } - - lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - uint16_t old_col_cnt = ext->col_cnt; - ext->col_cnt = col_cnt; - - if(ext->row_cnt > 0 && ext->col_cnt > 0) { - ext->cell_data = lv_mem_realloc(ext->cell_data, ext->row_cnt * ext->col_cnt * sizeof(char *)); - /*Initilize the new fields*/ - if(old_col_cnt < col_cnt) { - uint16_t old_cell_cnt = old_col_cnt * ext->row_cnt; - uint32_t new_cell_cnt = ext->col_cnt * ext->row_cnt; - memset(&ext->cell_data[old_cell_cnt], 0, (new_cell_cnt - old_cell_cnt) * sizeof(ext->cell_data[0])); - } - - } else { - lv_mem_free(ext->cell_data); - ext->cell_data = NULL; - } - refr_size(table); -} - -/** - * Set the width of a column - * @param table table pointer to a Table object - * @param col_id id of the column [0 .. LV_TABLE_COL_MAX -1] - * @param w width of the column - */ -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; - } - - lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - ext->col_w[col_id] = w; - refr_size(table); -} - -/** - * Set the text align in a cell - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param align LV_LABEL_ALIGN_LEFT or LV_LABEL_ALIGN_CENTER or LV_LABEL_ALIGN_RIGHT - */ -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"); - return; - } - uint32_t cell = row * ext->col_cnt + col; - - if(ext->cell_data[cell] == NULL) { - ext->cell_data[cell] = lv_mem_alloc(2); /*+1: trailing '\0; +1: format byte*/ - ext->cell_data[cell][0] = 0; - ext->cell_data[cell][1] = '\0'; - } - - lv_table_cell_format_t format; - format.format_byte = ext->cell_data[cell][0]; - format.s.align = align; - ext->cell_data[cell][0] = format.format_byte; -} - -/** - * Set the type of a cell. - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param type 1,2,3 or 4. The cell style will be chosen accordingly. - */ -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"); - return; - } - uint32_t cell = row * ext->col_cnt + col; - - if(ext->cell_data[cell] == NULL) { - ext->cell_data[cell] = lv_mem_alloc(2); /*+1: trailing '\0; +1: format byte*/ - ext->cell_data[cell][0] = 0; - ext->cell_data[cell][1] = '\0'; - } - - if(type > 0) type--; /*User gives 1,2,3,4 but easier to handle 0, 1, 2, 3*/ - if(type >= LV_TABLE_CELL_STYLE_CNT) type = LV_TABLE_CELL_STYLE_CNT - 1; - - lv_table_cell_format_t format; - format.format_byte = ext->cell_data[cell][0]; - format.s.type = type; - ext->cell_data[cell][0] = format.format_byte; -} - -/** - * Set the cell crop. (Don't adjust the height of the cell according to its content) - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param crop true: crop the cell content; false: set the cell height to the content. - */ -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"); - return; - } - uint32_t cell = row * ext->col_cnt + col; - - if(ext->cell_data[cell] == NULL) { - ext->cell_data[cell] = lv_mem_alloc(2); /*+1: trailing '\0; +1: format byte*/ - ext->cell_data[cell][0] = 0; - ext->cell_data[cell][1] = '\0'; - } - - lv_table_cell_format_t format; - format.format_byte = ext->cell_data[cell][0]; - format.s.crop = crop; - ext->cell_data[cell][0] = format.format_byte; -} - -/** - * Merge a cell with the right neighbor. The value of the cell to the right won't be displayed. - * @param table table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param en true: merge right; false: don't merge right - */ -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"); - return; - } - - uint32_t cell = row * ext->col_cnt + col; - - if(ext->cell_data[cell] == NULL) { - ext->cell_data[cell] = lv_mem_alloc(2); /*+1: trailing '\0; +1: format byte*/ - ext->cell_data[cell][0] = 0; - ext->cell_data[cell][1] = '\0'; - } - - lv_table_cell_format_t format; - format.format_byte = ext->cell_data[cell][0]; - format.s.right_merge = en ? 1 : 0; - ext->cell_data[cell][0] = format.format_byte; - refr_size(table); -} - -/** - * Set a style of a table. - * @param table pointer to table object - * @param type which style should be set - * @param style pointer to a style - */ -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) { - case LV_TABLE_STYLE_BG: - lv_obj_set_style(table, style); - refr_size(table); - break; - case LV_TABLE_STYLE_CELL1: - ext->cell_style[0] = style; - refr_size(table); - break; - case LV_TABLE_STYLE_CELL2: - ext->cell_style[1] = style; - refr_size(table); - break; - case LV_TABLE_STYLE_CELL3: - ext->cell_style[2] = style; - refr_size(table); - break; - case LV_TABLE_STYLE_CELL4: - ext->cell_style[3] = style; - refr_size(table); - break; - } -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the value of a cell. - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @return text in the cell - */ -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"); - return ""; - } - uint32_t cell = row * ext->col_cnt + col; - - if(ext->cell_data[cell] == NULL) return ""; - - return &ext->cell_data[cell][1]; /*Skip the format byte*/ -} - -/** - * Get the number of rows. - * @param table table pointer to a Table object - * @return number of rows. - */ -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; -} - -/** - * Get the number of columns. - * @param table table pointer to a Table object - * @return number of columns. - */ -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; -} - -/** - * Get the width of a column - * @param table table pointer to a Table object - * @param col_id id of the column [0 .. LV_TABLE_COL_MAX -1] - * @return width of the column - */ -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; - } - - lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - return ext->col_w[col_id]; -} - -/** - * Get the text align of a cell - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @return LV_LABEL_ALIGN_LEFT (default in case of error) or LV_LABEL_ALIGN_CENTER or - * LV_LABEL_ALIGN_RIGHT - */ -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"); - return LV_LABEL_ALIGN_LEFT; /*Just return with something*/ - } - uint32_t cell = row * ext->col_cnt + col; - - if(ext->cell_data[cell] == NULL) - return LV_LABEL_ALIGN_LEFT; /*Just return with something*/ - else { - lv_table_cell_format_t format; - format.format_byte = ext->cell_data[cell][0]; - return format.s.align; - } -} - -/** - * Get the type of a cell - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @return 1,2,3 or 4 - */ -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"); - return 1; /*Just return with something*/ - } - uint32_t cell = row * ext->col_cnt + col; - - if(ext->cell_data[cell] == NULL) - return 1; /*Just return with something*/ - else { - lv_table_cell_format_t format; - format.format_byte = ext->cell_data[cell][0]; - return format.s.type + 1; /*0,1,2,3 is stored but user sees 1,2,3,4*/ - } -} - -/** - * Get the crop property of a cell - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @return true: text crop enabled; false: disabled - */ -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"); - return false; /*Just return with something*/ - } - uint32_t cell = row * ext->col_cnt + col; - - if(ext->cell_data[cell] == NULL) - return false; /*Just return with something*/ - else { - lv_table_cell_format_t format; - format.format_byte = ext->cell_data[cell][0]; - return format.s.crop; - } -} - -/** - * Get the cell merge attribute. - * @param table table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @return true: merge right; false: don't merge right - */ -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"); - return false; - } - - uint32_t cell = row * ext->col_cnt + col; - - if(ext->cell_data[cell] == NULL) - return false; - else { - lv_table_cell_format_t format; - format.format_byte = ext->cell_data[cell][0]; - return format.s.right_merge ? true : false; - } -} - -/** - * Get style of a table. - * @param table pointer to table object - * @param type which style should be get - * @return style pointer to the style - */ -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; - - switch(type) { - case LV_TABLE_STYLE_BG: style = lv_obj_get_style(table); break; - case LV_TABLE_STYLE_CELL1: style = ext->cell_style[0]; break; - case LV_TABLE_STYLE_CELL2: style = ext->cell_style[1]; break; - case LV_TABLE_STYLE_CELL3: style = ext->cell_style[2]; break; - case LV_TABLE_STYLE_CELL4: style = ext->cell_style[3]; break; - default: return NULL; - } - - return style; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * 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 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' - */ -static bool lv_table_design(lv_obj_t * table, const lv_area_t * mask, 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; - } - /*Draw the object*/ - else if(mode == LV_DESIGN_DRAW_MAIN) { - ancestor_scrl_design(table, mask, mode); - - lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - const lv_style_t * bg_style = lv_obj_get_style(table); - lv_coord_t h_row; - lv_point_t txt_size; - lv_area_t cell_area; - lv_area_t txt_area; - lv_txt_flag_t txt_flags; - lv_opa_t opa_scale = lv_obj_get_opa_scale(table); - - uint16_t col; - uint16_t row; - uint16_t cell = 0; - - cell_area.y2 = table->coords.y1 + bg_style->body.padding.top; - for(row = 0; row < ext->row_cnt; row++) { - h_row = get_row_height(table, row); - - cell_area.y1 = cell_area.y2 + 1; - cell_area.y2 = cell_area.y1 + h_row - 1; - - cell_area.x2 = table->coords.x1 + bg_style->body.padding.left; - - for(col = 0; col < ext->col_cnt; col++) { - - lv_table_cell_format_t format; - if(ext->cell_data[cell]) { - format.format_byte = ext->cell_data[cell][0]; - } else { - format.s.right_merge = 0; - format.s.align = LV_LABEL_ALIGN_LEFT; - format.s.type = 0; - format.s.crop = 1; - } - - - lv_style_t cell_style; - lv_style_copy(&cell_style, ext->cell_style[format.s.type]); - cell_area.x1 = cell_area.x2 + 1; - cell_area.x2 = cell_area.x1 + ext->col_w[col] - 1; - - uint16_t col_merge = 0; - for(col_merge = 0; col_merge + col < ext->col_cnt - 1; col_merge++) { - - if(ext->cell_data[cell + col_merge] != NULL) { - format.format_byte = ext->cell_data[cell + col_merge][0]; - if(format.s.right_merge) - cell_area.x2 += ext->col_w[col + col_merge + 1]; - else - break; - } else { - break; - } - } - - lv_draw_rect(&cell_area, mask, &cell_style, opa_scale); - - if(ext->cell_data[cell]) { - - txt_area.x1 = cell_area.x1 + cell_style.body.padding.left; - txt_area.x2 = cell_area.x2 - cell_style.body.padding.right; - txt_area.y1 = cell_area.y1 + cell_style.body.padding.top; - txt_area.y2 = cell_area.y2 - cell_style.body.padding.bottom; - /*Align the content to the middle if not cropped*/ - if(format.s.crop == 0) { - txt_flags = LV_TXT_FLAG_NONE; - } else { - txt_flags = LV_TXT_FLAG_EXPAND; - } - - lv_txt_get_size(&txt_size, ext->cell_data[cell] + 1, cell_style.text.font, - cell_style.text.letter_space, cell_style.text.line_space, - lv_area_get_width(&txt_area), txt_flags); - - /*Align the content to the middle if not cropped*/ - if(format.s.crop == 0) { - txt_area.y1 = cell_area.y1 + h_row / 2 - txt_size.y / 2; - txt_area.y2 = cell_area.y1 + h_row / 2 + txt_size.y / 2; - } - - switch(format.s.align) { - default: - case LV_LABEL_ALIGN_LEFT: txt_flags |= LV_TXT_FLAG_NONE; break; - case LV_LABEL_ALIGN_RIGHT: txt_flags |= LV_TXT_FLAG_RIGHT; break; - case LV_LABEL_ALIGN_CENTER: txt_flags |= LV_TXT_FLAG_CENTER; break; - } - - lv_area_t label_mask; - bool label_mask_ok; - label_mask_ok = lv_area_intersect(&label_mask, mask, &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, NULL, NULL, lv_obj_get_base_dir(table)); - } - /*Draw lines after '\n's*/ - lv_point_t p1; - lv_point_t p2; - p1.x = cell_area.x1; - p2.x = cell_area.x2; - uint16_t i; - for(i = 1; ext->cell_data[cell][i] != '\0'; i++) { - if(ext->cell_data[cell][i] == '\n') { - ext->cell_data[cell][i] = '\0'; - lv_txt_get_size(&txt_size, ext->cell_data[cell] + 1, cell_style.text.font, - cell_style.text.letter_space, cell_style.text.line_space, - lv_area_get_width(&txt_area), txt_flags); - - 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); - - ext->cell_data[cell][i] = '\n'; - } - } - } - - cell += col_merge + 1; - col += col_merge; - } - } - } - /*Post draw when the children are drawn*/ - else if(mode == LV_DESIGN_DRAW_POST) { - } - - return true; -} - -/** - * Signal function of the table - * @param table pointer to a table 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_table_signal(lv_obj_t * table, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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*/ - lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - uint16_t cell; - for(cell = 0; cell < ext->col_cnt * ext->row_cnt; cell++) { - if(ext->cell_data[cell]) { - lv_mem_free(ext->cell_data[cell]); - ext->cell_data[cell] = NULL; - } - } - if(ext->cell_data != NULL) - lv_mem_free(ext->cell_data); - } - - return res; -} - -static void refr_size(lv_obj_t * table) -{ - lv_coord_t h = 0; - lv_coord_t w = 0; - - lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - - uint16_t i; - for(i = 0; i < ext->col_cnt; i++) { - w += ext->col_w[i]; - } - for(i = 0; i < ext->row_cnt; i++) { - h += get_row_height(table, i); - } - - const lv_style_t * bg_style = lv_obj_get_style(table); - - w += bg_style->body.padding.left + bg_style->body.padding.right; - h += bg_style->body.padding.top + bg_style->body.padding.bottom; - - lv_obj_set_size(table, w + 1, h + 1); - lv_obj_invalidate(table); -} - -static lv_coord_t get_row_height(lv_obj_t * table, uint16_t row_id) -{ - lv_table_ext_t * ext = lv_obj_get_ext_attr(table); - lv_point_t txt_size; - lv_coord_t txt_w; - const lv_style_t * cell_style; - - uint16_t row_start = row_id * ext->col_cnt; - uint16_t cell; - uint16_t col; - lv_coord_t h_max = lv_font_get_line_height(ext->cell_style[0]->text.font) + ext->cell_style[0]->body.padding.top + - ext->cell_style[0]->body.padding.bottom; - - for(cell = row_start, col = 0; cell < row_start + ext->col_cnt; cell++, col++) { - if(ext->cell_data[cell] != NULL) { - - txt_w = ext->col_w[col]; - uint16_t col_merge = 0; - for(col_merge = 0; col_merge + col < ext->col_cnt - 1; col_merge++) { - - if(ext->cell_data[cell + col_merge] != NULL) { - lv_table_cell_format_t format; - format.format_byte = ext->cell_data[cell + col_merge][0]; - if(format.s.right_merge) - txt_w += ext->col_w[col + col_merge + 1]; - else - break; - } else { - break; - } - } - - lv_table_cell_format_t format; - format.format_byte = ext->cell_data[cell][0]; - cell_style = ext->cell_style[format.s.type]; - - /*With text crop assume 1 line*/ - if(format.s.crop) { - h_max = LV_MATH_MAX(lv_font_get_line_height(cell_style->text.font) + cell_style->body.padding.top + - cell_style->body.padding.bottom, - h_max); - } - /*Without text crop calculate the height of the text in the cell*/ - else { - txt_w -= cell_style->body.padding.left + cell_style->body.padding.right; - - lv_txt_get_size(&txt_size, ext->cell_data[cell] + 1, cell_style->text.font, - cell_style->text.letter_space, cell_style->text.line_space, txt_w, LV_TXT_FLAG_NONE); - - h_max = LV_MATH_MAX(txt_size.y + cell_style->body.padding.top + cell_style->body.padding.bottom, h_max); - cell += col_merge; - col += col_merge; - } - } - } - - return h_max; -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_table.h b/src/libs/lvgl/src/lv_objx/lv_table.h deleted file mode 100644 index d6a0be7d..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_table.h +++ /dev/null @@ -1,268 +0,0 @@ -/** - * @file lv_table.h - * - */ - -#ifndef LV_TABLE_H -#define LV_TABLE_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_TABLE != 0 - -/*Testing of dependencies*/ -#if LV_USE_LABEL == 0 -#error "lv_table: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "lv_label.h" - -/********************* - * DEFINES - *********************/ -#ifndef LV_TABLE_COL_MAX -#define LV_TABLE_COL_MAX 12 -#endif - -#define LV_TABLE_CELL_STYLE_CNT 4 -/********************** - * TYPEDEFS - **********************/ - -/** - * Internal table cell format structure. - * - * Use the `lv_table` APIs instead. - */ -typedef union -{ - struct - { - uint8_t align : 2; - uint8_t right_merge : 1; - uint8_t type : 2; - uint8_t crop : 1; - } s; - uint8_t format_byte; -} lv_table_cell_format_t; - -/*Data of table*/ -typedef struct -{ - /*New data for this type */ - uint16_t col_cnt; - uint16_t row_cnt; - char ** cell_data; - const lv_style_t * cell_style[LV_TABLE_CELL_STYLE_CNT]; - lv_coord_t col_w[LV_TABLE_COL_MAX]; -} lv_table_ext_t; - -/*Styles*/ -enum { - LV_TABLE_STYLE_BG, - LV_TABLE_STYLE_CELL1, - LV_TABLE_STYLE_CELL2, - LV_TABLE_STYLE_CELL3, - LV_TABLE_STYLE_CELL4, -}; -typedef uint8_t lv_table_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a table object - * @param par pointer to an object, it will be the parent of the new table - * @param copy pointer to a table object, if not NULL then the new object will be copied from it - * @return pointer to the created table - */ -lv_obj_t * lv_table_create(lv_obj_t * par, const lv_obj_t * copy); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set the value of a cell. - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param txt text to display in the cell. It will be copied and saved so this variable is not - * required after this function call. - */ -void lv_table_set_cell_value(lv_obj_t * table, uint16_t row, uint16_t col, const char * txt); - -/** - * Set the number of rows - * @param table table pointer to a Table object - * @param row_cnt number of rows - */ -void lv_table_set_row_cnt(lv_obj_t * table, uint16_t row_cnt); - -/** - * Set the number of columns - * @param table table pointer to a Table object - * @param col_cnt number of columns. Must be < LV_TABLE_COL_MAX - */ -void lv_table_set_col_cnt(lv_obj_t * table, uint16_t col_cnt); - -/** - * Set the width of a column - * @param table table pointer to a Table object - * @param col_id id of the column [0 .. LV_TABLE_COL_MAX -1] - * @param w width of the column - */ -void lv_table_set_col_width(lv_obj_t * table, uint16_t col_id, lv_coord_t w); - -/** - * Set the text align in a cell - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param align LV_LABEL_ALIGN_LEFT or LV_LABEL_ALIGN_CENTER or LV_LABEL_ALIGN_RIGHT - */ -void lv_table_set_cell_align(lv_obj_t * table, uint16_t row, uint16_t col, lv_label_align_t align); - -/** - * Set the type of a cell. - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param type 1,2,3 or 4. The cell style will be chosen accordingly. - */ -void lv_table_set_cell_type(lv_obj_t * table, uint16_t row, uint16_t col, uint8_t type); - -/** - * Set the cell crop. (Don't adjust the height of the cell according to its content) - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param crop true: crop the cell content; false: set the cell height to the content. - */ -void lv_table_set_cell_crop(lv_obj_t * table, uint16_t row, uint16_t col, bool crop); - -/** - * Merge a cell with the right neighbor. The value of the cell to the right won't be displayed. - * @param table table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @param en true: merge right; false: don't merge right - */ -void lv_table_set_cell_merge_right(lv_obj_t * table, uint16_t row, uint16_t col, bool en); - -/** - * Set a style of a table. - * @param table pointer to table object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_table_set_style(lv_obj_t * table, lv_table_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the value of a cell. - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @return text in the cell - */ -const char * lv_table_get_cell_value(lv_obj_t * table, uint16_t row, uint16_t col); - -/** - * Get the number of rows. - * @param table table pointer to a Table object - * @return number of rows. - */ -uint16_t lv_table_get_row_cnt(lv_obj_t * table); - -/** - * Get the number of columns. - * @param table table pointer to a Table object - * @return number of columns. - */ -uint16_t lv_table_get_col_cnt(lv_obj_t * table); - -/** - * Get the width of a column - * @param table table pointer to a Table object - * @param col_id id of the column [0 .. LV_TABLE_COL_MAX -1] - * @return width of the column - */ -lv_coord_t lv_table_get_col_width(lv_obj_t * table, uint16_t col_id); - -/** - * Get the text align of a cell - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @return LV_LABEL_ALIGN_LEFT (default in case of error) or LV_LABEL_ALIGN_CENTER or - * LV_LABEL_ALIGN_RIGHT - */ -lv_label_align_t lv_table_get_cell_align(lv_obj_t * table, uint16_t row, uint16_t col); - -/** - * Get the type of a cell - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @return 1,2,3 or 4 - */ -lv_label_align_t lv_table_get_cell_type(lv_obj_t * table, uint16_t row, uint16_t col); - -/** - * Get the crop property of a cell - * @param table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @return true: text crop enabled; false: disabled - */ -lv_label_align_t lv_table_get_cell_crop(lv_obj_t * table, uint16_t row, uint16_t col); - -/** - * Get the cell merge attribute. - * @param table table pointer to a Table object - * @param row id of the row [0 .. row_cnt -1] - * @param col id of the column [0 .. col_cnt -1] - * @return true: merge right; false: don't merge right - */ -bool lv_table_get_cell_merge_right(lv_obj_t * table, uint16_t row, uint16_t col); - -/** - * Get style of a table. - * @param table pointer to table object - * @param type which style should be get - * @return style pointer to the style - */ -const lv_style_t * lv_table_get_style(const lv_obj_t * table, lv_table_style_t type); - -/*===================== - * Other functions - *====================*/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_TABLE*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_TABLE_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_tabview.c b/src/libs/lvgl/src/lv_objx/lv_tabview.c deleted file mode 100644 index 809cf241..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_tabview.c +++ /dev/null @@ -1,1175 +0,0 @@ -/** - * @file lv_tab.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_tabview.h" -#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" - -/********************* - * 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) */ -#endif -#else -#undef LV_TABVIEW_DEF_ANIM_TIME -#define LV_TABVIEW_DEF_ANIM_TIME 0 /*No animations*/ -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * 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 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 VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_signal_cb_t page_signal; -static lv_signal_cb_t page_scrl_signal; -static const char * tab_def[] = {""}; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a Tab view object - * @param par pointer to an object, it will be the parent of the new tab - * @param copy pointer to a tab object, if not NULL then the new object will be copied from it - * @return pointer to the created tab - */ -lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("tab view create started"); - - /*Create the ancestor of tab*/ - lv_obj_t * new_tabview = lv_obj_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) 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; - ext->content = NULL; - ext->indic = NULL; - ext->btns = NULL; - ext->btns_pos = LV_TABVIEW_BTNS_POS_TOP; -#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); - - /*Init the new tab tab*/ - if(copy == NULL) { - ext->tab_name_ptr = lv_mem_alloc(sizeof(char *)); - LV_ASSERT_MEM(ext->tab_name_ptr); - if(ext->tab_name_ptr == NULL) return NULL; - ext->tab_name_ptr[0] = ""; - ext->tab_cnt = 0; - - /* Set a size which fits into the parent. - * 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_coord_t w; - lv_coord_t h; - if(par) { - w = lv_obj_get_width_fit(lv_obj_get_parent(new_tabview)); - h = lv_obj_get_height_fit(lv_obj_get_parent(new_tabview)); - } else { - w = lv_disp_get_hor_res(NULL); - h = lv_disp_get_ver_res(NULL); - } - - lv_obj_set_size(new_tabview, w, h); - - ext->content = lv_cont_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); - 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); - - /*Set the default styles*/ - lv_theme_t * th = lv_theme_get_current(); - if(th) { - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BG, th->style.tabview.bg); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_INDIC, th->style.tabview.indic); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BTN_BG, th->style.tabview.btn.bg); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BTN_REL, th->style.tabview.btn.rel); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BTN_PR, th->style.tabview.btn.pr); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BTN_TGL_REL, th->style.tabview.btn.tgl_rel); - 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_pretty);//transp); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_INDIC, &lv_style_plain_color); - } - } - /*Copy an existing tab view*/ - else { - lv_tabview_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->point_last.x = 0; - 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); -#if LV_USE_ANIMATION - ext->anim_time = copy_ext->anim_time; -#endif - - ext->tab_name_ptr = lv_mem_alloc(sizeof(char *)); - 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); - - uint16_t i; - lv_obj_t * new_tab; - lv_obj_t * copy_tab; - for(i = 0; i < copy_ext->tab_cnt; i++) { - new_tab = lv_tabview_add_tab(new_tabview, copy_ext->tab_name_ptr[i]); - copy_tab = lv_tabview_get_tab(copy, i); - lv_page_set_style(new_tab, LV_PAGE_STYLE_BG, lv_page_get_style(copy_tab, LV_PAGE_STYLE_BG)); - lv_page_set_style(new_tab, LV_PAGE_STYLE_SCRL, lv_page_get_style(copy_tab, LV_PAGE_STYLE_SCRL)); - lv_page_set_style(new_tab, LV_PAGE_STYLE_SB, lv_page_get_style(copy_tab, LV_PAGE_STYLE_SB)); - } - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_tabview); - } - - LV_LOG_INFO("tab view created"); - - return new_tabview; -} - -/** - * Delete all children of the scrl object, without deleting scrl child. - * @param tabview pointer to an object - */ -void lv_tabview_clean(lv_obj_t * tabview) -{ - LV_ASSERT_OBJ(tabview, LV_OBJX_NAME); - - lv_obj_t * scrl = lv_page_get_scrl(tabview); - lv_obj_clean(scrl); -} - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Add a new tab with the given name - * @param tabview pointer to Tab view object where to ass the new tab - * @param name the text on the tab button - * @return pointer to the created page object (lv_page). You can create your content here - */ -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_tight); - lv_page_set_style(h, LV_PAGE_STYLE_SCRL, &lv_style_transp);//plain_color); - - 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_ASSERT_MEM(name_dm); - if(name_dm == NULL) return NULL; - strcpy(name_dm, name); - - ext->tab_cnt++; - - switch(ext->btns_pos) { - case LV_TABVIEW_BTNS_POS_TOP: - case LV_TABVIEW_BTNS_POS_BOTTOM: - 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((void*)ext->tab_name_ptr, sizeof(char *) * (ext->tab_cnt * 2)); - break; - } - - 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. - * Method: clean extra \n when switch from LV_TABVIEW_BTNS_POS_LEFT or LV_TABVIEW_BTNS_POS_RIGHT - * 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; - } - - /* The button matrix's map still points to the old `tab_name_ptr` which might be freed by - * `lv_mem_realloc`. So make its current map invalid*/ - lv_btnm_ext_t * btnm_ext = lv_obj_get_ext_attr(ext->btns); - btnm_ext->map_p = NULL; - - 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; - } - - tabview_realign(tabview); /*Set the size of the pages, tab buttons and indicator*/ - - lv_tabview_set_tab_act(tabview, ext->tab_cur, false); - - return h; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new tab - * @param tabview pointer to Tab view object - * @param id index of a tab to load - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -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); - - if(id >= ext->tab_cnt) id = ext->tab_cnt - 1; - - lv_btnm_clear_btn_ctrl(ext->btns, ext->tab_cur, LV_BTNM_CTRL_TGL_STATE); - - 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; - } - - if(anim == LV_ANIM_OFF || lv_tabview_get_anim_time(tabview) == 0) { - lv_obj_set_x(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.end = cont_x; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_x; - a.path_cb = lv_anim_path_linear; - a.ready_cb = NULL; - 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); - } -#endif - - /*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; - - 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); - const lv_style_t * style_tabs = lv_tabview_get_style(tabview, LV_TABVIEW_STYLE_BTN_BG); - lv_coord_t max_h = lv_obj_get_height(ext->btns) - style_tabs->body.padding.top - style_tabs->body.padding.bottom; - - if(ext->tab_cnt) indic_pos = (max_h * ext->tab_cur) / ext->tab_cnt; - else indic_pos = 0; - break; - } - -#if LV_USE_ANIMATION - if(anim == LV_ANIM_OFF || ext->anim_time == 0) -#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; - } - } -#if LV_USE_ANIMATION - else { - lv_anim_t a; - 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; - } - - a.path_cb = lv_anim_path_linear; - a.ready_cb = NULL; - 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); - } -#endif - - 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_ASSERT_OBJ(tabview, LV_OBJX_NAME); - - 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 - * @param anim_time_ms time of animation in milliseconds - */ -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; -#else - (void)tabview; - (void)anim_time; -#endif -} - -/** - * Set the style of a tab view - * @param tabview pointer to a tan view object - * @param type which style should be set - * @param style pointer to the new style - */ -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; - } -} - -/** - * Set the position of tab select buttons - * @param tabview pointer to a tan view object - * @param btns_pos which button position - */ -void lv_tabview_set_btns_pos(lv_obj_t * tabview, lv_tabview_btns_pos_t btns_pos) -{ - 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_ASSERT_OBJ(tabview, LV_OBJX_NAME); - - lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); - - ext->btns_hide = en; - tabview_realign(tabview); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the index of the currently active tab - * @param tabview pointer to Tab view object - * @return the active btn index - */ -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; -} - -/** - * Get the number of tabs - * @param tabview pointer to Tab view object - * @return btn count - */ -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; -} - -/** - * Get the page (content area) of a tab - * @param tabview pointer to Tab view object - * @param id index of the btn (>= 0) - * @return pointer to page (lv_page) object - */ -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); - uint16_t i = 0; - lv_obj_t * page = lv_obj_get_child_back(ext->content, NULL); - - while(page != NULL && i != id) { - i++; - page = lv_obj_get_child_back(ext->content, page); - } - - if(i == id) return page; - - 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_ASSERT_OBJ(tabview, LV_OBJX_NAME); - - 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 - * @return time of animation in milliseconds - */ -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; -#else - (void)tabview; - return 0; -#endif -} - -/** - * Get a style of a tab view - * @param tabview pointer to a ab view object - * @param type which style should be get - * @return style pointer to a style - */ -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; - } - - return style; -} - -/** - * Get position of tab select buttons - * @param tabview pointer to a ab view object - */ -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_ASSERT_OBJ(tabview, LV_OBJX_NAME); - - lv_tabview_ext_t * ext = lv_obj_get_ext_attr(tabview); - - return ext->btns_hide; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Signal function of the Tab view - * @param tabview pointer to a Tab view 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_tabview_signal(lv_obj_t * tabview, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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) { - uint8_t i; - for(i = 0; ext->tab_name_ptr[i][0] != '\0'; i++) lv_mem_free(ext->tab_name_ptr[i]); - - lv_mem_free(ext->tab_name_ptr); - ext->tab_name_ptr = NULL; - ext->btns = NULL; /*These objects were children so they are already invalid*/ - 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))) { - tabview_realign(tabview); - } - } else if(sign == LV_SIGNAL_RELEASED) { -#if LV_USE_GROUP - /*If released by a KEYPAD or ENCODER then really the tab buttons should be released. - * So simulate a CLICK on the tab buttons*/ - 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)))) { - lv_event_send(ext->btns, LV_EVENT_CLICKED, lv_event_get_data()); - } -#endif - } else if(sign == LV_SIGNAL_FOCUS || sign == LV_SIGNAL_DEFOCUS || sign == LV_SIGNAL_CONTROL) { - /* The button matrix is not in a group (the tab view is in it) but it should handle the - * group signals. So propagate the related signals to the button matrix manually*/ - if(ext->btns) { - ext->btns->signal_cb(ext->btns, sign, param); - } - - 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_set_pressed(ext->btns, ext->tab_cur); - } -#endif - } else { - lv_btnm_set_pressed(ext->btns, ext->tab_cur); - } - } - } else if(sign == LV_SIGNAL_GET_EDITABLE) { - bool * editable = (bool *)param; - *editable = true; - } - - return res; -} - -/** - * Signal function of a tab's page - * @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) -{ - lv_res_t res; - - /* Include the ancient signal function */ - res = page_signal(tab_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_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; -} -/** - * 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; - if(sign == LV_SIGNAL_GET_TYPE) return lv_obj_handle_get_type_signal(param, ""); - - 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; - } - } 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; - - /*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); - - { - uint16_t id = ext->tab_cur; - if(lv_obj_get_base_dir(tabview) == LV_BIDI_DIR_RTL) { - id = (ext->tab_cnt - (id + 1)); - } - lv_obj_set_x(ext->indic, indic_size * id + tabs_style->body.padding.inner * id + - 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; - } - } -} - -/** - * 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; - - int16_t tab_cur = ext->tab_cur; - if(page_x1 > treshold) { - if(lv_obj_get_base_dir(tabview) == LV_BIDI_DIR_RTL) tab_cur++; - else tab_cur--; - } else if(page_x2 < treshold) { - if(lv_obj_get_base_dir(tabview) == LV_BIDI_DIR_RTL) tab_cur--; - else tab_cur++; - } - - if(tab_cur > ext->tab_cnt - 1) tab_cur = ext->tab_cnt - 1; - else 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); - - 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; -} - -/** - * Called when a tab button is clicked - * @param tab_btnm pointer to the tab's button matrix object - * @param event type of the event - */ -static void tab_btnm_event_cb(lv_obj_t * tab_btnm, lv_event_t event) -{ - if(event != LV_EVENT_CLICKED) return; - - uint16_t btn_id = lv_btnm_get_active_btn(tab_btnm); - if(btn_id == LV_BTNM_BTN_NONE) return; - - lv_btnm_clear_btn_ctrl_all(tab_btnm, LV_BTNM_CTRL_TGL_STATE); - lv_btnm_set_btn_ctrl(tab_btnm, btn_id, LV_BTNM_CTRL_TGL_STATE); - - lv_obj_t * tabview = lv_obj_get_parent(tab_btnm); - - uint32_t id_prev = lv_tabview_get_tab_act(tabview); - lv_tabview_set_tab_act(tabview, btn_id, 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; -} - -/** - * Realign and resize the elements of Tab view - * @param tabview pointer to a Tab view object - */ -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)); - - 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; - } - } - - lv_tabview_set_tab_act(tabview, ext->tab_cur, LV_ANIM_OFF); -} -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_tabview.h b/src/libs/lvgl/src/lv_objx/lv_tabview.h deleted file mode 100644 index f7546d0c..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_tabview.h +++ /dev/null @@ -1,231 +0,0 @@ -/** - * @file lv_tabview.h - * - */ - -#ifndef LV_TABVIEW_H -#define LV_TABVIEW_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_TABVIEW != 0 - -/*Testing of dependencies*/ -#if LV_USE_BTNM == 0 -#error "lv_tabview: lv_btnm is required. Enable it in lv_conf.h (LV_USE_BTNM 1) " -#endif - -#if LV_USE_PAGE == 0 -#error "lv_tabview: lv_page is required. Enable it in lv_conf.h (LV_USE_PAGE 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "../lv_objx/lv_win.h" -#include "../lv_objx/lv_page.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** 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 }; -typedef uint8_t lv_tabview_btns_pos_t; - -/*Data of tab*/ -typedef struct -{ - /*Ext. of ancestor*/ - /*New data for this type */ - lv_obj_t * btns; - lv_obj_t * indic; - lv_obj_t * content; /*A rectangle to show the current tab*/ - const char ** tab_name_ptr; - lv_point_t point_last; - uint16_t tab_cur; - uint16_t tab_cnt; -#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_ext_t; - -enum { - LV_TABVIEW_STYLE_BG, - LV_TABVIEW_STYLE_INDIC, - LV_TABVIEW_STYLE_BTN_BG, - LV_TABVIEW_STYLE_BTN_REL, - LV_TABVIEW_STYLE_BTN_PR, - LV_TABVIEW_STYLE_BTN_TGL_REL, - LV_TABVIEW_STYLE_BTN_TGL_PR, -}; -typedef uint8_t lv_tabview_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a Tab view object - * @param par pointer to an object, it will be the parent of the new tab - * @param copy pointer to a tab object, if not NULL then the new object will be copied from it - * @return pointer to the created tab - */ -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 tabview pointer to an object - */ -void lv_tabview_clean(lv_obj_t * tabview); - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Add a new tab with the given name - * @param tabview pointer to Tab view object where to ass the new tab - * @param name the text on the tab button - * @return pointer to the created page object (lv_page). You can create your content here - */ -lv_obj_t * lv_tabview_add_tab(lv_obj_t * tabview, const char * name); - -/*===================== - * Setter functions - *====================*/ - -/** - * Set a new tab - * @param tabview pointer to Tab view object - * @param id index of a tab to load - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -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 - * @param anim_time time of animation in milliseconds - */ -void lv_tabview_set_anim_time(lv_obj_t * tabview, uint16_t anim_time); - -/** - * Set the style of a tab view - * @param tabview pointer to a tan view object - * @param type which style should be set - * @param style pointer to the new style - */ -void lv_tabview_set_style(lv_obj_t * tabview, lv_tabview_style_t type, const lv_style_t * style); - -/** - * Set the position of tab select buttons - * @param tabview pointer to a tab view object - * @param btns_pos which button position - */ -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 - *====================*/ - -/** - * Get the index of the currently active tab - * @param tabview pointer to Tab view object - * @return the active tab index - */ -uint16_t lv_tabview_get_tab_act(const lv_obj_t * tabview); - -/** - * Get the number of tabs - * @param tabview pointer to Tab view object - * @return tab count - */ -uint16_t lv_tabview_get_tab_count(const lv_obj_t * tabview); -/** - * Get the page (content area) of a tab - * @param tabview pointer to Tab view object - * @param id index of the tab (>= 0) - * @return pointer to page (lv_page) object - */ -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 - * @return time of animation in milliseconds - */ -uint16_t lv_tabview_get_anim_time(const lv_obj_t * tabview); - -/** - * Get a style of a tab view - * @param tabview pointer to a ab view object - * @param type which style should be get - * @return style pointer to a style - */ -const lv_style_t * lv_tabview_get_style(const lv_obj_t * tabview, lv_tabview_style_t type); - -/** - * Get position of tab select buttons - * @param tabview pointer to a ab view object - */ -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 - **********************/ - -#endif /*LV_USE_TABVIEW*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_TABVIEW_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_tileview.c b/src/libs/lvgl/src/lv_objx/lv_tileview.c deleted file mode 100644 index 3b2f8514..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_tileview.c +++ /dev/null @@ -1,584 +0,0 @@ -/** - * @file lv_tileview.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_tileview.h" -#if LV_USE_TILEVIEW != 0 - -#include <stdbool.h> -#include "lv_cont.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) */ -#endif -#else -#undef LV_TILEVIEW_DEF_ANIM_TIME -#define LV_TILEVIEW_DEF_ANIM_TIME 0 /*No animations*/ -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -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); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; -static lv_signal_cb_t ancestor_scrl_signal; -static lv_design_cb_t ancestor_design; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a tileview object - * @param par pointer to an object, it will be the parent of the new tileview - * @param copy pointer to a tileview object, if not NULL then the new object will be copied from it - * @return pointer to the created tileview - */ -lv_obj_t * lv_tileview_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("tileview create started"); - - /*Create the ancestor of tileview*/ - lv_obj_t * new_tileview = lv_page_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) 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' */ -#if LV_USE_ANIMATION - ext->anim_time = LV_TILEVIEW_DEF_ANIM_TIME; -#endif - ext->act_id.x = 0; - ext->act_id.y = 0; - ext->valid_pos = NULL; - ext->valid_pos_cnt = 0; - - /*The signal and design functions are not copied so set them here*/ - lv_obj_set_signal_cb(new_tileview, lv_tileview_signal); - lv_obj_set_signal_cb(lv_page_get_scrl(new_tileview), lv_tileview_scrl_signal); - - /*Init the new tileview*/ - if(copy == NULL) { - /* Set a size which fits into the parent. - * 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_coord_t w; - lv_coord_t h; - if(par) { - w = lv_obj_get_width_fit(lv_obj_get_parent(new_tileview)); - h = lv_obj_get_height_fit(lv_obj_get_parent(new_tileview)); - } else { - w = lv_disp_get_hor_res(NULL); - h = lv_disp_get_ver_res(NULL); - } - - lv_obj_set_size(new_tileview, w, h); - - lv_obj_set_drag_throw(lv_page_get_scrl(new_tileview), false); - 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) { - lv_page_set_style(new_tileview, LV_PAGE_STYLE_BG, th->style.tileview.bg); - lv_page_set_style(new_tileview, LV_PAGE_STYLE_SCRL, th->style.tileview.scrl); - lv_page_set_style(new_tileview, LV_PAGE_STYLE_SB, th->style.tileview.sb); - } else { - lv_page_set_style(new_tileview, LV_PAGE_STYLE_BG, &lv_style_transp_tight); - lv_page_set_style(new_tileview, LV_PAGE_STYLE_SCRL, &lv_style_transp_tight); - } - } - /*Copy an existing tileview*/ - else { - lv_tileview_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->act_id.x = copy_ext->act_id.x; - ext->act_id.y = copy_ext->act_id.y; - ext->valid_pos = copy_ext->valid_pos; - ext->valid_pos_cnt = copy_ext->valid_pos_cnt; -#if LV_USE_ANIMATION - ext->anim_time = copy_ext->anim_time; -#endif - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_tileview); - } - - LV_LOG_INFO("tileview created"); - - return new_tileview; -} - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Register an object on the tileview. The register object will able to slide the tileview - * @param tileview pointer to a Tileview object - * @param element pointer to an object - */ -void lv_tileview_add_element(lv_obj_t * tileview, lv_obj_t * element) -{ - LV_ASSERT_OBJ(tileview, LV_OBJX_NAME); - LV_ASSERT_NULL(tileview); - - /* 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); - - /* 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); -} - -/*===================== - * Setter functions - *====================*/ - -/** - * 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_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) -{ - 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; - - /*If valid pos. is selected do nothing*/ - uint16_t i; - for(i = 0; i < valid_pos_cnt; i++) { - if(valid_pos[i].x == ext->act_id.x && valid_pos[i].y == ext->act_id.y) { - return; - } - } - - /*Set a valid position if now an invalid is selected*/ - if(valid_pos_cnt > 0) { - lv_tileview_set_tile_act(tileview, valid_pos[0].x, valid_pos[0].y, LV_ANIM_OFF); - } -} - -/** - * Set 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...) - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -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 - - lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); - - uint32_t tile_id; - bool valid = false; - for(tile_id = 0; tile_id < ext->valid_pos_cnt; tile_id++) { - if(ext->valid_pos[tile_id].x == x && ext->valid_pos[tile_id].y == y) { - valid = true; - break; - } - } - - if(valid == false) return; /*Don't load not valid tiles*/ - - ext->act_id.x = x; - ext->act_id.y = y; - - lv_coord_t x_coord = -x * lv_obj_get_width(tileview); - lv_coord_t y_coord = -y * lv_obj_get_height(tileview); - lv_obj_t * scrl = lv_page_get_scrl(tileview); - if(anim) { -#if LV_USE_ANIMATION - lv_coord_t x_act = lv_obj_get_x(scrl); - lv_coord_t y_act = lv_obj_get_y(scrl); - - lv_anim_t a; - a.var = scrl; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_x; - a.path_cb = lv_anim_path_linear; - a.ready_cb = NULL; - a.act_time = 0; - a.time = ext->anim_time; - a.playback = 0; - a.playback_pause = 0; - a.repeat = 0; - a.repeat_pause = 0; - - if(x_coord != x_act) { - a.start = x_act; - a.end = x_coord; - lv_anim_create(&a); - } - - if(y_coord != y_act) { - a.start = y_act; - a.end = y_coord; - a.exec_cb = (lv_anim_exec_xcb_t)lv_obj_set_y; - lv_anim_create(&a); - } -#endif - } else { - lv_obj_set_pos(scrl, x_coord, y_coord); - } - - 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 a style of a tileview. - * @param tileview pointer to tileview object - * @param type which style should be set - * @param style pointer to a style - */ -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; - } -} - -/*===================== - * Getter functions - *====================*/ - -/* - * New object specific "get" functions come here - */ - -/** - * Get style of a tileview. - * @param tileview pointer to tileview object - * @param type which style should be get - * @return style pointer to the style - */ -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; - } - - return style; -} - -/*===================== - * Other functions - *====================*/ - -/* - * New object specific "other" functions come here - */ - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Signal function of the tileview - * @param tileview pointer to a tileview 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_tileview_signal(lv_obj_t * tileview, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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')*/ - } - - return res; -} - -/** - * Signal function of the tileview scrollable - * @param tileview pointer to the scrollable part of the tileview 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_tileview_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void * param) -{ - - lv_res_t res; - - /* Include the ancient signal function */ - res = ancestor_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 * tileview = lv_obj_get_parent(scrl); - const lv_style_t * style_bg = lv_tileview_get_style(tileview, LV_TILEVIEW_STYLE_MAIN); - - /*Apply constraint on moving of the tileview*/ - 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 - } - - 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_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 - } - - 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_obj_set_y(scrl, -ext->act_id.y * lv_obj_get_height(tileview) + style_bg->body.padding.top); - if(ext->drag_hor == 0) - 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 - */ -static void drag_end_handler(lv_obj_t * tileview) -{ - lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); - lv_indev_t * indev = lv_indev_get_act(); - lv_point_t point_act; - lv_indev_get_point(indev, &point_act); - lv_obj_t * scrl = lv_page_get_scrl(tileview); - lv_point_t p; - - p.x = -(scrl->coords.x1 - lv_obj_get_width(tileview) / 2); - p.y = -(scrl->coords.y1 - lv_obj_get_height(tileview) / 2); - - /*From the drag vector (drag throw) predict the end position*/ - if(ext->drag_hor) { - lv_point_t vect; - lv_indev_get_vect(indev, &vect); - lv_coord_t predict = 0; - - while(vect.x != 0) { - predict += vect.x; - vect.x = vect.x * (100 - LV_INDEV_DEF_DRAG_THROW) / 100; - } - - p.x -= predict; - } else if(ext->drag_ver) { - lv_point_t vect; - lv_indev_get_vect(indev, &vect); - lv_coord_t predict = 0; - - while(vect.y != 0) { - predict += vect.y; - vect.y = vect.y * (100 - LV_INDEV_DEF_DRAG_THROW) / 100; - } - - p.y -= predict; - } - - /*Get the index of the tile*/ - p.x = p.x / lv_obj_get_width(tileview); - p.y = p.y / lv_obj_get_height(tileview); - - /*Max +- move*/ - lv_coord_t x_move = p.x - ext->act_id.x; - lv_coord_t y_move = p.y - ext->act_id.y; - if(x_move < -1) x_move = -1; - if(x_move > 1) x_move = 1; - if(y_move < -1) y_move = -1; - if(y_move > 1) y_move = 1; - - /*Set the new tile*/ - lv_tileview_set_tile_act(tileview, ext->act_id.x + x_move, ext->act_id.y + y_move, true); -} - -static bool set_valid_drag_dirs(lv_obj_t * tileview) -{ - - lv_tileview_ext_t * ext = lv_obj_get_ext_attr(tileview); - if(ext->valid_pos == NULL) return false; - - ext->drag_bottom_en = 0; - ext->drag_top_en = 0; - ext->drag_left_en = 0; - ext->drag_right_en = 0; - - uint16_t i; - for(i = 0; i < ext->valid_pos_cnt; i++) { - if(ext->valid_pos[i].x == ext->act_id.x && ext->valid_pos[i].y == ext->act_id.y - 1) ext->drag_top_en = 1; - if(ext->valid_pos[i].x == ext->act_id.x && ext->valid_pos[i].y == ext->act_id.y + 1) ext->drag_bottom_en = 1; - if(ext->valid_pos[i].x == ext->act_id.x - 1 && ext->valid_pos[i].y == ext->act_id.y) ext->drag_left_en = 1; - if(ext->valid_pos[i].x == ext->act_id.x + 1 && ext->valid_pos[i].y == ext->act_id.y) ext->drag_right_en = 1; - } - - return true; -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_tileview.h b/src/libs/lvgl/src/lv_objx/lv_tileview.h deleted file mode 100644 index 60e4098b..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_tileview.h +++ /dev/null @@ -1,178 +0,0 @@ -/** - * @file lv_tileview.h - * - */ - -#ifndef LV_TILEVIEW_H -#define LV_TILEVIEW_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_TILEVIEW != 0 - -#include "../lv_objx/lv_page.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*Data of tileview*/ -typedef struct -{ - lv_page_ext_t page; - /*New data for this type */ - const lv_point_t * valid_pos; - uint16_t valid_pos_cnt; -#if LV_USE_ANIMATION - uint16_t anim_time; -#endif - lv_point_t act_id; - uint8_t drag_top_en : 1; - 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*/ -enum { - LV_TILEVIEW_STYLE_MAIN, -}; -typedef uint8_t lv_tileview_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a tileview objects - * @param par pointer to an object, it will be the parent of the new tileview - * @param copy pointer to a tileview object, if not NULL then the new object will be copied from it - * @return pointer to the created tileview - */ -lv_obj_t * lv_tileview_create(lv_obj_t * par, const lv_obj_t * copy); - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Register an object on the tileview. The register object will able to slide the tileview - * @param tileview pointer to a Tileview object - * @param element pointer to an object - */ -void lv_tileview_add_element(lv_obj_t * tileview, lv_obj_t * element); - -/*===================== - * Setter functions - *====================*/ - -/** - * 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_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); - -/** - * Set 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...) - * @param anim LV_ANIM_ON: set the value with an animation; LV_ANIM_OFF: change the value immediately - */ -void lv_tileview_set_tile_act(lv_obj_t * tileview, lv_coord_t x, lv_coord_t y, lv_anim_enable_t anim); - -/** - * Enable the edge flash effect. (Show an arc when the an edge is reached) - * @param tileview pointer to a Tileview - * @param en true or false to enable/disable end flash - */ -static inline void lv_tileview_set_edge_flash(lv_obj_t * tileview, bool en) -{ - lv_page_set_edge_flash(tileview, en); -} - -/** - * Set the animation time for the Tile view - * @param tileview pointer to a page object - * @param anim_time animation time in milliseconds - */ -static inline void lv_tileview_set_anim_time(lv_obj_t * tileview, uint16_t anim_time) -{ - lv_page_set_anim_time(tileview, anim_time); -} - -/** - * Set a style of a tileview. - * @param tileview pointer to tileview object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_tileview_set_style(lv_obj_t * tileview, lv_tileview_style_t type, const lv_style_t * style); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the scroll propagation property - * @param tileview pointer to a Tileview - * @return true or false - */ -static inline bool lv_tileview_get_edge_flash(lv_obj_t * tileview) -{ - return lv_page_get_edge_flash(tileview); -} - -/** - * Get the animation time for the Tile view - * @param tileview pointer to a page object - * @return animation time in milliseconds - */ -static inline uint16_t lv_tileview_get_anim_time(lv_obj_t * tileview) -{ - return lv_page_get_anim_time(tileview); -} - -/** - * Get style of a tileview. - * @param tileview pointer to tileview object - * @param type which style should be get - * @return style pointer to the style - */ -const lv_style_t * lv_tileview_get_style(const lv_obj_t * tileview, lv_tileview_style_t type); - -/*===================== - * Other functions - *====================*/ - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_TILEVIEW*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_TILEVIEW_H*/ diff --git a/src/libs/lvgl/src/lv_objx/lv_win.c b/src/libs/lvgl/src/lv_objx/lv_win.c deleted file mode 100644 index 689dad37..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_win.c +++ /dev/null @@ -1,618 +0,0 @@ -/** - * @file lv_win.c - * - */ - -/********************* - * INCLUDES - *********************/ -#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 - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static lv_res_t lv_win_signal(lv_obj_t * win, lv_signal_t sign, void * param); -static void lv_win_realign(lv_obj_t * win); - -/********************** - * STATIC VARIABLES - **********************/ -static lv_signal_cb_t ancestor_signal; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Create a window objects - * @param par pointer to an object, it will be the parent of the new window - * @param copy pointer to a window object, if not NULL then the new object will be copied from it - * @return pointer to the created window - */ -lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy) -{ - LV_LOG_TRACE("window create started"); - - /*Create the ancestor object*/ - lv_obj_t * new_win = lv_obj_create(par, copy); - 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_ASSERT_MEM(ext); - if(ext == NULL) return NULL; - - ext->page = NULL; - ext->header = NULL; - ext->title = NULL; - ext->style_btn_rel = &lv_style_btn_rel; - ext->style_btn_pr = &lv_style_btn_pr; - ext->btn_size = (LV_DPI) / 2; - - /*Init the new window object*/ - if(copy == NULL) { - /* Set a size which fits into the parent. - * Don't use `par` directly because if the window is created on a page it is moved to the - * scrollable so the parent has changed */ - lv_coord_t w; - lv_coord_t h; - if(par) { - w = lv_obj_get_width_fit(lv_obj_get_parent(new_win)); - h = lv_obj_get_height_fit(lv_obj_get_parent(new_win)); - } else { - w = lv_disp_get_hor_res(NULL); - h = lv_disp_get_ver_res(NULL); - } - - lv_obj_set_size(new_win, w, h); - - lv_obj_set_style(new_win, &lv_style_pretty); - - ext->page = lv_page_create(new_win, NULL); - lv_obj_set_protect(ext->page, LV_PROTECT_PARENT); - lv_page_set_sb_mode(ext->page, LV_SB_MODE_AUTO); - lv_page_set_style(ext->page, LV_PAGE_STYLE_BG, &lv_style_transp_fit); - - /*Create a holder for the header*/ - ext->header = lv_obj_create(new_win, NULL); - /*Move back the header because it is automatically moved to the scrollable */ - lv_obj_set_protect(ext->header, LV_PROTECT_PARENT); - lv_obj_set_parent(ext->header, new_win); - - /*Create a title on the header*/ - 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) { - lv_win_set_style(new_win, LV_WIN_STYLE_BG, th->style.win.bg); - lv_win_set_style(new_win, LV_WIN_STYLE_SB, th->style.win.sb); - lv_win_set_style(new_win, LV_WIN_STYLE_HEADER, th->style.win.header); - lv_win_set_style(new_win, LV_WIN_STYLE_CONTENT, th->style.win.content); - lv_win_set_style(new_win, LV_WIN_STYLE_BTN_REL, th->style.win.btn.rel); - lv_win_set_style(new_win, LV_WIN_STYLE_BTN_PR, th->style.win.btn.pr); - } else { - lv_win_set_style(new_win, LV_WIN_STYLE_BG, &lv_style_plain); - 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); - } - } - /*Copy an existing object*/ - else { - lv_win_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - /*Create the objects*/ - ext->header = lv_obj_create(new_win, copy_ext->header); - ext->title = lv_label_create(ext->header, copy_ext->title); - ext->page = lv_page_create(new_win, copy_ext->page); - ext->btn_size = copy_ext->btn_size; - - /*Copy the control buttons*/ - lv_obj_t * child; - lv_obj_t * cbtn; - child = lv_obj_get_child_back(copy_ext->header, NULL); - child = lv_obj_get_child_back(copy_ext->header, child); /*Sip the title*/ - while(child != NULL) { - cbtn = lv_btn_create(ext->header, child); - lv_img_create(cbtn, lv_obj_get_child(child, NULL)); - child = lv_obj_get_child_back(copy_ext->header, child); - } - - lv_obj_set_signal_cb(new_win, lv_win_signal); - } - - /*Refresh the style with new signal function*/ - lv_obj_refresh_style(new_win); - - lv_win_realign(new_win); - - LV_LOG_INFO("window created"); - - return new_win; -} - -/** - * Delete all children of the scrl object, without deleting scrl child. - * @param win pointer to an object - */ -void lv_win_clean(lv_obj_t * win) -{ - LV_ASSERT_OBJ(win, LV_OBJX_NAME); - - lv_obj_t * scrl = lv_page_get_scrl(win); - lv_obj_clean(scrl); -} - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Add control button to the header of the window - * @param win pointer to a window object - * @param img_src an image source ('lv_img_t' variable, path to file or a symbol) - * @return pointer to the created button object - */ -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); - lv_btn_set_style(btn, LV_BTN_STYLE_REL, ext->style_btn_rel); - lv_btn_set_style(btn, LV_BTN_STYLE_PR, ext->style_btn_pr); - lv_obj_set_size(btn, ext->btn_size, ext->btn_size); - - lv_obj_t * img = lv_img_create(btn, NULL); - lv_obj_set_click(img, false); - lv_img_set_src(img, img_src); - - lv_win_realign(win); - - return btn; -} - -/*===================== - * Setter functions - *====================*/ - -/** - * Can be assigned to a window control button to close the window - * @param btn pointer to the control button on teh widows header - * @param evet the event type - */ -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); - - lv_obj_del(win); - } -} - -/** - * Set the title of a window - * @param win pointer to a window object - * @param title string of the new title - */ -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); - lv_win_realign(win); -} - -/** - * Set the control button size of a window - * @param win pointer to a window object - * @param size control button size - */ -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; - - ext->btn_size = 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 - * @param layout the layout from 'lv_layout_t' - */ -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); -} - -/** - * Set the scroll bar mode of a window - * @param win pointer to a window object - * @param sb_mode the new scroll bar mode from 'lv_sb_mode_t' - */ -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); -} -/** - * Set focus animation duration on `lv_win_focus()` - * @param win pointer to a window object - * @param anim_time duration of animation [ms] - */ -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); -} - -/** - * Set a style of a window - * @param win pointer to a window object - * @param type which style should be set - * @param style pointer to a style - */ -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) { - case LV_WIN_STYLE_BG: - lv_obj_set_style(win, style); - lv_win_realign(win); - break; - case LV_WIN_STYLE_CONTENT: lv_page_set_style(ext->page, LV_PAGE_STYLE_SCRL, style); break; - case LV_WIN_STYLE_SB: lv_page_set_style(ext->page, LV_PAGE_STYLE_SB, style); break; - case LV_WIN_STYLE_HEADER: - lv_obj_set_style(ext->header, style); - lv_win_realign(win); - break; - case LV_WIN_STYLE_BTN_REL: ext->style_btn_rel = style; break; - case LV_WIN_STYLE_BTN_PR: ext->style_btn_pr = style; break; - } - - /*Refresh the existing buttons*/ - if(type == LV_WIN_STYLE_BTN_REL || type == LV_WIN_STYLE_BTN_PR) { - lv_obj_t * btn; - btn = lv_obj_get_child_back(ext->header, NULL); - btn = lv_obj_get_child_back(ext->header, btn); /*Skip the title*/ - while(btn != NULL) { - if(type == LV_WIN_STYLE_BTN_REL) - lv_btn_set_style(btn, LV_BTN_STYLE_REL, style); - else - lv_btn_set_style(btn, LV_BTN_STYLE_PR, style); - btn = lv_obj_get_child_back(ext->header, btn); - } - } -} - -/** - * Set drag status of a window. If set to 'true' window can be dragged like on a PC. - * @param win pointer to a window object - * @param en whether dragging is enabled - */ -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); - lv_obj_set_drag(win, en); -} - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the title of a window - * @param win pointer to a window object - * @return title string of the window - */ -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); -} - -/** - * Get the content holder object of window (`lv_page`) to allow additional customization - * @param win pointer to a window object - * @return the Page object where the window's content is - */ -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; -} - -/** - * Get the control button size of a window - * @param win pointer to a window object - * @return control button size - */ -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; -} - -/** - * Get the pointer of a widow from one of its control button. - * It is useful in the action of the control buttons where only button is known. - * @param ctrl_btn pointer to a control button of a window - * @return pointer to the window of 'ctrl_btn' - */ -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); - - return win; -} - -/** - * Get the layout of a window - * @param win pointer to a window object - * @return the layout of the window (from 'lv_layout_t') - */ -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); -} - -/** - * Get the scroll bar mode of a window - * @param win pointer to a window object - * @return the scroll bar mode of the window (from 'lv_sb_mode_t') - */ -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); -} - -/** - * Get focus animation duration - * @param win pointer to a window object - * @return duration of animation [ms] - */ -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)); -} - -/** - * Get width of the content area (page scrollable) of the window - * @param win pointer to a window object - * @return the width of the content_bg area - */ -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); - - return lv_obj_get_width(scrl) - style_scrl->body.padding.left - style_scrl->body.padding.right; -} - -/** - * Get a style of a window - * @param win pointer to a button object - * @param type which style window be get - * @return style pointer to a style - */ -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); - - switch(type) { - case LV_WIN_STYLE_BG: style = lv_obj_get_style(win); break; - case LV_WIN_STYLE_CONTENT: style = lv_page_get_style(ext->page, LV_PAGE_STYLE_SCRL); break; - case LV_WIN_STYLE_SB: style = lv_page_get_style(ext->page, LV_PAGE_STYLE_SB); break; - case LV_WIN_STYLE_HEADER: style = lv_obj_get_style(ext->header); break; - case LV_WIN_STYLE_BTN_REL: style = ext->style_btn_rel; break; - case LV_WIN_STYLE_BTN_PR: style = ext->style_btn_pr; break; - default: style = NULL; break; - } - - return style; -} - -/*===================== - * Other functions - *====================*/ - -/** - * Focus on an object. It ensures that the object will be visible in the window. - * @param win pointer to a window object - * @param obj pointer to an object to focus (must be in the window) - * @param anim_en LV_ANIM_ON focus with an animation; LV_ANIM_OFF focus without animation - */ -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); -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Signal function of the window - * @param win pointer to a window 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_win_signal(lv_obj_t * win, lv_signal_t sign, void * param) -{ - lv_res_t res; - - /* 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*/ - lv_obj_t * page = ext->page; - if(page != NULL) { - lv_obj_t * child; - child = lv_obj_get_child(win, NULL); - while(child != NULL) { - if(lv_obj_is_protected(child, LV_PROTECT_PARENT) == false) { - lv_obj_t * tmp = child; - child = lv_obj_get_child(win, child); /*Get the next child before move this*/ - lv_obj_set_parent(tmp, page); - } else { - child = lv_obj_get_child(win, child); - } - } - } - } else if(sign == LV_SIGNAL_STYLE_CHG) { - lv_win_realign(win); - } else if(sign == LV_SIGNAL_CORD_CHG) { - /*If the size is changed refresh the window*/ - if(lv_area_get_width(param) != lv_obj_get_width(win) || lv_area_get_height(param) != lv_obj_get_height(win)) { - lv_win_realign(win); - } - } else if(sign == LV_SIGNAL_CLEANUP) { - ext->header = NULL; /*These objects were children so they are already invalid*/ - ext->page = NULL; - ext->title = NULL; - } else if(sign == LV_SIGNAL_CONTROL) { - /*Forward all the control signals to the page*/ - ext->page->signal_cb(ext->page, sign, param); - } - - return res; -} - -/** - * Realign the building elements of a window - * @param win pointer to window objectker - */ -static void lv_win_realign(lv_obj_t * win) -{ - lv_win_ext_t * ext = lv_obj_get_ext_attr(win); - - if(ext->page == NULL || ext->header == NULL || ext->title == NULL) return; - - const lv_style_t * header_style = lv_win_get_style(win, LV_WIN_STYLE_HEADER); - lv_obj_set_size(ext->header, lv_obj_get_width(win), - ext->btn_size + header_style->body.padding.top + header_style->body.padding.bottom); - - bool first_btn = true; - lv_obj_t * btn; - lv_obj_t * btn_prev = NULL; - /*Refresh the size of all control buttons*/ - btn = lv_obj_get_child_back(ext->header, NULL); - btn = lv_obj_get_child_back(ext->header, btn); /*Skip the title*/ - while(btn != NULL) { - lv_obj_set_size(btn, ext->btn_size, ext->btn_size); - if(first_btn) { - lv_obj_align(btn, ext->header, LV_ALIGN_IN_RIGHT_MID, -header_style->body.padding.right, 0); - first_btn = false; - } else { - lv_obj_align(btn, btn_prev, LV_ALIGN_OUT_LEFT_MID, -header_style->body.padding.inner, 0); - } - btn_prev = btn; - btn = lv_obj_get_child_back(ext->header, btn); - } - - const lv_style_t * style_header = lv_win_get_style(win, LV_WIN_STYLE_HEADER); - lv_obj_align(ext->title, NULL, LV_ALIGN_IN_LEFT_MID, style_header->body.padding.left, 0); - - lv_obj_set_pos(ext->header, 0, 0); - - lv_obj_set_size(ext->page, lv_obj_get_width(win), lv_obj_get_height(win) - lv_obj_get_height(ext->header)); - lv_obj_align(ext->page, ext->header, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); -} - -#endif diff --git a/src/libs/lvgl/src/lv_objx/lv_win.h b/src/libs/lvgl/src/lv_objx/lv_win.h deleted file mode 100644 index 28560cf6..00000000 --- a/src/libs/lvgl/src/lv_objx/lv_win.h +++ /dev/null @@ -1,302 +0,0 @@ -/** - * @file lv_win.h - * - */ - -#ifndef LV_WIN_H -#define LV_WIN_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_WIN != 0 - -/*Testing of dependencies*/ -#if LV_USE_BTN == 0 -#error "lv_win: lv_btn is required. Enable it in lv_conf.h (LV_USE_BTN 1) " -#endif - -#if LV_USE_LABEL == 0 -#error "lv_win: lv_label is required. Enable it in lv_conf.h (LV_USE_LABEL 1) " -#endif - -#if LV_USE_IMG == 0 -#error "lv_win: lv_img is required. Enable it in lv_conf.h (LV_USE_IMG 1) " -#endif - -#if LV_USE_PAGE == 0 -#error "lv_win: lv_page is required. Enable it in lv_conf.h (LV_USE_PAGE 1) " -#endif - -#include "../lv_core/lv_obj.h" -#include "lv_cont.h" -#include "lv_btn.h" -#include "lv_label.h" -#include "lv_img.h" -#include "lv_page.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/*Data of window*/ -typedef struct -{ - /*Ext. of ancestor*/ - /*New data for this type */ - lv_obj_t * page; /*Pointer to a page which holds the content*/ - lv_obj_t * header; /*Pointer to the header container of the window*/ - lv_obj_t * title; /*Pointer to the title label of the window*/ - const lv_style_t * style_btn_rel; /*Control button releases style*/ - const lv_style_t * style_btn_pr; /*Control button pressed style*/ - lv_coord_t btn_size; /*Size of the control buttons (square)*/ -} lv_win_ext_t; - -/** Window styles. */ -enum { - LV_WIN_STYLE_BG, /**< Window object background style. */ - LV_WIN_STYLE_CONTENT, /**< Window content style. */ - LV_WIN_STYLE_SB, /**< Window scrollbar style. */ - LV_WIN_STYLE_HEADER, /**< Window titlebar background style. */ - LV_WIN_STYLE_BTN_REL, /**< Same meaning as ordinary button styles. */ - LV_WIN_STYLE_BTN_PR, -}; -typedef uint8_t lv_win_style_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Create a window objects - * @param par pointer to an object, it will be the parent of the new window - * @param copy pointer to a window object, if not NULL then the new object will be copied from it - * @return pointer to the created window - */ -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 win pointer to an object - */ -void lv_win_clean(lv_obj_t * win); - -/*====================== - * Add/remove functions - *=====================*/ - -/** - * Add control button to the header of the window - * @param win pointer to a window object - * @param img_src an image source ('lv_img_t' variable, path to file or a symbol) - * @return pointer to the created button object - */ -lv_obj_t * lv_win_add_btn(lv_obj_t * win, const void * img_src); - -/*===================== - * Setter functions - *====================*/ - -/** - * Can be assigned to a window control button to close the window - * @param btn pointer to the control button on teh widows header - * @param evet the event type - */ -void lv_win_close_event_cb(lv_obj_t * btn, lv_event_t event); - -/** - * Set the title of a window - * @param win pointer to a window object - * @param title string of the new title - */ -void lv_win_set_title(lv_obj_t * win, const char * title); - -/** - * Set the control button size of a window - * @param win pointer to a window object - * @return control button size - */ -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 - * @param layout the layout from 'lv_layout_t' - */ -void lv_win_set_layout(lv_obj_t * win, lv_layout_t layout); - -/** - * Set the scroll bar mode of a window - * @param win pointer to a window object - * @param sb_mode the new scroll bar mode from 'lv_sb_mode_t' - */ -void lv_win_set_sb_mode(lv_obj_t * win, lv_sb_mode_t sb_mode); - -/** - * Set focus animation duration on `lv_win_focus()` - * @param win pointer to a window object - * @param anim_time duration of animation [ms] - */ -void lv_win_set_anim_time(lv_obj_t * win, uint16_t anim_time); - -/** - * Set a style of a window - * @param win pointer to a window object - * @param type which style should be set - * @param style pointer to a style - */ -void lv_win_set_style(lv_obj_t * win, lv_win_style_t type, const lv_style_t * style); - -/** - * Set drag status of a window. If set to 'true' window can be dragged like on a PC. - * @param win pointer to a window object - * @param en whether dragging is enabled - */ -void lv_win_set_drag(lv_obj_t * win, bool en); - -/*===================== - * Getter functions - *====================*/ - -/** - * Get the title of a window - * @param win pointer to a window object - * @return title string of the window - */ -const char * lv_win_get_title(const lv_obj_t * win); - -/** - * Get the content holder object of window (`lv_page`) to allow additional customization - * @param win pointer to a window object - * @return the Page object where the window's content is - */ -lv_obj_t * lv_win_get_content(const lv_obj_t * win); - -/** - * Get the control button size of a window - * @param win pointer to a window object - * @return control button size - */ -lv_coord_t lv_win_get_btn_size(const lv_obj_t * win); - -/** - * Get the pointer of a widow from one of its control button. - * It is useful in the action of the control buttons where only button is known. - * @param ctrl_btn pointer to a control button of a window - * @return pointer to the window of 'ctrl_btn' - */ -lv_obj_t * lv_win_get_from_btn(const lv_obj_t * ctrl_btn); - -/** - * Get the layout of a window - * @param win pointer to a window object - * @return the layout of the window (from 'lv_layout_t') - */ -lv_layout_t lv_win_get_layout(lv_obj_t * win); - -/** - * Get the scroll bar mode of a window - * @param win pointer to a window object - * @return the scroll bar mode of the window (from 'lv_sb_mode_t') - */ -lv_sb_mode_t lv_win_get_sb_mode(lv_obj_t * win); - -/** - * Get focus animation duration - * @param win pointer to a window object - * @return duration of animation [ms] - */ -uint16_t lv_win_get_anim_time(const lv_obj_t * win); - -/** - * Get width of the content area (page scrollable) of the window - * @param win pointer to a window object - * @return the width of the content area - */ -lv_coord_t lv_win_get_width(lv_obj_t * win); - -/** - * Get a style of a window - * @param win pointer to a button object - * @param type which style window be get - * @return style pointer to a style - */ -const lv_style_t * lv_win_get_style(const lv_obj_t * win, lv_win_style_t type); - -/** - * Get drag status of a window. If set to 'true' window can be dragged like on a PC. - * @param win pointer to a window object - * @return whether window is draggable - */ -static inline bool lv_win_get_drag(const lv_obj_t * win) -{ - return lv_obj_get_drag(win); -} - -/*===================== - * Other functions - *====================*/ - -/** - * Focus on an object. It ensures that the object will be visible in the window. - * @param win pointer to a window object - * @param obj pointer to an object to focus (must be in the window) - * @param anim_en LV_ANIM_ON focus with an animation; LV_ANIM_OFF focus without animation - */ -void lv_win_focus(lv_obj_t * win, lv_obj_t * obj, lv_anim_enable_t anim_en); - -/** - * Scroll the window horizontally - * @param win pointer to a window object - * @param dist the distance to scroll (< 0: scroll right; > 0 scroll left) - */ -static inline void lv_win_scroll_hor(lv_obj_t * win, lv_coord_t dist) -{ - lv_win_ext_t * ext = (lv_win_ext_t *)lv_obj_get_ext_attr(win); - lv_page_scroll_hor(ext->page, dist); -} -/** - * Scroll the window vertically - * @param win pointer to a window object - * @param dist the distance to scroll (< 0: scroll down; > 0 scroll up) - */ -static inline void lv_win_scroll_ver(lv_obj_t * win, lv_coord_t dist) -{ - lv_win_ext_t * ext = (lv_win_ext_t *)lv_obj_get_ext_attr(win); - lv_page_scroll_ver(ext->page, dist); -} - -/********************** - * MACROS - **********************/ - -#endif /*LV_USE_WIN*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_WIN_H*/ diff --git a/src/libs/lvgl/src/lv_themes/lv_theme.c b/src/libs/lvgl/src/lv_themes/lv_theme.c deleted file mode 100644 index 21cc38c2..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme.c +++ /dev/null @@ -1,124 +0,0 @@ -/** - * @file lv_theme.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_theme.h" -#include "../lv_core/lv_obj.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -#if LV_THEME_LIVE_UPDATE == 0 -static lv_theme_t * current_theme; -#else -/* If live update is used then a big `lv_style_t` array is used to store the real styles of the - * theme not only pointers. On `lv_theme_set_current` the styles of the theme are copied to this - * array. The pointers in `current_theme` are initialized to point to the styles in the array. This - * way the theme styles will always point to the same memory address even after theme is change. - * (The pointers in the theme points to the styles declared by the theme itself) */ - -/* Store the styles in this array. */ -static lv_style_t th_styles[LV_THEME_STYLE_COUNT]; -static bool inited = false; -static lv_theme_t current_theme; -#endif - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Set a theme for the system. - * From now, all the created objects will use styles from this theme by default - * @param th pointer to theme (return value of: 'lv_theme_init_xxx()') - */ -void lv_theme_set_current(lv_theme_t * th) -{ -#if LV_THEME_LIVE_UPDATE == 0 - current_theme = th; - -#if LV_USE_GROUP - /*Copy group style modification callback functions*/ - memcpy(¤t_theme->group, &th->group, sizeof(th->group)); -#endif - - /*Let the object know their style might change*/ - lv_obj_report_style_mod(NULL); - -#else - uint32_t style_num = sizeof(th->style) / sizeof(lv_style_t *); /*Number of styles in a theme*/ - - if(!inited) { - /*Initialize the style pointers `current_theme` to point to the `th_styles` style array */ - uint16_t i; - lv_style_t ** cur_th_style_p = (lv_style_t **)¤t_theme.style; - for(i = 0; i < style_num; i++) { - uintptr_t adr = (uintptr_t)&th_styles[i]; - memcpy(&cur_th_style_p[i], &adr, sizeof(lv_style_t *)); - } - inited = true; - } - - /*Copy the styles pointed by the new theme to the `th_styles` style array*/ - uint16_t i; - lv_style_t ** th_style = (lv_style_t **)&th->style; - for(i = 0; i < style_num; i++) { - uintptr_t s = (uintptr_t)th_style[i]; - if(s) memcpy(&th_styles[i], (void *)s, sizeof(lv_style_t)); - } - -#if LV_USE_GROUP - /*Copy group style modification callback functions*/ - memcpy(¤t_theme.group, &th->group, sizeof(th->group)); -#endif - - /*Let the object know their style might change*/ - lv_obj_report_style_mod(NULL); - -#endif - -#if LV_USE_GROUP - lv_group_report_style_mod(NULL); -#endif -} - -/** - * Get the current system theme. - * @return pointer to the current system theme. NULL if not set. - */ -lv_theme_t * lv_theme_get_current(void) -{ -#if LV_THEME_LIVE_UPDATE == 0 - return current_theme; -#else - if(!inited) - return NULL; - else - return ¤t_theme; -#endif -} - -/********************** - * STATIC FUNCTIONS - **********************/ diff --git a/src/libs/lvgl/src/lv_themes/lv_theme.h b/src/libs/lvgl/src/lv_themes/lv_theme.h deleted file mode 100644 index 28b532c6..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme.h +++ /dev/null @@ -1,382 +0,0 @@ -/** - *@file lv_themes.h - * - */ - -#ifndef LV_THEMES_H -#define LV_THEMES_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../../lv_conf.h" -#endif - -#include "../lv_core/lv_style.h" -#include "../lv_core/lv_group.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/** - * A theme in LittlevGL consists of many styles bound together. - * - * There is a style for each object type, as well as a generic style for - * backgrounds and panels. - */ -typedef struct -{ - struct - { - lv_style_t * scr; - lv_style_t * bg; - lv_style_t * panel; - -#if LV_USE_CONT != 0 - lv_style_t * cont; -#endif - -#if LV_USE_BTN != 0 - struct - { - lv_style_t * rel; - lv_style_t * pr; - lv_style_t * tgl_rel; - lv_style_t * tgl_pr; - lv_style_t * ina; - } btn; -#endif - -#if LV_USE_IMGBTN != 0 - struct - { - lv_style_t * rel; - lv_style_t * pr; - lv_style_t * tgl_rel; - lv_style_t * tgl_pr; - lv_style_t * ina; - } imgbtn; -#endif - -#if LV_USE_LABEL != 0 - struct - { - lv_style_t * prim; - lv_style_t * sec; - lv_style_t * hint; - } label; -#endif - -#if LV_USE_IMG != 0 - struct - { - lv_style_t * light; - lv_style_t * dark; - } img; -#endif - -#if LV_USE_LINE != 0 - struct - { - lv_style_t * decor; - } line; -#endif - -#if LV_USE_LED != 0 - lv_style_t * led; -#endif - -#if LV_USE_BAR != 0 - struct - { - lv_style_t * bg; - lv_style_t * indic; - } bar; -#endif - -#if LV_USE_SLIDER != 0 - struct - { - lv_style_t * bg; - lv_style_t * indic; - lv_style_t * knob; - } slider; -#endif - -#if LV_USE_LMETER != 0 - lv_style_t * lmeter; -#endif - -#if LV_USE_GAUGE != 0 - lv_style_t * gauge; -#endif - -#if LV_USE_ARC != 0 - lv_style_t * arc; -#endif - -#if LV_USE_PRELOAD != 0 - lv_style_t * preload; -#endif - -#if LV_USE_SW != 0 - struct - { - lv_style_t * bg; - lv_style_t * indic; - lv_style_t * knob_off; - lv_style_t * knob_on; - } sw; -#endif - -#if LV_USE_CHART != 0 - lv_style_t * chart; -#endif - -#if LV_USE_CALENDAR != 0 - struct - { - lv_style_t * bg; - lv_style_t * header; - lv_style_t * header_pr; - lv_style_t * day_names; - lv_style_t * highlighted_days; - lv_style_t * inactive_days; - lv_style_t * week_box; - lv_style_t * today_box; - } calendar; -#endif - -#if LV_USE_CB != 0 - struct - { - lv_style_t * bg; - struct - { - lv_style_t * rel; - lv_style_t * pr; - lv_style_t * tgl_rel; - lv_style_t * tgl_pr; - lv_style_t * ina; - } box; - } cb; -#endif - -#if LV_USE_BTNM != 0 - struct - { - lv_style_t * bg; - struct - { - lv_style_t * rel; - lv_style_t * pr; - lv_style_t * tgl_rel; - lv_style_t * tgl_pr; - lv_style_t * ina; - } btn; - } btnm; -#endif - -#if LV_USE_KB != 0 - struct - { - lv_style_t * bg; - struct - { - lv_style_t * rel; - lv_style_t * pr; - lv_style_t * tgl_rel; - lv_style_t * tgl_pr; - lv_style_t * ina; - } btn; - } kb; -#endif - -#if LV_USE_MBOX != 0 - struct - { - lv_style_t * bg; - struct - { - lv_style_t * bg; - lv_style_t * rel; - lv_style_t * pr; - } btn; - } mbox; -#endif - -#if LV_USE_PAGE != 0 - struct - { - lv_style_t * bg; - lv_style_t * scrl; - lv_style_t * sb; - } page; -#endif - -#if LV_USE_TA != 0 - struct - { - lv_style_t * area; - lv_style_t * oneline; - lv_style_t * cursor; - lv_style_t * sb; - } ta; -#endif - -#if LV_USE_SPINBOX != 0 - struct - { - lv_style_t * bg; - lv_style_t * cursor; - lv_style_t * sb; - } spinbox; -#endif - -#if LV_USE_LIST - struct - { - lv_style_t * bg; - lv_style_t * scrl; - lv_style_t * sb; - struct - { - lv_style_t * rel; - lv_style_t * pr; - lv_style_t * tgl_rel; - lv_style_t * tgl_pr; - lv_style_t * ina; - } btn; - } list; -#endif - -#if LV_USE_DDLIST != 0 - struct - { - lv_style_t * bg; - lv_style_t * sel; - lv_style_t * sb; - } ddlist; -#endif - -#if LV_USE_ROLLER != 0 - struct - { - lv_style_t * bg; - lv_style_t * sel; - } roller; -#endif - -#if LV_USE_TABVIEW != 0 - struct - { - lv_style_t * bg; - lv_style_t * indic; - struct - { - lv_style_t * bg; - lv_style_t * rel; - lv_style_t * pr; - lv_style_t * tgl_rel; - lv_style_t * tgl_pr; - } btn; - } tabview; -#endif - -#if LV_USE_TILEVIEW != 0 - struct - { - lv_style_t * bg; - lv_style_t * scrl; - lv_style_t * sb; - } tileview; -#endif - -#if LV_USE_TABLE != 0 - struct - { - lv_style_t * bg; - lv_style_t * cell; - } table; -#endif - -#if LV_USE_WIN != 0 - struct - { - lv_style_t * bg; - lv_style_t * sb; - lv_style_t * header; - lv_style_t * content; - struct - { - lv_style_t * rel; - lv_style_t * pr; - } btn; - } win; -#endif - } style; - -#if LV_USE_GROUP - struct - { - /* The `x` in the names inidicates that inconsistence becasue - * the group related function are stored in the theme.*/ - lv_group_style_mod_cb_t style_mod_xcb; - lv_group_style_mod_cb_t style_mod_edit_xcb; - } group; -#endif -} lv_theme_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Set a theme for the system. - * From now, all the created objects will use styles from this theme by default - * @param th pointer to theme (return value of: 'lv_theme_init_xxx()') - */ -void lv_theme_set_current(lv_theme_t * th); - -/** - * Get the current system theme. - * @return pointer to the current system theme. NULL if not set. - */ -lv_theme_t * lv_theme_get_current(void); - -/********************** - * MACROS - **********************/ - -/* Returns number of styles within the `lv_theme_t` structure. */ -#define LV_THEME_STYLE_COUNT (sizeof(((lv_theme_t *)0)->style) / sizeof(lv_style_t *)) - -/********************** - * POST INCLUDE - *********************/ -#include "lv_theme_templ.h" -#include "lv_theme_default.h" -#include "lv_theme_alien.h" -#include "lv_theme_night.h" -#include "lv_theme_zen.h" -#include "lv_theme_mono.h" -#include "lv_theme_nemo.h" -#include "lv_theme_material.h" - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_THEMES_H*/ diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_alien.c b/src/libs/lvgl/src/lv_themes/lv_theme_alien.c deleted file mode 100644 index 987a3631..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_alien.c +++ /dev/null @@ -1,958 +0,0 @@ -/** - * @file lv_theme_alien.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_theme.h" - -#if LV_USE_THEME_ALIEN - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -static uint16_t _hue; -static lv_font_t * _font; - -static lv_theme_t theme; -static lv_style_t def; -static lv_style_t bg; -static lv_style_t scr; -static lv_style_t panel; /*General fancy background (e.g. to chart or ta)*/ -static lv_style_t sb; -static lv_style_t btn_rel, btn_pr, btn_trel, btn_tpr, btn_ina; - -#if LV_USE_BAR -static lv_style_t bar_bg, bar_indic; -#endif - -#if LV_USE_SLIDER -static lv_style_t slider_knob; -#endif - -#if LV_USE_LMETER -static lv_style_t lmeter_bg; -#endif - -#if LV_USE_DDLIST -static lv_style_t ddlist_bg, ddlist_sel; -#endif - -#if LV_USE_BTNM -static lv_style_t btnm_bg, btnm_rel, btnm_pr, btnm_trel, btnm_ina; -#endif - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void basic_init(void) -{ - /*Default*/ - lv_style_copy(&def, &lv_style_plain); - def.body.opa = LV_OPA_COVER; - def.glass = 0; - - def.body.main_color = lv_color_hex3(0x222); - def.body.grad_color = lv_color_hex3(0x222); - def.body.radius = 0; - def.body.padding.left = LV_DPI / 8; - def.body.padding.right = LV_DPI / 8; - def.body.padding.top = LV_DPI / 8; - def.body.padding.bottom = LV_DPI / 8; - def.body.padding.inner = LV_DPI / 8; - def.body.border.color = LV_COLOR_SILVER; - def.body.border.width = 1; - 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; - def.text.letter_space = 1; - def.text.line_space = 2; - - def.image.color = lv_color_hex3(0xDDD); - def.image.intense = LV_OPA_TRANSP; - - def.line.color = lv_color_hex3(0xDDD); - def.line.width = 1; - - /*Background*/ - lv_style_copy(&bg, &def); - bg.body.main_color = lv_color_hex3(0x333); - bg.body.grad_color = lv_color_hex3(0x333); - bg.body.border.width = 2; - bg.body.border.color = lv_color_hex3(0x666); - bg.body.shadow.color = LV_COLOR_SILVER; - - lv_style_copy(&scr, &bg); - scr.body.padding.bottom = 0; - scr.body.padding.top = 0; - scr.body.padding.left = 0; - scr.body.padding.right = 0; - - /*Panel*/ - lv_style_copy(&panel, &def); - panel.body.radius = LV_DPI / 10; - panel.body.main_color = lv_color_hex3(0x666); - panel.body.grad_color = lv_color_hex3(0x666); - panel.body.border.color = lv_color_hex3(0xccc); - panel.body.border.width = 2; - panel.body.border.opa = LV_OPA_60; - panel.text.color = lv_color_hsv_to_rgb(_hue, 8, 96); - panel.image.color = lv_color_hsv_to_rgb(_hue, 8, 96); - panel.line.color = lv_color_hsv_to_rgb(_hue, 20, 70); - - /*Scrollbar*/ - lv_style_copy(&sb, &def); - sb.body.opa = LV_OPA_50; - sb.body.radius = LV_RADIUS_CIRCLE; - sb.body.border.color = LV_COLOR_SILVER; - sb.body.border.opa = LV_OPA_40; - sb.body.border.width = 1; - sb.body.main_color = lv_color_hsv_to_rgb(_hue, 33, 92); - sb.body.grad_color = lv_color_hsv_to_rgb(_hue, 33, 92); - sb.body.padding.left = 1; - sb.body.padding.right = 1; - sb.body.padding.top = 1; - sb.body.padding.bottom = 1; - sb.body.padding.inner = LV_DPI / 15; /*Scrollbar width*/ - - theme.style.bg = &bg; - theme.style.scr = &scr; - theme.style.panel = &panel; -} - -static void cont_init(void) -{ -#if LV_USE_CONT != 0 - theme.style.cont = &panel; -#endif -} - -static void btn_init(void) -{ -#if LV_USE_BTN != 0 - lv_style_copy(&btn_rel, &def); - btn_rel.glass = 0; - btn_rel.body.opa = LV_OPA_TRANSP; - btn_rel.body.radius = LV_RADIUS_CIRCLE; - btn_rel.body.border.width = 2; - btn_rel.body.border.color = lv_color_hsv_to_rgb(_hue, 70, 90); - btn_rel.body.border.opa = LV_OPA_80; - btn_rel.body.padding.left = LV_DPI / 4; - btn_rel.body.padding.right = LV_DPI / 4; - btn_rel.body.padding.top = LV_DPI / 6; - btn_rel.body.padding.bottom = LV_DPI / 6; - btn_rel.body.padding.inner = LV_DPI / 10; - btn_rel.text.color = lv_color_hsv_to_rgb(_hue, 8, 96); - btn_rel.text.font = _font; - btn_rel.image.color = lv_color_hsv_to_rgb(_hue, 8, 96); - - lv_style_copy(&btn_pr, &btn_rel); - btn_pr.body.opa = LV_OPA_COVER; - btn_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 50, 50); - btn_pr.body.grad_color = lv_color_hsv_to_rgb(_hue, 50, 50); - btn_pr.body.border.opa = LV_OPA_60; - btn_pr.text.font = _font; - btn_pr.text.color = lv_color_hsv_to_rgb(_hue, 10, 100); - btn_pr.image.color = lv_color_hsv_to_rgb(_hue, 10, 100); - - lv_style_copy(&btn_trel, &btn_pr); - btn_trel.body.opa = LV_OPA_COVER; - btn_trel.body.main_color = lv_color_hsv_to_rgb(_hue, 50, 60); - btn_trel.body.grad_color = lv_color_hsv_to_rgb(_hue, 50, 60); - btn_trel.body.border.opa = LV_OPA_60; - btn_trel.body.border.color = lv_color_hsv_to_rgb(_hue, 80, 90); - btn_trel.text.font = _font; - btn_trel.text.color = lv_color_hsv_to_rgb(_hue, 0, 100); - btn_trel.image.color = lv_color_hsv_to_rgb(_hue, 0, 100); - - lv_style_copy(&btn_tpr, &btn_trel); - btn_tpr.body.opa = LV_OPA_COVER; - btn_tpr.body.main_color = lv_color_hsv_to_rgb(_hue, 50, 50); - btn_tpr.body.grad_color = lv_color_hsv_to_rgb(_hue, 50, 50); - btn_tpr.body.border.opa = LV_OPA_60; - btn_tpr.body.border.color = lv_color_hsv_to_rgb(_hue, 80, 70); - btn_tpr.text.font = _font; - btn_tpr.text.color = lv_color_hsv_to_rgb(_hue, 10, 90); - btn_tpr.image.color = lv_color_hsv_to_rgb(_hue, 10, 90); - - lv_style_copy(&btn_ina, &btn_rel); - btn_ina.body.border.opa = LV_OPA_60; - btn_ina.body.border.color = lv_color_hsv_to_rgb(_hue, 10, 50); - btn_ina.text.font = _font; - btn_ina.text.color = lv_color_hsv_to_rgb(_hue, 10, 90); - - theme.style.btn.rel = &btn_rel; - theme.style.btn.pr = &btn_pr; - theme.style.btn.tgl_rel = &btn_trel; - theme.style.btn.tgl_pr = &btn_tpr; - theme.style.btn.ina = &btn_ina; -#endif -} - -static void label_init(void) -{ -#if LV_USE_LABEL != 0 - static lv_style_t label_prim, label_sec, label_hint; - - lv_style_copy(&label_prim, &def); - label_prim.text.font = _font; - label_prim.text.color = lv_color_hsv_to_rgb(_hue, 80, 96); - - lv_style_copy(&label_sec, &label_prim); - label_sec.text.color = lv_color_hsv_to_rgb(_hue, 40, 85); - - lv_style_copy(&label_hint, &label_prim); - label_hint.text.color = lv_color_hsv_to_rgb(_hue, 20, 70); - - theme.style.label.prim = &label_prim; - theme.style.label.sec = &label_sec; - theme.style.label.hint = &label_hint; -#endif -} - -static void bar_init(void) -{ -#if LV_USE_BAR - lv_style_copy(&bar_bg, &def); - bar_bg.body.opa = LV_OPA_30; - bar_bg.body.radius = LV_RADIUS_CIRCLE; - bar_bg.body.main_color = LV_COLOR_WHITE; - bar_bg.body.grad_color = LV_COLOR_SILVER; - bar_bg.body.border.width = 2; - bar_bg.body.border.color = LV_COLOR_SILVER; - bar_bg.body.border.opa = LV_OPA_20; - bar_bg.body.padding.left = 0; - bar_bg.body.padding.right = 0; - bar_bg.body.padding.top = LV_DPI / 10; - bar_bg.body.padding.bottom = LV_DPI / 10; - bar_bg.body.padding.inner = 0; - - lv_style_copy(&bar_indic, &def); - bar_indic.body.radius = LV_RADIUS_CIRCLE; - bar_indic.body.border.width = 2; - bar_indic.body.border.color = LV_COLOR_SILVER; - bar_indic.body.border.opa = LV_OPA_70; - bar_indic.body.padding.left = 0; - bar_indic.body.padding.right = 0; - bar_indic.body.padding.top = 0; - bar_indic.body.padding.bottom = 0; - bar_indic.body.shadow.width = LV_DPI / 20; - bar_indic.body.shadow.color = lv_color_hsv_to_rgb(_hue, 20, 90); - bar_indic.body.main_color = lv_color_hsv_to_rgb(_hue, 40, 80); - bar_indic.body.grad_color = lv_color_hsv_to_rgb(_hue, 40, 80); - - theme.style.bar.bg = &bar_bg; - theme.style.bar.indic = &bar_indic; -#endif -} - -static void img_init(void) -{ -#if LV_USE_IMG != 0 - static lv_style_t img_light, img_dark; - lv_style_copy(&img_light, &def); - img_light.image.color = lv_color_hsv_to_rgb(_hue, 15, 85); - img_light.image.intense = LV_OPA_80; - - lv_style_copy(&img_dark, &def); - img_light.image.color = lv_color_hsv_to_rgb(_hue, 85, 65); - img_light.image.intense = LV_OPA_80; - - theme.style.img.light = &img_light; - theme.style.img.dark = &img_dark; -#endif -} - -static void line_init(void) -{ -#if LV_USE_LINE != 0 - static lv_style_t line_decor; - lv_style_copy(&line_decor, &def); - line_decor.line.color = lv_color_hsv_to_rgb(_hue, 50, 50); - line_decor.line.width = 1; - - theme.style.line.decor = &line_decor; -#endif -} - -static void led_init(void) -{ -#if LV_USE_LED != 0 - static lv_style_t led; - lv_style_copy(&led, &lv_style_pretty_color); - led.body.shadow.width = LV_DPI / 10; - led.body.radius = LV_RADIUS_CIRCLE; - led.body.border.width = LV_DPI / 30; - led.body.border.opa = LV_OPA_30; - led.body.main_color = lv_color_hsv_to_rgb(_hue, 100, 100); - led.body.grad_color = lv_color_hsv_to_rgb(_hue, 100, 40); - led.body.border.color = lv_color_hsv_to_rgb(_hue, 60, 60); - led.body.shadow.color = lv_color_hsv_to_rgb(_hue, 100, 100); - - theme.style.led = &led; -#endif -} - -static void slider_init(void) -{ -#if LV_USE_SLIDER != 0 - lv_style_copy(&slider_knob, &def); - slider_knob.body.opa = LV_OPA_60; - slider_knob.body.radius = LV_RADIUS_CIRCLE; - slider_knob.body.main_color = LV_COLOR_WHITE; - slider_knob.body.grad_color = LV_COLOR_SILVER; - slider_knob.body.border.width = 1; - slider_knob.body.border.color = LV_COLOR_GRAY; - slider_knob.body.border.opa = LV_OPA_50; - - theme.style.slider.bg = &bar_bg; - theme.style.slider.indic = &bar_indic; - theme.style.slider.knob = &slider_knob; -#endif -} - -static void sw_init(void) -{ -#if LV_USE_SW != 0 - static lv_style_t sw_bg, sw_indic, sw_knob; - lv_style_copy(&sw_bg, &bar_bg); - sw_bg.body.opa = LV_OPA_COVER; - sw_bg.body.padding.left = -2; - sw_bg.body.padding.right = -2; - sw_bg.body.padding.top = -2; - sw_bg.body.padding.bottom = -2; - sw_bg.body.main_color = lv_color_hex3(0x666); - sw_bg.body.grad_color = lv_color_hex3(0x999); - sw_bg.body.border.width = 2; - sw_bg.body.border.opa = LV_OPA_50; - - lv_style_copy(&sw_indic, &bar_indic); - sw_indic.body.shadow.width = LV_DPI / 20; - sw_indic.body.padding.left = 0; - sw_indic.body.padding.right = 0; - sw_indic.body.padding.top = 0; - sw_indic.body.padding.bottom = 0; - - lv_style_copy(&sw_knob, &slider_knob); - sw_knob.body.opa = LV_OPA_80; - - theme.style.sw.bg = &sw_bg; - theme.style.sw.indic = &sw_indic; - theme.style.sw.knob_off = &sw_knob; - theme.style.sw.knob_on = &sw_knob; -#endif -} - -static void lmeter_init(void) -{ -#if LV_USE_LMETER != 0 - lv_style_copy(&lmeter_bg, &def); - lmeter_bg.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 70); - lmeter_bg.body.grad_color = lv_color_hsv_to_rgb(_hue, 80, 80); - lmeter_bg.body.padding.left = LV_DPI / 8; /*Scale line length*/ - lmeter_bg.body.padding.right = LV_DPI / 8; /*Scale line length*/ - lmeter_bg.line.color = lv_color_hex3(0x222); - lmeter_bg.line.width = 2; - - theme.style.lmeter = &lmeter_bg; - -#endif -} - -static void gauge_init(void) -{ -#if LV_USE_GAUGE != 0 - static lv_style_t gauge_bg; - lv_style_copy(&gauge_bg, &def); - gauge_bg.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 70); - gauge_bg.body.grad_color = gauge_bg.body.main_color; - gauge_bg.body.padding.left = LV_DPI / 16; /*Scale line length*/ - gauge_bg.body.padding.right = LV_DPI / 16; /*Scale line length*/ - gauge_bg.body.padding.top = LV_DPI / 10; /*Needle center size*/ - gauge_bg.body.padding.bottom = LV_DPI / 10; /*Needle center size*/ - gauge_bg.body.padding.inner = LV_DPI / 12; /*Label - scale distance*/ - gauge_bg.body.border.color = lv_color_hex3(0x777); - gauge_bg.line.color = lv_color_hsv_to_rgb(_hue, 80, 75); - gauge_bg.line.width = 2; - gauge_bg.text.color = lv_color_hsv_to_rgb(_hue, 10, 90); - gauge_bg.text.font = _font; - - theme.style.gauge = &gauge_bg; -#endif -} - -static void arc_init(void) -{ -#if LV_USE_ARC != 0 - - static lv_style_t arc; - lv_style_copy(&arc, &def); - arc.line.width = 8; - arc.line.color = lv_color_hsv_to_rgb(_hue, 70, 90); - arc.line.rounded = 1; - - /*For preloader*/ - arc.body.border.width = 2; - arc.body.border.color = lv_color_hex3(0x555); - arc.body.padding.left = 3; - arc.body.padding.right = 3; - arc.body.padding.top = 3; - arc.body.padding.bottom = 3; - - theme.style.arc = &arc; -#endif -} - -static void preload_init(void) -{ -#if LV_USE_PRELOAD != 0 - - theme.style.preload = theme.style.arc; -#endif -} - -static void chart_init(void) -{ -#if LV_USE_CHART - theme.style.chart = &panel; -#endif -} - -static void calendar_init(void) -{ -#if LV_USE_CALENDAR - static lv_style_t header; - static lv_style_t color_text; - static lv_style_t gray_text; - static lv_style_t today_box; - - lv_style_copy(&header, &def); - header.body.radius = 0; - header.body.padding.left = LV_DPI / 12; - header.body.padding.right = LV_DPI / 12; - header.body.padding.top = LV_DPI / 14; - header.body.padding.bottom = LV_DPI / 14; - header.body.main_color = lv_color_hsv_to_rgb(_hue, 30, 60); - header.body.grad_color = header.body.main_color; - 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.text.color = lv_color_hsv_to_rgb(_hue, 5, 100); - - lv_style_copy(&today_box, &header); - today_box.body.main_color = lv_color_hsv_to_rgb(_hue, 40, 70); - today_box.body.grad_color = today_box.body.main_color; - today_box.body.opa = LV_OPA_TRANSP; - - lv_style_copy(&color_text, &def); - color_text.text.color = lv_color_hsv_to_rgb(_hue, 30, 80); - - lv_style_copy(&gray_text, &def); - gray_text.text.color = lv_color_hsv_to_rgb(_hue, 10, 65); - - theme.style.calendar.bg = &panel; - theme.style.calendar.header = &header; - theme.style.calendar.week_box = &header; - theme.style.calendar.today_box = &today_box; - theme.style.calendar.day_names = &color_text; - theme.style.calendar.highlighted_days = &color_text; - theme.style.calendar.inactive_days = &gray_text; -#endif -} - -static void cb_init(void) -{ -#if LV_USE_CB != 0 - static lv_style_t cb_bg, cb_rel, cb_pr, cb_trel, cb_tpr, cb_ina; - lv_style_copy(&cb_rel, &bg); - cb_rel.body.radius = LV_DPI / 20; - cb_rel.body.border.width = 1; - cb_rel.body.border.color = LV_COLOR_GRAY; - cb_rel.body.main_color = LV_COLOR_WHITE; - cb_rel.body.grad_color = LV_COLOR_SILVER; - - lv_style_copy(&cb_bg, &bg); - cb_bg.body.opa = LV_OPA_TRANSP; - cb_bg.body.border.width = 0; - cb_bg.body.padding.inner = LV_DPI / 8; - cb_bg.body.padding.left = 0; - cb_bg.body.padding.right = 0; - cb_bg.body.padding.top = 0; - cb_bg.body.padding.bottom = 0; - cb_bg.text.font = _font; - - lv_style_copy(&cb_pr, &cb_rel); - cb_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 90); - cb_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 82); - - lv_style_copy(&cb_trel, &cb_rel); - cb_trel.body.border.width = 4; - cb_trel.body.border.color = LV_COLOR_WHITE; - cb_trel.body.border.opa = LV_OPA_60; - cb_trel.body.main_color = lv_color_hsv_to_rgb(_hue, 50, 82); - cb_trel.body.grad_color = lv_color_hsv_to_rgb(_hue, 50, 62); - - lv_style_copy(&cb_tpr, &cb_trel); - cb_tpr.body.border.color = LV_COLOR_SILVER; - cb_tpr.body.border.opa = LV_OPA_70; - cb_tpr.body.main_color = lv_color_hsv_to_rgb(_hue, 50, 72); - cb_tpr.body.grad_color = lv_color_hsv_to_rgb(_hue, 50, 52); - - lv_style_copy(&cb_ina, &cb_trel); - cb_ina.body.border.width = 1; - cb_ina.body.border.color = LV_COLOR_GRAY; - cb_ina.body.main_color = LV_COLOR_SILVER; - cb_ina.body.grad_color = LV_COLOR_SILVER; - - theme.style.cb.bg = &cb_bg; - theme.style.cb.box.rel = &cb_rel; - theme.style.cb.box.pr = &cb_pr; - theme.style.cb.box.tgl_rel = &cb_trel; - theme.style.cb.box.tgl_pr = &cb_tpr; - theme.style.cb.box.ina = &cb_ina; -#endif -} - -static void btnm_init(void) -{ -#if LV_USE_BTNM - lv_style_copy(&btnm_bg, &lv_style_transp_tight); - btnm_bg.body.border.width = 1; - btnm_bg.body.border.color = lv_color_hsv_to_rgb(_hue, 60, 80); - btnm_bg.body.border.opa = LV_OPA_COVER; - btnm_bg.body.radius = LV_DPI / 8; - - lv_style_copy(&btnm_rel, &lv_style_plain); - btnm_rel.body.opa = LV_OPA_TRANSP; - btnm_rel.body.radius = LV_DPI / 8; - btnm_rel.text.color = lv_color_hsv_to_rgb(_hue, 60, 80); - btnm_rel.text.font = _font; - - lv_style_copy(&btnm_pr, &lv_style_plain); - btnm_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 40, 70); - btnm_pr.body.grad_color = lv_color_hsv_to_rgb(_hue, 40, 70); - btnm_pr.body.radius = LV_DPI / 8; - btnm_pr.text.color = lv_color_hsv_to_rgb(_hue, 40, 40); - btnm_pr.text.font = _font; - - lv_style_copy(&btnm_trel, &btnm_rel); - btnm_trel.body.border.color = lv_color_hsv_to_rgb(_hue, 80, 80); - btnm_trel.body.border.width = 3; - - lv_style_copy(&btnm_ina, &btnm_rel); - btnm_ina.text.color = lv_color_hsv_to_rgb(_hue, 10, 60); - - theme.style.btnm.bg = &btnm_bg; - theme.style.btnm.btn.rel = &btnm_rel; - theme.style.btnm.btn.pr = &btnm_pr; - theme.style.btnm.btn.tgl_rel = &btnm_trel; - theme.style.btnm.btn.tgl_pr = &btnm_pr; - theme.style.btnm.btn.ina = &btnm_ina; -#endif -} - -static void kb_init(void) -{ -#if LV_USE_KB - theme.style.kb.bg = &btnm_bg; - theme.style.kb.btn.rel = &btnm_rel; - theme.style.kb.btn.pr = &btnm_pr; - theme.style.kb.btn.tgl_rel = &btnm_trel; - theme.style.kb.btn.tgl_pr = &btnm_pr; - theme.style.kb.btn.ina = &btnm_ina; -#endif -} - -static void mbox_init(void) -{ -#if LV_USE_MBOX - static lv_style_t mbox_bg; - lv_style_copy(&mbox_bg, &panel); - mbox_bg.body.shadow.width = LV_DPI / 12; - - theme.style.mbox.bg = &mbox_bg; - theme.style.mbox.btn.bg = &lv_style_transp; - theme.style.mbox.btn.rel = &btn_trel; - theme.style.mbox.btn.pr = &btn_tpr; -#endif -} - -static void page_init(void) -{ -#if LV_USE_PAGE - theme.style.page.bg = &panel; - theme.style.page.scrl = &lv_style_transp_fit; - theme.style.page.sb = &sb; -#endif -} - -static void ta_init(void) -{ -#if LV_USE_TA - theme.style.ta.area = &panel; - theme.style.ta.oneline = &panel; - theme.style.ta.cursor = NULL; - theme.style.ta.sb = &sb; -#endif -} - -static void spinbox_init(void) -{ -#if LV_USE_SPINBOX - theme.style.spinbox.bg = &panel; - theme.style.spinbox.cursor = theme.style.ta.cursor; - theme.style.spinbox.sb = theme.style.ta.sb; -#endif -} - -static void list_init(void) -{ -#if LV_USE_LIST != 0 - static lv_style_t list_bg, list_rel, list_pr, list_trel, list_tpr, list_ina; - lv_style_copy(&list_rel, &def); - list_rel.body.opa = LV_OPA_TRANSP; - list_rel.body.border.width = 1; - list_rel.body.border.color = lv_color_hsv_to_rgb(_hue, 50, 85); - list_rel.body.border.opa = LV_OPA_COVER; - list_rel.text.color = lv_color_hsv_to_rgb(_hue, 10, 94); - list_rel.text.font = _font; - list_rel.image.color = lv_color_hsv_to_rgb(_hue, 10, 94); - - lv_style_copy(&list_pr, &list_rel); - 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); - list_pr.text.color = lv_color_hsv_to_rgb(_hue, 7, 96); - list_pr.image.color = lv_color_hsv_to_rgb(_hue, 7, 96); - - lv_style_copy(&list_trel, &list_rel); - lv_style_copy(&list_tpr, &list_pr); - lv_style_copy(&list_ina, &def); - - lv_style_copy(&list_bg, &list_rel); - list_bg.body.padding.left = 0; - list_bg.body.padding.right = 0; - list_bg.body.padding.top = 0; - list_bg.body.padding.bottom = 0; - - theme.style.list.sb = &sb; - theme.style.list.bg = &list_bg; - theme.style.list.scrl = &lv_style_transp_tight; - theme.style.list.btn.rel = &list_rel; - theme.style.list.btn.pr = &list_pr; - theme.style.list.btn.tgl_rel = &list_trel; - theme.style.list.btn.tgl_pr = &list_tpr; - theme.style.list.btn.ina = &list_ina; -#endif -} - -static void ddlist_init(void) -{ -#if LV_USE_DDLIST != 0 - lv_style_copy(&ddlist_bg, &panel); - ddlist_bg.text.line_space = LV_DPI / 8; - ddlist_bg.body.padding.left = LV_DPI / 6; - ddlist_bg.body.padding.right = LV_DPI / 6; - ddlist_bg.body.padding.top = LV_DPI / 6; - ddlist_bg.body.padding.bottom = LV_DPI / 6; - - lv_style_copy(&ddlist_sel, &panel); - ddlist_sel.body.main_color = lv_color_hsv_to_rgb(_hue, 45, 70); - ddlist_sel.body.grad_color = lv_color_hsv_to_rgb(_hue, 45, 70); - ddlist_sel.body.opa = LV_OPA_COVER; - ddlist_sel.body.radius = 0; - - theme.style.ddlist.bg = &ddlist_bg; - theme.style.ddlist.sel = &ddlist_sel; - theme.style.ddlist.sb = &sb; -#endif -} - -static void roller_init(void) -{ -#if LV_USE_ROLLER != 0 - static lv_style_t roller_bg, roller_sel; - lv_style_copy(&roller_bg, &ddlist_bg); - roller_bg.text.line_space = LV_DPI / 6; - roller_bg.body.radius = LV_DPI / 20; - roller_bg.body.main_color = lv_color_hex3(0x222); - roller_bg.body.grad_color = lv_color_hex3(0x666); - roller_bg.body.border.opa = LV_OPA_30; - roller_bg.text.opa = LV_OPA_70; - roller_bg.text.color = lv_color_hsv_to_rgb(_hue, 20, 70); - roller_bg.body.shadow.width = 0; - - lv_style_copy(&roller_sel, &panel); - roller_sel.body.opa = LV_OPA_TRANSP; - roller_sel.body.radius = 0; - roller_sel.text.opa = LV_OPA_COVER; - roller_sel.text.color = lv_color_hsv_to_rgb(_hue, 70, 95); - - theme.style.roller.bg = &roller_bg; - theme.style.roller.sel = &roller_sel; -#endif -} - -static void tabview_init(void) -{ -#if LV_USE_TABVIEW != 0 - static lv_style_t tab_rel, tab_pr, tab_trel, tab_tpr, tab_indic; - lv_style_copy(&tab_rel, &def); - tab_rel.body.main_color = lv_color_hex3(0x666); - tab_rel.body.grad_color = lv_color_hex3(0x666); - tab_rel.body.padding.left = 0; - tab_rel.body.padding.right = 0; - tab_rel.body.padding.top = LV_DPI / 6; - tab_rel.body.padding.bottom = LV_DPI / 6; - tab_rel.body.padding.inner = 0; - tab_rel.body.border.width = 1; - tab_rel.body.border.color = LV_COLOR_SILVER; - tab_rel.body.border.opa = LV_OPA_40; - tab_rel.text.color = lv_color_hex3(0xDDD); - tab_rel.text.font = _font; - - lv_style_copy(&tab_pr, &tab_rel); - tab_pr.body.main_color = lv_color_hex3(0x444); - tab_pr.body.grad_color = lv_color_hex3(0x444); - - lv_style_copy(&tab_trel, &def); - tab_trel.body.opa = LV_OPA_TRANSP; - tab_trel.body.padding.left = 0; - tab_trel.body.padding.right = 0; - tab_trel.body.padding.top = LV_DPI / 6; - tab_trel.body.padding.bottom = LV_DPI / 6; - tab_trel.body.padding.inner = 0; - tab_trel.body.border.width = 1; - tab_trel.body.border.color = LV_COLOR_SILVER; - tab_trel.body.border.opa = LV_OPA_40; - tab_trel.text.color = lv_color_hsv_to_rgb(_hue, 10, 94); - tab_trel.text.font = _font; - - lv_style_copy(&tab_tpr, &def); - tab_tpr.body.main_color = LV_COLOR_GRAY; - tab_tpr.body.grad_color = LV_COLOR_GRAY; - tab_tpr.body.padding.left = 0; - tab_tpr.body.padding.right = 0; - tab_tpr.body.padding.top = LV_DPI / 6; - tab_tpr.body.padding.bottom = LV_DPI / 6; - tab_tpr.body.padding.inner = 0; - tab_tpr.body.border.width = 1; - tab_tpr.body.border.color = LV_COLOR_SILVER; - tab_tpr.body.border.opa = LV_OPA_40; - tab_tpr.text.color = lv_color_hsv_to_rgb(_hue, 10, 94); - tab_tpr.text.font = _font; - - lv_style_copy(&tab_indic, &def); - tab_indic.body.border.width = 0; - tab_indic.body.main_color = lv_color_hsv_to_rgb(_hue, 80, 87); - tab_indic.body.grad_color = lv_color_hsv_to_rgb(_hue, 80, 87); - tab_indic.body.padding.inner = LV_DPI / 10; /*Indicator height*/ - - theme.style.tabview.bg = &bg; - theme.style.tabview.indic = &tab_indic; - theme.style.tabview.btn.bg = &lv_style_transp_tight; - theme.style.tabview.btn.rel = &tab_rel; - theme.style.tabview.btn.pr = &tab_pr; - theme.style.tabview.btn.tgl_rel = &tab_trel; - theme.style.tabview.btn.tgl_pr = &tab_tpr; -#endif -} - -static void tileview_init(void) -{ -#if LV_USE_TILEVIEW != 0 - theme.style.tileview.bg = &lv_style_transp_tight; - theme.style.tileview.scrl = &lv_style_transp_tight; - theme.style.tileview.sb = theme.style.page.sb; -#endif -} - -static void table_init(void) -{ -#if LV_USE_TABLE != 0 - static lv_style_t cell; - lv_style_copy(&cell, &panel); - cell.body.radius = 0; - cell.body.border.width = 1; - cell.body.padding.left = LV_DPI / 12; - cell.body.padding.right = LV_DPI / 12; - cell.body.padding.top = LV_DPI / 12; - cell.body.padding.bottom = LV_DPI / 12; - - theme.style.table.bg = &lv_style_transp_tight; - theme.style.table.cell = &cell; -#endif -} - -static void win_init(void) -{ -#if LV_USE_WIN != 0 - static lv_style_t header; - - lv_style_copy(&header, &def); - header.body.radius = 0; - header.body.padding.left = LV_DPI / 12; - header.body.padding.right = LV_DPI / 12; - header.body.padding.top = LV_DPI / 20; - header.body.padding.bottom = LV_DPI / 20; - header.body.main_color = lv_color_hsv_to_rgb(_hue, 30, 60); - header.body.grad_color = header.body.main_color; - 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.text.color = lv_color_hsv_to_rgb(_hue, 5, 100); - header.image.color = lv_color_hsv_to_rgb(_hue, 5, 100); - - theme.style.win.bg = &bg; - theme.style.win.sb = &sb; - theme.style.win.header = &header; - theme.style.win.content = &lv_style_transp; - theme.style.win.btn.rel = &btn_rel; - theme.style.win.btn.pr = &btn_pr; -#endif -} - -#if LV_USE_GROUP - -static void style_mod(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = lv_color_hsv_to_rgb(_hue, 70, 90); -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 2; -#endif -} - -static void style_mod_edit(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_GREEN; - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 20; - - style->body.main_color = lv_color_mix(style->body.main_color, LV_COLOR_GREEN, LV_OPA_70); - style->body.grad_color = lv_color_mix(style->body.grad_color, LV_COLOR_GREEN, LV_OPA_70); - style->body.shadow.color = lv_color_mix(style->body.shadow.color, LV_COLOR_GREEN, LV_OPA_60); - - style->text.color = lv_color_mix(style->text.color, LV_COLOR_GREEN, LV_OPA_70); -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 3; -#endif -} - -#endif /*LV_USE_GROUP*/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the alien theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_alien_init(uint16_t hue, lv_font_t * font) -{ - if(font == NULL) font = LV_FONT_DEFAULT; - - _hue = hue; - _font = font; - - /*For backward compatibility initialize all theme elements with a default style */ - uint16_t i; - lv_style_t ** style_p = (lv_style_t **)&theme.style; - for(i = 0; i < LV_THEME_STYLE_COUNT; i++) { - *style_p = &def; - style_p++; - } - - basic_init(); - cont_init(); - btn_init(); - label_init(); - bar_init(); - img_init(); - line_init(); - led_init(); - slider_init(); - sw_init(); - lmeter_init(); - gauge_init(); - arc_init(); - preload_init(); - chart_init(); - calendar_init(); - cb_init(); - btnm_init(); - kb_init(); - mbox_init(); - page_init(); - ta_init(); - spinbox_init(); - list_init(); - ddlist_init(); - roller_init(); - tabview_init(); - tileview_init(); - table_init(); - win_init(); - -#if LV_USE_GROUP - theme.group.style_mod_xcb = style_mod; - theme.group.style_mod_edit_xcb = style_mod_edit; -#endif - - return &theme; -} - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_alien(void) -{ - return &theme; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_alien.h b/src/libs/lvgl/src/lv_themes/lv_theme_alien.h deleted file mode 100644 index a3d5851f..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_alien.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @file lv_theme_alien.h - * - */ - -#ifndef LV_THEME_ALIEN_H -#define LV_THEME_ALIEN_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_THEME_ALIEN - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the alien theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_alien_init(uint16_t hue, lv_font_t * font); -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_alien(void); - -/********************** - * MACROS - **********************/ - -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_THEME_ALIEN_H*/ diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_default.c b/src/libs/lvgl/src/lv_themes/lv_theme_default.c deleted file mode 100644 index 7a7c2311..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_default.c +++ /dev/null @@ -1,477 +0,0 @@ -/** - * @file lv_theme_default.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_theme.h" - -#if LV_USE_THEME_DEFAULT - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static lv_theme_t theme; -static lv_style_t def; -static lv_style_t scr; - -/*Static style definitions*/ -static lv_style_t sb; -static lv_style_t plain_bordered; -static lv_style_t label_prim; -static lv_style_t label_sec; -static lv_style_t label_hint; - -/*Saved input parameters*/ -static uint16_t _hue; -static lv_font_t * _font; - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void basic_init(void) -{ - lv_style_copy(&def, &lv_style_pretty); /*Initialize the default style*/ - - lv_style_copy(&scr, &def); - scr.body.padding.bottom = 0; - scr.body.padding.top = 0; - scr.body.padding.left = 0; - scr.body.padding.right = 0; - - lv_style_copy(&sb, &lv_style_pretty_color); - sb.body.grad_color = sb.body.main_color; - sb.body.padding.right = sb.body.padding.right / 2; /*Make closer to the edges*/ - sb.body.padding.bottom = sb.body.padding.bottom / 2; - - lv_style_copy(&plain_bordered, &lv_style_plain); - plain_bordered.body.border.width = 2; - plain_bordered.body.border.color = lv_color_hex3(0xbbb); - - theme.style.bg = &lv_style_plain; - theme.style.scr = &scr; - theme.style.panel = &lv_style_pretty; -} - -static void btn_init(void) -{ -#if LV_USE_BTN != 0 - theme.style.btn.rel = &lv_style_btn_rel; - theme.style.btn.pr = &lv_style_btn_pr; - theme.style.btn.tgl_rel = &lv_style_btn_tgl_rel; - theme.style.btn.tgl_pr = &lv_style_btn_tgl_pr; - theme.style.btn.ina = &lv_style_btn_ina; -#endif -} - -static void label_init(void) -{ -#if LV_USE_LABEL != 0 - - lv_style_copy(&label_prim, &lv_style_plain); - lv_style_copy(&label_sec, &lv_style_plain); - lv_style_copy(&label_hint, &lv_style_plain); - - label_prim.text.color = lv_color_hex3(0x111); - label_sec.text.color = lv_color_hex3(0x888); - label_hint.text.color = lv_color_hex3(0xaaa); - - theme.style.label.prim = &label_prim; - theme.style.label.sec = &label_sec; - theme.style.label.hint = &label_hint; -#endif -} - -static void img_init(void) -{ -#if LV_USE_IMG != 0 - - theme.style.img.light = &def; - theme.style.img.dark = &def; -#endif -} - -static void line_init(void) -{ -#if LV_USE_LINE != 0 - - theme.style.line.decor = &def; -#endif -} - -static void led_init(void) -{ -#if LV_USE_LED != 0 - static lv_style_t led; - - lv_style_copy(&led, &lv_style_pretty_color); - led.body.shadow.width = LV_DPI / 10; - led.body.radius = LV_RADIUS_CIRCLE; - led.body.border.width = LV_DPI / 30; - led.body.border.opa = LV_OPA_30; - led.body.shadow.color = led.body.main_color; - - theme.style.led = &led; -#endif -} - -static void bar_init(void) -{ -#if LV_USE_BAR - - theme.style.bar.bg = &lv_style_pretty; - theme.style.bar.indic = &lv_style_pretty_color; -#endif -} - -static void slider_init(void) -{ -#if LV_USE_SLIDER != 0 - static lv_style_t slider_bg; - lv_style_copy(&slider_bg, &lv_style_pretty); - slider_bg.body.padding.left = LV_DPI / 20; - slider_bg.body.padding.right = LV_DPI / 20; - slider_bg.body.padding.top = LV_DPI / 20; - slider_bg.body.padding.bottom = LV_DPI / 20; - - theme.style.slider.bg = &slider_bg; - theme.style.slider.indic = &lv_style_pretty_color; - theme.style.slider.knob = &lv_style_pretty; -#endif -} - -static void sw_init(void) -{ -#if LV_USE_SW != 0 - static lv_style_t sw_bg; - lv_style_copy(&sw_bg, &lv_style_pretty); - sw_bg.body.padding.left = 3; - sw_bg.body.padding.right = 3; - sw_bg.body.padding.top = 3; - sw_bg.body.padding.bottom = 3; - - theme.style.sw.bg = &sw_bg; - theme.style.sw.indic = &lv_style_pretty_color; - theme.style.sw.knob_off = &lv_style_pretty; - theme.style.sw.knob_on = &lv_style_pretty; -#endif -} - -static void lmeter_init(void) -{ -#if LV_USE_LMETER != 0 - static lv_style_t lmeter; - lv_style_copy(&lmeter, &lv_style_pretty_color); - lmeter.line.color = lv_color_hex3(0xddd); - lmeter.line.width = 2; - lmeter.body.main_color = lv_color_mix(lmeter.body.main_color, LV_COLOR_WHITE, LV_OPA_50); - lmeter.body.grad_color = lv_color_mix(lmeter.body.grad_color, LV_COLOR_BLACK, LV_OPA_50); - - theme.style.lmeter = &lmeter; -#endif -} - -static void gauge_init(void) -{ -#if LV_USE_GAUGE != 0 - static lv_style_t gauge; - lv_style_copy(&gauge, theme.style.lmeter); - gauge.line.color = theme.style.lmeter->body.grad_color; - gauge.line.width = 2; - gauge.body.main_color = lv_color_hex3(0x888); - gauge.body.grad_color = theme.style.lmeter->body.main_color; - gauge.text.color = lv_color_hex3(0x888); - - theme.style.gauge = &gauge; -#endif -} - -static void chart_init(void) -{ -#if LV_USE_CHART - - theme.style.chart = &lv_style_pretty; -#endif -} - -static void cb_init(void) -{ -#if LV_USE_CB != 0 - - theme.style.cb.bg = &lv_style_transp; - theme.style.cb.box.rel = &lv_style_pretty; - theme.style.cb.box.pr = &lv_style_btn_pr; - theme.style.cb.box.tgl_rel = &lv_style_btn_tgl_rel; - theme.style.cb.box.tgl_pr = &lv_style_btn_tgl_pr; - theme.style.cb.box.ina = &lv_style_btn_ina; -#endif -} - -static void btnm_init(void) -{ -#if LV_USE_BTNM - - theme.style.btnm.bg = &lv_style_pretty; - theme.style.btnm.btn.rel = &lv_style_btn_rel; - theme.style.btnm.btn.pr = &lv_style_btn_pr; - theme.style.btnm.btn.tgl_rel = &lv_style_btn_tgl_rel; - theme.style.btnm.btn.tgl_pr = &lv_style_btn_tgl_pr; - theme.style.btnm.btn.ina = &lv_style_btn_ina; -#endif -} - -static void kb_init(void) -{ -#if LV_USE_KB - - theme.style.kb.bg = &lv_style_pretty; - theme.style.kb.btn.rel = &lv_style_btn_rel; - theme.style.kb.btn.pr = &lv_style_btn_pr; - theme.style.kb.btn.tgl_rel = &lv_style_btn_tgl_rel; - theme.style.kb.btn.tgl_pr = &lv_style_btn_tgl_pr; - theme.style.kb.btn.ina = &lv_style_btn_ina; -#endif -} - -static void mbox_init(void) -{ -#if LV_USE_MBOX - - theme.style.mbox.bg = &lv_style_pretty; - theme.style.mbox.btn.bg = &lv_style_transp; - theme.style.mbox.btn.rel = &lv_style_btn_rel; - theme.style.mbox.btn.pr = &lv_style_btn_tgl_pr; -#endif -} - -static void page_init(void) -{ -#if LV_USE_PAGE - - theme.style.page.bg = &lv_style_pretty; - theme.style.page.scrl = &lv_style_transp_tight; - theme.style.page.sb = &sb; -#endif -} - -static void ta_init(void) -{ -#if LV_USE_TA - - theme.style.ta.area = &lv_style_pretty; - theme.style.ta.oneline = &lv_style_pretty; - theme.style.ta.cursor = NULL; - theme.style.ta.sb = &sb; -#endif -} - -static void list_init(void) -{ -#if LV_USE_LIST != 0 - - theme.style.list.bg = &lv_style_pretty; - theme.style.list.scrl = &lv_style_transp_fit; - theme.style.list.sb = &sb; - theme.style.list.btn.rel = &lv_style_btn_rel; - theme.style.list.btn.pr = &lv_style_btn_pr; - theme.style.list.btn.tgl_rel = &lv_style_btn_tgl_rel; - theme.style.list.btn.tgl_pr = &lv_style_btn_tgl_pr; - theme.style.list.btn.ina = &lv_style_btn_ina; -#endif -} - -static void ddlist_init(void) -{ -#if LV_USE_DDLIST != 0 - - theme.style.ddlist.bg = &lv_style_pretty; - theme.style.ddlist.sel = &lv_style_plain_color; - theme.style.ddlist.sb = &sb; -#endif -} - -static void roller_init(void) -{ -#if LV_USE_ROLLER != 0 - - theme.style.roller.bg = &lv_style_pretty; - theme.style.roller.sel = &lv_style_plain_color; -#endif -} - -static void tabview_init(void) -{ -#if LV_USE_TABVIEW != 0 - - theme.style.tabview.bg = &plain_bordered; - theme.style.tabview.indic = &lv_style_plain_color; - theme.style.tabview.btn.bg = &lv_style_transp; - theme.style.tabview.btn.rel = &lv_style_btn_rel; - theme.style.tabview.btn.pr = &lv_style_btn_pr; - theme.style.tabview.btn.tgl_rel = &lv_style_btn_tgl_rel; - theme.style.tabview.btn.tgl_pr = &lv_style_btn_tgl_pr; -#endif -} - -static void table_init(void) -{ -#if LV_USE_TABLE != 0 - theme.style.table.bg = &lv_style_transp_tight; - theme.style.table.cell = &lv_style_plain; -#endif -} - -static void win_init(void) -{ -#if LV_USE_WIN != 0 - - theme.style.win.bg = &plain_bordered; - theme.style.win.sb = &sb; - theme.style.win.header = &lv_style_plain_color; - theme.style.win.content = &lv_style_transp; - theme.style.win.btn.rel = &lv_style_btn_rel; - theme.style.win.btn.pr = &lv_style_btn_pr; -#endif -} - -#if LV_USE_GROUP - -static void style_mod(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_ORANGE; - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 20; - - style->body.main_color = lv_color_mix(style->body.main_color, LV_COLOR_ORANGE, LV_OPA_70); - style->body.grad_color = lv_color_mix(style->body.grad_color, LV_COLOR_ORANGE, LV_OPA_70); - style->body.shadow.color = lv_color_mix(style->body.shadow.color, LV_COLOR_ORANGE, LV_OPA_60); - - style->text.color = lv_color_mix(style->text.color, LV_COLOR_ORANGE, LV_OPA_70); -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 2; -#endif -} - -static void style_mod_edit(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_GREEN; - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 20; - - style->body.main_color = lv_color_mix(style->body.main_color, LV_COLOR_GREEN, LV_OPA_70); - style->body.grad_color = lv_color_mix(style->body.grad_color, LV_COLOR_GREEN, LV_OPA_70); - style->body.shadow.color = lv_color_mix(style->body.shadow.color, LV_COLOR_GREEN, LV_OPA_60); - - style->text.color = lv_color_mix(style->text.color, LV_COLOR_GREEN, LV_OPA_70); -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 3; -#endif -} - -#endif /*LV_USE_GROUP*/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the default theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_default_init(uint16_t hue, lv_font_t * font) -{ - if(font == NULL) font = LV_FONT_DEFAULT; - - _hue = hue; - _font = font; - - /*For backward compatibility initialize all theme elements with a default style */ - uint16_t i; - lv_style_t ** style_p = (lv_style_t **)&theme.style; - for(i = 0; i < LV_THEME_STYLE_COUNT; i++) { - *style_p = &def; - style_p++; - } - - basic_init(); - btn_init(); - label_init(); - img_init(); - line_init(); - led_init(); - bar_init(); - slider_init(); - sw_init(); - lmeter_init(); - gauge_init(); - chart_init(); - cb_init(); - btnm_init(); - kb_init(); - mbox_init(); - page_init(); - ta_init(); - list_init(); - ddlist_init(); - roller_init(); - tabview_init(); - table_init(); - win_init(); - -#if LV_USE_GROUP - theme.group.style_mod_xcb = style_mod; - theme.group.style_mod_edit_xcb = style_mod_edit; -#endif - - return &theme; -} - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_default(void) -{ - return &theme; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_default.h b/src/libs/lvgl/src/lv_themes/lv_theme_default.h deleted file mode 100644 index 4a2ecc08..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_default.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file lv_theme_default.h - * - */ - -#ifndef LV_THEME_DEFAULT_H -#define LV_THEME_DEFAULT_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_THEME_DEFAULT - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the default theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_default_init(uint16_t hue, lv_font_t * font); - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_default(void); - -/********************** - * MACROS - **********************/ - -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_THEME_TEMPL_H*/ diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_material.c b/src/libs/lvgl/src/lv_themes/lv_theme_material.c deleted file mode 100644 index 6d162bf5..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_material.c +++ /dev/null @@ -1,936 +0,0 @@ -/** - * @file lv_theme_material.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_theme.h" - -#if LV_USE_THEME_MATERIAL - -/********************* - * DEFINES - *********************/ -#define DEF_RADIUS 4 -#define DEF_SHADOW_COLOR lv_color_hex3(0xaaa) - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static lv_theme_t theme; -static lv_style_t def; - -/*Static style definitions*/ -static lv_style_t sb; - -/*Saved input parameters*/ -static uint16_t _hue; -static lv_font_t * _font; - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void basic_init(void) -{ - static lv_style_t bg, panel, scr; - - lv_style_copy(&def, &lv_style_plain); /*Initialize the default style*/ - def.text.font = _font; - def.body.radius = DEF_RADIUS; - - lv_style_copy(&bg, &def); - bg.body.main_color = lv_color_hex(0xf0f0f0); - bg.body.grad_color = bg.body.main_color; - bg.body.radius = 0; - - lv_style_copy(&scr, &bg); - scr.body.padding.bottom = 0; - scr.body.padding.top = 0; - scr.body.padding.left = 0; - scr.body.padding.right = 0; - - lv_style_copy(&panel, &def); - panel.body.radius = DEF_RADIUS; - panel.body.main_color = LV_COLOR_WHITE; - panel.body.grad_color = LV_COLOR_WHITE; - panel.body.border.width = 1; - 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.padding.left = LV_DPI / 8; - panel.body.padding.right = LV_DPI / 8; - panel.body.padding.top = LV_DPI / 8; - panel.body.padding.bottom = LV_DPI / 8; - panel.body.padding.inner = LV_DPI / 12; - panel.text.color = lv_color_hex3(0x333); - panel.image.color = lv_color_hex3(0x333); - - lv_style_copy(&sb, &def); - sb.body.main_color = LV_COLOR_BLACK; - sb.body.grad_color = LV_COLOR_BLACK; - sb.body.opa = LV_OPA_40; - sb.body.padding.right = LV_DPI / 25; - sb.body.padding.bottom = LV_DPI / 25; - - theme.style.bg = &bg; - theme.style.scr = &scr; - theme.style.panel = &panel; -} - -static void cont_init(void) -{ -#if LV_USE_CONT != 0 - - theme.style.cont = theme.style.panel; -#endif -} - -static void btn_init(void) -{ -#if LV_USE_BTN != 0 - static lv_style_t rel, pr, tgl_rel, tgl_pr, ina; - - lv_style_copy(&rel, &def); - rel.body.main_color = lv_color_hsv_to_rgb(_hue, 90, 70); - rel.body.grad_color = rel.body.main_color; - rel.body.radius = DEF_RADIUS; - rel.body.padding.left = LV_DPI / 6; - rel.body.padding.right = LV_DPI / 6; - rel.body.padding.top = LV_DPI / 8; - 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.text.color = lv_color_hsv_to_rgb(_hue, 5, 95); - rel.image.color = lv_color_hsv_to_rgb(_hue, 5, 95); - - lv_style_copy(&pr, &rel); - pr.body.main_color = lv_color_hsv_to_rgb(_hue, 90, 60); - pr.body.grad_color = pr.body.main_color; - pr.body.shadow.width = 4; - - lv_style_copy(&tgl_rel, &rel); - tgl_rel.body.main_color = lv_color_hsv_to_rgb(_hue, 95, 50); - tgl_rel.body.grad_color = tgl_rel.body.main_color; - tgl_rel.body.shadow.width = 4; - - lv_style_copy(&tgl_pr, &tgl_rel); - tgl_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 95, 40); - tgl_pr.body.grad_color = tgl_pr.body.main_color; - tgl_pr.body.shadow.width = 2; - - lv_style_copy(&ina, &rel); - ina.body.main_color = lv_color_hex3(0xccc); - ina.body.grad_color = ina.body.main_color; - ina.body.shadow.width = 0; - ina.text.color = lv_color_hsv_to_rgb(_hue, 95, 5); - ina.image.color = lv_color_hsv_to_rgb(_hue, 95, 5); - - theme.style.btn.rel = &rel; - theme.style.btn.pr = ≺ - theme.style.btn.tgl_rel = &tgl_rel; - theme.style.btn.tgl_pr = &tgl_pr; - theme.style.btn.ina = &ina; -#endif -} - -static void label_init(void) -{ -#if LV_USE_LABEL != 0 - static lv_style_t prim, sec, hint; - - lv_style_copy(&prim, &def); - prim.text.font = _font; - prim.text.color = lv_color_hsv_to_rgb(_hue, 80, 10); - - lv_style_copy(&sec, &prim); - sec.text.color = lv_color_hsv_to_rgb(_hue, 80, 75); - - lv_style_copy(&hint, &prim); - hint.text.color = lv_color_hsv_to_rgb(_hue, 40, 90); - - theme.style.label.prim = &prim; - theme.style.label.sec = &sec; - theme.style.label.hint = &hint; -#endif -} - -static void img_init(void) -{ -#if LV_USE_IMG != 0 - static lv_style_t img_light, img_dark; - lv_style_copy(&img_light, &def); - img_light.image.color = lv_color_hsv_to_rgb(_hue, 15, 85); - img_light.image.intense = LV_OPA_80; - - lv_style_copy(&img_dark, &def); - img_light.image.color = lv_color_hsv_to_rgb(_hue, 85, 65); - img_light.image.intense = LV_OPA_80; - - theme.style.img.light = &def; - theme.style.img.dark = &def; -#endif -} - -static void line_init(void) -{ -#if LV_USE_LINE != 0 - - theme.style.line.decor = &def; -#endif -} - -static void led_init(void) -{ -#if LV_USE_LED != 0 - static lv_style_t led; - lv_style_copy(&led, &def); - led.body.shadow.width = LV_DPI / 10; - led.body.radius = LV_RADIUS_CIRCLE; - led.body.border.width = LV_DPI / 30; - led.body.border.opa = LV_OPA_30; - led.body.main_color = lv_color_hsv_to_rgb(_hue, 100, 100); - led.body.grad_color = lv_color_hsv_to_rgb(_hue, 100, 100); - led.body.border.color = lv_color_hsv_to_rgb(_hue, 60, 60); - led.body.shadow.color = lv_color_hsv_to_rgb(_hue, 100, 100); - - theme.style.led = &led; -#endif -} - -static void bar_init(void) -{ -#if LV_USE_BAR - static lv_style_t bar_bg, bar_indic; - - lv_style_copy(&bar_bg, &def); - bar_bg.body.main_color = lv_color_hsv_to_rgb(_hue, 15, 95); - bar_bg.body.grad_color = bar_bg.body.main_color; - bar_bg.body.radius = 3; - bar_bg.body.border.width = 0; - bar_bg.body.padding.left = LV_DPI / 16; - bar_bg.body.padding.right = LV_DPI / 16; - bar_bg.body.padding.top = LV_DPI / 16; - bar_bg.body.padding.bottom = LV_DPI / 16; - - lv_style_copy(&bar_indic, &bar_bg); - bar_indic.body.main_color = lv_color_hsv_to_rgb(_hue, 85, 70); - bar_indic.body.grad_color = bar_indic.body.main_color; - bar_indic.body.padding.left = 0; - bar_indic.body.padding.right = 0; - bar_indic.body.padding.top = 0; - bar_indic.body.padding.bottom = 0; - - theme.style.bar.bg = &bar_bg; - theme.style.bar.indic = &bar_indic; -#endif -} - -static void slider_init(void) -{ -#if LV_USE_SLIDER != 0 - static lv_style_t knob; - - lv_style_copy(&knob, &def); - knob.body.radius = LV_RADIUS_CIRCLE; - knob.body.border.width = 0; - knob.body.main_color = theme.style.bar.indic->body.main_color; - knob.body.grad_color = knob.body.main_color; - - theme.style.slider.bg = theme.style.bar.bg; - theme.style.slider.indic = theme.style.bar.indic; - theme.style.slider.knob = &knob; -#endif -} - -static void sw_init(void) -{ -#if LV_USE_SW != 0 - static lv_style_t sw_bg, sw_indic, sw_knob_off, sw_knob_on; - lv_style_copy(&sw_bg, theme.style.slider.bg); - sw_bg.body.radius = LV_RADIUS_CIRCLE; - - lv_style_copy(&sw_indic, theme.style.slider.bg); - sw_indic.body.radius = LV_RADIUS_CIRCLE; - - 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.color = DEF_SHADOW_COLOR; - - lv_style_copy(&sw_knob_off, &sw_knob_on); - sw_knob_off.body.main_color = lv_color_hex(0xfafafa); - sw_knob_off.body.grad_color = sw_knob_off.body.main_color; - sw_knob_off.body.border.width = 1; - sw_knob_off.body.border.color = lv_color_hex3(0x999); - sw_knob_off.body.border.opa = LV_OPA_COVER; - - theme.style.sw.bg = &sw_bg; - theme.style.sw.indic = &sw_indic; - theme.style.sw.knob_off = &sw_knob_off; - theme.style.sw.knob_on = &sw_knob_on; -#endif -} - -static void lmeter_init(void) -{ -#if LV_USE_LMETER != 0 - static lv_style_t lmeter; - lv_style_copy(&lmeter, &def); - lmeter.body.main_color = lv_color_hsv_to_rgb(_hue, 75, 90); - lmeter.body.grad_color = lmeter.body.main_color; - lmeter.body.padding.left = LV_DPI / 10; /*Scale line length*/ - lmeter.line.color = lv_color_hex3(0x999); - lmeter.line.width = 2; - - theme.style.lmeter = &lmeter; -#endif -} - -static void gauge_init(void) -{ -#if LV_USE_GAUGE != 0 - - static lv_style_t gauge; - lv_style_copy(&gauge, &def); - gauge.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 60); - gauge.body.grad_color = gauge.body.main_color; - gauge.body.padding.left = LV_DPI / 16; /*Scale line length*/ - gauge.body.padding.inner = LV_DPI / 8; - gauge.body.border.color = lv_color_hex3(0x999); - gauge.text.color = lv_color_hex3(0x333); - gauge.line.width = 3; - gauge.line.color = lv_color_hsv_to_rgb(_hue, 95, 70); - - theme.style.gauge = &gauge; -#endif -} - -static void arc_init(void) -{ -#if LV_USE_ARC != 0 - - static lv_style_t arc; - lv_style_copy(&arc, &def); - arc.line.width = 10; - arc.line.color = lv_color_hsv_to_rgb(_hue, 90, 90); - - /*For prelaoder*/ - arc.body.border.width = 10; - arc.body.border.color = lv_color_hsv_to_rgb(_hue, 30, 90); - arc.body.padding.left = 0; - arc.body.padding.right = 0; - arc.body.padding.top = 0; - arc.body.padding.bottom = 0; - - theme.style.arc = &arc; -#endif -} - -static void preload_init(void) -{ -#if LV_USE_PRELOAD != 0 - - theme.style.preload = theme.style.arc; -#endif -} - -static void chart_init(void) -{ -#if LV_USE_CHART - theme.style.chart = theme.style.panel; -#endif -} - -static void calendar_init(void) -{ -#if LV_USE_CALENDAR - static lv_style_t ina_days; - lv_style_copy(&ina_days, &def); - ina_days.text.color = lv_color_hsv_to_rgb(_hue, 0, 70); - - static lv_style_t high_days; - lv_style_copy(&high_days, &def); - high_days.text.color = lv_color_hsv_to_rgb(_hue, 80, 90); - - static lv_style_t week_box; - lv_style_copy(&week_box, &def); - week_box.body.main_color = lv_color_hsv_to_rgb(_hue, 40, 100); - week_box.body.grad_color = lv_color_hsv_to_rgb(_hue, 40, 100); - week_box.body.padding.top = LV_DPI / 20; - week_box.body.padding.bottom = LV_DPI / 20; - week_box.body.padding.left = theme.style.panel->body.padding.left; - 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.radius = 0; - - static lv_style_t today_box; - lv_style_copy(&today_box, &def); - today_box.body.main_color = LV_COLOR_WHITE; - today_box.body.grad_color = LV_COLOR_WHITE; - today_box.body.padding.top = LV_DPI / 20; - today_box.body.padding.bottom = LV_DPI / 20; - today_box.body.radius = 0; - - theme.style.calendar.bg = theme.style.panel; - theme.style.calendar.header = &lv_style_transp; - theme.style.calendar.inactive_days = &ina_days; - theme.style.calendar.highlighted_days = &high_days; - theme.style.calendar.week_box = &week_box; - theme.style.calendar.today_box = &today_box; -#endif -} - -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); - pr.body.main_color = lv_color_hex3(0xccc); - pr.body.grad_color = pr.body.main_color; - pr.body.shadow.width = 0; - - 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); - tgl_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 75, 65); - tgl_pr.body.grad_color = tgl_pr.body.main_color; - tgl_pr.body.shadow.width = 0; - - lv_style_copy(&ina, theme.style.btn.ina); - - theme.style.cb.bg = &lv_style_transp; - theme.style.cb.box.rel = &rel; - theme.style.cb.box.pr = ≺ - theme.style.cb.box.tgl_rel = &tgl_rel; - theme.style.cb.box.tgl_pr = &tgl_pr; - theme.style.cb.box.ina = &ina; -#endif -} - -static void btnm_init(void) -{ -#if LV_USE_BTNM - static lv_style_t bg, rel, pr, tgl_rel, tgl_pr, ina; - - lv_style_copy(&bg, theme.style.panel); - bg.body.padding.left = 0; - bg.body.padding.right = 0; - bg.body.padding.top = 0; - bg.body.padding.bottom = 0; - bg.body.padding.inner = 0; - 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.width = 1; - rel.body.border.color = lv_color_hex3(0xbbb); - rel.body.opa = LV_OPA_TRANSP; - rel.body.shadow.width = 0; - - lv_style_copy(&pr, &rel); - pr.glass = 0; - pr.body.main_color = lv_color_hex3(0xddd); - pr.body.grad_color = pr.body.main_color; - pr.body.border.width = 0; - pr.body.opa = LV_OPA_COVER; - - lv_style_copy(&tgl_rel, &pr); - tgl_rel.body.main_color = lv_color_hsv_to_rgb(_hue, 90, 70); - tgl_rel.body.grad_color = tgl_rel.body.main_color; - tgl_rel.text.color = lv_color_hsv_to_rgb(_hue, 5, 95); - - lv_style_copy(&tgl_pr, &tgl_rel); - tgl_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 95, 65); - tgl_pr.body.grad_color = tgl_pr.body.main_color; - tgl_pr.body.border.width = 0; - - lv_style_copy(&ina, &pr); - ina.body.main_color = lv_color_hex3(0xccc); - ina.body.grad_color = ina.body.main_color; - - theme.style.btnm.bg = &bg; - theme.style.btnm.btn.rel = &rel; - theme.style.btnm.btn.pr = ≺ - theme.style.btnm.btn.tgl_rel = &tgl_rel; - theme.style.btnm.btn.tgl_pr = &tgl_pr; - theme.style.btnm.btn.ina = &def; -#endif -} - -static void kb_init(void) -{ -#if LV_USE_KB - - static lv_style_t rel; - lv_style_copy(&rel, &lv_style_transp); - rel.text.font = _font; - - theme.style.kb.bg = theme.style.btnm.bg; - theme.style.kb.btn.rel = &rel; - theme.style.kb.btn.pr = theme.style.btnm.btn.pr; - theme.style.kb.btn.tgl_rel = theme.style.btnm.btn.tgl_rel; - theme.style.kb.btn.tgl_pr = theme.style.btnm.btn.tgl_pr; - theme.style.kb.btn.ina = theme.style.btnm.btn.ina; -#endif -} - -static void mbox_init(void) -{ -#if LV_USE_MBOX - static lv_style_t pr, rel; - - lv_style_copy(&rel, &lv_style_transp); - rel.glass = 0; - rel.text.font = _font; - rel.text.color = lv_color_hsv_to_rgb(_hue, 85, 75); - - lv_style_copy(&pr, theme.style.btnm.btn.pr); - pr.text.color = lv_color_hsv_to_rgb(_hue, 85, 60); - - theme.style.mbox.bg = theme.style.panel; - theme.style.mbox.btn.bg = &lv_style_transp; - theme.style.mbox.btn.rel = &rel; - theme.style.mbox.btn.pr = ≺ -#endif -} - -static void page_init(void) -{ -#if LV_USE_PAGE - - theme.style.page.bg = theme.style.panel; - theme.style.page.scrl = &lv_style_transp; - theme.style.page.sb = &sb; -#endif -} - -static void ta_init(void) -{ -#if LV_USE_TA - static lv_style_t oneline; - - 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.width = 3; - oneline.body.border.color = lv_color_hex3(0x333); - oneline.body.border.opa = LV_OPA_COVER; - oneline.text.color = lv_color_hex3(0x333); - - theme.style.ta.area = theme.style.panel; - theme.style.ta.oneline = &oneline; - theme.style.ta.cursor = NULL; /*Let library to calculate the cursor's style*/ - theme.style.ta.sb = &sb; -#endif -} - -static void spinbox_init(void) -{ -#if LV_USE_SPINBOX - theme.style.spinbox.bg = theme.style.panel; - theme.style.spinbox.cursor = theme.style.ta.cursor; - theme.style.spinbox.sb = theme.style.ta.sb; -#endif -} - -static void list_init(void) -{ -#if LV_USE_LIST != 0 - - static lv_style_t list_bg, rel, pr, tgl_rel, tgl_pr, ina; - - lv_style_copy(&list_bg, theme.style.panel); - list_bg.body.padding.left = 0; - list_bg.body.padding.right = 0; - list_bg.body.padding.top = 0; - list_bg.body.padding.bottom = 0; - list_bg.body.padding.inner = 0; - - lv_style_copy(&rel, &lv_style_transp); - rel.body.padding.left = LV_DPI / 8; - rel.body.padding.right = LV_DPI / 8; - rel.body.padding.top = LV_DPI / 6; - rel.body.padding.bottom = LV_DPI / 6; - rel.body.radius = 10; - rel.body.border.color = lv_color_hex3(0xbbb); - rel.body.border.width = 1; - rel.body.border.part = LV_BORDER_BOTTOM; - - lv_style_copy(&pr, &rel); - pr.glass = 0; - pr.body.main_color = lv_color_hex3(0xddd); - pr.body.grad_color = pr.body.main_color; - pr.body.border.width = 0; - pr.body.opa = LV_OPA_COVER; - pr.body.radius = DEF_RADIUS; - pr.text.font = _font; - - lv_style_copy(&tgl_rel, &pr); - tgl_rel.body.main_color = lv_color_hsv_to_rgb(_hue, 90, 70); - tgl_rel.body.grad_color = tgl_rel.body.main_color; - tgl_rel.text.color = lv_color_hsv_to_rgb(_hue, 5, 95); - - lv_style_copy(&tgl_pr, &tgl_rel); - tgl_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 90, 60); - tgl_pr.body.grad_color = tgl_pr.body.main_color; - tgl_pr.body.border.width = 0; - - lv_style_copy(&ina, &pr); - ina.body.main_color = lv_color_hex3(0xccc); - ina.body.grad_color = ina.body.main_color; - - theme.style.list.sb = &sb; - theme.style.list.bg = &list_bg; - theme.style.list.scrl = &lv_style_transp_tight; - theme.style.list.btn.rel = &rel; - theme.style.list.btn.pr = ≺ - theme.style.list.btn.tgl_rel = &tgl_rel; - theme.style.list.btn.tgl_pr = &tgl_pr; - theme.style.list.btn.ina = &ina; -#endif -} - -static void ddlist_init(void) -{ -#if LV_USE_DDLIST != 0 - static lv_style_t bg, sel; - lv_style_copy(&bg, theme.style.panel); - bg.body.padding.left = LV_DPI / 6; - bg.body.padding.right = LV_DPI / 6; - bg.body.padding.top = LV_DPI / 6; - bg.body.padding.bottom = LV_DPI / 6; - bg.text.line_space = LV_DPI / 8; - - lv_style_copy(&sel, &bg); - sel.body.main_color = lv_color_hsv_to_rgb(_hue, 90, 70); - sel.body.grad_color = sel.body.main_color; - sel.body.border.width = 0; - sel.body.shadow.width = 0; - sel.text.color = lv_color_hsv_to_rgb(_hue, 5, 95); - - theme.style.ddlist.bg = &bg; - theme.style.ddlist.sel = &sel; - theme.style.ddlist.sb = &sb; -#endif -} - -static void roller_init(void) -{ -#if LV_USE_ROLLER != 0 - static lv_style_t roller_bg, roller_sel; - - lv_style_copy(&roller_bg, &lv_style_transp); - roller_bg.body.padding.left = LV_DPI / 6; - roller_bg.body.padding.right = LV_DPI / 6; - roller_bg.body.padding.top = LV_DPI / 6; - roller_bg.body.padding.bottom = LV_DPI / 6; - roller_bg.text.line_space = LV_DPI / 8; - roller_bg.text.font = _font; - roller_bg.glass = 0; - - lv_style_copy(&roller_sel, &roller_bg); - roller_sel.text.color = lv_color_hsv_to_rgb(_hue, 90, 70); - - theme.style.roller.bg = &roller_bg; - theme.style.roller.sel = &roller_sel; -#endif -} - -static void tabview_init(void) -{ -#if LV_USE_TABVIEW != 0 - static lv_style_t indic, btn_bg, rel, pr, tgl_rel, tgl_pr; - - lv_style_copy(&indic, &def); - indic.body.main_color = lv_color_hsv_to_rgb(_hue, 90, 70); - indic.body.grad_color = indic.body.main_color; - indic.body.radius = 0; - indic.body.border.width = 0; - indic.body.padding.inner = LV_DPI / 20; - - lv_style_copy(&btn_bg, &def); - btn_bg.body.main_color = lv_color_hex3(0xccc); - btn_bg.body.grad_color = btn_bg.body.main_color; - 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.opa = LV_OPA_COVER; - btn_bg.body.shadow.width = 5; - 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; - btn_bg.body.padding.top = 0; - btn_bg.body.padding.bottom = 0; - btn_bg.text.color = lv_color_hex3(0x333); - - lv_style_copy(&rel, &lv_style_transp); - rel.body.padding.top = LV_DPI / 8; - rel.body.padding.bottom = LV_DPI / 8; - rel.text.font = _font; - - lv_style_copy(&pr, &def); - pr.body.main_color = lv_color_hex3(0xbbb); - pr.body.grad_color = pr.body.main_color; - pr.body.border.width = 0; - pr.body.opa = LV_OPA_COVER; - 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.opa = LV_OPA_COVER; - pr.text.color = lv_color_hex3(0x111); - - lv_style_copy(&tgl_rel, &lv_style_transp); - tgl_rel.glass = 0; - tgl_rel.text.font = _font; - tgl_rel.text.color = lv_color_hsv_to_rgb(_hue, 90, 70); - - lv_style_copy(&tgl_pr, &def); - tgl_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 15, 85); - tgl_pr.body.grad_color = tgl_pr.body.main_color; - tgl_pr.body.border.width = 0; - tgl_pr.body.opa = LV_OPA_COVER; - tgl_pr.body.radius = 0; - tgl_pr.text.color = lv_color_hsv_to_rgb(_hue, 90, 60); - - theme.style.tabview.bg = theme.style.bg; - theme.style.tabview.indic = &indic; - theme.style.tabview.btn.bg = &btn_bg; - theme.style.tabview.btn.rel = &rel; - theme.style.tabview.btn.pr = ≺ - theme.style.tabview.btn.tgl_rel = &tgl_rel; - theme.style.tabview.btn.tgl_pr = &tgl_pr; -#endif -} - -static void tileview_init(void) -{ -#if LV_USE_TILEVIEW != 0 - theme.style.tileview.bg = &lv_style_transp_tight; - theme.style.tileview.scrl = &lv_style_transp_tight; - theme.style.tileview.sb = theme.style.page.sb; -#endif -} - -static void table_init(void) -{ -#if LV_USE_TABLE != 0 - static lv_style_t cell; - lv_style_copy(&cell, theme.style.panel); - cell.body.radius = 0; - cell.body.border.width = 1; - cell.body.padding.left = LV_DPI / 12; - cell.body.padding.right = LV_DPI / 12; - cell.body.padding.top = LV_DPI / 12; - cell.body.padding.bottom = LV_DPI / 12; - - theme.style.table.bg = &lv_style_transp_tight; - theme.style.table.cell = &cell; -#endif -} - -static void win_init(void) -{ -#if LV_USE_WIN != 0 - static lv_style_t header, pr; - - lv_style_copy(&header, &def); - header.body.main_color = lv_color_hex3(0xccc); - header.body.grad_color = header.body.main_color; - 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.opa = LV_OPA_COVER; - header.body.padding.inner = 0; - header.body.padding.left = 0; - header.body.padding.right = 0; - header.body.padding.top = 0; - header.body.padding.bottom = 0; - header.text.color = lv_color_hex3(0x333); - header.image.color = lv_color_hex3(0x333); - - lv_style_copy(&pr, &def); - pr.body.main_color = lv_color_hex3(0xbbb); - pr.body.grad_color = pr.body.main_color; - pr.body.border.width = 0; - pr.body.opa = LV_OPA_COVER; - pr.body.radius = 0; - pr.text.color = lv_color_hex3(0x111); - pr.image.color = lv_color_hex3(0x111); - - theme.style.win.bg = theme.style.panel; - theme.style.win.sb = &sb; - theme.style.win.header = &header; - theme.style.win.content = &lv_style_transp; - theme.style.win.btn.rel = &lv_style_transp; - theme.style.win.btn.pr = ≺ -#endif -} - -#if LV_USE_GROUP - -static void style_mod(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - uint16_t hue2 = (_hue + 60) % 360; - - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = lv_color_hsv_to_rgb(hue2, 90, 70); - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 30; - - style->body.main_color = lv_color_mix(style->body.main_color, lv_color_hsv_to_rgb(hue2, 90, 70), LV_OPA_70); - style->body.grad_color = lv_color_mix(style->body.grad_color, lv_color_hsv_to_rgb(hue2, 90, 70), LV_OPA_70); - style->body.shadow.color = lv_color_mix(style->body.shadow.color, lv_color_hsv_to_rgb(hue2, 90, 70), LV_OPA_60); - - style->text.color = lv_color_mix(style->text.color, lv_color_hsv_to_rgb(hue2, 90, 70), LV_OPA_70); -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 2; -#endif -} - -static void style_mod_edit(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - uint16_t hue2 = (_hue + 300) % 360; - - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_GREEN; - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 30; - - - style->body.main_color = lv_color_mix(style->body.main_color, lv_color_hsv_to_rgb(hue2, 90, 70), LV_OPA_70); - style->body.grad_color = lv_color_mix(style->body.grad_color, lv_color_hsv_to_rgb(hue2, 90, 70), LV_OPA_70); - style->body.shadow.color = lv_color_mix(style->body.shadow.color, lv_color_hsv_to_rgb(hue2, 90, 70), LV_OPA_60); - - style->text.color = lv_color_mix(style->text.color, lv_color_hsv_to_rgb(hue2, 90, 70), LV_OPA_70); -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 3; -#endif -} - -#endif /*LV_USE_GROUP*/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the material theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_material_init(uint16_t hue, lv_font_t * font) -{ - if(font == NULL) font = LV_FONT_DEFAULT; - - _hue = hue; - _font = font; - - /*For backward compatibility initialize all theme elements with a default style */ - uint16_t i; - lv_style_t ** style_p = (lv_style_t **)&theme.style; - for(i = 0; i < LV_THEME_STYLE_COUNT; i++) { - *style_p = &def; - style_p++; - } - - basic_init(); - cont_init(); - btn_init(); - label_init(); - img_init(); - line_init(); - led_init(); - bar_init(); - slider_init(); - sw_init(); - lmeter_init(); - gauge_init(); - chart_init(); - arc_init(); - preload_init(); - calendar_init(); - cb_init(); - btnm_init(); - kb_init(); - mbox_init(); - page_init(); - ta_init(); - spinbox_init(); - list_init(); - ddlist_init(); - roller_init(); - tabview_init(); - tileview_init(); - table_init(); - win_init(); - -#if LV_USE_GROUP - theme.group.style_mod_xcb = style_mod; - theme.group.style_mod_edit_xcb = style_mod_edit; -#endif - - return &theme; -} - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_material(void) -{ - return &theme; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_material.h b/src/libs/lvgl/src/lv_themes/lv_theme_material.h deleted file mode 100644 index 1f2e1b7e..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_material.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file lv_theme_material.h - * - */ - -#ifndef LV_THEME_MATERIAL_H -#define LV_THEME_MATERIAL_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_THEME_MATERIAL - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the material theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_material_init(uint16_t hue, lv_font_t * font); - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_material(void); - -/********************** - * MACROS - **********************/ - -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_THEME_MATERIAL_H*/ diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_mono.c b/src/libs/lvgl/src/lv_themes/lv_theme_mono.c deleted file mode 100644 index 9c2e7743..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_mono.c +++ /dev/null @@ -1,525 +0,0 @@ -/** - * @file lv_theme_templ.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_theme.h" - -#if LV_USE_THEME_MONO - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static lv_theme_t theme; -static lv_style_t def; -static lv_style_t scr; - -/*Static style definitions*/ -static lv_style_t light_plain; -static lv_style_t dark_plain; -static lv_style_t light_frame; -static lv_style_t dark_frame; - -/*Saved input parameters*/ -static lv_font_t * _font; - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void basic_init(void) -{ - lv_style_copy(&def, &lv_style_plain); /*Initialize the default style*/ - def.body.main_color = LV_COLOR_WHITE; - def.body.grad_color = LV_COLOR_WHITE; - def.body.radius = 0; - def.body.opa = LV_OPA_COVER; - def.body.padding.left = LV_DPI / 10; - def.body.padding.right = LV_DPI / 10; - def.body.padding.top = LV_DPI / 10; - def.body.padding.bottom = LV_DPI / 10; - def.body.padding.inner = LV_DPI / 10; - 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.text.font = _font; - def.text.color = LV_COLOR_BLACK; - def.text.letter_space = 1; - def.text.line_space = 1; - - def.line.color = LV_COLOR_BLACK; - def.line.opa = LV_OPA_COVER; - def.line.width = 1; - - def.image.color = LV_COLOR_BLACK; - def.image.intense = LV_OPA_TRANSP; - def.image.opa = LV_OPA_COVER; - - 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; - - lv_style_copy(&dark_plain, &light_plain); - dark_plain.body.main_color = LV_COLOR_BLACK; - dark_plain.body.grad_color = LV_COLOR_BLACK; - dark_plain.body.border.color = LV_COLOR_WHITE; - dark_plain.text.color = LV_COLOR_WHITE; - dark_plain.line.color = LV_COLOR_WHITE; - dark_plain.image.color = LV_COLOR_WHITE; - - lv_style_copy(&dark_frame, &dark_plain); - dark_frame.body.radius = LV_DPI / 20; - - theme.style.bg = &def; - theme.style.scr = &scr; - theme.style.panel = &light_frame; -} - -static void cont_init(void) -{ -#if LV_USE_CONT != 0 - - theme.style.cont = &def; -#endif -} - -static void btn_init(void) -{ -#if LV_USE_BTN != 0 - - theme.style.btn.rel = &light_frame; - theme.style.btn.pr = &dark_frame; - theme.style.btn.tgl_rel = &dark_frame; - theme.style.btn.tgl_pr = &light_frame; - theme.style.btn.ina = &light_frame; -#endif -} - -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; -#endif -} - -static void img_init(void) -{ -#if LV_USE_IMG != 0 - - theme.style.img.light = &def; - theme.style.img.dark = &def; -#endif -} - -static void line_init(void) -{ -#if LV_USE_LINE != 0 - theme.style.line.decor = NULL; -#endif -} - -static void led_init(void) -{ -#if LV_USE_LED != 0 - static lv_style_t led; - lv_style_copy(&led, &light_frame); - 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 -} - -static void bar_init(void) -{ -#if LV_USE_BAR - static lv_style_t bar_bg; - static lv_style_t bar_indic; - - lv_style_copy(&bar_bg, &light_frame); - bar_bg.body.padding.left = LV_DPI / 15; - bar_bg.body.padding.right = LV_DPI / 15; - bar_bg.body.padding.top = LV_DPI / 15; - bar_bg.body.padding.bottom = LV_DPI / 15; - bar_bg.body.radius = LV_RADIUS_CIRCLE; - - lv_style_copy(&bar_indic, &dark_frame); - bar_indic.body.padding.left = LV_DPI / 30; - bar_indic.body.padding.right = LV_DPI / 30; - bar_indic.body.padding.top = LV_DPI / 30; - bar_indic.body.padding.bottom = LV_DPI / 30; - bar_indic.body.radius = LV_RADIUS_CIRCLE; - - theme.style.bar.bg = &bar_bg; - theme.style.bar.indic = &bar_indic; -#endif -} - -static void slider_init(void) -{ -#if LV_USE_SLIDER != 0 - static lv_style_t slider_knob; - lv_style_copy(&slider_knob, &light_frame); - slider_knob.body.radius = LV_RADIUS_CIRCLE; - slider_knob.body.padding.left = LV_DPI / 30; - slider_knob.body.padding.right = LV_DPI / 30; - slider_knob.body.padding.top = LV_DPI / 30; - slider_knob.body.padding.bottom = LV_DPI / 30; - - theme.style.slider.bg = theme.style.bar.bg; - theme.style.slider.indic = theme.style.bar.indic; - theme.style.slider.knob = &slider_knob; -#endif -} - -static void sw_init(void) -{ -#if LV_USE_SW != 0 - - theme.style.sw.bg = theme.style.slider.bg; - theme.style.sw.indic = theme.style.slider.indic; - theme.style.sw.knob_off = theme.style.slider.knob; - theme.style.sw.knob_on = theme.style.slider.knob; -#endif -} - -static void lmeter_init(void) -{ -#if LV_USE_LMETER != 0 - static lv_style_t lmeter_bg; - lv_style_copy(&lmeter_bg, &light_frame); - lmeter_bg.body.opa = LV_OPA_TRANSP; - lmeter_bg.body.main_color = LV_COLOR_BLACK; - lmeter_bg.body.grad_color = LV_COLOR_BLACK; - lmeter_bg.body.padding.left = LV_DPI / 20; - lmeter_bg.body.padding.inner = LV_DPI / 8; - lmeter_bg.line.color = LV_COLOR_WHITE; - lmeter_bg.line.width = 1; - - theme.style.lmeter = &lmeter_bg; -#endif -} - -static void gauge_init(void) -{ -#if LV_USE_GAUGE != 0 - static lv_style_t gauge_bg; - lv_style_copy(&gauge_bg, theme.style.lmeter); - gauge_bg.line.color = LV_COLOR_BLACK; - gauge_bg.line.width = 1; - - theme.style.gauge = &gauge_bg; -#endif -} - -static void chart_init(void) -{ -#if LV_USE_CHART - theme.style.chart = &light_frame; -#endif -} - -static void calendar_init(void) -{ -#if LV_USE_CALENDAR - static lv_style_t box; - lv_style_copy(&box, &light_plain); - box.body.padding.top = LV_DPI / 20; - box.body.padding.bottom = LV_DPI / 20; - - /*Can't handle highlighted dates in this theme*/ - theme.style.calendar.week_box = &box; - theme.style.calendar.today_box = &box; -#endif -} - -static void cb_init(void) -{ -#if LV_USE_CB != 0 - - theme.style.cb.bg = &lv_style_transp; - theme.style.cb.box.rel = &light_frame; - theme.style.cb.box.pr = &dark_frame; - theme.style.cb.box.tgl_rel = &dark_frame; - theme.style.cb.box.tgl_pr = &light_frame; - theme.style.cb.box.ina = &light_frame; -#endif -} - -static void btnm_init(void) -{ -#if LV_USE_BTNM - - theme.style.btnm.bg = &light_frame; - theme.style.btnm.btn.rel = &light_frame; - theme.style.btnm.btn.pr = &dark_frame; - theme.style.btnm.btn.tgl_rel = &dark_frame; - theme.style.btnm.btn.tgl_pr = &light_frame; - theme.style.btnm.btn.ina = &light_frame; -#endif -} - -static void kb_init(void) -{ -#if LV_USE_KB - theme.style.kb.bg = &lv_style_transp_fit; - theme.style.kb.btn.rel = &light_frame; - theme.style.kb.btn.pr = &light_frame; - theme.style.kb.btn.tgl_rel = &dark_frame; - theme.style.kb.btn.tgl_pr = &dark_frame; - theme.style.kb.btn.ina = &light_frame; -#endif -} - -static void mbox_init(void) -{ -#if LV_USE_MBOX - - theme.style.mbox.bg = &dark_frame; - theme.style.mbox.btn.bg = &lv_style_transp_fit; - theme.style.mbox.btn.rel = &light_frame; - theme.style.mbox.btn.pr = &dark_frame; -#endif -} - -static void page_init(void) -{ -#if LV_USE_PAGE - - theme.style.page.bg = &light_frame; - theme.style.page.scrl = &light_frame; - theme.style.page.sb = &dark_frame; -#endif -} - -static void ta_init(void) -{ -#if LV_USE_TA - - theme.style.ta.area = &light_frame; - theme.style.ta.oneline = &light_frame; - theme.style.ta.cursor = NULL; /*Let library to calculate the cursor's style*/ - theme.style.ta.sb = &dark_frame; -#endif -} - -static void list_init(void) -{ -#if LV_USE_LIST != 0 - - theme.style.list.sb = &dark_frame; - theme.style.list.bg = &light_frame; - theme.style.list.scrl = &lv_style_transp_fit; - theme.style.list.btn.rel = &light_plain; - theme.style.list.btn.pr = &dark_plain; - theme.style.list.btn.tgl_rel = &dark_plain; - theme.style.list.btn.tgl_pr = &light_plain; - theme.style.list.btn.ina = &light_plain; -#endif -} - -static void ddlist_init(void) -{ -#if LV_USE_DDLIST != 0 - static lv_style_t bg; - lv_style_copy(&bg, &light_frame); - bg.text.line_space = LV_DPI / 12; - - theme.style.ddlist.bg = &bg; - theme.style.ddlist.sel = &dark_plain; - theme.style.ddlist.sb = &dark_frame; -#endif -} - -static void roller_init(void) -{ -#if LV_USE_ROLLER != 0 - static lv_style_t bg; - lv_style_copy(&bg, &light_frame); - bg.text.line_space = LV_DPI / 12; - - theme.style.roller.bg = &bg; - theme.style.roller.sel = &dark_frame; -#endif -} - -static void tabview_init(void) -{ -#if LV_USE_TABVIEW != 0 - - theme.style.tabview.bg = &light_frame; - theme.style.tabview.indic = &light_plain; - theme.style.tabview.btn.bg = &lv_style_transp_fit; - theme.style.tabview.btn.rel = &light_frame; - theme.style.tabview.btn.pr = &dark_frame; - theme.style.tabview.btn.tgl_rel = &dark_frame; - theme.style.tabview.btn.tgl_pr = &light_frame; -#endif -} - -static void win_init(void) -{ -#if LV_USE_WIN != 0 - static lv_style_t win_header; - lv_style_copy(&win_header, &dark_plain); - win_header.body.padding.left = LV_DPI / 30; - win_header.body.padding.right = LV_DPI / 30; - win_header.body.padding.top = LV_DPI / 30; - win_header.body.padding.bottom = LV_DPI / 30; - - theme.style.win.bg = &light_frame; - theme.style.win.sb = &dark_frame; - theme.style.win.header = &win_header; - theme.style.win.content = &lv_style_transp; - theme.style.win.btn.rel = &light_frame; - theme.style.win.btn.pr = &dark_frame; -#endif -} - -#if LV_USE_GROUP - -static void style_mod(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 20; -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 2; -#endif -} - -static void style_mod_edit(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 20; -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 3; -#endif -} - -#endif /*LV_USE_GROUP*/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the mono theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color; is not used - * in lv_theme_mono - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_mono_init(uint16_t hue, lv_font_t * font) -{ - - (void)hue; /*Unused*/ - - if(font == NULL) font = LV_FONT_DEFAULT; - - _font = font; - - /*For backward compatibility initialize all theme elements with a default style */ - uint16_t i; - lv_style_t ** style_p = (lv_style_t **)&theme.style; - for(i = 0; i < LV_THEME_STYLE_COUNT; i++) { - *style_p = &def; - style_p++; - } - - basic_init(); - cont_init(); - btn_init(); - label_init(); - img_init(); - line_init(); - led_init(); - bar_init(); - slider_init(); - sw_init(); - lmeter_init(); - gauge_init(); - chart_init(); - calendar_init(); - cb_init(); - btnm_init(); - kb_init(); - mbox_init(); - page_init(); - ta_init(); - list_init(); - ddlist_init(); - roller_init(); - tabview_init(); - win_init(); - -#if LV_USE_GROUP - theme.group.style_mod_xcb = style_mod; - theme.group.style_mod_edit_xcb = style_mod_edit; -#endif - - return &theme; -} - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_mono(void) -{ - return &theme; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_mono.h b/src/libs/lvgl/src/lv_themes/lv_theme_mono.h deleted file mode 100644 index 6730d1e9..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_mono.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file lv_theme_mono.h - * - */ - -#ifndef LV_THEME_MONO_H -#define LV_THEME_MONO_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_THEME_MONO - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the mono theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_mono_init(uint16_t hue, lv_font_t * font); - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_mono(void); - -/********************** - * MACROS - **********************/ - -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_THEME_MONO_H*/ diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_nemo.c b/src/libs/lvgl/src/lv_themes/lv_theme_nemo.c deleted file mode 100644 index 564c232b..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_nemo.c +++ /dev/null @@ -1,929 +0,0 @@ -/** - * @file lv_theme_nemo.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_theme.h" - -#if LV_USE_THEME_NEMO - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -static uint16_t _hue; -static lv_font_t * _font; -static lv_font_t * _font; -static lv_font_t * _font; - -static lv_theme_t theme; -static lv_style_t def; -static lv_style_t bg; -static lv_style_t scr; -static lv_style_t panel; /*General fancy background (e.g. to chart or ta)*/ -static lv_style_t sb; -static lv_style_t btn_rel, btn_pr, btn_trel, btn_tpr, btn_ina; - -#if LV_USE_BAR -static lv_style_t bar_bg, bar_indic; -#endif - -#if LV_USE_SLIDER -static lv_style_t slider_knob; -#endif - -#if LV_USE_LMETER -static lv_style_t lmeter_bg; -#endif - -#if LV_USE_DDLIST -static lv_style_t ddlist_bg, ddlist_sel; -#endif - -#if LV_USE_BTNM -static lv_style_t btnm_bg, btnm_rel, btnm_pr, btnm_trel, btnm_ina; -#endif - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void basic_init(void) -{ - /*Default*/ - lv_style_copy(&def, &lv_style_plain); - def.body.opa = LV_OPA_COVER; - def.glass = 0; - - def.body.main_color = lv_color_hex3(0x222); - def.body.grad_color = lv_color_hex3(0x222); - def.body.radius = 0; - def.body.padding.left = LV_DPI / 8; - def.body.padding.right = LV_DPI / 8; - def.body.padding.top = LV_DPI / 8; - def.body.padding.bottom = LV_DPI / 8; - def.body.padding.inner = LV_DPI / 8; - def.body.border.color = LV_COLOR_SILVER; - def.body.border.width = 1; - 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; - def.text.letter_space = 1; - def.text.line_space = 2; - - def.image.color = lv_color_hex3(0xDDD); - def.image.intense = LV_OPA_TRANSP; - - def.line.color = lv_color_hex3(0xDDD); - def.line.width = 1; - - /*Background*/ - lv_style_copy(&bg, &def); - bg.body.main_color = lv_color_hex3(0x005); - bg.body.grad_color = lv_color_hex3(0x045); - bg.body.border.width = 2; - bg.body.border.color = lv_color_hex3(0x666); - bg.body.shadow.color = LV_COLOR_SILVER; - - lv_style_copy(&scr, &bg); - scr.body.padding.bottom = 0; - scr.body.padding.top = 0; - scr.body.padding.left = 0; - scr.body.padding.right = 0; - - /*Panel*/ - lv_style_copy(&panel, &def); - panel.body.radius = LV_DPI / 10; - panel.body.main_color = lv_color_hex3(0x500); - panel.body.grad_color = lv_color_hex3(0x505); - panel.body.border.color = lv_color_hex3(0xccc); - panel.body.border.width = 2; - panel.body.border.opa = LV_OPA_60; - panel.text.color = lv_color_hsv_to_rgb(_hue, 8, 96); - panel.line.color = lv_color_hsv_to_rgb(_hue, 20, 70); - - /*Scrollbar*/ - lv_style_copy(&sb, &def); - sb.body.opa = LV_OPA_50; - sb.body.radius = LV_RADIUS_CIRCLE; - sb.body.border.color = LV_COLOR_SILVER; - sb.body.border.opa = LV_OPA_40; - sb.body.border.width = 1; - sb.body.main_color = lv_color_hsv_to_rgb(_hue, 33, 92); - sb.body.grad_color = lv_color_hsv_to_rgb(_hue, 33, 92); - sb.body.padding.left = 1; - sb.body.padding.right = 1; - sb.body.padding.top = 1; - sb.body.padding.bottom = 1; - sb.body.padding.inner = LV_DPI / 15; /*Scrollbar width*/ - - theme.style.bg = &bg; - theme.style.scr = &scr; - theme.style.panel = &panel; -} - -static void btn_init(void) -{ -#if LV_USE_BTN != 0 - lv_style_copy(&btn_rel, &def); - btn_rel.glass = 0; - btn_rel.body.opa = LV_OPA_TRANSP; - btn_rel.body.radius = LV_RADIUS_CIRCLE; - btn_rel.body.border.width = 2; - btn_rel.body.border.color = lv_color_hsv_to_rgb(_hue, 70, 90); - btn_rel.body.border.opa = LV_OPA_80; - btn_rel.body.padding.left = LV_DPI / 4; - btn_rel.body.padding.right = LV_DPI / 4; - btn_rel.body.padding.top = LV_DPI / 6; - btn_rel.body.padding.bottom = LV_DPI / 6; - btn_rel.body.padding.inner = LV_DPI / 10; - btn_rel.text.color = lv_color_hsv_to_rgb(_hue, 8, 96); - btn_rel.text.font = _font; - - lv_style_copy(&btn_pr, &btn_rel); - btn_pr.body.opa = LV_OPA_COVER; - btn_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 50, 50); - btn_pr.body.grad_color = lv_color_hsv_to_rgb(_hue, 50, 50); - btn_pr.body.border.opa = LV_OPA_60; - btn_pr.text.font = _font; - btn_pr.text.color = lv_color_hsv_to_rgb(_hue, 10, 100); - - lv_style_copy(&btn_trel, &btn_pr); - btn_trel.body.opa = LV_OPA_COVER; - btn_trel.body.main_color = lv_color_hsv_to_rgb(_hue, 50, 60); - btn_trel.body.grad_color = lv_color_hsv_to_rgb(_hue, 50, 60); - btn_trel.body.border.opa = LV_OPA_60; - btn_trel.body.border.color = lv_color_hsv_to_rgb(_hue, 80, 90); - btn_trel.text.font = _font; - btn_trel.text.color = lv_color_hsv_to_rgb(_hue, 0, 100); - - lv_style_copy(&btn_tpr, &btn_trel); - btn_tpr.body.opa = LV_OPA_COVER; - btn_tpr.body.main_color = lv_color_hsv_to_rgb(_hue, 50, 50); - btn_tpr.body.grad_color = lv_color_hsv_to_rgb(_hue, 50, 50); - btn_tpr.body.border.opa = LV_OPA_60; - btn_tpr.body.border.color = lv_color_hsv_to_rgb(_hue, 80, 70); - btn_tpr.text.font = _font; - btn_tpr.text.color = lv_color_hsv_to_rgb(_hue, 10, 90); - - lv_style_copy(&btn_ina, &btn_rel); - btn_ina.body.border.opa = LV_OPA_60; - btn_ina.body.border.color = lv_color_hsv_to_rgb(_hue, 10, 50); - btn_ina.text.font = _font; - btn_ina.text.color = lv_color_hsv_to_rgb(_hue, 10, 90); - - theme.style.btn.rel = &btn_rel; - theme.style.btn.pr = &btn_pr; - theme.style.btn.tgl_rel = &btn_trel; - theme.style.btn.tgl_pr = &btn_tpr; - theme.style.btn.ina = &btn_ina; -#endif -} - -static void label_init(void) -{ -#if LV_USE_LABEL != 0 - static lv_style_t label_prim, label_sec, label_hint; - - lv_style_copy(&label_prim, &def); - label_prim.text.font = _font; - label_prim.text.color = lv_color_hsv_to_rgb(_hue, 5, 96); - - lv_style_copy(&label_sec, &label_prim); - label_sec.text.color = lv_color_hsv_to_rgb(_hue, 40, 85); - - lv_style_copy(&label_hint, &label_prim); - label_hint.text.color = lv_color_hsv_to_rgb(_hue, 20, 70); - - theme.style.label.prim = &label_prim; - theme.style.label.sec = &label_sec; - theme.style.label.hint = &label_hint; -#endif -} - -static void bar_init(void) -{ -#if LV_USE_BAR - lv_style_copy(&bar_bg, &def); - bar_bg.body.opa = LV_OPA_30; - bar_bg.body.radius = LV_RADIUS_CIRCLE; - bar_bg.body.main_color = LV_COLOR_WHITE; - bar_bg.body.grad_color = LV_COLOR_SILVER; - bar_bg.body.border.width = 2; - bar_bg.body.border.color = LV_COLOR_SILVER; - bar_bg.body.border.opa = LV_OPA_20; - bar_bg.body.padding.left = 0; - bar_bg.body.padding.right = 0; - bar_bg.body.padding.top = LV_DPI / 10; - bar_bg.body.padding.bottom = LV_DPI / 10; - bar_bg.body.padding.inner = 0; - - lv_style_copy(&bar_indic, &def); - bar_indic.body.radius = LV_RADIUS_CIRCLE; - bar_indic.body.border.width = 2; - bar_indic.body.border.color = LV_COLOR_SILVER; - bar_indic.body.border.opa = LV_OPA_70; - bar_indic.body.padding.left = 0; - bar_indic.body.padding.right = 0; - bar_indic.body.padding.top = 0; - bar_indic.body.padding.bottom = 0; - bar_indic.body.shadow.width = LV_DPI / 20; - bar_indic.body.shadow.color = lv_color_hsv_to_rgb(_hue, 20, 90); - bar_indic.body.main_color = lv_color_hsv_to_rgb(_hue, 40, 80); - bar_indic.body.grad_color = lv_color_hsv_to_rgb(_hue, 40, 80); - - theme.style.bar.bg = &bar_bg; - theme.style.bar.indic = &bar_indic; -#endif -} - -static void img_init(void) -{ -#if LV_USE_IMG != 0 - static lv_style_t img_light, img_dark; - lv_style_copy(&img_light, &def); - img_light.image.color = lv_color_hsv_to_rgb(_hue, 15, 85); - img_light.image.intense = LV_OPA_80; - - lv_style_copy(&img_dark, &def); - img_light.image.color = lv_color_hsv_to_rgb(_hue, 85, 65); - img_light.image.intense = LV_OPA_80; - - theme.style.img.light = &img_light; - theme.style.img.dark = &img_dark; -#endif -} - -static void line_init(void) -{ -#if LV_USE_LINE != 0 - static lv_style_t line_decor; - lv_style_copy(&line_decor, &def); - line_decor.line.color = lv_color_hsv_to_rgb(_hue, 50, 50); - line_decor.line.width = 1; - - theme.style.line.decor = &line_decor; -#endif -} - -static void led_init(void) -{ -#if LV_USE_LED != 0 - static lv_style_t led; - lv_style_copy(&led, &lv_style_pretty_color); - led.body.shadow.width = LV_DPI / 10; - led.body.radius = LV_RADIUS_CIRCLE; - led.body.border.width = LV_DPI / 30; - led.body.border.opa = LV_OPA_30; - led.body.main_color = lv_color_hsv_to_rgb(_hue, 100, 100); - led.body.grad_color = lv_color_hsv_to_rgb(_hue, 100, 40); - led.body.border.color = lv_color_hsv_to_rgb(_hue, 60, 60); - led.body.shadow.color = lv_color_hsv_to_rgb(_hue, 100, 100); - - theme.style.led = &led; -#endif -} - -static void slider_init(void) -{ -#if LV_USE_SLIDER != 0 - lv_style_copy(&slider_knob, &def); - slider_knob.body.opa = LV_OPA_60; - slider_knob.body.radius = LV_RADIUS_CIRCLE; - slider_knob.body.main_color = LV_COLOR_PURPLE; - slider_knob.body.grad_color = LV_COLOR_SILVER; - slider_knob.body.border.width = 2; - slider_knob.body.border.color = LV_COLOR_ORANGE; - slider_knob.body.border.opa = LV_OPA_50; - - theme.style.slider.bg = &bar_bg; - theme.style.slider.indic = &bar_indic; - theme.style.slider.knob = &slider_knob; -#endif -} - -static void sw_init(void) -{ -#if LV_USE_SW != 0 - static lv_style_t sw_bg, sw_indic, sw_knob; - lv_style_copy(&sw_bg, &bar_bg); - sw_bg.body.opa = LV_OPA_COVER; - sw_bg.body.padding.left = -2; - sw_bg.body.padding.right = -2; - sw_bg.body.padding.top = -2; - sw_bg.body.padding.bottom = -2; - sw_bg.body.main_color = lv_color_hex3(0x666); - sw_bg.body.grad_color = lv_color_hex3(0x999); - sw_bg.body.border.width = 2; - sw_bg.body.border.opa = LV_OPA_50; - - lv_style_copy(&sw_indic, &bar_indic); - sw_indic.body.shadow.width = LV_DPI / 20; - sw_indic.body.padding.left = 0; - sw_indic.body.padding.right = 0; - sw_indic.body.padding.top = 0; - sw_indic.body.padding.bottom = 0; - - lv_style_copy(&sw_knob, &slider_knob); - sw_knob.body.opa = LV_OPA_80; - - theme.style.sw.bg = &sw_bg; - theme.style.sw.indic = &sw_indic; - theme.style.sw.knob_off = &sw_knob; - theme.style.sw.knob_on = &sw_knob; -#endif -} - -static void lmeter_init(void) -{ -#if LV_USE_LMETER != 0 - lv_style_copy(&lmeter_bg, &def); - lmeter_bg.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 70); - lmeter_bg.body.grad_color = lv_color_hsv_to_rgb(_hue, 80, 80); - lmeter_bg.body.padding.left = LV_DPI / 8; /*Scale line length*/ - lmeter_bg.line.color = lv_color_hex3(0x500); - lmeter_bg.line.width = 2; - - theme.style.lmeter = &lmeter_bg; - -#endif -} - -static void gauge_init(void) -{ -#if LV_USE_GAUGE != 0 - static lv_style_t gauge_bg; - lv_style_copy(&gauge_bg, &def); - gauge_bg.body.main_color = lv_color_hsv_to_rgb(_hue, 20, 100); - gauge_bg.body.grad_color = gauge_bg.body.main_color; - gauge_bg.body.padding.left = LV_DPI / 16; /*Scale line length*/ - gauge_bg.body.padding.right = LV_DPI / 16; /*Scale line length*/ - gauge_bg.body.padding.top = LV_DPI / 20; /*Needle center size*/ - gauge_bg.body.padding.bottom = LV_DPI / 20; /*Needle center size*/ - gauge_bg.body.padding.inner = LV_DPI / 12; /*Label - scale distance*/ - gauge_bg.body.border.color = lv_color_hex3(0x500); - gauge_bg.line.color = lv_color_hsv_to_rgb(_hue, 80, 75); - gauge_bg.line.width = 2; - gauge_bg.text.color = lv_color_hsv_to_rgb(_hue, 10, 90); - gauge_bg.text.font = _font; - - theme.style.gauge = &gauge_bg; -#endif -} - -static void arc_init(void) -{ -#if LV_USE_ARC != 0 - - static lv_style_t arc; - lv_style_copy(&arc, &def); - arc.line.width = 10; - arc.line.color = lv_color_hsv_to_rgb(_hue, 70, 90); - arc.line.rounded = 1; - - /*For preloader*/ - arc.body.border.width = 0; - - theme.style.arc = &arc; -#endif -} - -static void preload_init(void) -{ -#if LV_USE_PRELOAD != 0 - - theme.style.preload = theme.style.arc; -#endif -} - -static void chart_init(void) -{ -#if LV_USE_CHART - theme.style.chart = &panel; -#endif -} - -static void calendar_init(void) -{ -#if LV_USE_CALENDAR != 0 - static lv_style_t ina_days; - lv_style_copy(&ina_days, &def); - ina_days.text.color = lv_color_hsv_to_rgb(_hue, 0, 50); - - static lv_style_t high_days; - lv_style_copy(&high_days, &def); - high_days.text.color = lv_color_hsv_to_rgb(_hue, 50, 90); - - static lv_style_t week_box; - lv_style_copy(&week_box, &def); - week_box.body.opa = LV_OPA_TRANSP; - week_box.body.border.color = theme.style.panel->body.border.color; - week_box.body.padding.top = LV_DPI / 20; - week_box.body.padding.bottom = LV_DPI / 20; - - static lv_style_t today_box; - lv_style_copy(&today_box, &def); - today_box.body.main_color = LV_COLOR_WHITE; - today_box.body.grad_color = LV_COLOR_WHITE; - today_box.body.padding.top = LV_DPI / 20; - today_box.body.padding.bottom = LV_DPI / 20; - today_box.body.radius = 0; - - theme.style.calendar.bg = theme.style.panel; - theme.style.calendar.header = theme.style.label.prim; - theme.style.calendar.inactive_days = theme.style.label.hint; - theme.style.calendar.highlighted_days = theme.style.label.sec; - theme.style.calendar.week_box = &week_box; - theme.style.calendar.today_box = &week_box; - theme.style.calendar.header_pr = theme.style.label.prim; -#endif -} - -static void cb_init(void) -{ -#if LV_USE_CB != 0 - static lv_style_t cb_bg, cb_rel, cb_pr, cb_trel, cb_tpr, cb_ina; - lv_style_copy(&cb_rel, &bg); - cb_rel.body.radius = LV_DPI / 20; - cb_rel.body.border.width = 1; - cb_rel.body.border.color = LV_COLOR_ORANGE; - cb_rel.body.main_color = LV_COLOR_PURPLE; - cb_rel.body.grad_color = LV_COLOR_SILVER; - - lv_style_copy(&cb_bg, &bg); - cb_bg.body.opa = LV_OPA_TRANSP; - cb_bg.body.border.width = 0; - cb_bg.body.padding.inner = LV_DPI / 8; - cb_bg.body.padding.left = 0; - cb_bg.body.padding.right = 0; - cb_bg.body.padding.top = 0; - cb_bg.body.padding.bottom = 0; - cb_bg.text.font = _font; - - lv_style_copy(&cb_pr, &cb_rel); - cb_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 90); - cb_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 82); - - lv_style_copy(&cb_trel, &cb_rel); - cb_trel.body.border.width = 4; - cb_trel.body.border.color = LV_COLOR_WHITE; - cb_trel.body.border.opa = LV_OPA_60; - cb_trel.body.main_color = lv_color_hsv_to_rgb(_hue, 50, 82); - cb_trel.body.grad_color = lv_color_hsv_to_rgb(_hue, 50, 62); - - lv_style_copy(&cb_tpr, &cb_trel); - cb_tpr.body.border.color = LV_COLOR_SILVER; - cb_tpr.body.border.opa = LV_OPA_70; - cb_tpr.body.main_color = lv_color_hsv_to_rgb(_hue, 50, 72); - cb_tpr.body.grad_color = lv_color_hsv_to_rgb(_hue, 50, 52); - - lv_style_copy(&cb_ina, &cb_trel); - cb_ina.body.border.width = 1; - cb_ina.body.border.color = LV_COLOR_GRAY; - cb_ina.body.main_color = LV_COLOR_PURPLE; - cb_ina.body.grad_color = LV_COLOR_SILVER; - - theme.style.cb.bg = &cb_bg; - theme.style.cb.box.rel = &cb_rel; - theme.style.cb.box.pr = &cb_pr; - theme.style.cb.box.tgl_rel = &cb_trel; - theme.style.cb.box.tgl_pr = &cb_tpr; - theme.style.cb.box.ina = &cb_ina; -#endif -} - -static void btnm_init(void) -{ -#if LV_USE_BTNM - lv_style_copy(&btnm_bg, &lv_style_transp_tight); - btnm_bg.body.border.width = 1; - btnm_bg.body.border.color = lv_color_hsv_to_rgb(_hue, 60, 80); - btnm_bg.body.border.opa = LV_OPA_COVER; - btnm_bg.body.radius = LV_DPI / 8; - - lv_style_copy(&btnm_rel, &lv_style_plain); - btnm_rel.body.opa = LV_OPA_TRANSP; - btnm_rel.body.radius = LV_DPI / 8; - btnm_rel.text.color = lv_color_hsv_to_rgb(_hue, 60, 80); - btnm_rel.text.font = _font; - - lv_style_copy(&btnm_pr, &lv_style_plain); - btnm_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 40, 70); - btnm_pr.body.grad_color = lv_color_hsv_to_rgb(_hue, 40, 70); - btnm_pr.body.radius = LV_DPI / 8; - btnm_pr.text.color = lv_color_hsv_to_rgb(_hue, 40, 40); - btnm_pr.text.font = _font; - - lv_style_copy(&btnm_trel, &btnm_rel); - btnm_trel.body.border.color = lv_color_hsv_to_rgb(_hue, 80, 80); - btnm_trel.body.border.width = 3; - - lv_style_copy(&btnm_ina, &btnm_rel); - btnm_ina.text.color = lv_color_hsv_to_rgb(_hue, 10, 60); - - theme.style.btnm.bg = &btnm_bg; - theme.style.btnm.btn.rel = &btnm_rel; - theme.style.btnm.btn.pr = &btnm_pr; - theme.style.btnm.btn.tgl_rel = &btnm_trel; - theme.style.btnm.btn.tgl_pr = &btnm_pr; - theme.style.btnm.btn.ina = &btnm_ina; -#endif -} - -static void kb_init(void) -{ -#if LV_USE_KB - theme.style.kb.bg = &btnm_bg; - theme.style.kb.btn.rel = &btnm_rel; - theme.style.kb.btn.pr = &btnm_pr; - theme.style.kb.btn.tgl_rel = &btnm_trel; - theme.style.kb.btn.tgl_pr = &btnm_pr; - theme.style.kb.btn.ina = &btnm_ina; -#endif -} - -static void mbox_init(void) -{ -#if LV_USE_MBOX - static lv_style_t mbox_bg; - lv_style_copy(&mbox_bg, &panel); - mbox_bg.body.shadow.width = LV_DPI / 12; - - theme.style.mbox.bg = &mbox_bg; - theme.style.mbox.btn.bg = &lv_style_transp; - theme.style.mbox.btn.rel = &btn_trel; - theme.style.mbox.btn.pr = &btn_tpr; -#endif -} - -static void page_init(void) -{ -#if LV_USE_PAGE - theme.style.page.bg = &panel; - theme.style.page.scrl = &lv_style_transp_fit; - theme.style.page.sb = &sb; -#endif -} - -static void ta_init(void) -{ -#if LV_USE_TA - theme.style.ta.area = &panel; - theme.style.ta.oneline = &panel; - theme.style.ta.cursor = NULL; - theme.style.ta.sb = &sb; -#endif -} - -static void spinbox_init(void) -{ -#if LV_USE_SPINBOX - theme.style.spinbox.bg = &panel; - theme.style.spinbox.cursor = theme.style.ta.cursor; - theme.style.spinbox.sb = theme.style.ta.sb; -#endif -} - -static void list_init(void) -{ -#if LV_USE_LIST != 0 - static lv_style_t list_bg, list_rel, list_pr, list_trel, list_tpr, list_ina; - lv_style_copy(&list_rel, &def); - list_rel.body.opa = LV_OPA_TRANSP; - list_rel.body.border.width = 1; - list_rel.body.border.color = lv_color_hsv_to_rgb(_hue, 50, 85); - list_rel.body.border.opa = LV_OPA_COVER; - list_rel.text.color = lv_color_hsv_to_rgb(_hue, 10, 94); - list_rel.text.font = _font; - - lv_style_copy(&list_pr, &list_rel); - 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); - list_pr.text.color = lv_color_hsv_to_rgb(_hue, 7, 96); - - lv_style_copy(&list_trel, &list_rel); - lv_style_copy(&list_tpr, &list_pr); - lv_style_copy(&list_ina, &def); - - lv_style_copy(&list_bg, &list_rel); - list_bg.body.padding.left = 0; - list_bg.body.padding.right = 0; - list_bg.body.padding.top = 0; - list_bg.body.padding.bottom = 0; - - theme.style.list.sb = &sb; - theme.style.list.bg = &list_bg; - theme.style.list.scrl = &lv_style_transp_tight; - theme.style.list.btn.rel = &list_rel; - theme.style.list.btn.pr = &list_pr; - theme.style.list.btn.tgl_rel = &list_trel; - theme.style.list.btn.tgl_pr = &list_tpr; - theme.style.list.btn.ina = &list_ina; -#endif -} - -static void ddlist_init(void) -{ -#if LV_USE_DDLIST != 0 - lv_style_copy(&ddlist_bg, &panel); - ddlist_bg.text.line_space = LV_DPI / 8; - ddlist_bg.body.padding.left = LV_DPI / 6; - ddlist_bg.body.padding.right = LV_DPI / 6; - ddlist_bg.body.padding.top = LV_DPI / 6; - ddlist_bg.body.padding.bottom = LV_DPI / 6; - - lv_style_copy(&ddlist_sel, &panel); - ddlist_sel.body.main_color = lv_color_hsv_to_rgb(_hue, 45, 70); - ddlist_sel.body.grad_color = lv_color_hsv_to_rgb(_hue, 45, 70); - ddlist_sel.body.opa = LV_OPA_COVER; - ddlist_sel.body.radius = 0; - - theme.style.ddlist.bg = &ddlist_bg; - theme.style.ddlist.sel = &ddlist_sel; - theme.style.ddlist.sb = &sb; -#endif -} - -static void roller_init(void) -{ -#if LV_USE_ROLLER != 0 - static lv_style_t roller_bg, roller_sel; - lv_style_copy(&roller_bg, &ddlist_bg); - roller_bg.text.line_space = LV_DPI / 6; - roller_bg.body.radius = LV_DPI / 20; - roller_bg.body.main_color = lv_color_hex3(0x500); - roller_bg.body.grad_color = lv_color_hex3(0x005); - roller_bg.body.border.opa = LV_OPA_30; - roller_bg.text.opa = LV_OPA_70; - roller_bg.text.color = lv_color_hsv_to_rgb(_hue, 20, 70); - roller_bg.body.shadow.width = 0; - - lv_style_copy(&roller_sel, &panel); - roller_sel.body.opa = LV_OPA_TRANSP; - roller_sel.body.radius = 0; - roller_sel.text.opa = LV_OPA_COVER; - roller_sel.text.color = lv_color_hsv_to_rgb(_hue, 70, 95); - - theme.style.roller.bg = &roller_bg; - theme.style.roller.sel = &roller_sel; -#endif -} - -static void tabview_init(void) -{ -#if LV_USE_TABVIEW != 0 - static lv_style_t tab_rel, tab_pr, tab_trel, tab_tpr, tab_indic; - lv_style_copy(&tab_rel, &def); - tab_rel.body.main_color = lv_color_hex3(0x500); - tab_rel.body.grad_color = lv_color_hex3(0x005); - tab_rel.body.padding.left = 0; - tab_rel.body.padding.right = 0; - tab_rel.body.padding.top = LV_DPI / 6; - tab_rel.body.padding.bottom = LV_DPI / 6; - tab_rel.body.padding.inner = 0; - tab_rel.body.border.width = 1; - tab_rel.body.border.color = LV_COLOR_SILVER; - tab_rel.body.border.opa = LV_OPA_40; - tab_rel.text.color = lv_color_hex3(0xDDD); - tab_rel.text.font = _font; - - lv_style_copy(&tab_pr, &tab_rel); - tab_pr.body.main_color = lv_color_hex3(0x005); - tab_pr.body.grad_color = lv_color_hex3(0x500); - - lv_style_copy(&tab_trel, &def); - tab_trel.body.opa = LV_OPA_TRANSP; - tab_trel.body.padding.left = 0; - tab_trel.body.padding.right = 0; - tab_trel.body.padding.top = LV_DPI / 6; - tab_trel.body.padding.bottom = LV_DPI / 6; - tab_trel.body.padding.inner = 0; - tab_trel.body.border.width = 1; - tab_trel.body.border.color = LV_COLOR_SILVER; - tab_trel.body.border.opa = LV_OPA_40; - tab_trel.text.color = lv_color_hsv_to_rgb(_hue, 10, 94); - tab_trel.text.font = _font; - - lv_style_copy(&tab_tpr, &def); - tab_tpr.body.main_color = LV_COLOR_GRAY; - tab_tpr.body.grad_color = LV_COLOR_GRAY; - tab_tpr.body.padding.left = 0; - tab_tpr.body.padding.right = 0; - tab_tpr.body.padding.top = LV_DPI / 6; - tab_tpr.body.padding.bottom = LV_DPI / 6; - tab_tpr.body.padding.inner = 0; - tab_tpr.body.border.width = 1; - tab_tpr.body.border.color = LV_COLOR_SILVER; - tab_tpr.body.border.opa = LV_OPA_40; - tab_tpr.text.color = lv_color_hsv_to_rgb(_hue, 10, 94); - tab_tpr.text.font = _font; - - lv_style_copy(&tab_indic, &def); - tab_indic.body.border.width = 0; - tab_indic.body.main_color = lv_color_hsv_to_rgb(_hue, 80, 87); - tab_indic.body.grad_color = lv_color_hsv_to_rgb(_hue, 80, 87); - tab_indic.body.padding.inner = LV_DPI / 10; /*Indicator height*/ - - theme.style.tabview.bg = &bg; - theme.style.tabview.indic = &tab_indic; - theme.style.tabview.btn.bg = &lv_style_transp_tight; - theme.style.tabview.btn.rel = &tab_rel; - theme.style.tabview.btn.pr = &tab_pr; - theme.style.tabview.btn.tgl_rel = &tab_trel; - theme.style.tabview.btn.tgl_pr = &tab_tpr; -#endif -} - -static void tileview_init(void) -{ -#if LV_USE_TILEVIEW != 0 - theme.style.tileview.bg = &lv_style_transp_tight; - theme.style.tileview.scrl = &lv_style_transp_tight; - theme.style.tileview.sb = theme.style.page.sb; -#endif -} - -static void table_init(void) -{ -#if LV_USE_TABLE != 0 - static lv_style_t cell; - lv_style_copy(&cell, &panel); - cell.body.radius = 0; - cell.body.border.width = 1; - - theme.style.table.bg = &lv_style_transp_tight; - theme.style.table.cell = &cell; -#endif -} - -static void win_init(void) -{ -#if LV_USE_WIN != 0 - static lv_style_t win_header; - - lv_style_copy(&win_header, &panel); - win_header.body.radius = 0; - win_header.body.padding.left = LV_DPI / 12; - win_header.body.padding.right = LV_DPI / 12; - win_header.body.padding.top = LV_DPI / 20; - win_header.body.padding.bottom = LV_DPI / 20; - win_header.body.border.opa = panel.body.border.opa; - win_header.body.border.width = panel.body.border.width; - win_header.body.border.color = lv_color_hsv_to_rgb(_hue, 20, 80); - win_header.text.color = lv_color_hsv_to_rgb(_hue, 5, 100); - - theme.style.win.bg = &bg; - theme.style.win.sb = &sb; - theme.style.win.header = &win_header; - theme.style.win.content = &lv_style_transp; - theme.style.win.btn.rel = &btn_rel; - theme.style.win.btn.pr = &btn_pr; -#endif -} - -#if LV_USE_GROUP - -static void style_mod(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - style->body.border.width = 2; - style->body.border.color = LV_COLOR_SILVER; - style->body.border.opa = LV_OPA_70; - style->body.shadow.width = LV_DPI / 20; - style->body.shadow.color = lv_color_hsv_to_rgb(_hue, 20, 90); - style->body.main_color = lv_color_hsv_to_rgb(_hue, 40, 80); - style->body.grad_color = lv_color_hsv_to_rgb(_hue, 40, 80); -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 2; -#endif -} - -static void style_mod_edit(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_GREEN; - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 20; - - style->body.main_color = lv_color_mix(style->body.main_color, LV_COLOR_GREEN, LV_OPA_70); - style->body.grad_color = lv_color_mix(style->body.grad_color, LV_COLOR_GREEN, LV_OPA_70); - style->body.shadow.color = lv_color_mix(style->body.shadow.color, LV_COLOR_GREEN, LV_OPA_60); - - style->text.color = lv_color_mix(style->text.color, LV_COLOR_GREEN, LV_OPA_70); -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 3; -#endif -} - -#endif /*LV_USE_GROUP*/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the nemo theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_nemo_init(uint16_t hue, lv_font_t * font) -{ - if(font == NULL) font = LV_FONT_DEFAULT; - - _hue = hue; - _font = font; - - /*For backward compatibility initialize all theme elements with a default style */ - uint16_t i; - lv_style_t ** style_p = (lv_style_t **)&theme.style; - for(i = 0; i < LV_THEME_STYLE_COUNT; i++) { - *style_p = &def; - style_p++; - } - - basic_init(); - btn_init(); - label_init(); - bar_init(); - img_init(); - line_init(); - led_init(); - slider_init(); - sw_init(); - lmeter_init(); - gauge_init(); - arc_init(); - preload_init(); - chart_init(); - calendar_init(); - cb_init(); - btnm_init(); - kb_init(); - mbox_init(); - page_init(); - ta_init(); - spinbox_init(); - list_init(); - ddlist_init(); - roller_init(); - tabview_init(); - tileview_init(); - table_init(); - win_init(); - -#if LV_USE_GROUP - theme.group.style_mod_xcb = style_mod; - theme.group.style_mod_edit_xcb = style_mod_edit; -#endif - - return &theme; -} - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_nemo(void) -{ - return &theme; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_nemo.h b/src/libs/lvgl/src/lv_themes/lv_theme_nemo.h deleted file mode 100644 index 5464cbfd..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_nemo.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file lv_theme_nemo.h - * - */ - -#ifndef LV_THEME_NEMO_H -#define LV_THEME_NEMO_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_THEME_NEMO - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the material theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_nemo_init(uint16_t hue, lv_font_t * font); - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_nemo(void); - -/********************** - * MACROS - **********************/ - -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_THEME_NEMO_H*/ diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_night.c b/src/libs/lvgl/src/lv_themes/lv_theme_night.c deleted file mode 100644 index c908939c..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_night.c +++ /dev/null @@ -1,847 +0,0 @@ -/** - * @file lv_theme_night.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_theme.h" - -#if LV_USE_THEME_NIGHT - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static lv_theme_t theme; -static lv_style_t def; - -/*Static style definitions*/ -static lv_style_t scr, bg, sb, panel; -static lv_style_t prim, sec, hint; - -/*Saved input parameters*/ -static uint16_t _hue; -static lv_font_t * _font; - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void basic_init(void) -{ - lv_style_copy(&def, &lv_style_pretty); /*Initialize the default style*/ - def.text.font = _font; - - lv_style_copy(&bg, &lv_style_plain); - bg.body.main_color = lv_color_hsv_to_rgb(_hue, 11, 30); - bg.body.grad_color = lv_color_hsv_to_rgb(_hue, 11, 30); - bg.text.color = lv_color_hsv_to_rgb(_hue, 5, 95); - bg.text.font = _font; - bg.image.color = lv_color_hsv_to_rgb(_hue, 5, 95); - - lv_style_copy(&scr, &bg); - scr.body.padding.bottom = 0; - scr.body.padding.top = 0; - scr.body.padding.left = 0; - scr.body.padding.right = 0; - - lv_style_copy(&sb, &def); - sb.body.main_color = lv_color_hsv_to_rgb(_hue, 30, 60); - sb.body.grad_color = lv_color_hsv_to_rgb(_hue, 30, 60); - sb.body.border.width = 0; - sb.body.padding.inner = LV_DPI / 20; - sb.body.padding.left = 0; - sb.body.padding.right = 0; - sb.body.padding.top = 0; - sb.body.padding.bottom = 0; - sb.body.radius = LV_DPI / 30; - sb.body.opa = LV_OPA_COVER; - - lv_style_copy(&panel, &bg); - panel.body.main_color = lv_color_hsv_to_rgb(_hue, 11, 18); - panel.body.grad_color = lv_color_hsv_to_rgb(_hue, 11, 18); - panel.body.radius = LV_DPI / 20; - panel.body.border.color = lv_color_hsv_to_rgb(_hue, 10, 25); - panel.body.border.width = 1; - panel.body.border.opa = LV_OPA_COVER; - panel.body.padding.left = LV_DPI / 10; - panel.body.padding.right = LV_DPI / 10; - panel.body.padding.top = LV_DPI / 10; - panel.body.padding.bottom = LV_DPI / 10; - panel.line.color = lv_color_hsv_to_rgb(_hue, 20, 40); - panel.line.width = 1; - - theme.style.scr = &scr; - theme.style.bg = &bg; - theme.style.panel = &def; -} - -static void cont_init(void) -{ -#if LV_USE_CONT != 0 - - theme.style.cont = &panel; -#endif -} -static void btn_init(void) -{ -#if LV_USE_BTN != 0 - static lv_style_t btn_rel, btn_pr, btn_tgl_rel, btn_tgl_pr, btn_ina; - - lv_style_copy(&btn_rel, &def); - btn_rel.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 40); - btn_rel.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 20); - btn_rel.body.border.color = lv_color_hex3(0x111); - btn_rel.body.border.width = 1; - btn_rel.body.border.opa = LV_OPA_70; - btn_rel.body.padding.left = LV_DPI / 4; - 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); - btn_rel.image.color = lv_color_hex3(0xeee); - - lv_style_copy(&btn_pr, &btn_rel); - btn_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 30); - btn_pr.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 10); - - lv_style_copy(&btn_tgl_rel, &btn_rel); - btn_tgl_rel.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 20); - btn_tgl_rel.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 40); - btn_tgl_rel.body.shadow.width = LV_DPI / 40; - btn_tgl_rel.text.color = lv_color_hex3(0xddd); - btn_tgl_rel.image.color = lv_color_hex3(0xddd); - - lv_style_copy(&btn_tgl_pr, &btn_rel); - btn_tgl_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 10); - btn_tgl_pr.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 30); - btn_tgl_pr.body.shadow.width = LV_DPI / 30; - btn_tgl_pr.text.color = lv_color_hex3(0xddd); - btn_tgl_pr.image.color = lv_color_hex3(0xddd); - - lv_style_copy(&btn_ina, &btn_rel); - btn_ina.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 20); - btn_ina.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 20); - btn_ina.body.shadow.width = 0; - btn_ina.text.color = lv_color_hex3(0xaaa); - btn_ina.image.color = lv_color_hex3(0xaaa); - - theme.style.btn.rel = &btn_rel; - theme.style.btn.pr = &btn_pr; - theme.style.btn.tgl_rel = &btn_tgl_rel; - theme.style.btn.tgl_pr = &btn_tgl_pr; - theme.style.btn.ina = &btn_ina; -#endif -} - -static void label_init(void) -{ -#if LV_USE_LABEL != 0 - - lv_style_copy(&prim, &bg); - prim.text.color = lv_color_hsv_to_rgb(_hue, 5, 95); - - lv_style_copy(&sec, &bg); - sec.text.color = lv_color_hsv_to_rgb(_hue, 15, 65); - - lv_style_copy(&hint, &bg); - hint.text.color = lv_color_hsv_to_rgb(_hue, 20, 55); - - theme.style.label.prim = &prim; - theme.style.label.sec = &sec; - theme.style.label.hint = &hint; -#endif -} - -static void line_init(void) -{ -#if LV_USE_LINE != 0 - - theme.style.line.decor = &def; -#endif -} - -static void led_init(void) -{ -#if LV_USE_LED != 0 - static lv_style_t led; - lv_style_copy(&led, &def); - led.body.shadow.width = LV_DPI / 10; - led.body.radius = LV_RADIUS_CIRCLE; - led.body.border.width = LV_DPI / 30; - led.body.border.opa = LV_OPA_30; - led.body.main_color = lv_color_hsv_to_rgb(_hue, 100, 100); - led.body.grad_color = lv_color_hsv_to_rgb(_hue, 100, 40); - led.body.border.color = lv_color_hsv_to_rgb(_hue, 60, 60); - led.body.shadow.color = lv_color_hsv_to_rgb(_hue, 100, 100); - - theme.style.led = &led; -#endif -} - -static void img_init(void) -{ -#if LV_USE_IMG != 0 - - theme.style.img.light = &def; - theme.style.img.dark = &def; -#endif -} - -static void bar_init(void) -{ -#if LV_USE_BAR - static lv_style_t bar_bg, bar_indic; - lv_style_copy(&bar_bg, &panel); - bar_bg.body.padding.left = LV_DPI / 16; - bar_bg.body.padding.right = LV_DPI / 16; - bar_bg.body.padding.top = LV_DPI / 16; - bar_bg.body.padding.bottom = LV_DPI / 16; - bar_bg.body.radius = LV_RADIUS_CIRCLE; - - lv_style_copy(&bar_indic, &def); - bar_indic.body.main_color = lv_color_hsv_to_rgb(_hue, 80, 70); - bar_indic.body.grad_color = lv_color_hsv_to_rgb(_hue, 80, 70); - bar_indic.body.border.color = lv_color_hsv_to_rgb(_hue, 20, 15); - bar_indic.body.border.width = 1; - bar_indic.body.border.opa = LV_OPA_COVER; - bar_indic.body.radius = LV_RADIUS_CIRCLE; - bar_indic.body.padding.left = 0; - bar_indic.body.padding.right = 0; - bar_indic.body.padding.top = 0; - bar_indic.body.padding.bottom = 0; - - theme.style.bar.bg = &bar_bg; - theme.style.bar.indic = &bar_indic; -#endif -} - -static void slider_init(void) -{ -#if LV_USE_SLIDER != 0 - static lv_style_t slider_knob; - lv_style_copy(&slider_knob, theme.style.btn.rel); - slider_knob.body.radius = LV_RADIUS_CIRCLE; - - theme.style.slider.bg = theme.style.bar.bg; - theme.style.slider.indic = theme.style.bar.indic; - theme.style.slider.knob = &slider_knob; -#endif -} - -static void sw_init(void) -{ -#if LV_USE_SW != 0 - - theme.style.sw.bg = theme.style.bar.bg; - theme.style.sw.indic = theme.style.bar.indic; - theme.style.sw.knob_off = theme.style.slider.knob; - theme.style.sw.knob_on = theme.style.slider.knob; -#endif -} - -static void lmeter_init(void) -{ -#if LV_USE_LMETER != 0 - static lv_style_t lmeter_bg; - lv_style_copy(&lmeter_bg, &def); - lmeter_bg.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 70); - lmeter_bg.body.grad_color = lv_color_hsv_to_rgb(_hue, 95, 90); - lmeter_bg.body.padding.left = LV_DPI / 10; /*Scale line length*/ - lmeter_bg.body.padding.inner = LV_DPI / 10; /*Text padding*/ - lmeter_bg.body.border.color = lv_color_hex3(0x333); - lmeter_bg.line.color = lv_color_hex3(0x555); - lmeter_bg.line.width = 1; - lmeter_bg.text.color = lv_color_hex3(0xddd); - - theme.style.lmeter = &lmeter_bg; -#endif -} - -static void gauge_init(void) -{ -#if LV_USE_GAUGE != 0 - static lv_style_t gauge_bg; - lv_style_copy(&gauge_bg, &def); - gauge_bg.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 70); - gauge_bg.body.grad_color = gauge_bg.body.main_color; - gauge_bg.line.color = lv_color_hsv_to_rgb(_hue, 80, 75); - gauge_bg.line.width = 1; - gauge_bg.text.color = lv_color_hex3(0xddd); - - theme.style.gauge = &gauge_bg; -#endif -} - -static void arc_init(void) -{ -#if LV_USE_ARC != 0 - - static lv_style_t arc; - lv_style_copy(&arc, &def); - arc.line.width = 8; - arc.line.color = lv_color_hsv_to_rgb(_hue, 80, 70); - arc.line.rounded = 1; - - /*For preloader*/ - arc.body.border.width = 7; - arc.body.border.color = lv_color_hsv_to_rgb(_hue, 11, 48); - arc.body.padding.left = 1; - arc.body.padding.right = 1; - arc.body.padding.top = 1; - arc.body.padding.bottom = 1; - - theme.style.arc = &arc; -#endif -} - -static void preload_init(void) -{ -#if LV_USE_PRELOAD != 0 - - theme.style.preload = theme.style.arc; -#endif -} - -static void chart_init(void) -{ -#if LV_USE_CHART - theme.style.chart = &panel; -#endif -} - -static void calendar_init(void) -{ -#if LV_USE_CALENDAR - static lv_style_t cal_bg; - lv_style_copy(&cal_bg, &bg); - cal_bg.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 40); - cal_bg.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 40); - cal_bg.body.border.color = lv_color_hex3(0x333); - cal_bg.body.border.width = 1; - cal_bg.body.radius = LV_DPI / 20; - cal_bg.body.padding.left = LV_DPI / 10; - cal_bg.body.padding.right = LV_DPI / 10; - cal_bg.body.padding.top = LV_DPI / 10; - cal_bg.body.padding.bottom = LV_DPI / 10; - - static lv_style_t cal_header; - lv_style_copy(&cal_header, &bg); - cal_header.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 20); - cal_header.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 20); - cal_header.body.radius = 0; - cal_header.body.border.width = 1; - cal_header.body.border.color = lv_color_hex3(0x333); - cal_header.body.padding.left = LV_DPI / 10; - cal_header.body.padding.right = LV_DPI / 10; - cal_header.body.padding.top = LV_DPI / 10; - cal_header.body.padding.bottom = LV_DPI / 10; - - static lv_style_t week_box; - lv_style_copy(&week_box, &panel); - week_box.body.main_color = lv_color_hsv_to_rgb(_hue, 30, 45); - week_box.body.grad_color = lv_color_hsv_to_rgb(_hue, 30, 45); - week_box.body.radius = LV_DPI / 20; - week_box.body.border.width = 1; - week_box.body.padding.left = LV_DPI / 20; - week_box.body.padding.right = LV_DPI / 20; - week_box.body.padding.top = LV_DPI / 25; - week_box.body.padding.bottom = LV_DPI / 25; - - static lv_style_t today_box; - lv_style_copy(&today_box, &week_box); - today_box.body.main_color = lv_color_hsv_to_rgb(_hue, 80, 70); - today_box.body.grad_color = lv_color_hsv_to_rgb(_hue, 80, 70); - today_box.body.radius = LV_DPI / 20; - today_box.body.padding.left = LV_DPI / 14; - today_box.body.padding.right = LV_DPI / 14; - today_box.body.padding.top = LV_DPI / 14; - today_box.body.padding.bottom = LV_DPI / 14; - - static lv_style_t highlighted_days; - lv_style_copy(&highlighted_days, &bg); - highlighted_days.text.color = lv_color_hsv_to_rgb(_hue, 40, 80); - - static lv_style_t ina_days; - lv_style_copy(&ina_days, &bg); - ina_days.text.color = lv_color_hsv_to_rgb(_hue, 0, 60); - - theme.style.calendar.bg = &cal_bg; - theme.style.calendar.header = &cal_header; - theme.style.calendar.week_box = &week_box; - theme.style.calendar.today_box = &today_box; - theme.style.calendar.highlighted_days = &highlighted_days; - theme.style.calendar.day_names = &cal_bg; - theme.style.calendar.inactive_days = &ina_days; -#endif -} - -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, &def); - rel.body.radius = LV_DPI / 20; - rel.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 95); - rel.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 95); - rel.body.border.color = lv_color_hsv_to_rgb(_hue, 10, 50); - rel.body.border.width = 2; - ; - - lv_style_copy(&pr, &rel); - pr.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 80); - pr.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 80); - pr.body.border.color = lv_color_hsv_to_rgb(_hue, 10, 20); - pr.body.border.width = 1; - ; - - lv_style_copy(&tgl_rel, &rel); - tgl_rel.body.main_color = lv_color_hsv_to_rgb(_hue, 80, 90); - tgl_rel.body.grad_color = lv_color_hsv_to_rgb(_hue, 80, 90); - tgl_rel.body.border.color = lv_color_hsv_to_rgb(_hue, 80, 50); - - lv_style_copy(&tgl_pr, &tgl_rel); - tgl_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 80, 70); - tgl_pr.body.grad_color = lv_color_hsv_to_rgb(_hue, 80, 70); - tgl_pr.body.border.color = lv_color_hsv_to_rgb(_hue, 80, 30); - tgl_pr.body.border.width = 1; - ; - - lv_style_copy(&ina, &rel); - ina.body.main_color = lv_color_hex3(0x777); - ina.body.grad_color = lv_color_hex3(0x777); - ina.body.border.width = 0; - - theme.style.cb.bg = &lv_style_transp; - theme.style.cb.box.rel = &rel; - theme.style.cb.box.pr = ≺ - theme.style.cb.box.tgl_rel = &tgl_rel; - theme.style.cb.box.tgl_pr = &tgl_pr; - theme.style.cb.box.ina = &def; -#endif -} - -static void btnm_init(void) -{ -#if LV_USE_BTNM - static lv_style_t btnm_bg, rel, pr, tgl_rel, tgl_pr, ina; - - lv_style_copy(&btnm_bg, theme.style.btn.rel); - btnm_bg.body.padding.left = 2; - btnm_bg.body.padding.right = 2; - btnm_bg.body.padding.top = 2; - btnm_bg.body.padding.bottom = 2; - btnm_bg.body.padding.inner = 0; - 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.width = 1; - rel.body.radius = 2; - - lv_style_copy(&pr, theme.style.btn.pr); - pr.body.border.part = rel.body.border.part; - pr.body.border.width = rel.body.border.width; - pr.body.radius = rel.body.radius; - - lv_style_copy(&tgl_rel, theme.style.btn.tgl_rel); - tgl_rel.body.border.part = rel.body.border.part; - tgl_rel.body.border.width = rel.body.border.width; - tgl_rel.body.radius = rel.body.radius; - - lv_style_copy(&tgl_pr, theme.style.btn.pr); - tgl_pr.body.border.part = rel.body.border.part; - tgl_pr.body.border.width = rel.body.border.width; - tgl_pr.body.radius = rel.body.radius; - - lv_style_copy(&ina, theme.style.btn.ina); - ina.body.border.part = rel.body.border.part; - ina.body.border.width = rel.body.border.width; - ina.body.radius = rel.body.radius; - - theme.style.btnm.bg = &btnm_bg; - theme.style.btnm.btn.rel = &rel; - theme.style.btnm.btn.pr = ≺ - theme.style.btnm.btn.tgl_rel = &tgl_rel; - theme.style.btnm.btn.tgl_pr = &tgl_pr; - theme.style.btnm.btn.ina = &ina; -#endif -} - -static void kb_init(void) -{ -#if LV_USE_KB - theme.style.kb.bg = &bg; - theme.style.kb.btn.rel = theme.style.btn.rel; - theme.style.kb.btn.pr = theme.style.btn.pr; - theme.style.kb.btn.tgl_rel = theme.style.btn.tgl_rel; - theme.style.kb.btn.tgl_pr = theme.style.btn.tgl_pr; - theme.style.kb.btn.ina = theme.style.btn.ina; -#endif -} - -static void mbox_init(void) -{ -#if LV_USE_MBOX - static lv_style_t mbox_bg; - lv_style_copy(&mbox_bg, &bg); - mbox_bg.body.main_color = lv_color_hsv_to_rgb(_hue, 30, 30); - mbox_bg.body.grad_color = lv_color_hsv_to_rgb(_hue, 30, 30); - mbox_bg.body.border.color = lv_color_hsv_to_rgb(_hue, 11, 20); - mbox_bg.body.border.width = 1; - mbox_bg.body.shadow.width = LV_DPI / 10; - mbox_bg.body.shadow.color = lv_color_hex3(0x222); - mbox_bg.body.radius = LV_DPI / 20; - theme.style.mbox.bg = &mbox_bg; - theme.style.mbox.btn.bg = &lv_style_transp; - theme.style.mbox.btn.rel = theme.style.btn.rel; - theme.style.mbox.btn.pr = theme.style.btn.pr; -#endif -} - -static void page_init(void) -{ -#if LV_USE_PAGE - - static lv_style_t page_scrl; - lv_style_copy(&page_scrl, &bg); - page_scrl.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 40); - page_scrl.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 40); - page_scrl.body.border.color = lv_color_hex3(0x333); - page_scrl.body.border.width = 1; - page_scrl.body.radius = LV_DPI / 20; - - theme.style.page.bg = &panel; - theme.style.page.scrl = &page_scrl; - theme.style.page.sb = &sb; -#endif -} - -static void ta_init(void) -{ -#if LV_USE_TA - theme.style.ta.area = &panel; - theme.style.ta.oneline = &panel; - theme.style.ta.cursor = NULL; - theme.style.ta.sb = &def; -#endif -} - -static void spinbox_init(void) -{ -#if LV_USE_SPINBOX - theme.style.spinbox.bg = &panel; - theme.style.spinbox.cursor = theme.style.ta.cursor; - theme.style.spinbox.sb = theme.style.ta.sb; -#endif -} - -static void list_init(void) -{ -#if LV_USE_LIST != 0 - static lv_style_t list_bg, list_btn_rel, list_btn_pr, list_btn_tgl_rel, list_btn_tgl_pr; - - lv_style_copy(&list_bg, &panel); - list_bg.body.padding.top = 0; - list_bg.body.padding.bottom = 0; - list_bg.body.padding.left = 0; - list_bg.body.padding.right = 0; - list_bg.body.padding.inner = 0; - - 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.color = lv_color_hsv_to_rgb(_hue, 10, 5); - list_btn_rel.body.border.width = 1; - list_btn_rel.body.radius = LV_DPI / 10; - list_btn_rel.text.color = lv_color_hsv_to_rgb(_hue, 5, 80); - list_btn_rel.image.color = lv_color_hsv_to_rgb(_hue, 5, 80); - list_btn_rel.body.padding.top = LV_DPI / 6; - list_btn_rel.body.padding.bottom = LV_DPI / 6; - list_btn_rel.body.padding.left = LV_DPI / 8; - list_btn_rel.body.padding.right = LV_DPI / 8; - - lv_style_copy(&list_btn_pr, theme.style.btn.pr); - list_btn_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 5); - list_btn_pr.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 5); - list_btn_pr.body.border.color = lv_color_hsv_to_rgb(_hue, 10, 5); - list_btn_pr.body.border.width = 0; - list_btn_pr.body.padding.top = LV_DPI / 6; - list_btn_pr.body.padding.bottom = LV_DPI / 6; - list_btn_pr.body.padding.left = LV_DPI / 8; - list_btn_pr.body.padding.right = LV_DPI / 8; - list_btn_pr.text.color = lv_color_hsv_to_rgb(_hue, 5, 80); - list_btn_pr.image.color = lv_color_hsv_to_rgb(_hue, 5, 80); - - lv_style_copy(&list_btn_tgl_rel, &list_btn_rel); - list_btn_tgl_rel.body.opa = LV_OPA_COVER; - list_btn_tgl_rel.body.main_color = lv_color_hsv_to_rgb(_hue, 80, 70); - list_btn_tgl_rel.body.grad_color = lv_color_hsv_to_rgb(_hue, 80, 70); - list_btn_tgl_rel.body.border.color = lv_color_hsv_to_rgb(_hue, 60, 40); - list_btn_tgl_rel.body.radius = list_bg.body.radius; - - lv_style_copy(&list_btn_tgl_pr, &list_btn_tgl_rel); - list_btn_tgl_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 80, 60); - list_btn_tgl_pr.body.grad_color = lv_color_hsv_to_rgb(_hue, 80, 60); - - theme.style.list.sb = &sb; - theme.style.list.bg = &list_bg; - theme.style.list.scrl = &lv_style_transp_tight; - theme.style.list.btn.rel = &list_btn_rel; - theme.style.list.btn.pr = &list_btn_pr; - theme.style.list.btn.tgl_rel = &list_btn_tgl_rel; - theme.style.list.btn.tgl_pr = &list_btn_tgl_pr; - theme.style.list.btn.ina = &def; -#endif -} - -static void ddlist_init(void) -{ -#if LV_USE_DDLIST != 0 - static lv_style_t ddlist_bg, ddlist_sel; - lv_style_copy(&ddlist_bg, theme.style.btn.rel); - ddlist_bg.text.line_space = LV_DPI / 8; - ddlist_bg.body.padding.top = LV_DPI / 8; - ddlist_bg.body.padding.bottom = LV_DPI / 8; - ddlist_bg.body.padding.left = LV_DPI / 8; - ddlist_bg.body.padding.right = LV_DPI / 8; - ddlist_bg.body.radius = LV_DPI / 30; - - lv_style_copy(&ddlist_sel, theme.style.btn.rel); - ddlist_sel.body.main_color = lv_color_hsv_to_rgb(_hue, 20, 50); - ddlist_sel.body.grad_color = lv_color_hsv_to_rgb(_hue, 20, 50); - ddlist_sel.body.radius = 0; - - theme.style.ddlist.bg = &ddlist_bg; - theme.style.ddlist.sel = &ddlist_sel; - theme.style.ddlist.sb = &def; -#endif -} - -static void roller_init(void) -{ -#if LV_USE_ROLLER != 0 - static lv_style_t roller_bg; - - lv_style_copy(&roller_bg, theme.style.ddlist.bg); - roller_bg.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 20); - roller_bg.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 40); - roller_bg.text.color = lv_color_hsv_to_rgb(_hue, 5, 70); - roller_bg.text.opa = LV_OPA_60; - - theme.style.roller.bg = &roller_bg; - theme.style.roller.sel = theme.style.ddlist.sel; -#endif -} - -static void tabview_init(void) -{ -#if LV_USE_TABVIEW != 0 - theme.style.tabview.bg = &bg; - theme.style.tabview.indic = &lv_style_transp; - theme.style.tabview.btn.bg = &lv_style_transp; - theme.style.tabview.btn.rel = theme.style.btn.rel; - theme.style.tabview.btn.pr = theme.style.btn.pr; - theme.style.tabview.btn.tgl_rel = theme.style.btn.tgl_rel; - theme.style.tabview.btn.tgl_pr = theme.style.btn.tgl_pr; -#endif -} - -static void tileview_init(void) -{ -#if LV_USE_TILEVIEW != 0 - theme.style.tileview.bg = &lv_style_transp_tight; - theme.style.tileview.scrl = &lv_style_transp_tight; - theme.style.tileview.sb = theme.style.page.sb; -#endif -} - -static void table_init(void) -{ -#if LV_USE_TABLE != 0 - static lv_style_t cell; - lv_style_copy(&cell, &panel); - cell.body.radius = 0; - cell.body.border.width = 1; - cell.body.padding.left = LV_DPI / 12; - cell.body.padding.right = LV_DPI / 12; - cell.body.padding.top = LV_DPI / 12; - cell.body.padding.bottom = LV_DPI / 12; - - theme.style.table.bg = &lv_style_transp_tight; - theme.style.table.cell = &cell; -#endif -} - -static void win_init(void) -{ -#if LV_USE_WIN != 0 - static lv_style_t win_bg; - lv_style_copy(&win_bg, &bg); - win_bg.body.border.color = lv_color_hex3(0x333); - win_bg.body.border.width = 1; - - static lv_style_t win_header; - lv_style_copy(&win_header, &win_bg); - win_header.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 20); - win_header.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 20); - win_header.body.radius = 0; - win_header.body.padding.left = 0; - win_header.body.padding.right = 0; - win_header.body.padding.top = 0; - win_header.body.padding.bottom = 0; - - static lv_style_t win_btn_pr; - lv_style_copy(&win_btn_pr, &def); - win_btn_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 10); - win_btn_pr.body.grad_color = lv_color_hsv_to_rgb(_hue, 10, 10); - win_btn_pr.text.color = lv_color_hex3(0xaaa); - win_btn_pr.image.color = lv_color_hex3(0xaaa); - - theme.style.win.bg = &win_bg; - theme.style.win.sb = &sb; - theme.style.win.header = &win_header; - theme.style.win.content = &lv_style_transp; - theme.style.win.btn.rel = &lv_style_transp; - theme.style.win.btn.pr = &win_btn_pr; -#endif -} - -#if LV_USE_GROUP - -static void style_mod(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = lv_color_hsv_to_rgb(_hue, 80, 70); - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 20; -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 2; -#endif -} - -static void style_mod_edit(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_GREEN; - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 20; -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 3; -#endif -} - -#endif /*LV_USE_GROUP*/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the night theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_night_init(uint16_t hue, lv_font_t * font) -{ - if(font == NULL) font = LV_FONT_DEFAULT; - - _hue = hue; - _font = font; - - /*For backward compatibility initialize all theme elements with a default style */ - uint16_t i; - lv_style_t ** style_p = (lv_style_t **)&theme.style; - for(i = 0; i < LV_THEME_STYLE_COUNT; i++) { - *style_p = &def; - style_p++; - } - - basic_init(); - cont_init(); - btn_init(); - label_init(); - img_init(); - line_init(); - led_init(); - bar_init(); - slider_init(); - sw_init(); - lmeter_init(); - gauge_init(); - arc_init(); - preload_init(); - chart_init(); - calendar_init(); - cb_init(); - btnm_init(); - kb_init(); - mbox_init(); - page_init(); - ta_init(); - spinbox_init(); - list_init(); - ddlist_init(); - roller_init(); - tabview_init(); - tileview_init(); - table_init(); - win_init(); - -#if LV_USE_GROUP - theme.group.style_mod_xcb = style_mod; - theme.group.style_mod_edit_xcb = style_mod_edit; -#endif - - return &theme; -} - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_night(void) -{ - return &theme; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_night.h b/src/libs/lvgl/src/lv_themes/lv_theme_night.h deleted file mode 100644 index a009bed0..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_night.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file lv_theme_night.h - * - */ - -#ifndef LV_THEME_NIGHT_H -#define LV_THEME_NIGHT_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_THEME_NIGHT - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the night theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_night_init(uint16_t hue, lv_font_t * font); - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_night(void); - -/********************** - * MACROS - **********************/ - -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_THEME_NIGHT_H*/ diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_templ.c b/src/libs/lvgl/src/lv_themes/lv_theme_templ.c deleted file mode 100644 index fecbdb84..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_templ.c +++ /dev/null @@ -1,473 +0,0 @@ -/** - * @file lv_theme_templ.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_theme.h" - -#if LV_USE_THEME_TEMPL - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static lv_theme_t theme; -static lv_style_t def; -/*Static style definitions*/ - -/*Saved input parameters*/ -static uint16_t _hue; -static lv_font_t * _font; - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void basic_init(void) -{ - lv_style_copy(&def, &lv_style_pretty); /*Initialize the default style*/ - def.text.font = _font; - - theme.style.scr = &def; - theme.style.bg = &def; - theme.style.panel = &def; -} - -static void cont_init(void) -{ -#if LV_USE_CONT != 0 - - theme.style.cont = &def; -#endif -} - -static void btn_init(void) -{ -#if LV_USE_BTN != 0 - - theme.style.btn.rel = &def; - theme.style.btn.pr = &def; - theme.style.btn.tgl_rel = &def; - theme.style.btn.tgl_pr = &def; - theme.style.btn.ina = &def; -#endif -} - -static void imgbtn_init(void) -{ -#if LV_USE_IMGBTN != 0 - theme.style.imgbtn.rel = &def; - theme.style.imgbtn.pr = &def; - theme.style.imgbtn.tgl_rel = &def; - theme.style.imgbtn.tgl_pr = &def; - theme.style.imgbtn.ina = &def; -#endif -} - -static void label_init(void) -{ -#if LV_USE_LABEL != 0 - - theme.style.label.prim = &def; - theme.style.label.sec = &def; - theme.style.label.hint = &def; -#endif -} - -static void img_init(void) -{ -#if LV_USE_IMG != 0 - - theme.style.img.light = &def; - theme.style.img.dark = &def; -#endif -} - -static void line_init(void) -{ -#if LV_USE_LINE != 0 - - theme.style.line.decor = &def; -#endif -} - -static void led_init(void) -{ -#if LV_USE_LED != 0 - - theme.style.led = &def; -#endif -} - -static void bar_init(void) -{ -#if LV_USE_BAR - - theme.style.bar.bg = &def; - theme.style.bar.indic = &def; -#endif -} - -static void slider_init(void) -{ -#if LV_USE_SLIDER != 0 - - theme.style.slider.bg = &def; - theme.style.slider.indic = &def; - theme.style.slider.knob = &def; -#endif -} - -static void sw_init(void) -{ -#if LV_USE_SW != 0 - - theme.style.sw.bg = &def; - theme.style.sw.indic = &def; - theme.style.sw.knob_off = &def; - theme.style.sw.knob_on = &def; -#endif -} - -static void lmeter_init(void) -{ -#if LV_USE_LMETER != 0 - - theme.style.lmeter = &def; -#endif -} - -static void gauge_init(void) -{ -#if LV_USE_GAUGE != 0 - - theme.style.gauge = &def; -#endif -} - -static void arc_init(void) -{ -#if LV_USE_ARC != 0 - - theme.style.arc = &def; -#endif -} - -static void preload_init(void) -{ -#if LV_USE_PRELOAD != 0 - - theme.style.preload = &def; -#endif -} - -static void chart_init(void) -{ -#if LV_USE_CHART - - theme.style.chart = &def; -#endif -} - -static void calendar_init(void) -{ -#if LV_USE_CALENDAR - - theme.style.calendar.bg = theme.style.panel; - theme.style.calendar.header = &def; - theme.style.calendar.inactive_days = &def; - theme.style.calendar.highlighted_days = &def; - theme.style.calendar.week_box = &def; - theme.style.calendar.today_box = &def; - theme.style.calendar.header_pr = &def; - theme.style.calendar.day_names = &def; -#endif -} - -static void cb_init(void) -{ -#if LV_USE_CB != 0 - - theme.style.cb.bg = &def; - theme.style.cb.box.rel = &def; - theme.style.cb.box.pr = &def; - theme.style.cb.box.tgl_rel = &def; - theme.style.cb.box.tgl_pr = &def; - theme.style.cb.box.ina = &def; -#endif -} - -static void btnm_init(void) -{ -#if LV_USE_BTNM - - theme.style.btnm.bg = &def; - theme.style.btnm.btn.rel = &def; - theme.style.btnm.btn.pr = &def; - theme.style.btnm.btn.tgl_rel = &def; - theme.style.btnm.btn.tgl_pr = &def; - theme.style.btnm.btn.ina = &def; -#endif -} - -static void kb_init(void) -{ -#if LV_USE_KB - - theme.style.kb.bg = &def; - theme.style.kb.btn.rel = &def; - theme.style.kb.btn.pr = &def; - theme.style.kb.btn.tgl_rel = &def; - theme.style.kb.btn.tgl_pr = &def; - theme.style.kb.btn.ina = &def; -#endif -} - -static void mbox_init(void) -{ -#if LV_USE_MBOX - - theme.style.mbox.bg = &def; - theme.style.mbox.btn.bg = &def; - theme.style.mbox.btn.rel = &def; - theme.style.mbox.btn.pr = &def; -#endif -} - -static void page_init(void) -{ -#if LV_USE_PAGE - - theme.style.page.bg = &def; - theme.style.page.scrl = &def; - theme.style.page.sb = &def; -#endif -} - -static void ta_init(void) -{ -#if LV_USE_TA - - theme.style.ta.area = &def; - theme.style.ta.oneline = &def; - theme.style.ta.cursor = NULL; /*Let library to calculate the cursor's style*/ - theme.style.ta.sb = &def; -#endif -} - -static void list_init(void) -{ -#if LV_USE_LIST != 0 - - theme.style.list.sb = &def; - theme.style.list.bg = &def; - theme.style.list.scrl = &def; - theme.style.list.btn.rel = &def; - theme.style.list.btn.pr = &def; - theme.style.list.btn.tgl_rel = &def; - theme.style.list.btn.tgl_pr = &def; - theme.style.list.btn.ina = &def; -#endif -} - -static void ddlist_init(void) -{ -#if LV_USE_DDLIST != 0 - - theme.style.ddlist.bg = &def; - theme.style.ddlist.sel = &def; - theme.style.ddlist.sb = &def; -#endif -} - -static void roller_init(void) -{ -#if LV_USE_ROLLER != 0 - - theme.style.roller.bg = &def; - theme.style.roller.sel = &def; -#endif -} - -static void tabview_init(void) -{ -#if LV_USE_TABVIEW != 0 - - theme.style.tabview.bg = &def; - theme.style.tabview.indic = &def; - theme.style.tabview.btn.bg = &def; - theme.style.tabview.btn.rel = &def; - theme.style.tabview.btn.pr = &def; - theme.style.tabview.btn.tgl_rel = &def; - theme.style.tabview.btn.tgl_pr = &def; -#endif -} - -static void table_init(void) -{ -#if LV_USE_TABLE != 0 - theme.style.table.bg = &def; - theme.style.table.cell = &def; -#endif -} - -static void win_init(void) -{ -#if LV_USE_WIN != 0 - - theme.style.win.bg = &def; - theme.style.win.sb = &def; - theme.style.win.header = &def; - theme.style.win.content = &def; - theme.style.win.btn.rel = &def; - theme.style.win.btn.pr = &def; -#endif -} - -#if LV_USE_GROUP - -static void style_mod(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ - -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_ORANGE; - - /*If not empty or has border then emphasis the border*/ - if(style->body.border.width != 0) style->body.border.width = LV_DPI / 20; - - style->body.main_color = lv_color_mix(style->body.main_color, LV_COLOR_ORANGE, LV_OPA_70); - style->body.grad_color = lv_color_mix(style->body.grad_color, LV_COLOR_ORANGE, LV_OPA_70); - style->body.shadow.color = lv_color_mix(style->body.shadow.color, LV_COLOR_ORANGE, LV_OPA_60); - - style->text.color = lv_color_mix(style->text.color, LV_COLOR_ORANGE, LV_OPA_70); -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 2; -#endif -} - -static void style_mod_edit(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ - -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_GREEN; - - /*If not empty or has border then emphasis the border*/ - if(style->body.border.width != 0) style->body.border.width = LV_DPI / 20; - - style->body.main_color = lv_color_mix(style->body.main_color, LV_COLOR_GREEN, LV_OPA_70); - style->body.grad_color = lv_color_mix(style->body.grad_color, LV_COLOR_GREEN, LV_OPA_70); - style->body.shadow.color = lv_color_mix(style->body.shadow.color, LV_COLOR_GREEN, LV_OPA_60); - - style->text.color = lv_color_mix(style->text.color, LV_COLOR_GREEN, LV_OPA_70); -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 3; -#endif -} - -#endif /*LV_USE_GROUP*/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the templ theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_templ_init(uint16_t hue, lv_font_t * font) -{ - if(font == NULL) font = LV_FONT_DEFAULT; - - _hue = hue; - _font = font; - - /*For backward compatibility initialize all theme elements with a default style */ - uint16_t i; - lv_style_t ** style_p = (lv_style_t **)&theme.style; - for(i = 0; i < LV_THEME_STYLE_COUNT; i++) { - *style_p = &def; - style_p++; - } - - basic_init(); - cont_init(); - btn_init(); - imgbtn_init(); - label_init(); - img_init(); - line_init(); - led_init(); - bar_init(); - slider_init(); - sw_init(); - lmeter_init(); - gauge_init(); - arc_init(); - preload_init(); - chart_init(); - calendar_init(); - cb_init(); - btnm_init(); - kb_init(); - mbox_init(); - page_init(); - ta_init(); - list_init(); - ddlist_init(); - roller_init(); - tabview_init(); - table_init(); - win_init(); - -#if LV_USE_GROUP - theme.group.style_mod_xcb = style_mod; - theme.group.style_mod_edit_xcb = style_mod_edit; -#endif - - return &theme; -} - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_templ(void) -{ - return &theme; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_templ.h b/src/libs/lvgl/src/lv_themes/lv_theme_templ.h deleted file mode 100644 index 7d1e3ec6..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_templ.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file lv_theme_templ.h - * - */ - -#ifndef LV_THEME_TEMPL_H -#define LV_THEME_TEMPL_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_THEME_TEMPL - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the templ theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_templ_init(uint16_t hue, lv_font_t * font); - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_templ(void); - -/********************** - * MACROS - **********************/ - -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_THEME_TEMPL_H*/ diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_zen.c b/src/libs/lvgl/src/lv_themes/lv_theme_zen.c deleted file mode 100644 index 55569993..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_zen.c +++ /dev/null @@ -1,902 +0,0 @@ -/** - * @file lv_theme_zen.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_theme.h" - -#if LV_USE_THEME_ZEN - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static lv_theme_t theme; -/*Static style definitions*/ -static lv_style_t def; -static lv_style_t sb; - -/*Saved input parameters*/ -static uint16_t _hue; -static lv_font_t * _font; - -/********************** - * MACROS - **********************/ - -/********************** - * STATIC FUNCTIONS - **********************/ - -static void basic_init(void) -{ - static lv_style_t bg; - static lv_style_t scr; - static lv_style_t panel; - - lv_style_copy(&def, &lv_style_pretty); /*Initialize the default style*/ - def.body.border.opa = LV_OPA_COVER; - def.text.font = _font; - def.text.color = lv_color_hex3(0x444); - def.image.color = lv_color_hex3(0x444); - - lv_style_copy(&bg, &def); - bg.body.main_color = LV_COLOR_WHITE; - bg.body.grad_color = LV_COLOR_WHITE; - bg.body.radius = 0; - bg.body.border.width = 0; - bg.body.shadow.width = 0; - - lv_style_copy(&scr, &bg); - scr.body.padding.bottom = 0; - scr.body.padding.top = 0; - scr.body.padding.left = 0; - scr.body.padding.right = 0; - - lv_style_copy(&panel, &bg); - panel.body.radius = LV_DPI / 10; - panel.body.border.width = 2; - panel.body.border.color = lv_color_hsv_to_rgb(_hue, 30, 90); - panel.body.border.opa = LV_OPA_COVER; - panel.body.shadow.width = 4; - panel.body.shadow.color = lv_color_hex3(0xddd); - panel.body.padding.left = LV_DPI / 6; - panel.body.padding.right = LV_DPI / 6; - panel.body.padding.top = LV_DPI / 8; - panel.body.padding.bottom = LV_DPI / 8; - panel.body.padding.inner = LV_DPI / 10; - - lv_style_copy(&sb, &def); - sb.body.main_color = lv_color_hsv_to_rgb(_hue, 30, 90); - sb.body.grad_color = sb.body.main_color; - sb.body.border.width = 0; - sb.body.radius = LV_RADIUS_CIRCLE; - sb.body.padding.inner = LV_DPI / 15; - - theme.style.scr = &scr; - theme.style.bg = &bg; - theme.style.panel = &panel; -} - -static void cont_init(void) -{ -#if LV_USE_CONT != 0 - - theme.style.cont = theme.style.panel; -#endif -} - -static void btn_init(void) -{ -#if LV_USE_BTN != 0 - static lv_style_t rel, pr, tgl_pr, ina; - lv_style_copy(&rel, &def); - rel.body.opa = LV_OPA_TRANSP; - rel.body.radius = LV_RADIUS_CIRCLE; - rel.body.border.width = 2; - rel.body.border.color = lv_color_hsv_to_rgb(_hue, 40, 90); - rel.body.border.opa = LV_OPA_COVER; - rel.body.shadow.width = 4; - rel.body.shadow.color = lv_color_hex3(0xddd); - rel.body.padding.left = LV_DPI / 4; - rel.body.padding.right = LV_DPI / 4; - rel.body.padding.top = LV_DPI / 8; - rel.body.padding.bottom = LV_DPI / 8; - rel.text.color = lv_color_hsv_to_rgb(_hue, 40, 90); - rel.image.color = lv_color_hsv_to_rgb(_hue, 40, 90); - - lv_style_copy(&pr, &rel); - pr.body.border.color = lv_color_hsv_to_rgb(_hue, 40, 60); - pr.body.shadow.width = 0; - pr.text.color = lv_color_hsv_to_rgb(_hue, 40, 60); - pr.image.color = lv_color_hsv_to_rgb(_hue, 40, 60); - - lv_style_copy(&tgl_pr, &pr); - tgl_pr.body.border.color = lv_color_hsv_to_rgb(_hue, 40, 50); - tgl_pr.text.color = lv_color_hsv_to_rgb(_hue, 40, 50); - tgl_pr.image.color = lv_color_hsv_to_rgb(_hue, 40, 50); - - lv_style_copy(&ina, &tgl_pr); - ina.body.border.color = lv_color_hex3(0xbbb); - ina.text.color = lv_color_hex3(0xbbb); - ina.image.color = lv_color_hex3(0xbbb); - - theme.style.btn.rel = &rel; - theme.style.btn.pr = ≺ - theme.style.btn.tgl_rel = ≺ - theme.style.btn.tgl_pr = &tgl_pr; - theme.style.btn.ina = &ina; -#endif -} - -static void label_init(void) -{ -#if LV_USE_LABEL != 0 - static lv_style_t prim, sec, hint; - lv_style_copy(&prim, &def); - lv_style_copy(&sec, &def); - lv_style_copy(&hint, &def); - - prim.text.color = lv_color_hex3(0x555); - sec.text.color = lv_color_hsv_to_rgb(_hue, 50, 80); - hint.text.color = lv_color_hsv_to_rgb(_hue, 25, 85); - - theme.style.label.prim = &prim; - theme.style.label.sec = &sec; - theme.style.label.hint = &hint; -#endif -} - -static void img_init(void) -{ -#if LV_USE_IMG != 0 - static lv_style_t img_light, img_dark; - lv_style_copy(&img_light, &def); - img_light.image.color = lv_color_hsv_to_rgb(_hue, 15, 85); - img_light.image.intense = LV_OPA_80; - - lv_style_copy(&img_dark, &def); - img_light.image.color = lv_color_hsv_to_rgb(_hue, 85, 55); - img_light.image.intense = LV_OPA_80; - - theme.style.img.light = &img_light; - theme.style.img.dark = &img_dark; -#endif -} - -static void line_init(void) -{ -#if LV_USE_LINE != 0 - - theme.style.line.decor = &def; -#endif -} - -static void led_init(void) -{ -#if LV_USE_LED != 0 - - static lv_style_t led; - lv_style_copy(&led, &lv_style_pretty_color); - led.body.shadow.width = LV_DPI / 10; - led.body.radius = LV_RADIUS_CIRCLE; - led.body.border.width = LV_DPI / 30; - led.body.border.opa = LV_OPA_30; - led.body.main_color = lv_color_hsv_to_rgb(_hue, 60, 100); - led.body.grad_color = lv_color_hsv_to_rgb(_hue, 60, 40); - led.body.border.color = lv_color_hsv_to_rgb(_hue, 60, 60); - led.body.shadow.color = lv_color_hsv_to_rgb(_hue, 80, 100); - - theme.style.led = &led; -#endif -} - -static void bar_init(void) -{ -#if LV_USE_BAR - static lv_style_t bg, indic; - - lv_style_copy(&bg, &def); - bg.body.opa = LV_OPA_TRANSP; - bg.body.radius = LV_RADIUS_CIRCLE; - bg.body.border.width = 2; - bg.body.border.opa = LV_OPA_COVER; - bg.body.border.color = lv_color_hsv_to_rgb(_hue, 40, 90); - - lv_style_copy(&indic, &def); - indic.body.radius = LV_RADIUS_CIRCLE; - indic.body.main_color = lv_color_hsv_to_rgb(_hue, 40, 90); - indic.body.grad_color = indic.body.main_color; - indic.body.border.width = 0; - indic.body.padding.left = LV_DPI / 20; - indic.body.padding.right = LV_DPI / 20; - indic.body.padding.top = LV_DPI / 20; - indic.body.padding.bottom = LV_DPI / 20; - - theme.style.bar.bg = &bg; - theme.style.bar.indic = &indic; -#endif -} - -static void slider_init(void) -{ -#if LV_USE_SLIDER != 0 - static lv_style_t knob; - - lv_style_copy(&knob, &def); - knob.body.main_color = theme.style.bar.indic->body.main_color; - knob.body.grad_color = knob.body.main_color; - knob.body.radius = LV_RADIUS_CIRCLE; - knob.body.border.width = 0; - - theme.style.slider.bg = theme.style.bar.bg; - theme.style.slider.indic = theme.style.bar.indic; - theme.style.slider.knob = &knob; -#endif -} - -static void sw_init(void) -{ -#if LV_USE_SW != 0 - static lv_style_t indic; - - lv_style_copy(&indic, theme.style.slider.indic); - indic.body.radius = LV_RADIUS_CIRCLE; - indic.body.main_color = lv_color_hsv_to_rgb(_hue, 15, 95); - indic.body.grad_color = indic.body.main_color; - indic.body.border.width = theme.style.slider.bg->body.border.width; - indic.body.border.color = theme.style.slider.bg->body.border.color; - indic.body.border.opa = theme.style.slider.bg->body.border.opa; - indic.body.padding.left = 0; - indic.body.padding.right = 0; - indic.body.padding.top = 0; - indic.body.padding.bottom = 0; - - theme.style.sw.bg = theme.style.slider.bg; - theme.style.sw.indic = &indic; - theme.style.sw.knob_off = theme.style.slider.knob; - theme.style.sw.knob_on = theme.style.slider.knob; -#endif -} - -static void lmeter_init(void) -{ -#if LV_USE_LMETER != 0 - static lv_style_t lmeter; - - lv_style_copy(&lmeter, &def); - lmeter.line.color = lv_color_hex3(0xddd); - lmeter.line.width = 2; - lmeter.body.main_color = lv_color_hsv_to_rgb(_hue, 80, 70); - lmeter.body.grad_color = lmeter.body.main_color; - lmeter.body.padding.left = LV_DPI / 8; - lmeter.body.padding.right = LV_DPI / 8; - - theme.style.lmeter = &lmeter; -#endif -} - -static void gauge_init(void) -{ -#if LV_USE_GAUGE != 0 - static lv_style_t gauge; - - lv_style_copy(&gauge, &def); - gauge.line.color = lv_color_hsv_to_rgb(_hue, 50, 70); - gauge.line.width = 1; - gauge.body.main_color = lv_color_hex3(0x999); - gauge.body.grad_color = gauge.body.main_color; - gauge.body.padding.left = LV_DPI / 16; - gauge.body.padding.right = LV_DPI / 16; - gauge.body.border.color = lv_color_hex3(0x666); /*Needle middle color*/ - - theme.style.gauge = &gauge; -#endif -} - -static void arc_init(void) -{ -#if LV_USE_ARC != 0 - - static lv_style_t arc; - lv_style_copy(&arc, &def); - arc.line.width = 10; - arc.line.color = lv_color_hsv_to_rgb(_hue, 40, 90); - arc.line.rounded = 1; - - /*For preloader*/ - arc.body.border.width = 0; - - theme.style.arc = &arc; -#endif -} - -static void preload_init(void) -{ -#if LV_USE_PRELOAD != 0 - - theme.style.preload = theme.style.arc; -#endif -} - -static void chart_init(void) -{ -#if LV_USE_CHART - theme.style.chart = theme.style.panel; -#endif -} - -static void calendar_init(void) -{ -#if LV_USE_CALENDAR != 0 - static lv_style_t ina_days; - lv_style_copy(&ina_days, &def); - ina_days.text.color = lv_color_hsv_to_rgb(_hue, 0, 70); - - static lv_style_t high_days; - lv_style_copy(&high_days, &def); - high_days.text.color = lv_color_hsv_to_rgb(_hue, 50, 90); - - static lv_style_t today_box; - lv_style_copy(&today_box, &def); - today_box.body.opa = LV_OPA_TRANSP; - today_box.body.border.color = theme.style.panel->body.border.color; - today_box.body.padding.top = LV_DPI / 20; - today_box.body.padding.bottom = LV_DPI / 20; - today_box.body.radius = LV_RADIUS_CIRCLE; - - theme.style.calendar.bg = theme.style.panel; - theme.style.calendar.header = &lv_style_transp; - theme.style.calendar.inactive_days = &ina_days; - theme.style.calendar.highlighted_days = &high_days; - theme.style.calendar.week_box = &lv_style_transp_fit; - theme.style.calendar.today_box = &today_box; -#endif -} - -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, &def); - rel.body.radius = LV_DPI / 20; - rel.body.shadow.width = 0; - rel.body.border.width = 3; - rel.body.border.opa = LV_OPA_COVER; - rel.body.border.color = lv_color_hsv_to_rgb(_hue, 35, 80); - rel.body.main_color = lv_color_hex3(0xfff); - rel.body.grad_color = rel.body.main_color; - - lv_style_copy(&pr, &rel); - pr.body.border.color = lv_color_hsv_to_rgb(_hue, 35, 70); - - lv_style_copy(&tgl_rel, &rel); - tgl_rel.body.border.color = lv_color_hsv_to_rgb(_hue, 45, 80); - tgl_rel.body.main_color = lv_color_hsv_to_rgb(_hue, 40, 90); - tgl_rel.body.grad_color = tgl_rel.body.main_color; - - lv_style_copy(&tgl_pr, &rel); - tgl_pr.body.border.color = lv_color_hsv_to_rgb(_hue, 45, 70); - tgl_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 40, 80); - tgl_pr.body.grad_color = tgl_pr.body.main_color; - - lv_style_copy(&ina, &rel); - ina.body.border.color = lv_color_hex3(0xaaa); - - theme.style.cb.bg = &lv_style_transp; - theme.style.cb.box.rel = &rel; - theme.style.cb.box.pr = ≺ - theme.style.cb.box.tgl_rel = &tgl_rel; - theme.style.cb.box.tgl_pr = &tgl_pr; - theme.style.cb.box.ina = &ina; -#endif -} - -static void btnm_init(void) -{ -#if LV_USE_BTNM - static lv_style_t bg, rel, pr, tgl_rel, tgl_pr, ina; - - lv_style_copy(&bg, &lv_style_transp); - bg.glass = 0; - bg.body.padding.left = 0; - bg.body.padding.right = 0; - bg.body.padding.top = 0; - bg.body.padding.bottom = 0; - bg.body.padding.inner = LV_DPI / 15; - bg.text.font = _font; - - lv_style_copy(&rel, &def); - rel.body.opa = LV_OPA_TRANSP; - rel.body.border.width = 0; - - lv_style_copy(&pr, &def); - pr.body.opa = LV_OPA_TRANSP; - pr.body.radius = LV_DPI / 1; - pr.body.border.width = 2; - pr.body.border.color = lv_color_hsv_to_rgb(_hue, 40, 60); - pr.body.border.opa = LV_OPA_COVER; - pr.text.color = lv_color_hsv_to_rgb(_hue, 40, 60); - - lv_style_copy(&tgl_rel, &pr); - tgl_rel.body.opa = LV_OPA_COVER; - tgl_rel.body.main_color = lv_color_hsv_to_rgb(_hue, 15, 95); - tgl_rel.body.grad_color = tgl_rel.body.main_color; - tgl_rel.body.border.width = 0; - tgl_rel.text.color = lv_color_hsv_to_rgb(_hue, 60, 40); - - lv_style_copy(&tgl_pr, &tgl_rel); - tgl_pr.body.main_color = lv_color_hsv_to_rgb(_hue, 30, 70); - tgl_pr.body.grad_color = tgl_pr.body.main_color; - - lv_style_copy(&ina, &pr); - ina.body.main_color = lv_color_hex3(0x888); - ina.body.grad_color = tgl_pr.body.main_color; - ina.text.color = lv_color_hex3(0x888); - ; - - theme.style.btnm.bg = &bg; - theme.style.btnm.btn.rel = &rel; - theme.style.btnm.btn.pr = ≺ - theme.style.btnm.btn.tgl_rel = &tgl_rel; - theme.style.btnm.btn.tgl_pr = &tgl_pr; - theme.style.btnm.btn.ina = &ina; -#endif -} - -static void kb_init(void) -{ -#if LV_USE_KB - static lv_style_t bg, rel, pr, tgl_rel, tgl_pr, ina; - lv_style_copy(&bg, &def); - bg.body.main_color = lv_color_hex3(0x666); - bg.body.grad_color = bg.body.main_color; - bg.body.padding.left = 0; - bg.body.padding.right = 0; - bg.body.padding.top = 0; - bg.body.padding.bottom = 0; - bg.body.padding.inner = 0; - bg.body.radius = 0; - bg.body.border.width = 0; - - lv_style_copy(&rel, &def); - rel.body.opa = LV_OPA_COVER; - rel.body.radius = 0; - rel.body.border.width = 1; - rel.body.border.color = lv_color_hex3(0x888); - rel.body.border.opa = LV_OPA_COVER; - rel.text.color = LV_COLOR_WHITE; - - lv_style_copy(&pr, &def); - pr.body.main_color = lv_color_hex3(0xeee); - pr.body.grad_color = pr.body.main_color; - pr.body.border.color = lv_color_hex3(0x888); - pr.body.border.width = 1; - pr.body.border.opa = LV_OPA_COVER; - pr.body.radius = 0; - pr.text.color = lv_color_hex3(0x666); - - lv_style_copy(&tgl_rel, &pr); - tgl_rel.body.main_color = lv_color_hex3(0x999); - tgl_rel.body.grad_color = tgl_rel.body.main_color; - tgl_rel.text.color = LV_COLOR_WHITE; - - lv_style_copy(&tgl_pr, &pr); - tgl_pr.body.main_color = lv_color_hex3(0xbbb); - tgl_pr.body.grad_color = tgl_pr.body.main_color; - tgl_pr.text.color = lv_color_hex3(0xddd); - - lv_style_copy(&ina, &pr); - ina.body.main_color = lv_color_hex3(0x777); - ina.body.grad_color = ina.body.main_color; - ina.text.color = lv_color_hex3(0xbbb); - - theme.style.kb.bg = &bg; - theme.style.kb.btn.rel = &rel; - theme.style.kb.btn.pr = ≺ - theme.style.kb.btn.tgl_rel = &tgl_rel; - theme.style.kb.btn.tgl_pr = &tgl_pr; - theme.style.kb.btn.ina = &ina; -#endif -} - -static void mbox_init(void) -{ -#if LV_USE_MBOX - static lv_style_t bg, rel, pr; - lv_style_copy(&bg, theme.style.panel); - bg.body.main_color = lv_color_hsv_to_rgb(_hue, 10, 95); - bg.body.grad_color = bg.body.main_color; - bg.text.color = lv_color_hsv_to_rgb(_hue, 40, 25); - - lv_style_copy(&rel, &def); - rel.body.main_color = lv_color_hsv_to_rgb(_hue, 25, 85); - rel.body.grad_color = rel.body.main_color; - rel.body.radius = LV_RADIUS_CIRCLE; - rel.body.border.width = 2; - rel.body.border.color = lv_color_hsv_to_rgb(_hue, 30, 70); - rel.body.padding.left = LV_DPI / 4; - rel.body.padding.right = LV_DPI / 4; - rel.body.padding.top = LV_DPI / 8; - rel.body.padding.bottom = LV_DPI / 8; - rel.text.color = bg.text.color; - - lv_style_copy(&pr, &rel); - pr.body.border.color = lv_color_hsv_to_rgb(_hue, 30, 90); - pr.text.color = lv_color_hsv_to_rgb(_hue, 40, 40); - pr.body.main_color = lv_color_hsv_to_rgb(_hue, 20, 85); - pr.body.grad_color = pr.body.main_color; - - theme.style.mbox.bg = &bg; - theme.style.mbox.btn.bg = &lv_style_transp; - theme.style.mbox.btn.rel = &rel; - theme.style.mbox.btn.pr = ≺ -#endif -} - -static void page_init(void) -{ -#if LV_USE_PAGE - - theme.style.page.bg = theme.style.panel; - theme.style.page.scrl = &lv_style_transp; - theme.style.page.sb = &sb; -#endif -} - -static void ta_init(void) -{ -#if LV_USE_TA - static lv_style_t oneline; - lv_style_copy(&oneline, theme.style.panel); - oneline.body.radius = LV_RADIUS_CIRCLE; - oneline.body.padding.top = LV_DPI / 10; - oneline.body.padding.bottom = LV_DPI / 10; - oneline.body.shadow.width = 0; - - theme.style.ta.area = theme.style.panel; - theme.style.ta.oneline = &oneline; - theme.style.ta.cursor = NULL; /*Let library to calculate the cursor's style*/ - theme.style.ta.sb = &def; -#endif -} - -static void spinbox_init(void) -{ -#if LV_USE_SPINBOX - theme.style.spinbox.bg = theme.style.panel; - theme.style.spinbox.cursor = theme.style.ta.cursor; - theme.style.spinbox.sb = theme.style.ta.sb; -#endif -} - -static void list_init(void) -{ -#if LV_USE_LIST != 0 - static lv_style_t bg, rel, pr, tgl_rel, tgl_pr, ina; - - lv_style_copy(&bg, theme.style.panel); - bg.body.padding.left = 0; - bg.body.padding.right = 0; - bg.body.padding.top = 0; - bg.body.padding.bottom = 0; - - lv_style_copy(&rel, &def); - rel.body.opa = LV_OPA_TRANSP; - rel.body.border.width = 0; - rel.body.padding.left = LV_DPI / 8; - rel.body.padding.right = LV_DPI / 8; - rel.body.padding.top = LV_DPI / 8; - rel.body.padding.bottom = LV_DPI / 8; - rel.text.color = lv_color_hex3(0x666); - rel.image.color = lv_color_hex3(0x666); - - lv_style_copy(&pr, &rel); - pr.text.color = theme.style.btn.pr->text.color; - pr.image.color = theme.style.btn.pr->image.color; - - lv_style_copy(&tgl_rel, &rel); - tgl_rel.text.color = lv_color_hsv_to_rgb(_hue, 50, 90); - - lv_style_copy(&tgl_pr, &rel); - tgl_pr.text.color = theme.style.btn.tgl_pr->text.color; - tgl_pr.image.color = theme.style.btn.tgl_pr->image.color; - - lv_style_copy(&ina, &rel); - ina.text.color = theme.style.btn.ina->text.color; - ina.image.color = theme.style.btn.ina->image.color; - - theme.style.list.sb = &sb; - theme.style.list.bg = &bg; - theme.style.list.scrl = &lv_style_transp_tight; - theme.style.list.btn.rel = &rel; - theme.style.list.btn.pr = ≺ - theme.style.list.btn.tgl_rel = &tgl_rel; - theme.style.list.btn.tgl_pr = &tgl_pr; - theme.style.list.btn.ina = &ina; -#endif -} - -static void ddlist_init(void) -{ -#if LV_USE_DDLIST != 0 - static lv_style_t bg, sel; - lv_style_copy(&bg, theme.style.panel); - bg.text.line_space = LV_DPI / 8; - bg.body.padding.left = LV_DPI / 6; - bg.body.padding.right = LV_DPI / 6; - bg.body.padding.top = LV_DPI / 8; - bg.body.padding.bottom = LV_DPI / 8; - bg.text.color = lv_color_hex3(0x666); - - lv_style_copy(&sel, &def); - sel.body.opa = LV_OPA_TRANSP; - sel.body.border.width = 0; - sel.text.color = lv_color_hsv_to_rgb(_hue, 50, 80); - - theme.style.ddlist.bg = &bg; - theme.style.ddlist.sel = &sel; - theme.style.ddlist.sb = &def; -#endif -} - -static void roller_init(void) -{ -#if LV_USE_ROLLER != 0 - static lv_style_t bg, sel; - lv_style_copy(&bg, &def); - bg.body.border.width = 0; - bg.body.opa = LV_OPA_TRANSP; - bg.text.line_space = LV_DPI / 6; - bg.text.color = lv_color_hex3(0x999); - - lv_style_copy(&sel, theme.style.panel); - sel.body.radius = LV_RADIUS_CIRCLE; - sel.body.opa = LV_OPA_TRANSP; - - theme.style.roller.bg = &bg; - theme.style.roller.sel = &sel; -#endif -} - -static void tabview_init(void) -{ -#if LV_USE_TABVIEW != 0 - static lv_style_t btn_bg, indic, rel, pr, tgl_rel, tgl_pr; - - 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.color = lv_color_hsv_to_rgb(_hue, 10, 90); - - lv_style_copy(&indic, &def); - indic.body.padding.inner = LV_DPI / 16; - indic.body.border.width = 0; - indic.body.radius = LV_RADIUS_CIRCLE; - indic.body.main_color = lv_color_hsv_to_rgb(_hue, 50, 80); - indic.body.grad_color = indic.body.main_color; - - lv_style_copy(&rel, &def); - rel.body.opa = LV_OPA_TRANSP; - rel.body.border.width = 0; - rel.text.color = lv_color_hex3(0x999); - - lv_style_copy(&pr, &rel); - pr.text.color = lv_color_hex3(0x777); - - lv_style_copy(&tgl_rel, &rel); - tgl_rel.text.color = lv_color_hsv_to_rgb(_hue, 50, 80); - - lv_style_copy(&tgl_pr, &rel); - tgl_pr.text.color = lv_color_hsv_to_rgb(_hue, 50, 70); - - theme.style.tabview.bg = theme.style.bg; - theme.style.tabview.indic = &indic; - theme.style.tabview.btn.bg = &btn_bg; - theme.style.tabview.btn.rel = &rel; - theme.style.tabview.btn.pr = ≺ - theme.style.tabview.btn.tgl_rel = &tgl_rel; - theme.style.tabview.btn.tgl_pr = &tgl_pr; -#endif -} - -static void tileview_init(void) -{ -#if LV_USE_TILEVIEW != 0 - theme.style.tileview.bg = &lv_style_transp_tight; - theme.style.tileview.scrl = &lv_style_transp_tight; - theme.style.tileview.sb = theme.style.page.sb; -#endif -} - -static void table_init(void) -{ -#if LV_USE_TABLE != 0 - static lv_style_t cell; - lv_style_copy(&cell, theme.style.panel); - cell.body.radius = 0; - cell.body.border.width = 1; - cell.body.shadow.width = 0; - cell.body.padding.left = LV_DPI / 12; - cell.body.padding.right = LV_DPI / 12; - cell.body.padding.top = LV_DPI / 12; - cell.body.padding.bottom = LV_DPI / 12; - - theme.style.table.bg = &lv_style_transp_tight; - theme.style.table.cell = &cell; -#endif -} - -static void win_init(void) -{ -#if LV_USE_WIN != 0 - static lv_style_t header, rel, pr; - - 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.color = lv_color_hsv_to_rgb(_hue, 10, 90); - header.text.color = lv_color_hex3(0x666); - header.image.color = lv_color_hex3(0x666); - header.body.padding.top = 0; - header.body.padding.bottom = 0; - header.body.padding.inner = 0; - - lv_style_copy(&rel, &def); - rel.body.opa = LV_OPA_TRANSP; - rel.body.border.width = 0; - rel.text.color = lv_color_hex3(0x666); - rel.image.color = lv_color_hex3(0x666); - - lv_style_copy(&pr, &rel); - pr.text.color = lv_color_hex3(0x333); - pr.image.color = lv_color_hex3(0x333); - - theme.style.win.bg = theme.style.panel; - theme.style.win.sb = &sb; - theme.style.win.header = &header; - theme.style.win.content = &lv_style_transp; - theme.style.win.btn.rel = &rel; - theme.style.win.btn.pr = ≺ -#endif -} - -#if LV_USE_GROUP - -static void style_mod(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = lv_color_hsv_to_rgb(_hue, 40, 50); - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 20; -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 2; -#endif -} - -static void style_mod_edit(lv_group_t * group, lv_style_t * style) -{ - (void)group; /*Unused*/ - -#if LV_COLOR_DEPTH != 1 - /*Make the style to be a little bit orange*/ - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_GREEN; - - /*If not empty or has border then emphasis the border*/ - if(style->body.opa != LV_OPA_TRANSP || style->body.border.width != 0) style->body.border.width = LV_DPI / 20; - - style->body.main_color = lv_color_mix(style->body.main_color, LV_COLOR_GREEN, LV_OPA_70); - style->body.grad_color = lv_color_mix(style->body.grad_color, LV_COLOR_GREEN, LV_OPA_70); - style->body.shadow.color = lv_color_mix(style->body.shadow.color, LV_COLOR_GREEN, LV_OPA_60); - - style->text.color = lv_color_mix(style->text.color, LV_COLOR_GREEN, LV_OPA_70); -#else - style->body.border.opa = LV_OPA_COVER; - style->body.border.color = LV_COLOR_BLACK; - style->body.border.width = 3; -#endif -} - -#endif /*LV_USE_GROUP*/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Initialize the zen theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_zen_init(uint16_t hue, lv_font_t * font) -{ - if(font == NULL) font = LV_FONT_DEFAULT; - - _hue = hue; - _font = font; - - /*For backward compatibility initialize all theme elements with a default style */ - uint16_t i; - lv_style_t ** style_p = (lv_style_t **)&theme.style; - for(i = 0; i < LV_THEME_STYLE_COUNT; i++) { - *style_p = &def; - style_p++; - } - - basic_init(); - cont_init(); - btn_init(); - label_init(); - img_init(); - line_init(); - led_init(); - bar_init(); - slider_init(); - sw_init(); - lmeter_init(); - gauge_init(); - arc_init(); - preload_init(); - chart_init(); - calendar_init(); - cb_init(); - btnm_init(); - kb_init(); - mbox_init(); - page_init(); - ta_init(); - spinbox_init(); - list_init(); - ddlist_init(); - roller_init(); - tabview_init(); - tileview_init(); - table_init(); - win_init(); - -#if LV_USE_GROUP - theme.group.style_mod_xcb = style_mod; - theme.group.style_mod_edit_xcb = style_mod_edit; -#endif - - return &theme; -} - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_zen(void) -{ - return &theme; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif diff --git a/src/libs/lvgl/src/lv_themes/lv_theme_zen.h b/src/libs/lvgl/src/lv_themes/lv_theme_zen.h deleted file mode 100644 index 4a497fe3..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_theme_zen.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @file lv_theme_zen.h - * - */ - -#ifndef LV_THEME_ZEN_H -#define LV_THEME_ZEN_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_THEME_ZEN - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Initialize the zen theme - * @param hue [0..360] hue value from HSV color space to define the theme's base color - * @param font pointer to a font (NULL to use the default) - * @return pointer to the initialized theme - */ -lv_theme_t * lv_theme_zen_init(uint16_t hue, lv_font_t * font); - -/** - * Get a pointer to the theme - * @return pointer to the theme - */ -lv_theme_t * lv_theme_get_zen(void); - -/********************** - * MACROS - **********************/ - -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_THEME_ZEN_H*/ diff --git a/src/libs/lvgl/src/lv_themes/lv_themes.mk b/src/libs/lvgl/src/lv_themes/lv_themes.mk deleted file mode 100644 index fce41e4e..00000000 --- a/src/libs/lvgl/src/lv_themes/lv_themes.mk +++ /dev/null @@ -1,14 +0,0 @@ -CSRCS += lv_theme_alien.c -CSRCS += lv_theme.c -CSRCS += lv_theme_default.c -CSRCS += lv_theme_night.c -CSRCS += lv_theme_templ.c -CSRCS += lv_theme_zen.c -CSRCS += lv_theme_material.c -CSRCS += lv_theme_nemo.c -CSRCS += lv_theme_mono.c - -DEPPATH += --dep-path $(LVGL_DIR)/lvgl/src/lv_themes -VPATH += :$(LVGL_DIR)/lvgl/src/lv_themes - -CFLAGS += "-I$(LVGL_DIR)/lvgl/src/lv_themes" diff --git a/src/libs/lvgl/src/lv_version.h b/src/libs/lvgl/src/lv_version.h deleted file mode 100644 index 886966f7..00000000 --- a/src/libs/lvgl/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 1 -#define LVGL_VERSION_PATCH 1 -#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*/ |