diff --git a/.github/stale.yml b/.github/stale.yml index 914189811..ea1179b76 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -7,7 +7,7 @@ exemptLabels: - architecture - pinned # Label to use when marking an issue as stale - staleLabel: stale +staleLabel: stale # Comment to post when marking an issue as stale. Set to `false` to disable markComment: > This issue or pull request has been automatically marked as stale because it has not had diff --git a/README.md b/README.md index cb9a00527..aa82ed46e 100644 --- a/README.md +++ b/README.md @@ -62,34 +62,43 @@ The easiest way to get started with LittlevGL is to run it in a simulator on you Choose a project with your favourite IDE: -| Eclipse | CodeBlock | Visual Studio | PlatformIO | Qt Creator | -|-------------|----------- |---------------|-----------|------------| +| Eclipse | CodeBlocks | Visual Studio | PlatformIO | Qt Creator | +|-------------|-------------|---------------|-----------|------------| | [![Eclipse](https://littlevgl.com/logo/ide/eclipse.jpg)](https://github.com/littlevgl/pc_simulator_sdl_eclipse) | [![CodeBlocks](https://littlevgl.com/logo/ide/codeblocks.jpg)](https://github.com/littlevgl/pc_simulator_win_codeblocks) | [![VisualStudio](https://littlevgl.com/logo/ide/visualstudio.jpg)](https://github.com/littlevgl/visual_studio_2017_sdl_x64) | [![PlatformIO](https://littlevgl.com/logo/ide/platformio.jpg)](https://github.com/littlevgl/pc_simulator_sdl_platformio) | [![QtCreator](https://littlevgl.com/logo/ide/qtcreator.jpg)](https://blog.littlevgl.com/2019-01-03/qt-creator) | | Cross-platform
with SDL | Native Windows | Cross-platform
with SDL | Cross-platform
with SDL | Cross-platform
with SDL | ### Porting to an embedded hardware In the most simple case you need to do these steps: 1. Copy `lv_conf_templ.h` as `lv_conf.h` next to `lvgl` and set at least `LV_HOR_RES`, `LV_VER_RES` and `LV_COLOR_DEPTH`. -2. Call `lv_tick_inc(x)` every `x` milliseconds in a Timer or Task (`x` should be between 1 and 10) +2. Call `lv_tick_inc(x)` every `x` milliseconds **in a Timer or Task** (`x` should be between 1 and 10) 3. Call `lv_init()` -4. Register a function which can **copy a pixel array** to an area of the screen: +4. Create a buffer for LittlevGL +```c +static lv_disp_buf_t disp_buf; +static lv_color_t buf[LV_HOR_RES_MAX * 10]; /*Declare a buffer for 10 lines*/ +v_disp_buf_init(&disp_buf1, buf, NULL, LV_HOR_RES_MAX * 10); /*Initialize the display buffer*/ +``` +4. Implement and register a function which can **copy a pixel array** to an area of your diplay: ```c lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ lv_disp_drv_init(&disp_drv); /*Basic initialization*/ -disp_drv.disp_flush = disp_flush; /*Set your driver function*/ +disp_drv.hor_res = 480; /*Set the horizontal resolution*/ +disp_drv.ver_res = 320; /*Set the vertical resolution*/ +disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/ +disp_drv.buffer = &disp_buf; /*Assign the buffer to teh display*/ lv_disp_drv_register(&disp_drv); /*Finally register the driver*/ -void disp_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p) +void my_disp_flush(lv_disp_t * disp, const lv_area_t * area, lv_color_t * color_p) { int32_t x, y; - for(y = y1; y <= y2; y++) { - for(x = x1; x <= x2; x++) { - sep_pixel(x, y, *color_p); /* Put a pixel to the display.*/ + for(y = area->y1; y <= area->y2; y++) { + for(x = area->x1; x <= area->x2; x++) { + set_pixel(x, y, *color_p); /* Put a pixel to the display.*/ color_p++; } } - lv_flush_ready(); /* Tell you are ready with the flushing*/ + lv_disp_flush_ready(disp); /* Tell you are ready with the flushing*/ } ``` @@ -97,10 +106,10 @@ void disp_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t ```c lv_indev_drv_init(&indev_drv); /*Descriptor of a input device driver*/ indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/ -indev_drv.read = touchpad_read; /*Set your driver function*/ +indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/ lv_indev_drv_register(&indev_drv); /*Finally register the driver*/ -bool touchpad_read(lv_indev_data_t * data) +bool my_touchpad_read(lv_indev_t * indev, lv_indev_data_t * data) { static lv_coord_t last_x = 0; static lv_coord_t last_y = 0; @@ -116,9 +125,9 @@ bool touchpad_read(lv_indev_data_t * data) return false; /*Return `false` because we are not buffering and no more data to read*/ } ``` -6. Call `lv_task_handler()` periodically every few milliseconds in the main `while(1)` loop, in Timer interrupt or in an Operation system task. +6. Call `lv_task_handler()` periodically every few milliseconds in the main `while(1)` loop, in a Timer interrupt or in an Operation system task. -For a detailed description check the [Documentation](https://docs.littlevgl.com/#Porting) or the [Porting tutorial](https://github.com/littlevgl/lv_examples/blob/master/lv_tutorial/0_porting/lv_tutorial_porting.c) +For a detailed description check the [Documentation](https://docs.littlevgl.com/#Porting) or the [Porting examples](https://github.com/littlevgl/lvgl/tree/multi-disp/lv_porting). ### Code examples diff --git a/lv_conf_checker.h b/lv_conf_checker.h index e4caa9480..b818dd1c8 100644 --- a/lv_conf_checker.h +++ b/lv_conf_checker.h @@ -6,6 +6,50 @@ #ifndef LV_CONF_CHECKER_H #define LV_CONF_CHECKER_H + +/*=================== + Graphical settings + *===================*/ + +/* Horizontal and vertical resolution of 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 settings*/ +#ifndef LV_COLOR_DEPTH +#define LV_COLOR_DEPTH 16 /*Color depth: 1/8/16/32*/ +#endif +#ifndef LV_COLOR_16_SWAP +#define LV_COLOR_16_SWAP 0 /*Swap the 2 bytes of RGB565 color. Useful if the display has a 8 bit interface (e.g. SPI)*/ +#endif +#ifndef LV_COLOR_SCREEN_TRANSP +#define LV_COLOR_SCREEN_TRANSP 0 /*1: Enable screen transparency. Useful for OSD or other overlapping GUIs. Requires ARGB8888 colors*/ +#endif +#ifndef LV_COLOR_TRANSP +#define LV_COLOR_TRANSP LV_COLOR_LIME /*Images pixels with this color will not be drawn (with chroma keying)*/ +#endif + +/* Enable anti-aliasing (lines, and radiuses will be smoothed) */ +#ifndef LV_ANTIALIAS +#define LV_ANTIALIAS 1 /*1: Enable anti-aliasing*/ +#endif + + +/*Screen refresh period in milliseconds. LittlevGL will redraw the screen with this period*/ +#ifndef LV_REFR_PERIOD +#define LV_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 + /*=================== Dynamic memory *===================*/ @@ -17,7 +61,7 @@ #endif #if LV_MEM_CUSTOM == 0 #ifndef LV_MEM_SIZE -# define LV_MEM_SIZE (64U * 1024U) /*Size memory used by `lv_mem_alloc` in bytes (>= 2kB)*/ +# define LV_MEM_SIZE (16U * 1024U) /*Size memory used by `lv_mem_alloc` in bytes (>= 2kB)*/ #endif #ifndef LV_MEM_ATTR # define LV_MEM_ATTR /*Complier prefix for big array declaration*/ @@ -40,7 +84,8 @@ #endif #endif /*LV_MEM_CUSTOM*/ -/* Garbage Collector settings. */ +/* Garbage Collector settings + * Used if lvgl is binded to higher language and the memory is managed by that language */ #ifndef LV_ENABLE_GC #define LV_ENABLE_GC 0 #endif @@ -56,96 +101,13 @@ #endif #endif /* LV_ENABLE_GC */ -/*=================== - Graphical settings - *===================*/ - -/* Horizontal and vertical resolution of the library.*/ -#ifndef LV_HOR_RES -#define LV_HOR_RES (480) -#endif -#ifndef LV_VER_RES -#define LV_VER_RES (320) -#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 -#endif - -/* Enable anti-aliasing (lines, and radiuses will be smoothed) */ -#ifndef LV_ANTIALIAS -#define LV_ANTIALIAS 1 /*1: Enable anti-aliasing*/ -#endif - -/*Screen refresh period in milliseconds*/ -#ifndef LV_REFR_PERIOD -#define LV_REFR_PERIOD 30 -#endif - -/*----------------- - * VDB settings - *----------------*/ - -/* VDB (Virtual Display Buffer) is an internal graphics buffer. - * To images will be drawn into this buffer first and then - * the buffer will be passed to your `disp_drv.disp_flush` function to - * copy it to your frame buffer. - * VDB is required for: buffered drawing, opacity, anti-aliasing and shadows - * Learn more: https://docs.littlevgl.com/#Drawing*/ - -/* Size of the VDB in pixels. Typical size: ~1/10 screen. Must be >= LV_HOR_RES - * Setting it to 0 will disable VDB and `disp_drv.disp_fill` and `disp_drv.disp_map` functions - * will be called to draw to the frame buffer directly*/ -#ifndef LV_VDB_SIZE -#define LV_VDB_SIZE ((LV_VER_RES * LV_HOR_RES) / 10) -#endif - - /* Bit-per-pixel of VDB. Useful for monochrome or non-standard color format displays. - * Special formats are handled with `disp_drv.vdb_wr`)*/ -#ifndef LV_VDB_PX_BPP -#define LV_VDB_PX_BPP LV_COLOR_SIZE /*LV_COLOR_SIZE comes from LV_COLOR_DEPTH below to set 8, 16 or 32 bit pixel size automatically */ -#endif - - /* Place VDB to a specific address (e.g. in external RAM) - * 0: allocate automatically into RAM - * LV_VDB_ADR_INV: to replace it later with `lv_vdb_set_adr()`*/ -#ifndef LV_VDB_ADR -#define LV_VDB_ADR 0 -#endif - -/* Use two Virtual Display buffers (VDB) parallelize rendering and flushing (optional) - * The flushing should use DMA to write the frame buffer in the background */ -#ifndef LV_VDB_DOUBLE -#define LV_VDB_DOUBLE 0 -#endif - -/* Place VDB2 to a specific address (e.g. in external RAM) - * 0: allocate automatically into RAM - * LV_VDB_ADR_INV: to replace it later with `lv_vdb_set_adr()`*/ -#ifndef LV_VDB2_ADR -#define LV_VDB2_ADR 0 -#endif - -/* Using true double buffering in `disp_drv.disp_flush` you will always get the image of the whole screen. - * Your only task is to set the rendered image (`color_p` parameter) as frame buffer address or send it to your display. - * The best if you do in the blank period of you display to avoid tearing effect. - * Requires: - * - LV_VDB_SIZE = LV_HOR_RES * LV_VER_RES - * - LV_VDB_DOUBLE = 1 - */ -#ifndef LV_VDB_TRUE_DOUBLE_BUFFERED -#define LV_VDB_TRUE_DOUBLE_BUFFERED 0 -#endif - /*================= Misc. setting *=================*/ /*Input device settings*/ #ifndef LV_INDEV_READ_PERIOD -#define LV_INDEV_READ_PERIOD 50 /*Input device read period in milliseconds*/ +#define LV_INDEV_READ_PERIOD 30 /*Input device read period in milliseconds*/ #endif #ifndef LV_INDEV_POINT_MARKER #define LV_INDEV_POINT_MARKER 0 /*Mark the pressed points (required: USE_LV_REAL_DRAW = 1)*/ @@ -163,20 +125,6 @@ #define LV_INDEV_LONG_PRESS_REP_TIME 100 /*Repeated trigger period in long press [ms] */ #endif -/*Color settings*/ -#ifndef LV_COLOR_DEPTH -#define LV_COLOR_DEPTH 32 /*Color depth: 1/8/16/32*/ -#endif -#ifndef LV_COLOR_16_SWAP -#define LV_COLOR_16_SWAP 0 /*Swap the 2 bytes of RGB565 color. Useful if the display has a 8 bit interface (e.g. SPI)*/ -#endif -#ifndef LV_COLOR_SCREEN_TRANSP -#define LV_COLOR_SCREEN_TRANSP 0 /*1: Enable screen transparency. Useful for OSD or other overlapping GUIs. Requires ARGB8888 colors*/ -#endif -#ifndef LV_COLOR_TRANSP -#define LV_COLOR_TRANSP LV_COLOR_LIME /*Images pixels with this color will not be drawn (with chroma keying)*/ -#endif - /*Text settings*/ #ifndef LV_TXT_UTF8 #define LV_TXT_UTF8 1 /*Enable UTF-8 coded Unicode character usage */ @@ -207,14 +155,17 @@ #ifndef USE_LV_GPU #define USE_LV_GPU 1 /*1: Enable GPU interface*/ #endif -#ifndef USE_LV_REAL_DRAW -#define USE_LV_REAL_DRAW 1 /*1: Enable function which draw directly to the frame buffer instead of VDB (required if LV_VDB_SIZE = 0)*/ -#endif #ifndef USE_LV_FILESYSTEM #define USE_LV_FILESYSTEM 1 /*1: Enable file system (might be required for images*/ #endif -#ifndef USE_LV_MULTI_LANG -#define USE_LV_MULTI_LANG 0 /* Number of languages for labels to store (0: to disable this feature)*/ +#ifndef USE_LV_I18N +#define USE_LV_I18N 1 /*1: Enable InternationalizatioN (multi-language) support*/ +#endif +#ifndef USE_LV_USER_DATA_SINGLE +#define USE_LV_USER_DATA_SINGLE 1 /*1: Add a `user_data` to drivers and objects*/ +#endif +#ifndef USE_LV_USER_DATA_MULTI +#define USE_LV_USER_DATA_MULTI 0 /*1: Add separate `user_data` for every callback*/ #endif /*Compiler settings*/ @@ -237,13 +188,15 @@ #endif #if LV_TICK_CUSTOM == 1 #ifndef LV_TICK_CUSTOM_INCLUDE -#define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the sys time function*/ +#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*/ +#endif /*LV_TICK_CUSTOM*/ +typedef void * lv_disp_drv_user_data_t; /*Type of user data in the display driver*/ +typedef void * lv_indev_drv_user_data_t; /*Type of user data in the display driver*/ /*Log settings*/ #ifndef USE_LV_LOG @@ -253,16 +206,16 @@ /* 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 caused problem + * 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 */ #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*/ +/* 1: Print the log with 'printf'; 0: user need to register a callback*/ #ifndef LV_LOG_PRINTF -# define LV_LOG_PRINTF 1 +# define LV_LOG_PRINTF 0 #endif #endif /*USE_LV_LOG*/ @@ -270,7 +223,7 @@ * THEME USAGE *================*/ #ifndef LV_THEME_LIVE_UPDATE -#define LV_THEME_LIVE_UPDATE 1 /*1: Allow theme switching at run time. Uses 8..10 kB of RAM*/ +#define LV_THEME_LIVE_UPDATE 0 /*1: Allow theme switching at run time. Uses 8..10 kB of RAM*/ #endif #ifndef USE_LV_THEME_TEMPL @@ -306,16 +259,16 @@ * To enable a built-in font use 1,2,4 or 8 values * which will determine the bit-per-pixel. Higher value means smoother fonts */ #ifndef USE_LV_FONT_DEJAVU_10 -#define USE_LV_FONT_DEJAVU_10 4 +#define USE_LV_FONT_DEJAVU_10 0 #endif #ifndef USE_LV_FONT_DEJAVU_10_LATIN_SUP -#define USE_LV_FONT_DEJAVU_10_LATIN_SUP 4 +#define USE_LV_FONT_DEJAVU_10_LATIN_SUP 0 #endif #ifndef USE_LV_FONT_DEJAVU_10_CYRILLIC -#define USE_LV_FONT_DEJAVU_10_CYRILLIC 4 +#define USE_LV_FONT_DEJAVU_10_CYRILLIC 0 #endif #ifndef USE_LV_FONT_SYMBOL_10 -#define USE_LV_FONT_SYMBOL_10 4 +#define USE_LV_FONT_SYMBOL_10 0 #endif #ifndef USE_LV_FONT_DEJAVU_20 @@ -332,29 +285,29 @@ #endif #ifndef USE_LV_FONT_DEJAVU_30 -#define USE_LV_FONT_DEJAVU_30 4 +#define USE_LV_FONT_DEJAVU_30 0 #endif #ifndef USE_LV_FONT_DEJAVU_30_LATIN_SUP -#define USE_LV_FONT_DEJAVU_30_LATIN_SUP 4 +#define USE_LV_FONT_DEJAVU_30_LATIN_SUP 0 #endif #ifndef USE_LV_FONT_DEJAVU_30_CYRILLIC -#define USE_LV_FONT_DEJAVU_30_CYRILLIC 4 +#define USE_LV_FONT_DEJAVU_30_CYRILLIC 0 #endif #ifndef USE_LV_FONT_SYMBOL_30 -#define USE_LV_FONT_SYMBOL_30 4 +#define USE_LV_FONT_SYMBOL_30 0 #endif #ifndef USE_LV_FONT_DEJAVU_40 -#define USE_LV_FONT_DEJAVU_40 4 +#define USE_LV_FONT_DEJAVU_40 0 #endif #ifndef USE_LV_FONT_DEJAVU_40_LATIN_SUP -#define USE_LV_FONT_DEJAVU_40_LATIN_SUP 4 +#define USE_LV_FONT_DEJAVU_40_LATIN_SUP 0 #endif #ifndef USE_LV_FONT_DEJAVU_40_CYRILLIC -#define USE_LV_FONT_DEJAVU_40_CYRILLIC 4 +#define USE_LV_FONT_DEJAVU_40_CYRILLIC 0 #endif #ifndef USE_LV_FONT_SYMBOL_40 -#define USE_LV_FONT_SYMBOL_40 4 +#define USE_LV_FONT_SYMBOL_40 0 #endif #ifndef USE_LV_FONT_MONOSPACE_8 @@ -386,7 +339,7 @@ #define LV_OBJ_FREE_PTR 1 /*Enable the free pointer attribute*/ #endif #ifndef LV_OBJ_REALIGN -#define LV_OBJ_REALIGN 0 /*Enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/ +#define LV_OBJ_REALIGN 1 /*Enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/ #endif /*================== diff --git a/lv_conf_templ.h b/lv_conf_templ.h index fcadf391b..cce4c48b7 100644 --- a/lv_conf_templ.h +++ b/lv_conf_templ.h @@ -9,8 +9,35 @@ #if 0 /*Set it to "1" to enable content*/ + #ifndef LV_CONF_H #define LV_CONF_H + +/*=================== + Graphical settings + *===================*/ + +/* Horizontal and vertical resolution of the library.*/ +#define LV_HOR_RES_MAX (480) +#define LV_VER_RES_MAX (320) + +/*Color settings*/ +#define LV_COLOR_DEPTH 16 /*Color depth: 1/8/16/32*/ +#define LV_COLOR_16_SWAP 0 /*Swap the 2 bytes of RGB565 color. Useful if the display has a 8 bit interface (e.g. SPI)*/ +#define LV_COLOR_SCREEN_TRANSP 0 /*1: Enable screen transparency. Useful for OSD or other overlapping GUIs. Requires ARGB8888 colors*/ +#define LV_COLOR_TRANSP LV_COLOR_LIME /*Images pixels with this color will not be drawn (with chroma keying)*/ + +/* Enable anti-aliasing (lines, and radiuses will be smoothed) */ +#define LV_ANTIALIAS 1 /*1: Enable anti-aliasing*/ + + +/*Screen refresh period in milliseconds. LittlevGL will redraw the screen with this period*/ +#define LV_REFR_PERIOD 30 /*[ms]*/ + +/* 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)*/ +#define LV_DPI 100 /*[px]*/ + /*=================== Dynamic memory *===================*/ @@ -19,7 +46,7 @@ * to store the graphical objects and other data */ #define LV_MEM_CUSTOM 0 /*1: use custom malloc/free, 0: use the built-in lv_mem_alloc/lv_mem_free*/ #if LV_MEM_CUSTOM == 0 -# define LV_MEM_SIZE (64U * 1024U) /*Size memory used by `lv_mem_alloc` in bytes (>= 2kB)*/ +# define LV_MEM_SIZE (16U * 1024U) /*Size memory used by `lv_mem_alloc` in bytes (>= 2kB)*/ # define LV_MEM_ATTR /*Complier prefix for big array declaration*/ # define LV_MEM_ADR 0 /*Set an address for memory pool instead of allocation it as an array. Can be in external SRAM too.*/ # define LV_MEM_AUTO_DEFRAG 1 /*Automatically defrag on free*/ @@ -38,85 +65,18 @@ # define LV_GC_INCLUDE "gc.h" /*Include Garbage Collector related things*/ #endif /* LV_ENABLE_GC */ -/*=================== - Graphical settings - *===================*/ - -/* Horizontal and vertical resolution of the library.*/ -#define LV_HOR_RES (480) -#define LV_VER_RES (320) - -/* 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)*/ -#define LV_DPI 100 - -/* Enable anti-aliasing (lines, and radiuses will be smoothed) */ -#define LV_ANTIALIAS 1 /*1: Enable anti-aliasing*/ - -/*Screen refresh period in milliseconds*/ -#define LV_REFR_PERIOD 30 - -/*----------------- - * VDB settings - *----------------*/ - -/* VDB (Virtual Display Buffer) is an internal graphics buffer. - * The GUI will be drawn into this buffer first and then - * the buffer will be passed to your `disp_drv.disp_flush` function to - * copy it to your frame buffer. - * VDB is required for: buffered drawing, opacity, anti-aliasing and shadows - * Learn more: https://docs.littlevgl.com/#Drawing*/ - -/* Size of the VDB in pixels. Typical size: ~1/10 screen. Must be >= LV_HOR_RES - * Setting it to 0 will disable VDB and `disp_drv.disp_fill` and `disp_drv.disp_map` functions - * will be called to draw to the frame buffer directly*/ -#define LV_VDB_SIZE ((LV_VER_RES * LV_HOR_RES) / 10) - - /* Bit-per-pixel of VDB. Useful for monochrome or non-standard color format displays. - * Special formats are handled with `disp_drv.vdb_wr`)*/ -#define LV_VDB_PX_BPP LV_COLOR_SIZE /*LV_COLOR_SIZE comes from LV_COLOR_DEPTH below to set 8, 16 or 32 bit pixel size automatically */ - - /* Place VDB to a specific address (e.g. in external RAM) - * 0: allocate automatically into RAM - * LV_VDB_ADR_INV: to replace it later with `lv_vdb_set_adr()`*/ -#define LV_VDB_ADR 0 - -/* Use two Virtual Display buffers (VDB) to parallelize rendering and flushing - * The flushing should use DMA to write the frame buffer in the background */ -#define LV_VDB_DOUBLE 0 - -/* Place VDB2 to a specific address (e.g. in external RAM) - * 0: allocate automatically into RAM - * LV_VDB_ADR_INV: to replace it later with `lv_vdb_set_adr()`*/ -#define LV_VDB2_ADR 0 - -/* Using true double buffering in `disp_drv.disp_flush` you will always get the image of the whole screen. - * Your only task is to set the rendered image (`color_p` parameter) as frame buffer address or send it to your display. - * The best if you do in the blank period of you display to avoid tearing effect. - * Requires: - * - LV_VDB_SIZE = LV_HOR_RES * LV_VER_RES - * - LV_VDB_DOUBLE = 1 - */ -#define LV_VDB_TRUE_DOUBLE_BUFFERED 0 - /*================= Misc. setting *=================*/ /*Input device settings*/ -#define LV_INDEV_READ_PERIOD 50 /*Input device read period in milliseconds*/ +#define LV_INDEV_READ_PERIOD 30 /*Input device read period in milliseconds*/ #define LV_INDEV_POINT_MARKER 0 /*Mark the pressed points (required: USE_LV_REAL_DRAW = 1)*/ #define LV_INDEV_DRAG_LIMIT 10 /*Drag threshold in pixels */ #define LV_INDEV_DRAG_THROW 20 /*Drag throw slow-down in [%]. Greater value means faster slow-down */ #define LV_INDEV_LONG_PRESS_TIME 400 /*Long press time in milliseconds*/ #define LV_INDEV_LONG_PRESS_REP_TIME 100 /*Repeated trigger period in long press [ms] */ -/*Color settings*/ -#define LV_COLOR_DEPTH 16 /*Color depth: 1/8/16/32*/ -#define LV_COLOR_16_SWAP 0 /*Swap the 2 bytes of RGB565 color. Useful if the display has a 8 bit interface (e.g. SPI)*/ -#define LV_COLOR_SCREEN_TRANSP 0 /*1: Enable screen transparency. Useful for OSD or other overlapping GUIs. Requires ARGB8888 colors*/ -#define LV_COLOR_TRANSP LV_COLOR_LIME /*Images pixels with this color will not be drawn (with chroma keying)*/ - /*Text settings*/ #define LV_TXT_UTF8 1 /*Enable UTF-8 coded Unicode character usage */ #define LV_TXT_BREAK_CHARS " ,.;:-_" /*Can break texts on these chars*/ @@ -129,9 +89,10 @@ #define USE_LV_SHADOW 1 /*1: Enable shadows*/ #define USE_LV_GROUP 1 /*1: Enable object groups (for keyboards)*/ #define USE_LV_GPU 1 /*1: Enable GPU interface*/ -#define USE_LV_REAL_DRAW 1 /*1: Enable function which draw directly to the frame buffer instead of VDB (required if LV_VDB_SIZE = 0)*/ #define USE_LV_FILESYSTEM 1 /*1: Enable file system (might be required for images*/ -#define USE_LV_MULTI_LANG 0 /* Number of languages for labels to store (0: to disable this feature)*/ +#define USE_LV_I18N 1 /*1: Enable InternationalizatioN (multi-language) support*/ +#define USE_LV_USER_DATA_SINGLE 1 /*1: Add a `user_data` to drivers and objects*/ +#define USE_LV_USER_DATA_MULTI 0 /*1: Add separate `user_data` for every callback*/ /*Compiler settings*/ #define LV_ATTRIBUTE_TICK_INC /* Define a custom attribute to `lv_tick_inc` function */ @@ -142,10 +103,12 @@ /*HAL settings*/ #define LV_TICK_CUSTOM 0 /*1: use a custom tick source (removing the need to manually update the tick with `lv_tick_inc`) */ #if LV_TICK_CUSTOM == 1 -#define LV_TICK_CUSTOM_INCLUDE "sonething.h" /*Header for the sys time function*/ +#define LV_TICK_CUSTOM_INCLUDE "something.h" /*Header for the sys time function*/ #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current systime in ms*/ -#endif /*LV_TICK_CUSTOM*/ +#endif /*LV_TICK_CUSTOM*/ +typedef void * lv_disp_drv_user_data_t; /*Type of user data in the display driver*/ +typedef void * lv_indev_drv_user_data_t; /*Type of user data in the display driver*/ /*Log settings*/ #define USE_LV_LOG 1 /*Enable/disable the log module*/ @@ -153,19 +116,19 @@ /* 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 caused problem + * 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 */ # define LV_LOG_LEVEL LV_LOG_LEVEL_WARN -/* 1: Print the log with 'printf'; 0: user need to register a callback*/ +/* 1: Print the log with 'printf'; 0: user need to register a callback*/ # define LV_LOG_PRINTF 0 #endif /*USE_LV_LOG*/ /*================ * THEME USAGE *================*/ -#define LV_THEME_LIVE_UPDATE 1 /*1: Allow theme switching at run time. Uses 8..10 kB of RAM*/ +#define LV_THEME_LIVE_UPDATE 0 /*1: Allow theme switching at run time. Uses 8..10 kB of RAM*/ #define USE_LV_THEME_TEMPL 0 /*Just for test*/ #define USE_LV_THEME_DEFAULT 1 /*Built mainly from the built-in styles. Consumes very few RAM*/ @@ -183,25 +146,25 @@ /* More info about fonts: https://docs.littlevgl.com/#Fonts * To enable a built-in font use 1,2,4 or 8 values * which will determine the bit-per-pixel. Higher value means smoother fonts */ -#define USE_LV_FONT_DEJAVU_10 4 -#define USE_LV_FONT_DEJAVU_10_LATIN_SUP 4 -#define USE_LV_FONT_DEJAVU_10_CYRILLIC 4 -#define USE_LV_FONT_SYMBOL_10 4 +#define USE_LV_FONT_DEJAVU_10 0 +#define USE_LV_FONT_DEJAVU_10_LATIN_SUP 0 +#define USE_LV_FONT_DEJAVU_10_CYRILLIC 0 +#define USE_LV_FONT_SYMBOL_10 0 #define USE_LV_FONT_DEJAVU_20 4 #define USE_LV_FONT_DEJAVU_20_LATIN_SUP 4 #define USE_LV_FONT_DEJAVU_20_CYRILLIC 4 #define USE_LV_FONT_SYMBOL_20 4 -#define USE_LV_FONT_DEJAVU_30 4 -#define USE_LV_FONT_DEJAVU_30_LATIN_SUP 4 -#define USE_LV_FONT_DEJAVU_30_CYRILLIC 4 -#define USE_LV_FONT_SYMBOL_30 4 +#define USE_LV_FONT_DEJAVU_30 0 +#define USE_LV_FONT_DEJAVU_30_LATIN_SUP 0 +#define USE_LV_FONT_DEJAVU_30_CYRILLIC 0 +#define USE_LV_FONT_SYMBOL_30 0 -#define USE_LV_FONT_DEJAVU_40 4 -#define USE_LV_FONT_DEJAVU_40_LATIN_SUP 4 -#define USE_LV_FONT_DEJAVU_40_CYRILLIC 4 -#define USE_LV_FONT_SYMBOL_40 4 +#define USE_LV_FONT_DEJAVU_40 0 +#define USE_LV_FONT_DEJAVU_40_LATIN_SUP 0 +#define USE_LV_FONT_DEJAVU_40_CYRILLIC 0 +#define USE_LV_FONT_SYMBOL_40 0 #define USE_LV_FONT_MONOSPACE_8 1 @@ -392,4 +355,5 @@ #endif /*LV_CONF_H*/ + #endif /*End of "Content enable"*/ diff --git a/lv_core/lv_core.mk b/lv_core/lv_core.mk index 9992e3fe7..ac69f25e3 100644 --- a/lv_core/lv_core.mk +++ b/lv_core/lv_core.mk @@ -1,9 +1,9 @@ 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_vdb.c CSRCS += lv_lang.c DEPPATH += --dep-path $(LVGL_DIR)/lvgl/lv_core diff --git a/lv_core/lv_disp.c b/lv_core/lv_disp.c new file mode 100644 index 000000000..dc4578d17 --- /dev/null +++ b/lv_core/lv_disp.c @@ -0,0 +1,117 @@ +/** + * @file lv_disp.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_disp.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_set_scr_act(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); +} + +/********************** + * STATIC FUNCTIONS + **********************/ diff --git a/lv_core/lv_disp.h b/lv_core/lv_disp.h new file mode 100644 index 000000000..e304fc43e --- /dev/null +++ b/lv_core/lv_disp.h @@ -0,0 +1,114 @@ +/** + * @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_set_scr_act(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); + +/*------------------------------------------------ + * 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_top_layer(void) +{ + return lv_disp_get_layer_top(lv_disp_get_default()); +} + +/** + * Get the active screen of the deafult display + * @return pointer to the sys layer + */ +static inline lv_obj_t * lv_sys_layer(void) +{ + return lv_disp_get_layer_sys(lv_disp_get_default()); +} + +/********************** + * MACROS + **********************/ + +/*------------------------------------------------ + * To improve backward compatibility + * Recommended only if you have one display + *------------------------------------------------*/ + +#define LV_HOR_RES (lv_disp_get_hor_res(lv_disp_get_default());) +#define LV_VER_RES (lv_disp_get_ver_res(lv_disp_get_default());) + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_TEMPL_H*/ diff --git a/lv_core/lv_group.c b/lv_core/lv_group.c index 46b71d15f..62156f28d 100644 --- a/lv_core/lv_group.c +++ b/lv_core/lv_group.c @@ -8,7 +8,9 @@ *********************/ #include "lv_group.h" #if USE_LV_GROUP != 0 +#include "../lv_themes/lv_theme.h" #include +#include "../lv_misc/lv_gc.h" /********************* * DEFINES @@ -23,7 +25,9 @@ **********************/ static void style_mod_def(lv_style_t * style); static void style_mod_edit_def(lv_style_t * style); -static void lv_group_refocus(lv_group_t *g); +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 VARIABLES @@ -37,24 +41,35 @@ static void lv_group_refocus(lv_group_t *g); * 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_mem_alloc(sizeof(lv_group_t)); + lv_group_t * group = lv_ll_ins_head(&LV_GC_ROOT(_lv_group_ll)); lv_mem_assert(group); if(group == NULL) return NULL; lv_ll_init(&group->obj_ll, sizeof(lv_obj_t *)); - group->style_mod = style_mod_def; - group->style_mod_edit = style_mod_edit_def; 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; + + /*Initialize style modification callbacks from current theme*/ + refresh_theme(group, lv_theme_get_current()); return group; } @@ -193,29 +208,7 @@ void lv_group_focus_obj(lv_obj_t * obj) */ void lv_group_focus_next(lv_group_t * group) { - if(group->frozen) return; - - if(group->obj_focus) { - (*group->obj_focus)->signal_func(*group->obj_focus, LV_SIGNAL_DEFOCUS, NULL); - lv_obj_invalidate(*group->obj_focus); - } - - lv_obj_t ** obj_next; - if(group->obj_focus == NULL) obj_next = lv_ll_get_head(&group->obj_ll); - else obj_next = lv_ll_get_next(&group->obj_ll, group->obj_focus); - - if(obj_next == NULL) { - if(group->wrap) obj_next = lv_ll_get_head(&group->obj_ll); - else obj_next = lv_ll_get_tail(&group->obj_ll); - } - group->obj_focus = obj_next; - - if(group->obj_focus) { - (*group->obj_focus)->signal_func(*group->obj_focus, LV_SIGNAL_FOCUS, NULL); - lv_obj_invalidate(*group->obj_focus); - - if(group->focus_cb) group->focus_cb(group); - } + focus_next_core(group, lv_ll_get_head, lv_ll_get_next); } /** @@ -224,30 +217,7 @@ void lv_group_focus_next(lv_group_t * group) */ void lv_group_focus_prev(lv_group_t * group) { - if(group->frozen) return; - - if(group->obj_focus) { - (*group->obj_focus)->signal_func(*group->obj_focus, LV_SIGNAL_DEFOCUS, NULL); - lv_obj_invalidate(*group->obj_focus); - } - - lv_obj_t ** obj_next; - if(group->obj_focus == NULL) obj_next = lv_ll_get_tail(&group->obj_ll); - else obj_next = lv_ll_get_prev(&group->obj_ll, group->obj_focus); - - if(obj_next == NULL) { - if(group->wrap) obj_next = lv_ll_get_tail(&group->obj_ll); - else obj_next = lv_ll_get_head(&group->obj_ll); - } - group->obj_focus = obj_next; - - if(group->obj_focus != NULL) { - (*group->obj_focus)->signal_func(*group->obj_focus, LV_SIGNAL_FOCUS, NULL); - lv_obj_invalidate(*group->obj_focus); - - if(group->focus_cb) group->focus_cb(group); - } - + focus_next_core(group, lv_ll_get_tail, lv_ll_get_prev); } /** @@ -460,6 +430,25 @@ bool lv_group_get_wrap(lv_group_t * group) 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; + LL_READ(LV_GC_ROOT(_lv_group_ll), i) { + refresh_theme(i, th); + } +} + /********************** * STATIC FUNCTIONS **********************/ @@ -522,4 +511,73 @@ static void style_mod_edit_def(lv_style_t * style) } +static void refresh_theme(lv_group_t * g, lv_theme_t * th) +{ + g->style_mod = style_mod_def; + g->style_mod_edit = style_mod_edit_def; + if(th) { + if(th->group.style_mod) + g->style_mod = th->group.style_mod; + if(th->group.style_mod_edit) + g->style_mod_edit = th->group.style_mod_edit; + } +} + +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_func(*group->obj_focus, LV_SIGNAL_DEFOCUS, NULL); + lv_obj_invalidate(*group->obj_focus); + } + + group->obj_focus = obj_next; + + (*group->obj_focus)->signal_func(*group->obj_focus, LV_SIGNAL_FOCUS, NULL); + lv_obj_invalidate(*group->obj_focus); + + if(group->focus_cb) group->focus_cb(group); +} + #endif /*USE_LV_GROUP != 0*/ diff --git a/lv_core/lv_group.h b/lv_core/lv_group.h index 133d5954e..7b3a6d482 100644 --- a/lv_core/lv_group.h +++ b/lv_core/lv_group.h @@ -72,6 +72,12 @@ typedef enum _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 @@ -236,6 +242,12 @@ bool lv_group_get_click_focus(const lv_group_t * group); */ 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 **********************/ diff --git a/lv_core/lv_i18n.c b/lv_core/lv_i18n.c new file mode 100644 index 000000000..c7fdb647d --- /dev/null +++ b/lv_core/lv_i18n.c @@ -0,0 +1,256 @@ +/** + * @file lv_i18n.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_i18n.h" +#if USE_LV_I18N + +#include "lv_obj.h" +#include "../lv_misc/lv_gc.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ +static const void * lv_i18n_get_text_core(const lv_i18n_trans_t * trans, const char * msg_id); + +/********************** + * STATIC VARIABLES + **********************/ +static const lv_i18n_lang_pack_t * languages; +static const lv_i18n_lang_t * local_lang; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Set the languages for internationalization + * @param langs pointer to the array of languages. (Last element has to be `NULL`) + * @return 0: no error; < 0: error + */ +int lv_i18n_init(const lv_i18n_lang_pack_t * langs) +{ + if(langs == NULL) { + LV_LOG_WARN("lv_i18n_init: `langs` can't be NULL"); + return -1; + } + + if(langs[0] == NULL) { + LV_LOG_WARN("lv_i18n_init: `langs` need to contain at least one translation"); + return -1; + } + + languages = langs; + local_lang = langs[0]; /*Automatically select the first language*/ + + return 0; +} + +/** + * Change the localization (language) + * @param lang_code name of the translation to use. E.g. "en_GB" + * @return 0: no error; < 0: error + */ +int lv_i18n_set_local(const char * lang_code) +{ + if(languages == NULL) { + LV_LOG_WARN("lv_i18n_set_local: The languages are not set with lv_i18n_init() yet"); + return -1; + } + + uint16_t i; + for(i = 0; languages[i] != NULL; i++) { + if(strcmp(languages[i]->name, lang_code) == 0) break; /*A language has found*/ + } + + /*The language wasn't found*/ + if(languages[i] == NULL) { + LV_LOG_WARN("lv_i18n_set_local: The selected language doesn't found"); + return -1; + } + + local_lang = languages[i]; + + LV_LOG_INFO("lv_i18n_set_local: new local selected") + + return 0; +} + +/** + * Get the translation from a message ID + * @param msg_id message ID + * @return the translation of `msg_id` on the set local + */ +const char * lv_i18n_get_text(const char * msg_id) +{ + if(local_lang == NULL) { + LV_LOG_WARN("lv_i18n_get_text: No language selected"); + return msg_id; + } + + const lv_i18n_lang_t * lang = local_lang; + + if(lang->simple == NULL) { + if(lang == languages[0]) { + LV_LOG_WARN("lv_i18n_get_text: No translations are specified even on the default language."); + return msg_id; + } else { + LV_LOG_WARN("lv_i18n_get_text: No translations are specified on the current local. Fallback to the default language"); + lang = languages[0]; + } + + if(lang->simple == NULL) { + LV_LOG_WARN("lv_i18n_get_text: No translations are specified even on the default language."); + return msg_id; + } + } + + /*Find the translation*/ + const void * txt = lv_i18n_get_text_core(lang->simple, msg_id); + if(txt == NULL) { + if(lang == languages[0]) { + LV_LOG_WARN("lv_i18n_get_text: No translation found even on the default language"); + return msg_id; + } else { + LV_LOG_WARN("lv_i18n_get_text: No translation found on this language. Fallback to the default language"); + lang = languages[0]; + } + } + + /*Try again with the default language*/ + if(lang->simple == NULL) { + LV_LOG_WARN("lv_i18n_get_text: No translations are specified even on the default language."); + return msg_id; + } + + txt = lv_i18n_get_text_core(lang->simple, msg_id); + if(txt == NULL) { + LV_LOG_WARN("lv_i18n_get_text: No translation found even on the default language"); + return msg_id; + } + + return txt; +} + +/** + * Get the translation from a message ID and apply the language's plural rule to get correct form + * @param msg_id message ID + * @param num an integer to select the correct plural form + * @return the translation of `msg_id` on the set local + */ +const char * lv_i18n_get_text_plural(const char * msg_id, int32_t num) +{ + if(local_lang == NULL) { + LV_LOG_WARN("lv_i18n_get_text_plural: No language selected"); + return msg_id; + } + + const lv_i18n_lang_t * lang = local_lang; + + if(lang->plurals == NULL || lang->plural_rule == NULL) { + if(lang == languages[0]) { + LV_LOG_WARN("lv_i18n_get_text_plural: No plurals or plural rule has defined even on the default language"); + return msg_id; + } else { + LV_LOG_WARN("lv_i18n_get_text_plural: o plurals or plural rule has defined for the language. Fallback to the default language"); + lang = languages[0]; + } + + if(lang->plurals == NULL) { + LV_LOG_WARN("lv_i18n_get_text_plural: o plurals or plural rule has defined even on the default language"); + return msg_id; + } + } + + lv_i18n_plural_type_t ptype = lang->plural_rule(num); + + if(lang->plurals[ptype] == NULL) { + if(lang == languages[0]) { + LV_LOG_WARN("lv_i18n_get_text_plural: No translations of the required plural form even on the default language."); + return msg_id; + } else { + LV_LOG_WARN("lv_i18n_get_text_plural:No translations of the required plural form for the language. Fallback to the default language"); + lang = languages[0]; + } + } + + /*Find the translation*/ + const void * txt = lv_i18n_get_text_core(lang->plurals[ptype], msg_id); + if(txt == NULL) { + if(lang == languages[0]) { + LV_LOG_WARN("lv_i18n_get_text_plural: No translation found even on the default language"); + return msg_id; + } else { + LV_LOG_WARN("lv_i18n_get_text_plural: No translation found on this language. Fallback to the default language"); + lang = languages[0]; + } + } + + /*Try again with the default language*/ + if(lang->plurals == NULL || lang->plural_rule == NULL) { + LV_LOG_WARN("lv_i18n_get_text_plural: No plurals or plural rule has defined even on the default language"); + return msg_id; + } + + ptype = lang->plural_rule(num); + if(lang->plurals[ptype] == NULL) { + LV_LOG_WARN("lv_i18n_get_text_plural: No translations of the required plural form even on the default language."); + return msg_id; + } + + txt = lv_i18n_get_text_core(lang->plurals[ptype], msg_id); + + if(txt == NULL) { + LV_LOG_WARN("lv_i18n_get_text_plural: No translation found even on the default language"); + return msg_id; + } + + return txt; +} + +/** + * Get the name of the currently used localization. + * @return name of the currently used localization. E.g. "en_GB" + */ +const char * lv_i18n_get_current_local(void) +{ + if(local_lang) return local_lang->name; + else return NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ + +static const void * lv_i18n_get_text_core(const lv_i18n_trans_t * trans, const char * msg_id) +{ + uint16_t i; + for(i = 0; trans[i].msg_id != NULL; i++) { + if(strcmp(trans[i].msg_id, msg_id) == 0) { + /*The msg_id has found. Check the translation*/ + if(trans[i].txt_trans) return trans[i].txt_trans; + } + } + + LV_LOG_TRACE("lv_i18n_get_text_core: `msg_id` wasn't found"); + return NULL; + +} + +#endif /*USE_LV_I18N*/ diff --git a/lv_core/lv_i18n.h b/lv_core/lv_i18n.h new file mode 100644 index 000000000..15b822c41 --- /dev/null +++ b/lv_core/lv_i18n.h @@ -0,0 +1,108 @@ +/** + * @file lv_lang.h + * + */ + +#ifndef LV_I18N_H +#define LV_I18N_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#ifdef LV_CONF_INCLUDE_SIMPLE +#include "lv_conf.h" +#else +#include "../../lv_conf.h" +#endif + +#if USE_LV_I18N + +#include + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +typedef enum { + LV_I18N_PLURAL_TYPE_ZERO, + LV_I18N_PLURAL_TYPE_ONE, + LV_I18N_PLURAL_TYPE_TWO, + LV_I18N_PLURAL_TYPE_FEW, + LV_I18N_PLURAL_TYPE_MANY, + LV_I18N_PLURAL_TYPE_OTHER, + _LV_I18N_PLURAL_TYPE_NUM, +}lv_i18n_plural_type_t; + +typedef struct { + const char * msg_id; + const char * txt_trans; +}lv_i18n_trans_t; + + +typedef struct { + const char * name; /*E.g. "en_GB"*/ + const lv_i18n_trans_t * simple; /*Translations of simple texts where no plurals are used*/ + const lv_i18n_trans_t * plurals[_LV_I18N_PLURAL_TYPE_NUM]; /*Translations of the plural forms*/ + uint8_t (*plural_rule)(int32_t num); /*Function pointer to get the correct plural form for a number*/ +}lv_i18n_lang_t; + +typedef const lv_i18n_lang_t * lv_i18n_lang_pack_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ + +/** + * Set the languages for internationalization + * @param langs pointer to the array of languages. (Last element has to be `NULL`) + * @return 0: no error; < 0: error + */ +int lv_i18n_init(const lv_i18n_lang_pack_t * langs); + +/** + * Change the localization (language) + * @param lang_code name of the translation to use. E.g. "en_GB" + * @return 0: no error; < 0: error + */ +int lv_i18n_set_local(const char * lang_code); + +/** + * Get the translation from a message ID + * @param msg_id message ID + * @return the translation of `msg_id` on the set local + */ +const char * lv_i18n_get_text(const char * msg_id); + +/** + * Get the translation from a message ID and apply the language's plural rule to get correct form + * @param msg_id message ID + * @param num an integer to select the correct plural form + * @return the translation of `msg_id` on the set local + */ +const char * lv_i18n_get_text_plural(const char * msg_id, int32_t num); + +/** + * Get the name of the currently used localization. + * @return name of the currently used localization. E.g. "en_GB" + */ +const char * lv_i18n_get_current_local(void); + +/********************** + * MACROS + **********************/ + +#endif /*USE_LV_I18N*/ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /*LV_LANG_H*/ diff --git a/lv_core/lv_indev.c b/lv_core/lv_indev.c index 1c2480cce..593527dcd 100644 --- a/lv_core/lv_indev.c +++ b/lv_core/lv_indev.c @@ -7,19 +7,23 @@ * 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" -#include "../lv_draw/lv_draw_rbasic.h" -#include "lv_obj.h" /********************* * DEFINES *********************/ +#if LV_INDEV_DRAG_THROW <= 0 +#warning "LV_INDEV_DRAG_THROW must be greater than 0" +#endif + /********************** * TYPEDEFS **********************/ @@ -121,6 +125,7 @@ void lv_indev_reset_lpr(lv_indev_t * indev) */ void lv_indev_enable(lv_hal_indev_type_t type, bool enable) { + lv_indev_t * i = lv_indev_next(NULL); while(i) { @@ -139,8 +144,8 @@ 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_layer_sys()); - lv_obj_set_pos(indev->cursor, indev->proc.act_point.x, indev->proc.act_point.y); + 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 USE_LV_GROUP @@ -187,8 +192,8 @@ void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point) point->x = -1; point->y = -1; } else { - point->x = indev->proc.act_point.x; - point->y = indev->proc.act_point.y; + point->x = indev->proc.types.pointer.act_point.x; + point->y = indev->proc.types.pointer.act_point.y; } } @@ -200,7 +205,7 @@ void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point) 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.last_key; + else return indev->proc.types.keypad.last_key; } /** @@ -212,13 +217,13 @@ 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.drag_in_prog == 0 ? false : true; + return indev->proc.types.pointer.drag_in_prog == 0 ? false : true; } /** - * Get the vector of dragging of an input device (for LV_INDEV_TYPE_POINTER and LV_INDEV_TYPE_BUTTON) + * 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 vector + * @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) { @@ -232,8 +237,8 @@ void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point) point->x = 0; point->y = 0; } else { - point->x = indev->proc.vect.x; - point->y = indev->proc.vect.y; + point->x = indev->proc.types.pointer.vect.x; + point->y = indev->proc.types.pointer.vect.y; } } @@ -244,6 +249,7 @@ void lv_indev_get_vect(const lv_indev_t * indev, lv_point_t * point) */ uint32_t lv_indev_get_inactive_time(const lv_indev_t * indev) { + uint32_t t; if(indev) return t = lv_tick_elaps(indev->last_activity_time); @@ -275,7 +281,7 @@ lv_indev_feedback_t lv_indev_get_feedback(const lv_indev_t *indev) */ void lv_indev_wait_release(lv_indev_t * indev) { - indev->proc.wait_unil_release = 1; + indev->proc.types.pointer.wait_unil_release = 1; } /********************** @@ -348,30 +354,22 @@ 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.last_point.x != data->point.x || - i->proc.last_point.y != data->point.y)) { + (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.act_point.x = data->point.x; - i->proc.act_point.y = 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) { -#if LV_INDEV_POINT_MARKER != 0 - lv_area_t area; - area.x1 = i->proc.act_point.x - (LV_INDEV_POINT_MARKER >> 1); - area.y1 = i->proc.act_point.y - (LV_INDEV_POINT_MARKER >> 1); - area.x2 = i->proc.act_point.x + ((LV_INDEV_POINT_MARKER >> 1) | 0x1); - area.y2 = i->proc.act_point.y + ((LV_INDEV_POINT_MARKER >> 1) | 0x1); - lv_rfill(&area, NULL, LV_COLOR_MAKE(0xFF, 0, 0), LV_OPA_COVER); -#endif indev_proc_press(&i->proc); } else { indev_proc_release(&i->proc); } - i->proc.last_point.x = i->proc.act_point.x; - i->proc.last_point.y = i->proc.act_point.y; + 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; } /** @@ -386,7 +384,7 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) /*Key press happened*/ if(data->state == LV_INDEV_STATE_PR && - i->proc.last_state == LV_INDEV_STATE_REL) { + i->proc.types.keypad.last_state == LV_INDEV_STATE_REL) { i->proc.pr_timestamp = lv_tick_get(); lv_obj_t * focused = lv_group_get_focused(i->group); if(focused && data->key == LV_GROUP_KEY_ENTER) { @@ -394,7 +392,7 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) } } /*Pressing*/ - else if(data->state == LV_INDEV_STATE_PR && i->proc.last_state == LV_INDEV_STATE_PR) { + else if(data->state == LV_INDEV_STATE_PR && i->proc.types.keypad.last_state == LV_INDEV_STATE_PR) { if(data->key == LV_GROUP_KEY_ENTER && i->proc.long_pr_sent == 0 && lv_tick_elaps(i->proc.pr_timestamp) > LV_INDEV_LONG_PRESS_TIME) { @@ -407,9 +405,9 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) } } /*Release happened*/ - else if(data->state == LV_INDEV_STATE_REL && i->proc.last_state == LV_INDEV_STATE_PR) { + else if(data->state == LV_INDEV_STATE_REL && i->proc.types.keypad.last_state == LV_INDEV_STATE_PR) { /*The user might clear the key when it was released. Always release the pressed key*/ - data->key = i->proc.last_key; + data->key = i->proc.types.keypad.last_key; /* Edit mode is not used by KEYPAD devices. * So leave edit mode if we are in it before focusing on the next/prev object*/ @@ -435,8 +433,8 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data) i->proc.long_pr_sent = 0; } - i->proc.last_state = data->state; - i->proc.last_key = data->key; + i->proc.types.keypad.last_state = data->state; + i->proc.types.keypad.last_key = data->key; #else (void)data; /*Unused*/ (void)i; /*Unused*/ @@ -477,11 +475,11 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) /*Key press happened*/ if(data->state == LV_INDEV_STATE_PR && - i->proc.last_state == LV_INDEV_STATE_REL) { + i->proc.types.keypad.last_state == LV_INDEV_STATE_REL) { i->proc.pr_timestamp = lv_tick_get(); } /*Pressing*/ - else if(data->state == LV_INDEV_STATE_PR && i->proc.last_state == LV_INDEV_STATE_PR) { + else if(data->state == LV_INDEV_STATE_PR && i->proc.types.keypad.last_state == LV_INDEV_STATE_PR) { if(i->proc.long_pr_sent == 0 && lv_tick_elaps(i->proc.pr_timestamp) > LV_INDEV_LONG_PRESS_TIME) { /*On enter long press leave edit mode.*/ @@ -505,7 +503,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) } } /*Release happened*/ - else if(data->state == LV_INDEV_STATE_REL && i->proc.last_state == LV_INDEV_STATE_PR) { + else if(data->state == LV_INDEV_STATE_REL && i->proc.types.keypad.last_state == LV_INDEV_STATE_PR) { lv_obj_t * focused = lv_group_get_focused(i->group); bool editable = false; if(focused) focused->signal_func(focused, LV_SIGNAL_GET_EDITABLE, &editable); @@ -530,8 +528,8 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data) i->proc.long_pr_sent = 0; } - i->proc.last_state = data->state; - i->proc.last_key = data->key; + i->proc.types.keypad.last_state = data->state; + i->proc.types.keypad.last_key = data->key; #else (void)data; /*Unused*/ (void)i; /*Unused*/ @@ -546,29 +544,22 @@ 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) { - i->proc.act_point.x = i->btn_points[data->btn].x; - i->proc.act_point.y = i->btn_points[data->btn].y; + 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.last_point.x == i->proc.act_point.x && - i->proc.last_point.y == i->proc.act_point.y && - data->state == LV_INDEV_STATE_PR) { -#if LV_INDEV_POINT_MARKER != 0 - lv_area_t area; - area.x1 = i->proc.act_point.x - (LV_INDEV_POINT_MARKER >> 1); - area.y1 = i->proc.act_point.y - (LV_INDEV_POINT_MARKER >> 1); - area.x2 = i->proc.act_point.x + ((LV_INDEV_POINT_MARKER >> 1) | 0x1); - area.y2 = i->proc.act_point.y + ((LV_INDEV_POINT_MARKER >> 1) | 0x1); - lv_rfill(&area, NULL, LV_COLOR_MAKE(0xFF, 0, 0), LV_OPA_COVER); -#endif + 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.last_point.x = i->proc.act_point.x; - i->proc.last_point.y = i->proc.act_point.y; + 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; } /** @@ -577,20 +568,24 @@ static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data) */ static void indev_proc_press(lv_indev_proc_t * proc) { - lv_obj_t * pr_obj = proc->act_obj; + lv_obj_t * pr_obj = proc->types.pointer.act_obj; - if(proc->wait_unil_release != 0) return; + if(proc->types.pointer.wait_unil_release != 0) return; + + lv_disp_t * disp = indev_act->driver.disp; /*If there is no last object then search*/ - if(proc->act_obj == NULL) { - pr_obj = indev_search_obj(proc, lv_layer_top()); - if(pr_obj == NULL) pr_obj = indev_search_obj(proc, lv_scr_act()); + if(proc->types.pointer.act_obj == NULL) { + pr_obj = indev_search_obj(proc, lv_disp_get_layer_sys(disp)); + if(pr_obj == NULL) pr_obj = indev_search_obj(proc, lv_disp_get_layer_top(disp)); + if(pr_obj == NULL) pr_obj = indev_search_obj(proc, lv_disp_get_scr_act(disp)); } /*If there is last object but it is not dragged and not protected also search*/ - else if(proc->drag_in_prog == 0 && - lv_obj_is_protected(proc->act_obj, LV_PROTECT_PRESS_LOST) == false) {/*Now act_obj != NULL*/ - pr_obj = indev_search_obj(proc, lv_layer_top()); - if(pr_obj == NULL) pr_obj = indev_search_obj(proc, lv_scr_act()); + else if(proc->types.pointer.drag_in_prog == 0 && + lv_obj_is_protected(proc->types.pointer.act_obj, LV_PROTECT_PRESS_LOST) == false) {/*Now types.pointer.act_obj != NULL*/ + pr_obj = indev_search_obj(proc, lv_disp_get_layer_sys(disp)); + if(pr_obj == NULL) pr_obj = indev_search_obj(proc, lv_disp_get_layer_top(disp)); + if(pr_obj == NULL) pr_obj = indev_search_obj(proc, lv_disp_get_scr_act(disp)); } /*If a dragable or a protected object was the last then keep it*/ else { @@ -598,34 +593,34 @@ static void indev_proc_press(lv_indev_proc_t * proc) } /*If a new object was found reset some variables and send a pressed signal*/ - if(pr_obj != proc->act_obj) { + if(pr_obj != proc->types.pointer.act_obj) { - proc->last_point.x = proc->act_point.x; - proc->last_point.y = proc->act_point.y; + 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->act_obj != NULL) { - proc->act_obj->signal_func(proc->act_obj, LV_SIGNAL_PRESS_LOST, indev_act); + if(proc->types.pointer.act_obj != NULL) { + proc->types.pointer.act_obj->signal_func(proc->types.pointer.act_obj, LV_SIGNAL_PRESS_LOST, indev_act); if(proc->reset_query != 0) return; } - proc->act_obj = pr_obj; /*Save the pressed object*/ - proc->last_obj = proc->act_obj; /*Refresh the last_obj*/ + proc->types.pointer.act_obj = pr_obj; /*Save the pressed object*/ + proc->types.pointer.last_obj = proc->types.pointer.act_obj; /*Refresh the types.pointer.last_obj*/ - if(proc->act_obj != NULL) { + if(proc->types.pointer.act_obj != 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->drag_range_out = 0; - proc->drag_in_prog = 0; - proc->drag_sum.x = 0; - proc->drag_sum.y = 0; - proc->vect.x = 0; - proc->vect.y = 0; + proc->types.pointer.drag_range_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 = proc->act_obj; + lv_obj_t * i = proc->types.pointer.act_obj; lv_obj_t * last_top = NULL; while(i != NULL) { if(i->top != 0) last_top = i; @@ -641,25 +636,25 @@ static void indev_proc_press(lv_indev_proc_t * proc) } /*Send a signal about the press*/ - proc->act_obj->signal_func(proc->act_obj, LV_SIGNAL_PRESSED, indev_act); + proc->types.pointer.act_obj->signal_func(proc->types.pointer.act_obj, LV_SIGNAL_PRESSED, indev_act); if(proc->reset_query != 0) return; } } - /*Calculate the vector*/ - proc->vect.x = proc->act_point.x - proc->last_point.x; - proc->vect.y = proc->act_point.y - proc->last_point.y; + /*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; /*If there is active object and it can be dragged run the drag*/ - if(proc->act_obj != NULL) { - proc->act_obj->signal_func(proc->act_obj, LV_SIGNAL_PRESSING, indev_act); + if(proc->types.pointer.act_obj != NULL) { + proc->types.pointer.act_obj->signal_func(proc->types.pointer.act_obj, LV_SIGNAL_PRESSING, indev_act); if(proc->reset_query != 0) return; indev_drag(proc); if(proc->reset_query != 0) return; /*If there is no drag then check for long press time*/ - if(proc->drag_in_prog == 0 && proc->long_pr_sent == 0) { + 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) > LV_INDEV_LONG_PRESS_TIME) { pr_obj->signal_func(pr_obj, LV_SIGNAL_LONG_PRESS, indev_act); @@ -673,7 +668,7 @@ static void indev_proc_press(lv_indev_proc_t * proc) } } /*Send long press repeated signal*/ - if(proc->drag_in_prog == 0 && proc->long_pr_sent == 1) { + if(proc->types.pointer.drag_in_prog == 0 && proc->long_pr_sent == 1) { /*Send a signal about the long press repeate if enough time elapsed*/ if(lv_tick_elaps(proc->longpr_rep_timestamp) > LV_INDEV_LONG_PRESS_REP_TIME) { pr_obj->signal_func(pr_obj, LV_SIGNAL_LONG_PRESS_REP, indev_act); @@ -691,31 +686,31 @@ static void indev_proc_press(lv_indev_proc_t * proc) */ static void indev_proc_release(lv_indev_proc_t * proc) { - if(proc->wait_unil_release != 0) { - proc->act_obj = NULL; - proc->last_obj = NULL; + if(proc->types.pointer.wait_unil_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_unil_release = 0; + proc->types.pointer.wait_unil_release = 0; } /*Forgot the act obj and send a released signal */ - if(proc->act_obj != NULL) { + if(proc->types.pointer.act_obj != NULL) { /* 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` if the indev is ON the `act_obj` */ - if(lv_obj_is_protected(proc->act_obj, LV_PROTECT_PRESS_LOST)) { + * the object is already not pressed but still it is the `types.pointer.act_obj`. + * In this case send the `LV_SIGNAL_RELEASED` if the indev is ON the `types.pointer.act_obj` */ + if(lv_obj_is_protected(proc->types.pointer.act_obj, LV_PROTECT_PRESS_LOST)) { /* Search the object on the current current coordinates. * The start object is the object itself. If not ON it the the result will be NULL*/ - lv_obj_t * obj_on = indev_search_obj(proc, proc->act_obj); - if(obj_on == proc->act_obj) proc->act_obj->signal_func(proc->act_obj, LV_SIGNAL_RELEASED, indev_act); - else proc->act_obj->signal_func(proc->act_obj, LV_SIGNAL_PRESS_LOST, indev_act); + lv_obj_t * obj_on = indev_search_obj(proc, proc->types.pointer.act_obj); + if(obj_on == proc->types.pointer.act_obj) proc->types.pointer.act_obj->signal_func(proc->types.pointer.act_obj, LV_SIGNAL_RELEASED, indev_act); + else proc->types.pointer.act_obj->signal_func(proc->types.pointer.act_obj, LV_SIGNAL_PRESS_LOST, indev_act); } - /* The simple case: `act_obj` was not protected against press lost. + /* The simple case: `types.pointer.act_obj` was not protected against press lost. * If it is already not pressed then was handled in `indev_proc_press`*/ else { - proc->act_obj->signal_func(proc->act_obj, LV_SIGNAL_RELEASED, indev_act); + proc->types.pointer.act_obj->signal_func(proc->types.pointer.act_obj, LV_SIGNAL_RELEASED, indev_act); } if(proc->reset_query != 0) return; @@ -723,15 +718,15 @@ static void indev_proc_release(lv_indev_proc_t * proc) /*Handle click focus*/ #if USE_LV_GROUP /*Edit mode is not used by POINTER devices. So leave edit mode if we are in it*/ - lv_group_t * act_g = lv_obj_get_group(proc->act_obj); + lv_group_t * act_g = lv_obj_get_group(proc->types.pointer.act_obj); if(lv_group_get_editing(act_g)) { lv_group_set_editing(act_g, false); } /*Check, if the parent is in a group focus on it.*/ - if(lv_obj_is_protected(proc->act_obj, LV_PROTECT_CLICK_FOCUS) == false) { /*Respect the click protection*/ - lv_group_t * g = lv_obj_get_group(proc->act_obj); - lv_obj_t * parent = proc->act_obj; + if(lv_obj_is_protected(proc->types.pointer.act_obj, LV_PROTECT_CLICK_FOCUS) == false) { /*Respect the click protection*/ + lv_group_t * g = lv_obj_get_group(proc->types.pointer.act_obj); + lv_obj_t * parent = proc->types.pointer.act_obj; while(g == NULL) { parent = lv_obj_get_parent(parent); @@ -751,14 +746,14 @@ static void indev_proc_release(lv_indev_proc_t * proc) #endif if(proc->reset_query != 0) return; - proc->act_obj = NULL; + 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->last_obj != NULL && proc->reset_query == 0) { + if(proc->types.pointer.last_obj != NULL && proc->reset_query == 0) { indev_drag_throw(proc); if(proc->reset_query != 0) return; } @@ -774,15 +769,15 @@ static void indev_proc_release(lv_indev_proc_t * proc) static void indev_proc_reset_query_handler(lv_indev_t * indev) { if(indev->proc.reset_query) { - indev->proc.act_obj = NULL; - indev->proc.last_obj = NULL; - indev->proc.drag_range_out = 0; - indev->proc.drag_in_prog = 0; + indev->proc.types.pointer.act_obj = NULL; + indev->proc.types.pointer.last_obj = NULL; + indev->proc.types.pointer.drag_range_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.drag_sum.x = 0; - indev->proc.drag_sum.y = 0; + indev->proc.types.pointer.drag_sum.x = 0; + indev->proc.types.pointer.drag_sum.y = 0; indev->proc.reset_query = 0; } } @@ -798,7 +793,7 @@ static lv_obj_t * indev_search_obj(const lv_indev_proc_t * proc, lv_obj_t * obj) /*If the point is on this object*/ /*Check its children too*/ - if(lv_area_is_point_on(&obj->coords, &proc->act_point)) { + if(lv_area_is_point_on(&obj->coords, &proc->types.pointer.act_point)) { lv_obj_t * i; LL_READ(obj->child_ll, i) { @@ -828,12 +823,12 @@ static lv_obj_t * indev_search_obj(const lv_indev_proc_t * proc, lv_obj_t * obj) } /** - * Handle the dragging of indev_proc_p->act_obj + * Handle the dragging of indev_proc_p->types.pointer.act_obj * @param indev pointer to a input device state */ static void indev_drag(lv_indev_proc_t * state) { - lv_obj_t * drag_obj = state->act_obj; + lv_obj_t * drag_obj = state->types.pointer.act_obj; /*If drag parent is active check recursively the drag_parent attribute*/ while(lv_obj_get_drag_parent(drag_obj) != false && @@ -846,43 +841,43 @@ static void indev_drag(lv_indev_proc_t * state) if(lv_obj_get_drag(drag_obj) == false) return; /*Count the movement by drag*/ - state->drag_sum.x += state->vect.x; - state->drag_sum.y += state->vect.y; + 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->drag_range_out == 0) { + if(state->types.pointer.drag_range_out == 0) { /*If a move is greater then LV_DRAG_LIMIT then begin the drag*/ - if(LV_MATH_ABS(state->drag_sum.x) >= LV_INDEV_DRAG_LIMIT || - LV_MATH_ABS(state->drag_sum.y) >= LV_INDEV_DRAG_LIMIT) { - state->drag_range_out = 1; + if(LV_MATH_ABS(state->types.pointer.drag_sum.x) >= LV_INDEV_DRAG_LIMIT || + LV_MATH_ABS(state->types.pointer.drag_sum.y) >= LV_INDEV_DRAG_LIMIT) { + state->types.pointer.drag_range_out = 1; } } /*If the drag limit is stepped over then handle the dragging*/ - if(state->drag_range_out != 0) { - /*Set new position if the vector is not zero*/ - if(state->vect.x != 0 || - state->vect.y != 0) { + if(state->types.pointer.drag_range_out != 0) { + /*Set new position if the types.pointer.vector is not zero*/ + if(state->types.pointer.vect.x != 0 || + state->types.pointer.vect.y != 0) { /*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); - uint16_t inv_buf_size = lv_refr_get_buf_size(); /*Get the number of currently invalidated areas*/ + 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)); - lv_obj_set_pos(drag_obj, act_x + state->vect.x, act_y + state->vect.y); + lv_obj_set_pos(drag_obj, act_x + state->types.pointer.vect.x, act_y + state->types.pointer.vect.y); /*Set the drag in progress flag if the object is really moved*/ if(drag_obj->coords.x1 != prev_x || drag_obj->coords.y1 != prev_y) { - if(state->drag_range_out != 0) { /*Send the drag begin signal on first move*/ + if(state->types.pointer.drag_range_out != 0) { /*Send the drag begin signal on first move*/ drag_obj->signal_func(drag_obj, LV_SIGNAL_DRAG_BEGIN, indev_act); if(state->reset_query != 0) return; } - state->drag_in_prog = 1; + state->types.pointer.drag_in_prog = 1; } /*If the object didn't moved then clear the invalidated areas*/ else { @@ -892,8 +887,8 @@ static void indev_drag(lv_indev_proc_t * state) 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_refr_get_buf_size(); - lv_refr_pop_from_buf(new_inv_buf_size - inv_buf_size); + 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); } } } @@ -906,10 +901,10 @@ static void indev_drag(lv_indev_proc_t * state) */ static void indev_drag_throw(lv_indev_proc_t * state) { - if(state->drag_in_prog == 0) return; + if(state->types.pointer.drag_in_prog == 0) return; - /*Set new position if the vector is not zero*/ - lv_obj_t * drag_obj = state->last_obj; + /*Set new position if the types.pointer.vector is not zero*/ + lv_obj_t * drag_obj = state->types.pointer.last_obj; /*If drag parent is active check recursively the drag_parent attribute*/ while(lv_obj_get_drag_parent(drag_obj) != false && @@ -921,40 +916,40 @@ static void indev_drag_throw(lv_indev_proc_t * state) /*Return if the drag throw is not enabled*/ if(lv_obj_get_drag_throw(drag_obj) == false) { - state->drag_in_prog = 0; + state->types.pointer.drag_in_prog = 0; drag_obj->signal_func(drag_obj, LV_SIGNAL_DRAG_END, indev_act); return; } - /*Reduce the vectors*/ - state->vect.x = state->vect.x * (100 - LV_INDEV_DRAG_THROW) / 100; - state->vect.y = state->vect.y * (100 - LV_INDEV_DRAG_THROW) / 100; + /*Reduce the types.pointer.vectors*/ + state->types.pointer.vect.x = state->types.pointer.vect.x * (100 - LV_INDEV_DRAG_THROW) / 100; + state->types.pointer.vect.y = state->types.pointer.vect.y * (100 - LV_INDEV_DRAG_THROW) / 100; - if(state->vect.x != 0 || - state->vect.y != 0) { + if(state->types.pointer.vect.x != 0 || + state->types.pointer.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) + state->vect.x; - lv_coord_t act_y = lv_obj_get_y(drag_obj) + state->vect.y; + lv_coord_t act_x = lv_obj_get_x(drag_obj) + state->types.pointer.vect.x; + lv_coord_t act_y = lv_obj_get_y(drag_obj) + state->types.pointer.vect.y; lv_obj_set_pos(drag_obj, act_x, 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 || state->vect.x == 0) && - (coords_ori.y1 == coord_new.y1 || state->vect.y == 0)) { - state->drag_in_prog = 0; - state->vect.x = 0; - state->vect.y = 0; + if((coords_ori.x1 == coord_new.x1 || state->types.pointer.vect.x == 0) && + (coords_ori.y1 == coord_new.y1 || state->types.pointer.vect.y == 0)) { + state->types.pointer.drag_in_prog = 0; + state->types.pointer.vect.x = 0; + state->types.pointer.vect.y = 0; drag_obj->signal_func(drag_obj, LV_SIGNAL_DRAG_END, indev_act); } } - /*If the vectors become 0 -> drag_in_prog = 0 and send a drag end signal*/ + /*If the types.pointer.vectors become 0 -> types.pointer.drag_in_prog = 0 and send a drag end signal*/ else { - state->drag_in_prog = 0; + state->types.pointer.drag_in_prog = 0; drag_obj->signal_func(drag_obj, LV_SIGNAL_DRAG_END, indev_act); } } diff --git a/lv_core/lv_lang.c b/lv_core/lv_lang.c deleted file mode 100644 index c96ed7883..000000000 --- a/lv_core/lv_lang.c +++ /dev/null @@ -1,117 +0,0 @@ -/** - * @file lv_lang.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_lang.h" -#if USE_LV_MULTI_LANG - -#include "lv_obj.h" -#include "../lv_misc/lv_gc.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ -static void lang_set_core(lv_obj_t * obj); - -/********************** - * STATIC VARIABLES - **********************/ -static uint8_t lang_act = 0; -static const void * (*get_txt)(uint16_t); - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Change the language - * @param lang_id the id of the - */ -void lv_lang_set(uint8_t lang_id) -{ - lang_act = lang_id; - - lv_obj_t * i; - LL_READ(LV_GC_ROOT(_lv_scr_ll), i) { - i->signal_func(i, LV_SIGNAL_LANG_CHG, NULL); - - lang_set_core(i); - } - - lang_set_core(lv_scr_act()); -} - -/** - * Set a function to get the texts of the set languages from a `txt_id` - * @param fp a function pointer to get the texts - */ -void lv_lang_set_text_func(const void * (*fp)(uint16_t)) -{ - get_txt = fp; -} - -/** - * Use the function set by `lv_lang_set_text_func` to get the `txt_id` text in the set language - * @param txt_id an ID of the text to get - * @return the `txt_id` txt on the set language - */ -const void * lv_lang_get_text(uint16_t txt_id) -{ - if(get_txt == NULL) { - LV_LOG_WARN("lv_lang_get_text: text_func is not specified"); - return NULL; /*No text_get function specified */ - } - if(txt_id == LV_LANG_TXT_ID_NONE) { - LV_LOG_WARN("lv_lang_get_text: attempts to get invalid text ID"); - return NULL; /*Invalid txt_id*/ - } - - return get_txt(txt_id); -} - - -/** - * Return with ID of the currently selected language - * @return pointer to the active screen object (loaded by 'lv_scr_load()') - */ -uint8_t lv_lang_act(void) -{ - return lang_act; -} - - -/********************** - * STATIC FUNCTIONS - **********************/ - -/** - * Change the language of the children. (Called recursively) - * @param obj pointer to an object - */ -static void lang_set_core(lv_obj_t * obj) -{ - lv_obj_t * i; - LL_READ(obj->child_ll, i) { - i->signal_func(i, LV_SIGNAL_LANG_CHG, NULL); - - lang_set_core(i); - } -} - -#endif /*USE_LV_MULTI_LANG*/ diff --git a/lv_core/lv_lang.h b/lv_core/lv_lang.h deleted file mode 100644 index 5d76f647f..000000000 --- a/lv_core/lv_lang.h +++ /dev/null @@ -1,74 +0,0 @@ -/** - * @file lv_lang.h - * - */ - -#ifndef LV_LANG_H -#define LV_LANG_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../lv_conf.h" -#endif - -#if USE_LV_MULTI_LANG - -#include - -/********************* - * DEFINES - *********************/ -#define LV_LANG_TXT_ID_NONE 0xFFFF /*Used to not assign any text IDs for a multi-language object.*/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Change the language - * @param lang_id the id of the - */ -void lv_lang_set(uint8_t lang_id); - -/** - * Set a function to get the texts of the set languages from a `txt_id` - * @param fp a function pointer to get the texts - */ -void lv_lang_set_text_func(const void * (*fp)(uint16_t)); - -/** - * Use the function set by `lv_lang_set_text_func` to get the `txt_id` text in the set language - * @param txt_id an ID of the text to get - * @return the `txt_id` txt on the set language - */ -const void * lv_lang_get_text(uint16_t txt_id); - -/** - * Return with ID of the currently selected language - * @return pointer to the active screen object (loaded by 'lv_scr_load()') - */ -uint8_t lv_lang_act(void); - -/********************** - * MACROS - **********************/ - -#endif /*USE_LV_MULTI_LANG*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_LANG_H*/ diff --git a/lv_core/lv_obj.c b/lv_core/lv_obj.c index a58ead8c2..4415b9300 100644 --- a/lv_core/lv_obj.c +++ b/lv_core/lv_obj.c @@ -10,13 +10,14 @@ #include "lv_indev.h" #include "lv_refr.h" #include "lv_group.h" +#include "lv_disp.h" #include "../lv_themes/lv_theme.h" #include "../lv_draw/lv_draw.h" -#include "../lv_draw/lv_draw_rbasic.h" #include "../lv_misc/lv_anim.h" #include "../lv_misc/lv_task.h" #include "../lv_misc/lv_fs.h" #include "../lv_misc/lv_ufs.h" +#include "../lv_hal/lv_hal.h" #include #include #include "../lv_misc/lv_gc.h" @@ -38,9 +39,9 @@ /********************** * STATIC PROTOTYPES **********************/ -static void refresh_childen_position(lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_diff); +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_childen_style(lv_obj_t * obj); +static void refresh_children_style(lv_obj_t * obj); static void delete_children(lv_obj_t * 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); @@ -49,6 +50,8 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param); * STATIC VARIABLES **********************/ +static bool _lv_initialized = false; + /********************** * MACROS **********************/ @@ -62,12 +65,11 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param); */ void lv_init(void) { - LV_GC_ROOT(_lv_def_scr) = NULL; - LV_GC_ROOT(_lv_act_scr) = NULL; - LV_GC_ROOT(_lv_top_layer) = NULL; - LV_GC_ROOT(_lv_sys_layer) = NULL; - LV_GC_ROOT(_lv_disp_list) = NULL; - LV_GC_ROOT(_lv_indev_list) = NULL; + /* Do nothing if already initialized */ + if (_lv_initialized) { + LV_LOG_WARN("lv_init: already inited"); + return; + } LV_LOG_TRACE("lv_init started"); @@ -85,33 +87,26 @@ void lv_init(void) lv_anim_init(); #endif +#if USE_LV_GROUP + lv_group_init(); +#endif + /*Init. the sstyles*/ lv_style_init(); /*Initialize the screen refresh system*/ lv_refr_init(); - /*Create the default screen*/ - lv_ll_init(&LV_GC_ROOT(_lv_scr_ll), sizeof(lv_obj_t)); - LV_GC_ROOT(_lv_def_scr) = lv_obj_create(NULL, NULL); + 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)); - LV_GC_ROOT(_lv_act_scr) = LV_GC_ROOT(_lv_def_scr); - - LV_GC_ROOT(_lv_top_layer) = lv_obj_create(NULL, NULL); - lv_obj_set_style(LV_GC_ROOT(_lv_top_layer), &lv_style_transp_fit); - - LV_GC_ROOT(_lv_sys_layer) = lv_obj_create(NULL, NULL); - lv_obj_set_style(LV_GC_ROOT(_lv_sys_layer), &lv_style_transp_fit); - - /*Refresh the screen*/ - lv_obj_invalidate(LV_GC_ROOT(_lv_act_scr)); #if LV_INDEV_READ_PERIOD != 0 /*Init the input device handling*/ lv_indev_init(); #endif - + _lv_initialized = true; LV_LOG_INFO("lv_init ready"); } @@ -133,8 +128,13 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) /*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(&LV_GC_ROOT(_lv_scr_ll)); + new_obj = lv_ll_ins_head(&disp->scr_ll); lv_mem_assert(new_obj); if(new_obj == NULL) return NULL; @@ -144,8 +144,8 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) /*Set coordinates to full screen size*/ new_obj->coords.x1 = 0; new_obj->coords.y1 = 0; - new_obj->coords.x2 = LV_HOR_RES - 1; - new_obj->coords.y2 = LV_VER_RES - 1; + 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_size = 0; /*Init realign*/ @@ -160,7 +160,7 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); if(th) { - new_obj->style_p = th->bg; + new_obj->style_p = th->style.bg; } else { new_obj->style_p = &lv_style_scr; } @@ -227,7 +227,7 @@ lv_obj_t * lv_obj_create(lv_obj_t * parent, const lv_obj_t * copy) /*Set appearance*/ lv_theme_t * th = lv_theme_get_current(); if(th) { - new_obj->style_p = th->panel; + new_obj->style_p = th->style.panel; } else { new_obj->style_p = &lv_style_plain_color; } @@ -357,7 +357,8 @@ lv_res_t lv_obj_del(lv_obj_t * obj) /*Remove the object from parent's children list*/ lv_obj_t * par = lv_obj_get_parent(obj); if(par == NULL) { /*It is a screen*/ - lv_ll_rem(&LV_GC_ROOT(_lv_scr_ll), obj); + lv_disp_t * d = lv_obj_get_disp(obj); + lv_ll_rem(&d->scr_ll, obj); } else { lv_ll_rem(&(par->child_ll), obj); } @@ -366,7 +367,7 @@ lv_res_t lv_obj_del(lv_obj_t * obj) * the currently pressed object is deleted*/ lv_indev_t * indev = lv_indev_next(NULL); while(indev) { - if(indev->proc.act_obj == obj || indev->proc.last_obj == obj) { + if(indev->proc.types.pointer.act_obj == obj || indev->proc.types.pointer.last_obj == obj) { lv_indev_reset(indev); } indev = lv_indev_next(indev); @@ -415,9 +416,10 @@ void lv_obj_invalidate(const lv_obj_t * obj) /*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); - if(obj_scr == lv_scr_act() || - obj_scr == lv_layer_top() || - obj_scr == lv_layer_sys()) { + 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 recursively to the parents*/ lv_area_t area_trunc; lv_obj_t * par = lv_obj_get_parent(obj); @@ -439,7 +441,7 @@ void lv_obj_invalidate(const lv_obj_t * obj) par = lv_obj_get_parent(par); } - if(union_ok != false) lv_inv_area(&area_trunc); + if(union_ok) lv_inv_area(disp, &area_trunc); } } @@ -448,21 +450,6 @@ void lv_obj_invalidate(const lv_obj_t * obj) * Setter functions *====================*/ -/*-------------- - * Screen set - *--------------*/ - -/** - * Load a new screen - * @param scr pointer to a screen - */ -void lv_scr_load(lv_obj_t * scr) -{ - LV_GC_ROOT(_lv_act_scr) = scr; - - lv_obj_invalidate(LV_GC_ROOT(_lv_act_scr)); -} - /*-------------------- * Parent/children set *--------------------*/ @@ -545,7 +532,7 @@ void lv_obj_set_pos(lv_obj_t * obj, lv_coord_t x, lv_coord_t y) obj->coords.x2 += diff.x; obj->coords.y2 += diff.y; - refresh_childen_position(obj, diff.x, diff.y); + refresh_children_position(obj, diff.x, diff.y); /*Inform the object about its new coordinates*/ obj->signal_func(obj, LV_SIGNAL_CORD_CHG, &ori); @@ -614,6 +601,12 @@ void lv_obj_set_size(lv_obj_t * obj, lv_coord_t w, lv_coord_t h) lv_obj_t * par = lv_obj_get_parent(obj); if(par != NULL) par->signal_func(par, LV_SIGNAL_CHILD_CHG, obj); + /*Tell the children the parent's size has changed*/ + lv_obj_t * i; + LL_READ(obj->child_ll, i) { + i->signal_func(i, LV_SIGNAL_PARENT_SIZE_CHG, NULL); + } + /*Invalidate the new area*/ lv_obj_invalidate(obj); @@ -981,7 +974,7 @@ void lv_obj_set_style(lv_obj_t * obj, lv_style_t * style) obj->style_p = style; /*Send a signal about style change to every children with NULL style*/ - refresh_childen_style(obj); + refresh_children_style(obj); /*Notify the object about the style change too*/ lv_obj_refresh_style(obj); @@ -1006,13 +999,18 @@ void lv_obj_refresh_style(lv_obj_t * obj) */ void lv_obj_report_style_mod(lv_style_t * style) { - lv_obj_t * i; - LL_READ(LV_GC_ROOT(_lv_scr_ll), i) { - if(i->style_p == style || style == NULL) { - lv_obj_refresh_style(i); - } + lv_disp_t * d = lv_disp_get_next(NULL); - report_style_mod_core(style, i); + while(d) { + lv_obj_t * i; + 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); } } @@ -1294,38 +1292,6 @@ void lv_obj_animate(lv_obj_t * obj, lv_anim_builtin_t type, uint16_t time, uint1 * Getter functions *======================*/ -/*------------------ - * Screen get - *-----------------*/ - -/** - * Return with a pointer to the active screen - * @return pointer to the active screen object (loaded by 'lv_scr_load()') - */ -lv_obj_t * lv_scr_act(void) -{ - return LV_GC_ROOT(_lv_act_scr); -} - -/** - * Return with the top layer. (Same on every screen and it is above the normal screen layer) - * @return pointer to the top layer object (transparent screen sized lv_obj) - */ -lv_obj_t * lv_layer_top(void) -{ - return LV_GC_ROOT(_lv_top_layer); -} - -/** - * Return with the system layer. (Same on every screen and it is above the all other layers) - * It is used for example by the cursor - * @return pointer to the system layer object (transparent screen sized lv_obj) - */ -lv_obj_t * lv_layer_sys(void) -{ - return LV_GC_ROOT(_lv_sys_layer); -} - /** * Return with the screen of an object * @param obj pointer to an object @@ -1344,6 +1310,30 @@ lv_obj_t * lv_obj_get_screen(const lv_obj_t * obj) 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) +{ + 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; + LL_READ(LV_GC_ROOT(_lv_disp_ll), d) { + lv_obj_t * s; + 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 *--------------------*/ @@ -1866,7 +1856,7 @@ static lv_res_t lv_obj_signal(lv_obj_t * obj, lv_signal_t sign, void * param) * @param x_diff x coordinate shift * @param y_diff y coordinate shift */ -static void refresh_childen_position(lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_diff) +static void refresh_children_position(lv_obj_t * obj, lv_coord_t x_diff, lv_coord_t y_diff) { lv_obj_t * i; LL_READ(obj->child_ll, i) { @@ -1875,7 +1865,7 @@ static void refresh_childen_position(lv_obj_t * obj, lv_coord_t x_diff, lv_coord i->coords.x2 += x_diff; i->coords.y2 += y_diff; - refresh_childen_position(i, x_diff, y_diff); + refresh_children_position(i, x_diff, y_diff); } } @@ -1889,7 +1879,7 @@ static void report_style_mod_core(void * style_p, lv_obj_t * obj) lv_obj_t * i; LL_READ(obj->child_ll, i) { if(i->style_p == style_p || style_p == NULL) { - refresh_childen_style(i); + refresh_children_style(i); lv_obj_refresh_style(i); } @@ -1902,16 +1892,16 @@ static void report_style_mod_core(void * style_p, lv_obj_t * obj) * because the NULL styles are inherited from the parent * @param obj pointer to an object */ -static void refresh_childen_style(lv_obj_t * obj) +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_childen_style(child); /*Check children too*/ + 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_childen_style(child); + refresh_children_style(child); } child = lv_obj_get_child(obj, child); } @@ -1955,7 +1945,7 @@ static void delete_children(lv_obj_t * obj) * the currently pressed object is deleted*/ lv_indev_t * indev = lv_indev_next(NULL); while(indev) { - if(indev->proc.act_obj == obj || indev->proc.last_obj == obj) { + if(indev->proc.types.pointer.act_obj == obj || indev->proc.types.pointer.last_obj == obj) { lv_indev_reset(indev); } indev = lv_indev_next(indev); diff --git a/lv_core/lv_obj.h b/lv_core/lv_obj.h index cfd8a8ac3..5e46f007e 100644 --- a/lv_core/lv_obj.h +++ b/lv_core/lv_obj.h @@ -27,13 +27,14 @@ extern "C" { #include "../lv_misc/lv_ll.h" #include "../lv_misc/lv_color.h" #include "../lv_misc/lv_log.h" +#include "../lv_hal/lv_hal.h" /********************* * DEFINES *********************/ /*Error check of lv_conf.h*/ -#if LV_HOR_RES == 0 || LV_VER_RES == 0 +#if LV_HOR_RES_MAX == 0 || LV_VER_RES_MAX == 0 #error "LittlevGL: LV_HOR_RES and LV_VER_RES must be greater than 0" #endif @@ -41,19 +42,6 @@ extern "C" { #error "LittlevGL: LV_ANTIALIAS can be only 0 or 1" #endif -#if LV_VDB_SIZE == 0 && LV_ANTIALIAS != 0 -#error "LittlevGL: If LV_VDB_SIZE == 0 the anti-aliasing must be disabled" -#endif - -#if LV_VDB_SIZE > 0 && LV_VDB_SIZE < LV_HOR_RES -#error "LittlevGL: Small Virtual Display Buffer (lv_conf.h: LV_VDB_SIZE >= LV_HOR_RES)" -#endif - -#if LV_VDB_SIZE == 0 && USE_LV_REAL_DRAW == 0 -#error "LittlevGL: If LV_VDB_SIZE = 0 Real drawing function are required (lv_conf.h: USE_LV_REAL_DRAW 1)" -#endif - - #define LV_ANIM_IN 0x00 /*Animation to show an object. 'OR' it with lv_anim_builtin_t*/ #define LV_ANIM_OUT 0x80 /*Animation to hide an object. 'OR' it with lv_anim_builtin_t*/ #define LV_ANIM_DIR_MASK 0x80 /*ANIM_IN/ANIM_OUT mask*/ @@ -89,9 +77,9 @@ enum LV_SIGNAL_CLEANUP, LV_SIGNAL_CHILD_CHG, LV_SIGNAL_CORD_CHG, + LV_SIGNAL_PARENT_SIZE_CHG, LV_SIGNAL_STYLE_CHG, LV_SIGNAL_REFR_EXT_SIZE, - LV_SIGNAL_LANG_CHG, LV_SIGNAL_GET_TYPE, _LV_SIGNAL_FEEDBACK_SECTION_START, @@ -273,16 +261,6 @@ void lv_obj_invalidate(const lv_obj_t * obj); * Setter functions *====================*/ -/*-------------- - * Screen set - *--------------*/ - -/** - * Load a new screen - * @param scr pointer to a screen - */ -void lv_scr_load(lv_obj_t * scr); - /*-------------------- * Parent/children set *--------------------*/ @@ -552,29 +530,6 @@ void lv_obj_animate(lv_obj_t * obj, lv_anim_builtin_t type, uint16_t time, uint1 * Getter functions *======================*/ -/*------------------ - * Screen get - *-----------------*/ - -/** - * Return with a pointer to the active screen - * @return pointer to the active screen object (loaded by 'lv_scr_load()') - */ -lv_obj_t * lv_scr_act(void); - -/** - * Return with the top layer. (Same on every screen and it is above the normal screen layer) - * @return pointer to the top layer object (transparent screen sized lv_obj) - */ -lv_obj_t * lv_layer_top(void); - -/** - * Return with the system layer. (Same on every screen and it is above the all other layers) - * It is used for example by the cursor - * @return pointer to the system layer object (transparent screen sized lv_obj) - */ -lv_obj_t * lv_layer_sys(void); - /** * Return with the screen of an object * @param obj pointer to an object @@ -582,6 +537,13 @@ lv_obj_t * lv_layer_sys(void); */ 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 *--------------------*/ diff --git a/lv_core/lv_refr.c b/lv_core/lv_refr.c index d6987832a..7ac2c6c14 100644 --- a/lv_core/lv_refr.c +++ b/lv_core/lv_refr.c @@ -8,26 +8,20 @@ *********************/ #include #include "lv_refr.h" -#include "lv_vdb.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" /********************* * DEFINES *********************/ -#ifndef LV_INV_FIFO_SIZE -#define LV_INV_FIFO_SIZE 32 /*The average count of objects on a screen */ -#endif /********************** * TYPEDEFS **********************/ -typedef struct { - lv_area_t area; - uint8_t joined; -} lv_join_t; /********************** * STATIC PROTOTYPES @@ -35,24 +29,18 @@ typedef struct { static void lv_refr_task(void * param); static void lv_refr_join_area(void); static void lv_refr_areas(void); -#if LV_VDB_SIZE == 0 -static void lv_refr_area_no_vdb(const lv_area_t * area_p); -#else -static void lv_refr_area_with_vdb(const lv_area_t * area_p); -static void lv_refr_area_part_vdb(const lv_area_t * area_p); -#endif +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 lv_join_t inv_buf[LV_INV_FIFO_SIZE]; -static uint16_t inv_buf_p; -static void (*monitor_cb)(uint32_t, uint32_t); /*Monitor the rendering time*/ -static void (*round_cb)(lv_area_t *); /*If set then called to modify invalidated areas for special display controllers*/ static uint32_t px_num; +static lv_disp_t * disp_refr; /*Display being refreshed*/ /********************** * MACROS @@ -67,9 +55,6 @@ static uint32_t px_num; */ void lv_refr_init(void) { - inv_buf_p = 0; - memset(inv_buf, 0, sizeof(inv_buf)); - lv_task_t * task; task = lv_task_create(lv_refr_task, LV_REFR_PERIOD, LV_TASK_PRIO_MID, NULL); lv_task_ready(task); /*Be sure the screen will be refreshed immediately on start up*/ @@ -88,22 +73,26 @@ void lv_refr_now(void) /** - * Invalidate an area - * @param area_p pointer to area which should be invalidated + * 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(const lv_area_t * area_p) +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) { - inv_buf_p = 0; + disp->inv_p = 0; return; } lv_area_t scr_area; scr_area.x1 = 0; scr_area.y1 = 0; - scr_area.x2 = LV_HOR_RES - 1; - scr_area.y2 = LV_VER_RES - 1; + scr_area.x2 = disp->driver.hor_res - 1; + scr_area.y2 = disp->driver.ver_res - 1; lv_area_t com_area; bool suc; @@ -112,64 +101,32 @@ void lv_inv_area(const lv_area_t * area_p) /*The area is truncated to the screen*/ if(suc != false) { - if(round_cb) round_cb(&com_area); + if(disp->driver.rounder_cb) disp->driver.rounder_cb(&disp_refr->driver, &com_area); /*Save only if this area is not in one of the saved areas*/ uint16_t i; - for(i = 0; i < inv_buf_p; i++) { - if(lv_area_is_in(&com_area, &inv_buf[i].area) != false) return; + 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(inv_buf_p < LV_INV_FIFO_SIZE) { - lv_area_copy(&inv_buf[inv_buf_p].area, &com_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*/ - inv_buf_p = 0; - lv_area_copy(&inv_buf[inv_buf_p].area, &scr_area); + disp->inv_p = 0; + lv_area_copy(&disp->inv_areas[disp->inv_p], &scr_area); } - inv_buf_p ++; + disp->inv_p ++; } } /** - * Set a function to call after every refresh to announce the refresh time and the number of refreshed pixels - * @param cb pointer to a callback function (void my_refr_cb(uint32_t time_ms, uint32_t px_num)) - * time_ms: refresh time in [ms] - * px_num: not the drawn pixels but the number of affected pixels of the screen - * (more pixels are drawn because of overlapping objects) + * Get the display which is being refreshed + * @return the display being refreshed */ -void lv_refr_set_monitor_cb(void (*cb)(uint32_t, uint32_t)) +lv_disp_t * lv_refr_get_disp_refreshing(void) { - monitor_cb = cb; -} - -/** - * Called when an area is invalidated to modify the coordinates of the area. - * Special display controllers may require special coordinate rounding - * @param cb pointer to the a function which will modify the area - */ -void lv_refr_set_round_cb(void(*cb)(lv_area_t *)) -{ - round_cb = cb; -} - -/** - * Get the number of areas in the buffer - * @return number of invalid areas - */ -uint16_t lv_refr_get_buf_size(void) -{ - return inv_buf_p; -} - -/** - * Pop (delete) the last 'num' invalidated areas from the buffer - * @param num number of areas to delete - */ -void lv_refr_pop_from_buf(uint16_t num) -{ - if(inv_buf_p < num) inv_buf_p = 0; - else inv_buf_p -= num; + return disp_refr; } /********************** @@ -184,69 +141,63 @@ static void lv_refr_task(void * param) { (void)param; - LV_LOG_TRACE("display refresh task started"); + LV_LOG_TRACE("lv_refr_task: started"); uint32_t start = lv_tick_get(); - if(lv_disp_get_active() == NULL) { - LV_LOG_TRACE("No display is registered"); - return; - } + LL_READ(LV_GC_ROOT(_lv_disp_ll), disp_refr) { + LV_LOG_TRACE("lv_refr_task: refreshing a display"); - lv_refr_join_area(); + lv_refr_join_area(); - lv_refr_areas(); + lv_refr_areas(); - /*If refresh happened ...*/ - if(inv_buf_p != 0) { + /*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); - /*In true double buffered mode copy the refreshed areas to the new VDB to keep it up to date*/ -#if LV_VDB_TRUE_DOUBLE_BUFFERED - lv_vdb_t * vdb_p = lv_vdb_get(); - vdb_p->area.x1 = 0; - vdb_p->area.x2 = LV_HOR_RES-1; - vdb_p->area.y1 = 0; - vdb_p->area.y2 = LV_VER_RES - 1; + /*Flush the content of the VDB*/ + lv_refr_vdb_flush(); - /*Flush the content of the VDB*/ - lv_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); - /* 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 active content to the other frame buffer (new active VDB) - * The changes will be written to the new VDB.*/ - lv_vdb_t * vdb_act = lv_vdb_get_active(); - lv_vdb_t * vdb_ina = lv_vdb_get_inactive(); + uint8_t * buf_act = (uint8_t *) vdb->buf_act; + uint8_t * buf_ina = (uint8_t *) vdb->buf_act == vdb->buf1 ? vdb->buf2 : vdb->buf1; - uint8_t * buf_act = (uint8_t *) vdb_act->buf; - uint8_t * buf_ina = (uint8_t *) vdb_ina->buf; + 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); - uint16_t a; - for(a = 0; a < inv_buf_p; a++) { - if(inv_buf[a].joined == 0) { - lv_coord_t y; - uint32_t start_offs = ((LV_HOR_RES * inv_buf[a].area.y1 + inv_buf[a].area.x1) * LV_VDB_PX_BPP) >> 3; - uint32_t line_length = (lv_area_get_width(&inv_buf[a].area) * LV_VDB_PX_BPP) >> 3; - - for(y = inv_buf[a].area.y1; y <= inv_buf[a].area.y2; y++) { - memcpy(buf_act + start_offs, buf_ina + start_offs, line_length); - start_offs += (LV_HOR_RES * LV_VDB_PX_BPP) >> 3; + 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); } } - -#endif - - /*Clean up*/ - memset(inv_buf, 0, sizeof(inv_buf)); - inv_buf_p = 0; - - /*Call monitor cb if present*/ - if(monitor_cb != NULL) { - monitor_cb(lv_tick_elaps(start), px_num); - } } - LV_LOG_TRACE("display refresh task finished"); + LV_LOG_TRACE("lv_refr_task: ready"); } @@ -258,32 +209,32 @@ 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 < inv_buf_p; join_in++) { - if(inv_buf[join_in].joined != 0) continue; + 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 < inv_buf_p; join_from++) { + for(join_from = 0; join_from < disp_refr->inv_p; join_from++) { /*Handle only unjoined areas and ignore itself*/ - if(inv_buf[join_from].joined != 0 || join_in == join_from) { + 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(&inv_buf[join_in].area, - &inv_buf[join_from].area) == false) { + if(lv_area_is_on(&disp_refr->inv_areas[join_in], + &disp_refr->inv_areas[join_from]) == false) { continue; } - lv_area_join(&joined_area, &inv_buf[join_in].area, - &inv_buf[join_from].area); + 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(&inv_buf[join_in].area) + lv_area_get_size(&inv_buf[join_from].area))) { - lv_area_copy(&inv_buf[join_in].area, &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'*/ - inv_buf[join_from].joined = 1; + disp_refr->inv_area_joined[join_from] = 1; } } } @@ -297,170 +248,133 @@ static void lv_refr_areas(void) px_num = 0; uint32_t i; - for(i = 0; i < inv_buf_p; i++) { + for(i = 0; i < disp_refr->inv_p; i++) { /*Refresh the unjoined areas*/ - if(inv_buf[i].joined == 0) { - /*If there is no VDB do simple drawing*/ -#if LV_VDB_SIZE == 0 - lv_refr_area_no_vdb(&inv_buf[i].area); -#else - /*If VDB is used...*/ - lv_refr_area_with_vdb(&inv_buf[i].area); -#endif - if(monitor_cb != NULL) px_num += lv_area_get_size(&inv_buf[i].area); + 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]); } } - } -#if LV_VDB_SIZE == 0 -/** - * Refresh an area if there is no Virtual Display Buffer - * @param area_p pointer to an area to refresh - */ -static void lv_refr_area_no_vdb(const lv_area_t * area_p) -{ - lv_obj_t * top_p; - - /*Get top object which is not covered by others*/ - top_p = lv_refr_get_top_obj(area_p, lv_scr_act()); - - /*Do the refreshing*/ - lv_refr_obj_and_children(top_p, area_p); - - /*Also refresh top and sys layer unconditionally*/ - lv_refr_obj_and_children(lv_layer_top(), area_p); - lv_refr_obj_and_children(lv_layer_sys(), area_p); -} - -#else - /** * Refresh an area if there is Virtual Display Buffer * @param area_p pointer to an area to refresh */ -static void lv_refr_area_with_vdb(const lv_area_t * area_p) +static void lv_refr_area(const lv_area_t * area_p) { - -#if LV_VDB_TRUE_DOUBLE_BUFFERED == 0 - /*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_VER_RES ? y2 = LV_VER_RES - 1 : area_p->y2; - - int32_t max_row = (uint32_t) LV_VDB_SIZE / w; - - if(max_row > h) max_row = h; - - - /*Round down the lines of VDB if rounding is added*/ - if(round_cb) { - lv_area_t tmp; - tmp.x1 = 0; - tmp.x2 = 0; - tmp.y1 = 0; - tmp.y2 = max_row; - - lv_coord_t y_tmp = max_row; - do { - tmp.y2 = y_tmp; - round_cb(&tmp); - y_tmp --; /*Decrement the number of line until it is rounded to a smaller (or equal) value then the original. */ - } while(lv_area_get_height(&tmp) > max_row && y_tmp != 0); - - if(y_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; - } + /*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(NULL) ? y2 = lv_disp_get_ver_res(NULL) - 1 : area_p->y2; - /*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) { - lv_vdb_t * vdb_p = lv_vdb_get(); - if(!vdb_p) { - LV_LOG_WARN("Invalid VDB pointer"); - return; + 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; + tmp.y2 = max_row; + + lv_coord_t y_tmp = max_row; + do { + tmp.y2 = y_tmp; + disp_refr->driver.rounder_cb(&disp_refr->driver, &tmp); + y_tmp --; /*Decrement the number of line until it is rounded to a smaller (or equal) value then the original. */ + } while(lv_area_get_height(&tmp) > max_row && y_tmp != 0); + + if(y_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; + } } - /*Calc. the next y coordinates of VDB*/ - vdb_p->area.x1 = area_p->x1; - vdb_p->area.x2 = area_p->x2; - vdb_p->area.y1 = row; - vdb_p->area.y2 = row + max_row - 1; - if(vdb_p->area.y2 > y2) vdb_p->area.y2 = y2; - row_last = vdb_p->area.y2; - lv_refr_area_part_vdb(area_p); - } - - /*If the last y coordinates are not handled yet ...*/ - if(y2 != row_last) { - lv_vdb_t * vdb_p = lv_vdb_get(); - if(!vdb_p) { - LV_LOG_WARN("Invalid VDB pointer"); - return; + /*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); } - /*Calc. the next y coordinates of VDB*/ - vdb_p->area.x1 = area_p->x1; - vdb_p->area.x2 = area_p->x2; - vdb_p->area.y1 = row; - vdb_p->area.y2 = y2; + /*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_vdb(area_p); + /*Refresh this part too*/ + lv_refr_area_part(area_p); + } } -#else - lv_vdb_t * vdb_p = lv_vdb_get(); - vdb_p->area.x1 = 0; - vdb_p->area.x2 = LV_HOR_RES-1; - vdb_p->area.y1 = 0; - vdb_p->area.y2 = LV_VER_RES - 1; - lv_refr_area_part_vdb(area_p); -#endif } /** * 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_vdb(const lv_area_t * area_p) +static void lv_refr_area_part(const lv_area_t * area_p) { - lv_vdb_t * vdb_p = lv_vdb_get(); - if(!vdb_p) { - LV_LOG_WARN("Invalid VDB pointer"); - return; + + 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_p->area); + 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_scr_act()); + 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_layer_top(), &start_mask); - lv_refr_obj_and_children(lv_layer_sys(), &start_mask); + 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_VDB_TRUE_DOUBLE_BUFFERED == 0 - /*Flush the content of the VDB*/ - lv_vdb_flush(); -#endif + if(lv_disp_is_true_double_buf(disp_refr) == false) { + lv_refr_vdb_flush(); + } } -#endif /*LV_VDB_SIZE == 0*/ - /** * Search the most top object which fully covers an area * @param area_p pointer to an area @@ -507,7 +421,7 @@ 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_scr_act(); + 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); @@ -608,3 +522,33 @@ static void lv_refr_obj(lv_obj_t * obj, const lv_area_t * mask_ori_p) } } + +/** + * Flush the content of the VDB + */ +static void lv_refr_vdb_flush(void) +{ + lv_disp_buf_t * vdb = lv_disp_get_buf(lv_refr_get_disp_refreshing()); + + /*In double buffered mode wait until the other buffer is flushed before flushing the current one*/ + if(vdb->buf1 && vdb->buf2) { + 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; + + /*If the screen is transparent initialize it when the new VDB is selected*/ +# if LV_COLOR_SCREEN_TRANSP + memset(vdb[vdb_active].buf, 0x00, LV_VDB_SIZE_IN_BYTES); +# endif /*LV_COLOR_SCREEN_TRANSP*/ + } +} diff --git a/lv_core/lv_refr.h b/lv_core/lv_refr.h index 75b22d017..2bd7d2b63 100644 --- a/lv_core/lv_refr.h +++ b/lv_core/lv_refr.h @@ -54,23 +54,11 @@ void lv_refr_init(void); void lv_refr_now(void); /** - * Invalidate an area - * @param area_p pointer to area which should be invalidated + * 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(const lv_area_t * area_p); - -/** - * Set a function to call after every refresh to announce the refresh time and the number of refreshed pixels - * @param cb pointer to a callback function (void my_refr_cb(uint32_t time_ms, uint32_t px_num)) - */ -void lv_refr_set_monitor_cb(void (*cb)(uint32_t, uint32_t)); - -/** - * Called when an area is invalidated to modify the coordinates of the area. - * Special display controllers may require special coordinate rounding - * @param cb pointer to the a function which will modify the area - */ -void lv_refr_set_round_cb(void(*cb)(lv_area_t*)); +void lv_inv_area(lv_disp_t * disp, const lv_area_t * area_p); /** * Get the number of areas in the buffer @@ -83,6 +71,13 @@ uint16_t lv_refr_get_buf_size(void); * @param num number of areas to delete */ void lv_refr_pop_from_buf(uint16_t num); + +/** + * Get the display which is being refreshed + * @return the display being refreshed + */ +lv_disp_t * lv_refr_get_disp_refreshing(void); + /********************** * STATIC FUNCTIONS **********************/ diff --git a/lv_core/lv_style.h b/lv_core/lv_style.h index ae50d93f4..62cea3615 100644 --- a/lv_core/lv_style.h +++ b/lv_core/lv_style.h @@ -184,7 +184,7 @@ 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_tgl_pr; extern lv_style_t lv_style_btn_ina; /********************** diff --git a/lv_core/lv_vdb.c b/lv_core/lv_vdb.c deleted file mode 100644 index c50eb99ab..000000000 --- a/lv_core/lv_vdb.c +++ /dev/null @@ -1,203 +0,0 @@ -/** - * @file lv_vdb.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_vdb.h" -#if LV_VDB_SIZE != 0 - -#include "../lv_hal/lv_hal_disp.h" -#include "../lv_misc/lv_log.h" -#include - -/********************* - * DEFINES - *********************/ -#ifndef LV_ATTRIBUTE_FLUSH_READY -#define LV_ATTRIBUTE_FLUSH_READY -#endif - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ - -/*Simple VDB*/ -#if LV_VDB_DOUBLE == 0 -# if LV_VDB_ADR == 0 -/*If the buffer address is not specified simply allocate it*/ -static uint8_t vdb_buf[LV_VDB_SIZE_IN_BYTES]; -static lv_vdb_t vdb = {.buf = (lv_color_t *)vdb_buf}; -# else /*LV_VDB_ADR != 0*/ -/*If the buffer address is specified use that address*/ -static lv_vdb_t vdb = {.buf = (lv_color_t *)LV_VDB_ADR}; -# endif - -/*LV_VDB_DOUBLE != 0*/ -#else -/*Double VDB*/ -static uint8_t vdb_active = 0; -# if LV_VDB_ADR == 0 -/*If the buffer address is not specified simply allocate it*/ -static uint8_t vdb_buf1[LV_VDB_SIZE_IN_BYTES]; -static uint8_t vdb_buf2[LV_VDB_SIZE_IN_BYTES]; -static lv_vdb_t vdb[2] = {{.buf = (lv_color_t *) vdb_buf1}, {.buf = (lv_color_t *) vdb_buf2}}; -# else /*LV_VDB_ADR != 0*/ -/*If the buffer address is specified use that address*/ -static lv_vdb_t vdb[2] = {{.buf = (lv_color_t *)LV_VDB_ADR}, {.buf = (lv_color_t *)LV_VDB2_ADR}}; -# endif -#endif - -static volatile bool vdb_flushing = false; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Get the 'vdb' variable or allocate one in LV_VDB_DOUBLE mode - * @return pointer to a 'vdb' variable - */ -lv_vdb_t * lv_vdb_get(void) -{ -#if LV_VDB_DOUBLE == 0 - /* Wait until VDB is flushing. - * (Until this user calls of 'lv_flush_ready()' in the display drivers's flush function*/ - while(vdb_flushing); - - return &vdb; -#else - /*If already there is an active do nothing*/ - return &vdb[vdb_active]; -#endif -} - -/** - * Flush the content of the VDB - */ -void lv_vdb_flush(void) -{ - lv_vdb_t * vdb_act = lv_vdb_get(); - if(!vdb_act) { - LV_LOG_WARN("Invalid VDB pointer"); - return; - } - - /*Don't start a new flush while the previous is not finished*/ -#if LV_VDB_DOUBLE - while(vdb_flushing); -#endif /*LV_VDB_DOUBLE*/ - - vdb_flushing = true; - - /*Flush the rendered content to the display*/ - lv_disp_flush(vdb_act->area.x1, vdb_act->area.y1, vdb_act->area.x2, vdb_act->area.y2, vdb_act->buf); - - -#if LV_VDB_DOUBLE - /*Make the other VDB active. The content of the current will be kept until the next flush*/ - vdb_active++; - vdb_active &= 0x1; - - /*If the screen is transparent initialize it when the new VDB is selected*/ -# if LV_COLOR_SCREEN_TRANSP - memset(vdb[vdb_active].buf, 0x00, LV_VDB_SIZE_IN_BYTES); -# endif /*LV_COLOR_SCREEN_TRANSP*/ - -#endif /*#if LV_VDB_DOUBLE*/ - -} - -/** - * Set the address of VDB buffer(s) manually. To use this set `LV_VDB_ADR` (and `LV_VDB2_ADR`) to `LV_VDB_ADR_INV` in `lv_conf.h`. - * It should be called before `lv_init()`. The size of the buffer should be: `LV_VDB_SIZE_IN_BYTES` - * @param buf1 address of the VDB. - * @param buf2 address of the second buffer. `NULL` if `LV_VDB_DOUBLE 0` - */ -void lv_vdb_set_adr(void * buf1, void * buf2) -{ -#if LV_VDB_DOUBLE == 0 - (void) buf2; /*unused*/ - vdb.buf = buf1; -#else - vdb[0].buf = buf1; - vdb[1].buf = buf2; -#endif -} - -/** - * Call in the display driver's 'disp_flush' function when the flushing is finished - */ -LV_ATTRIBUTE_FLUSH_READY void lv_flush_ready(void) -{ - vdb_flushing = false; - - /*If the screen is transparent initialize it when the flushing is ready*/ -#if LV_VDB_DOUBLE == 0 && LV_COLOR_SCREEN_TRANSP - memset(vdb_buf, 0x00, LV_VDB_SIZE_IN_BYTES); -#endif -} - -/** - * Get currently active VDB, where the drawing happens. Used with `LV_VDB_DOUBLE 1` - * @return pointer to the active VDB. If `LV_VDB_DOUBLE 0` give the single VDB - */ -lv_vdb_t * lv_vdb_get_active(void) -{ -#if LV_VDB_DOUBLE == 0 - return &vdb; -#else - return &vdb[vdb_active]; -#endif -} - -/** - * Get currently inactive VDB, which is being displayed or being flushed. Used with `LV_VDB_DOUBLE 1` - * @return pointer to the inactive VDB. If `LV_VDB_DOUBLE 0` give the single VDB - */ -lv_vdb_t * lv_vdb_get_inactive(void) -{ -#if LV_VDB_DOUBLE == 0 - return &vdb; -#else - return &vdb[(vdb_active + 1) & 0x1]; -#endif -} - -/** - * Whether the flushing is in progress or not - * @return true: flushing is in progress; false: flushing ready - */ -bool lv_vdb_is_flushing(void) -{ - return vdb_flushing; -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#else - -/** - * Just for compatibility - */ -void lv_flush_ready(void) -{ - /*Do nothing. It is used only for VDB*/ -} -#endif diff --git a/lv_core/lv_vdb.h b/lv_core/lv_vdb.h deleted file mode 100644 index e94ba1980..000000000 --- a/lv_core/lv_vdb.h +++ /dev/null @@ -1,119 +0,0 @@ -/** - * @file lv_vdb.h - * - */ - -#ifndef LV_VDB_H -#define LV_VDB_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../lv_conf.h" -#endif - -#if LV_VDB_SIZE != 0 - -#include "../lv_misc/lv_color.h" -#include "../lv_misc/lv_area.h" - -/********************* - * DEFINES - *********************/ -/*Can be used in `lv_conf.h` the set an invalid address for the VDB. It should be replaced later by a valid address using `lv_vdb_set_adr()`*/ -#define LV_VDB_ADR_INV 8 /*8 is still too small to be valid but it's aligned on 64 bit machines as well*/ - -#ifndef LV_VDB_PX_BPP -#define LV_VDB_PX_BPP LV_COLOR_SIZE /* Default is LV_COLOR_SIZE */ -#endif - - -#if LV_VDB_TRUE_DOUBLE_BUFFERED && (LV_VDB_SIZE != LV_HOR_RES * LV_VER_RES || LV_VDB_DOUBLE == 0) -#error "With LV_VDB_TRUE_DOUBLE_BUFFERED: (LV_VDB_SIZE = LV_HOR_RES * LV_VER_RES and LV_VDB_DOUBLE = 1 is required" -#endif - - -/* The size of VDB in bytes. - * (LV_VDB_SIZE * LV_VDB_PX_BPP) >> 3): just divide by 8 to convert bits to bytes - * (((LV_VDB_SIZE * LV_VDB_PX_BPP) & 0x7) ? 1 : 0): add an extra byte to round up. - * E.g. if LV_VDB_SIZE = 10 and LV_VDB_PX_BPP = 1 -> 10 bits -> 2 bytes*/ -#define LV_VDB_SIZE_IN_BYTES ((LV_VDB_SIZE * LV_VDB_PX_BPP) >> 3) + (((LV_VDB_SIZE * LV_VDB_PX_BPP) & 0x7) ? 1 : 0) - -/********************** - * TYPEDEFS - **********************/ - -typedef struct -{ - lv_area_t area; - lv_color_t *buf; -} lv_vdb_t; - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -/** - * Get the 'vdb' variable or allocate one in LV_VDB_DOUBLE mode - * @return pointer to a 'vdb' variable - */ -lv_vdb_t * lv_vdb_get(void); - -/** - * Flush the content of the vdb - */ -void lv_vdb_flush(void); - -/** - * Set the address of VDB buffer(s) manually. To use this set `LV_VDB_ADR` (and `LV_VDB2_ADR`) to `LV_VDB_ADR_INV` in `lv_conf.h`. - * It should be called before `lv_init()`. The size of the buffer should be: `LV_VDB_SIZE_IN_BYTES` - * @param buf1 address of the VDB. - * @param buf2 address of the second buffer. `NULL` if `LV_VDB_DOUBLE 0` - */ -void lv_vdb_set_adr(void * buf1, void * buf2); - -/** - * Call in the display driver's 'disp_flush' function when the flushing is finished - */ -void lv_flush_ready(void); - -/** - * Get currently active VDB, where the drawing happens. Used with `LV_VDB_DOUBLE 1` - * @return pointer to the active VDB. If `LV_VDB_DOUBLE 0` give the single VDB - */ -lv_vdb_t * lv_vdb_get_active(void); - -/** - * Get currently inactive VDB, which is being displayed or being flushed. Used with `LV_VDB_DOUBLE 1` - * @return pointer to the inactive VDB. If `LV_VDB_DOUBLE 0` give the single VDB - */ -lv_vdb_t * lv_vdb_get_inactive(void); - -/** - * Whether the flushing is in progress or not - * @return true: flushing is in progress; false: flushing ready - */ -bool lv_vdb_is_flushing(void); - -/********************** - * MACROS - **********************/ - -#else /*LV_VDB_SIZE != 0*/ - -/*Just for compatibility*/ -void lv_flush_ready(void); -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_VDB_H*/ diff --git a/lv_draw/lv_draw.c b/lv_draw/lv_draw.c index f1137ceb6..af7c8a384 100644 --- a/lv_draw/lv_draw.c +++ b/lv_draw/lv_draw.c @@ -10,12 +10,7 @@ #include #include #include "lv_draw.h" -#include "lv_draw_rbasic.h" -#include "lv_draw_vbasic.h" -#include "../lv_misc/lv_fs.h" #include "../lv_misc/lv_math.h" -#include "../lv_misc/lv_ufs.h" -#include "../lv_objx/lv_img.h" /********************* * DEFINES @@ -33,22 +28,6 @@ * STATIC VARIABLES **********************/ -#if LV_VDB_SIZE != 0 -void (*const px_fp)(lv_coord_t x, lv_coord_t y, const lv_area_t * mask, lv_color_t color, lv_opa_t opa) = lv_vpx; -void (*const fill_fp)(const lv_area_t * coords, const lv_area_t * mask, lv_color_t color, lv_opa_t opa) = lv_vfill; -void (*const letter_fp)(const lv_point_t * pos_p, const lv_area_t * mask, const lv_font_t * font_p, uint32_t letter, lv_color_t color, lv_opa_t opa) = lv_vletter; -void (*const map_fp)(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) = lv_vmap; -#else -void (*const px_fp)(lv_coord_t x, lv_coord_t y, const lv_area_t * mask, lv_color_t color, lv_opa_t opa) = lv_rpx; -void (*const fill_fp)(const lv_area_t * coords, const lv_area_t * mask, lv_color_t color, lv_opa_t opa) = lv_rfill; -void (*const letter_fp)(const lv_point_t * pos_p, const lv_area_t * mask, const lv_font_t * font_p, uint32_t letter, lv_color_t color, lv_opa_t opa) = lv_rletter; -void (*const map_fp)(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) = lv_rmap; -#endif - /********************** * MACROS **********************/ @@ -132,7 +111,7 @@ void lv_draw_aa_ver_seg(lv_coord_t x, lv_coord_t y, lv_coord_t length, const lv_ 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; - px_fp(x, y + i, mask, color, px_opa); + lv_draw_px(x, y + i, mask, color, px_opa); } } @@ -157,7 +136,7 @@ void lv_draw_aa_hor_seg(lv_coord_t x, lv_coord_t y, lv_coord_t length, const lv_ 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; - px_fp(x + i, y, mask, color, px_opa); + lv_draw_px(x + i, y, mask, color, px_opa); } } diff --git a/lv_draw/lv_draw.h b/lv_draw/lv_draw.h index cf50e98ce..ccd7b2ce4 100644 --- a/lv_draw/lv_draw.h +++ b/lv_draw/lv_draw.h @@ -88,12 +88,6 @@ void lv_draw_aa_hor_seg(lv_coord_t x, lv_coord_t y, lv_coord_t length, const lv_ /********************** * GLOBAL VARIABLES **********************/ -extern void (*const px_fp)(lv_coord_t x, lv_coord_t y, const lv_area_t * mask, lv_color_t color, lv_opa_t opa); -extern void (*const fill_fp)(const lv_area_t * coords, const lv_area_t * mask, lv_color_t color, lv_opa_t opa); -extern void (*const letter_fp)(const lv_point_t * pos_p, const lv_area_t * mask, const lv_font_t * font_p, uint32_t letter, lv_color_t color, lv_opa_t opa); -extern void (*const map_fp)(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 @@ -102,6 +96,7 @@ extern void (*const map_fp)(const lv_area_t * cords_p, const lv_area_t * mask_p, /********************** * POST INCLUDES *********************/ +#include "lv_draw_basic.h" #include "lv_draw_rect.h" #include "lv_draw_label.h" #include "lv_draw_img.h" diff --git a/lv_draw/lv_draw.mk b/lv_draw/lv_draw.mk index a384eefea..70fa7103f 100644 --- a/lv_draw/lv_draw.mk +++ b/lv_draw/lv_draw.mk @@ -1,5 +1,4 @@ -CSRCS += lv_draw_vbasic.c -CSRCS += lv_draw_rbasic.c +CSRCS += lv_draw_basic.c CSRCS += lv_draw.c CSRCS += lv_draw_rect.c CSRCS += lv_draw_label.c diff --git a/lv_draw/lv_draw_arc.c b/lv_draw/lv_draw_arc.c index 525e56b79..0177d1449 100644 --- a/lv_draw/lv_draw_arc.c +++ b/lv_draw/lv_draw_arc.c @@ -239,7 +239,7 @@ static void ver_line(lv_coord_t x, lv_coord_t y, const lv_area_t * mask, lv_coor lv_area_t area; lv_area_set(&area, x, y, x, y + len); - fill_fp(&area, mask, color, opa); + 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) @@ -247,7 +247,7 @@ static void hor_line(lv_coord_t x, lv_coord_t y, const lv_area_t * mask, lv_coor lv_area_t area; lv_area_set(&area, x, y, x + len, y); - fill_fp(&area, mask, color, opa); + lv_draw_fill(&area, mask, color, opa); } static bool deg_test_norm(uint16_t deg, uint16_t start, uint16_t end) diff --git a/lv_draw/lv_draw_vbasic.c b/lv_draw/lv_draw_basic.c similarity index 80% rename from lv_draw/lv_draw_vbasic.c rename to lv_draw/lv_draw_basic.c index c8b2fab55..31b8ba481 100644 --- a/lv_draw/lv_draw_vbasic.c +++ b/lv_draw/lv_draw_basic.c @@ -1,24 +1,22 @@ /** - * @file lv_vdraw.c + * @file lv_draw_basic.c * */ -#include "lv_draw_vbasic.h" +#include "lv_draw_basic.h" #include #include #include -#include "../lv_hal/lv_hal_disp.h" +#include "../lv_core/lv_refr.h" +#include "../lv_hal/lv_hal.h" #include "../lv_misc/lv_area.h" #include "../lv_misc/lv_font.h" #include "../lv_misc/lv_color.h" #include "../lv_misc/lv_log.h" -#if LV_VDB_SIZE != 0 - #include -#include "../lv_core/lv_vdb.h" #include "lv_draw.h" /********************* @@ -30,6 +28,10 @@ *********************/ #define VFILL_HW_ACC_SIZE_LIMIT 50 /*Always fill < 50 px with 'sw_color_fill' because of the hw. init overhead*/ +#ifndef LV_ATTRIBUTE_MEM_ALIGN +#define LV_ATTRIBUTE_MEM_ALIGN +#endif + /********************** * TYPEDEFS **********************/ @@ -64,16 +66,11 @@ static inline lv_color_t color_mix_2_alpha(lv_color_t bg_color, lv_opa_t bg_opa, * @param color pixel color * @param opa opacity of the area (0..255) */ -void lv_vpx(lv_coord_t x, lv_coord_t y, const lv_area_t * mask_p, lv_color_t color, lv_opa_t opa) +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; - lv_vdb_t * vdb_p = lv_vdb_get(); - if(!vdb_p) { - LV_LOG_WARN("Invalid VDB pointer"); - return; - } /*Pixel out of the mask*/ if(x < mask_p->x1 || x > mask_p->x2 || @@ -81,17 +78,19 @@ void lv_vpx(lv_coord_t x, lv_coord_t y, const lv_area_t * mask_p, lv_color_t col return; } - uint32_t vdb_width = lv_area_get_width(&vdb_p->area); + 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_p->area.x1; - y -= vdb_p->area.y1; + x -= vdb->area.x1; + y -= vdb->area.y1; - lv_disp_t * disp = lv_disp_get_active(); - if(disp->driver.vdb_wr) { - disp->driver.vdb_wr((uint8_t *)vdb_p->buf, vdb_width, x, y, color, opa); + 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 { - lv_color_t * vdb_px_p = vdb_p->buf + y * vdb_width + x; + lv_color_t * vdb_px_p = vdb->buf_act; + vdb_px_p += y * vdb_width + x; #if LV_COLOR_SCREEN_TRANSP == 0 if(opa == LV_OPA_COVER) { *vdb_px_p = color; @@ -112,7 +111,7 @@ void lv_vpx(lv_coord_t x, lv_coord_t y, const lv_area_t * mask_p, lv_color_t col * @param color fill color * @param opa opacity of the area (0..255) */ -void lv_vfill(const lv_area_t * cords_p, const lv_area_t * mask_p, +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; @@ -120,11 +119,6 @@ void lv_vfill(const lv_area_t * cords_p, const lv_area_t * mask_p, lv_area_t res_a; bool union_ok; - lv_vdb_t * vdb_p = lv_vdb_get(); - if(!vdb_p) { - LV_LOG_WARN("Invalid VDB pointer"); - return; - } /*Get the union of cord and mask*/ /* The mask is already truncated to the vdb size @@ -134,40 +128,43 @@ void lv_vfill(const lv_area_t * cords_p, const lv_area_t * mask_p, /*If there are common part of the three area then draw to the vdb*/ if(union_ok == false) return; - lv_area_t vdb_rel_a; /*Stores relative coordinates on vdb*/ - vdb_rel_a.x1 = res_a.x1 - vdb_p->area.x1; - vdb_rel_a.y1 = res_a.y1 - vdb_p->area.y1; - vdb_rel_a.x2 = res_a.x2 - vdb_p->area.x1; - vdb_rel_a.y2 = res_a.y2 - vdb_p->area.y1; + lv_disp_t * disp = lv_refr_get_disp_refreshing(); + lv_disp_buf_t * vdb = lv_disp_get_buf(disp); - lv_color_t * vdb_buf_tmp = vdb_p->buf; - uint32_t vdb_width = lv_area_get_width(&vdb_p->area); + 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 USE_LV_GPU - static lv_color_t color_array_tmp[LV_HOR_RES]; /*Used by 'lv_disp_mem_blend'*/ + 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_p->area, vdb_p->buf, &vdb_rel_a, color, opa); + sw_color_fill(&vdb->area, vdb->buf_act, &vdb_rel_a, color, opa); } /*Not opaque fill*/ else if(opa == LV_OPA_COVER) { /*Use hw fill if present*/ - if(lv_disp_is_mem_fill_supported()) { + if(disp->driver.mem_fill) { lv_coord_t row; for(row = vdb_rel_a.y1; row <= vdb_rel_a.y2; row++) { - lv_disp_mem_fill(&vdb_buf_tmp[vdb_rel_a.x1], w, color); + disp->driver.mem_fill(&vdb_buf_tmp[vdb_rel_a.x1], w, color); vdb_buf_tmp += vdb_width; } } /*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 && - lv_disp_is_mem_blend_supported()) { + disp->driver.mem_blend) { /*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; @@ -180,21 +177,21 @@ void lv_vfill(const lv_area_t * cords_p, const lv_area_t * mask_p, /*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++) { - lv_disp_mem_blend(&vdb_buf_tmp[vdb_rel_a.x1], color_array_tmp, w, opa); + disp->driver.mem_blend(&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_p->area, vdb_p->buf, &vdb_rel_a, color, opa); + sw_color_fill(&vdb->area, vdb->buf_act, &vdb_rel_a, color, opa); } } /*Fill with opacity*/ else { /*Use hw blend if present*/ - if(lv_disp_is_mem_blend_supported()) { + if(disp->driver.mem_blend) { if(color_array_tmp[0].full != color.full || last_width != w) { uint16_t i; for(i = 0; i < w; i++) { @@ -205,19 +202,19 @@ void lv_vfill(const lv_area_t * cords_p, const lv_area_t * mask_p, } lv_coord_t row; for(row = vdb_rel_a.y1; row <= vdb_rel_a.y2; row++) { - lv_disp_mem_blend(&vdb_buf_tmp[vdb_rel_a.x1], color_array_tmp, w, opa); + disp->driver.mem_blend(&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_p->area, vdb_p->buf, &vdb_rel_a, color, opa); + sw_color_fill(&vdb->area, vdb->buf_act, &vdb_rel_a, color, opa); } } #else - sw_color_fill(&vdb_p->area, vdb_p->buf, &vdb_rel_a, color, opa); + sw_color_fill(&vdb->area, vdb->buf_act, &vdb_rel_a, color, opa); #endif } @@ -230,7 +227,7 @@ void lv_vfill(const lv_area_t * cords_p, const lv_area_t * mask_p, * @param color color of letter * @param opa opacity of letter (0..255) */ -void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p, +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) { @@ -292,14 +289,11 @@ void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p, if(pos_x + letter_w < mask_p->x1 || pos_x > mask_p->x2 || pos_y + letter_h < mask_p->y1 || pos_y > mask_p->y2) return; - lv_vdb_t * vdb_p = lv_vdb_get(); - if(!vdb_p) { - LV_LOG_WARN("Invalid VDB pointer"); - 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_p->area); - lv_color_t * vdb_buf_tmp = vdb_p->buf; + 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 col_bit; uint8_t col_byte_cnt; @@ -315,8 +309,8 @@ void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p, lv_coord_t row_end = pos_y + letter_h <= mask_p->y2 ? letter_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_p->area.y1) * vdb_width) - + pos_x - vdb_p->area.x1; + vdb_buf_tmp += ((pos_y - vdb->area.y1) * vdb_width) + + pos_x - vdb->area.x1; /*If the letter is partially out of mask the move there on VDB*/ vdb_buf_tmp += (row_start * vdb_width) + col_start; @@ -324,8 +318,6 @@ void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p, /*Move on the map too*/ map_p += (row_start * width_byte_bpp) + ((col_start * bpp) >> 3); - lv_disp_t * disp = lv_disp_get_active(); - uint8_t letter_px; lv_opa_t px_opa; for(row = row_start; row < row_end; row ++) { @@ -343,9 +335,9 @@ void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p, (uint16_t)((uint16_t)bpp_opa_table[letter_px] * opa) >> 8; } - if(disp->driver.vdb_wr) { - disp->driver.vdb_wr((uint8_t *)vdb_p->buf, vdb_width, - (col + pos_x) - vdb_p->area.x1, (row + pos_y) - vdb_p->area.y1, + 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 LV_COLOR_SCREEN_TRANSP == 0 @@ -385,7 +377,7 @@ void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p, * @param recolor mix the pixels with this color * @param recolor_opa the intense of recoloring */ -void lv_vmap(const lv_area_t * cords_p, const lv_area_t * mask_p, +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) { @@ -395,11 +387,6 @@ void lv_vmap(const lv_area_t * cords_p, const lv_area_t * mask_p, lv_area_t masked_a; bool union_ok; - lv_vdb_t * vdb_p = lv_vdb_get(); - if(!vdb_p) { - LV_LOG_WARN("Invalid VDB pointer"); - return; - } /*Get the union of map size and mask*/ /* The mask is already truncated to the vdb size @@ -421,32 +408,33 @@ void lv_vmap(const lv_area_t * cords_p, const lv_area_t * mask_p, map_p += (masked_a.x1 - cords_p->x1) * px_size_byte; } - /*Stores coordinates relative to the current VDB*/ - masked_a.x1 = masked_a.x1 - vdb_p->area.x1; - masked_a.y1 = masked_a.y1 - vdb_p->area.y1; - masked_a.x2 = masked_a.x2 - vdb_p->area.x1; - masked_a.y2 = masked_a.y2 - vdb_p->area.y1; + 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_p->area); - lv_color_t * vdb_buf_tmp = vdb_p->buf; + /*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); - lv_disp_t * disp = lv_disp_get_active(); - /*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.vdb_wr) { + 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.vdb_wr((uint8_t *)vdb_p->buf, vdb_width, col + masked_a.x1, row, px_color, opa); + 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*/ } @@ -455,10 +443,10 @@ void lv_vmap(const lv_area_t * cords_p, const lv_area_t * mask_p, else { for(row = masked_a.y1; row <= masked_a.y2; row++) { #if USE_LV_GPU - if(lv_disp_is_mem_blend_supported() == false) { + if(disp->driver.mem_blend == false) { sw_mem_blend(vdb_buf_tmp, (lv_color_t *)map_p, map_useful_w, opa); } else { - lv_disp_mem_blend(vdb_buf_tmp, (lv_color_t *)map_p, map_useful_w, opa); + disp->driver.mem_blend(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); @@ -508,8 +496,8 @@ void lv_vmap(const lv_area_t * cords_p, const lv_area_t * mask_p, recolored_px = lv_color_mix(recolor, last_img_px, recolor_opa); } /*Handle custom VDB write is present*/ - if(disp->driver.vdb_wr) { - disp->driver.vdb_wr((uint8_t *)vdb_p->buf, vdb_width, col + masked_a.x1, row, recolored_px, opa_result); + 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 { @@ -518,8 +506,8 @@ void lv_vmap(const lv_area_t * cords_p, const lv_area_t * mask_p, } } else { /*Handle custom VDB write is present*/ - if(disp->driver.vdb_wr) { - disp->driver.vdb_wr((uint8_t *)vdb_p->buf, vdb_width, col + masked_a.x1, row, px_color, opa_result); + 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 { @@ -529,21 +517,6 @@ void lv_vmap(const lv_area_t * cords_p, const lv_area_t * mask_p, vdb_buf_tmp[col] = lv_color_mix(px_color, vdb_buf_tmp[col], opa_result); #else vdb_buf_tmp[col] = color_mix_2_alpha(vdb_buf_tmp[col], vdb_buf_tmp[col].alpha, px_color, opa_result); -// if(vdb_buf_tmp[col].alpha == LV_OPA_TRANSP) { -// /* When it is the first visible pixel on the transparent screen -// * simlply use this color and set the pixel opa as backrounds alpha*/ -// vdb_buf_tmp[col] = px_color; -// vdb_buf_tmp[col].alpha = opa_result; -// } else { -// /* If already this pixel is already written then for performance reasons -// * don't care with alpha channel -// */ -// lv_opa_t bg_opa = vdb_buf_tmp[col].alpha; -// vdb_buf_tmp[col] = lv_color_mix(px_color, vdb_buf_tmp[col], opa_result); -// -// uint16_t opa_tmp = (uint16_t)opa_result + ((bg_opa * (255 - opa_result)) >> 8); -// vdb_buf_tmp[col].alpha = opa_tmp > 0xFF ? 0xFF : opa_tmp ; -// } #endif } } @@ -594,11 +567,11 @@ static void sw_color_fill(lv_area_t * mem_area, lv_color_t * mem, const lv_area_ lv_coord_t col; lv_coord_t mem_width = lv_area_get_width(mem_area); - lv_disp_t * disp = lv_disp_get_active(); - if(disp->driver.vdb_wr) { + 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.vdb_wr((uint8_t *)mem, mem_width, col, row, color, opa); + disp->driver.set_px_cb(&disp->driver, (uint8_t *)mem, mem_width, col, row, color, opa); } } } else { @@ -700,4 +673,3 @@ static inline lv_color_t color_mix_2_alpha(lv_color_t bg_color, lv_opa_t bg_opa, } #endif /*LV_COLOR_SCREEN_TRANSP*/ -#endif diff --git a/lv_draw/lv_draw_vbasic.h b/lv_draw/lv_draw_basic.h similarity index 80% rename from lv_draw/lv_draw_vbasic.h rename to lv_draw/lv_draw_basic.h index 88838b7c7..2e52d29d8 100644 --- a/lv_draw/lv_draw_vbasic.h +++ b/lv_draw/lv_draw_basic.h @@ -1,10 +1,10 @@ /** - * @file lv_draw_vbasic.h + * @file lv_draw_basic.h * */ -#ifndef LV_DRAW_VBASIC_H -#define LV_DRAW_VBASIC_H +#ifndef LV_DRAW_BASIC_H +#define LV_DRAW_BASIC_H #ifdef __cplusplus extern "C" { @@ -19,8 +19,6 @@ extern "C" { #include "../../lv_conf.h" #endif -#if LV_VDB_SIZE != 0 - #include "../lv_misc/lv_color.h" #include "../lv_misc/lv_area.h" #include "../lv_misc/lv_font.h" @@ -37,7 +35,7 @@ extern "C" { * GLOBAL PROTOTYPES **********************/ -void lv_vpx(lv_coord_t x, lv_coord_t y, const lv_area_t * mask_p, lv_color_t color, lv_opa_t opa); +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 @@ -45,7 +43,7 @@ void lv_vpx(lv_coord_t x, lv_coord_t y, const lv_area_t * mask_p, lv_color_t col * @param color fill color * @param opa opacity of the area (0..255) */ -void lv_vfill(const lv_area_t * cords_p, const lv_area_t * mask_p, +void lv_draw_fill(const lv_area_t * cords_p, const lv_area_t * mask_p, lv_color_t color, lv_opa_t opa); /** @@ -57,7 +55,7 @@ void lv_vfill(const lv_area_t * cords_p, const lv_area_t * mask_p, * @param color color of letter * @param opa opacity of letter (0..255) */ -void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p, +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); @@ -72,7 +70,7 @@ void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p, * @param recolor mix the pixels with this color * @param recolor_opa the intense of recoloring */ -void lv_vmap(const lv_area_t * cords_p, const lv_area_t * mask_p, +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); @@ -80,10 +78,8 @@ void lv_vmap(const lv_area_t * cords_p, const lv_area_t * mask_p, * MACROS **********************/ -#endif /*LV_VDB_SIZE != 0*/ - #ifdef __cplusplus } /* extern "C" */ #endif -#endif /*LV_DRAW_RBASIC_H*/ +#endif /*LV_DRAW_BASIC_H*/ diff --git a/lv_draw/lv_draw_img.c b/lv_draw/lv_draw_img.c index 5c24aa89d..369fbb761 100644 --- a/lv_draw/lv_draw_img.c +++ b/lv_draw/lv_draw_img.c @@ -316,7 +316,7 @@ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mas /* The decoder open could open the image and gave the entire uncompressed image. * Just draw it!*/ if(img_data) { - map_fp(coords, mask, img_data, opa, chroma_keyed, alpha_byte, style->image.color, style->image.intense); + lv_draw_map(coords, mask, 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 { @@ -325,7 +325,7 @@ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mas #if LV_COMPILER_VLA_SUPPORTED uint8_t buf[(lv_area_get_width(&mask_com) * ((LV_COLOR_DEPTH >> 3) + 1))]; #else - uint8_t buf[LV_HOR_RES * ((LV_COLOR_DEPTH >> 3) + 1)]; /*+1 because of the possible alpha byte*/ + uint8_t buf[LV_HOR_RES_MAX * ((LV_COLOR_DEPTH >> 3) + 1)]; /*+1 because of the possible alpha byte*/ #endif lv_area_t line; lv_area_copy(&line, &mask_com); @@ -341,7 +341,7 @@ static lv_res_t lv_img_draw_core(const lv_area_t * coords, const lv_area_t * mas LV_LOG_WARN("Image draw can't read the line"); return LV_RES_INV; } - map_fp(&line, mask, buf, opa, chroma_keyed, alpha_byte, style->image.color, style->image.intense); + lv_draw_map(&line, mask, buf, opa, chroma_keyed, alpha_byte, style->image.color, style->image.intense); line.y1++; line.y2++; y++; diff --git a/lv_draw/lv_draw_label.c b/lv_draw/lv_draw_label.c index d80c9a0c2..2441d90be 100644 --- a/lv_draw/lv_draw_label.c +++ b/lv_draw/lv_draw_label.c @@ -7,7 +7,6 @@ * INCLUDES *********************/ #include "lv_draw_label.h" -#include "lv_draw_rbasic.h" #include "../lv_misc/lv_math.h" /********************* @@ -78,6 +77,14 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st 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; uint32_t line_end = lv_txt_get_next_line(txt, font, style->text.letter_space, w, flag); @@ -115,20 +122,6 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st lv_color_t recolor; lv_coord_t letter_w; - 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; - } - - /*Real draw need a background color for higher bpp letter*/ -#if LV_VDB_SIZE == 0 - lv_rletter_set_background(style->body.main_color); -#endif - - /*Write out all lines*/ while(txt[line_start] != '\0') { if(offset != NULL) { @@ -182,7 +175,7 @@ void lv_draw_label(const lv_area_t * coords, const lv_area_t * mask, const lv_st if(cmd_state == CMD_STATE_IN) color = recolor; - letter_fp(&pos, mask, font, letter, color, opa); + lv_draw_letter(&pos, mask, font, letter, color, opa); letter_w = lv_font_get_width(font, letter); if(letter_w > 0){ diff --git a/lv_draw/lv_draw_line.c b/lv_draw/lv_draw_line.c index 0d2c389c2..c456095c5 100644 --- a/lv_draw/lv_draw_line.c +++ b/lv_draw/lv_draw_line.c @@ -192,7 +192,7 @@ static void line_draw_hor(line_draw_t * main_line, const lv_area_t * mask, const 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); - fill_fp(&draw_area, mask, style->line.color, opa); + 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) @@ -214,7 +214,7 @@ static void line_draw_ver(line_draw_t * main_line, const lv_area_t * mask, const 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); - fill_fp(&draw_area, mask, style->line.color, opa); + 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) @@ -436,12 +436,12 @@ static void line_draw_skew(line_draw_t * main_line, bool dir_ori, const lv_area_ 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; - fill_fp(&draw_area, mask, style->line.color, opa); + 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) { - px_fp(draw_area.x1, draw_area.y1 - main_line->sy, mask, style->line.color, opa); + lv_draw_px(draw_area.x1, draw_area.y1 - main_line->sy, mask, style->line.color, opa); } } @@ -463,12 +463,12 @@ static void line_draw_skew(line_draw_t * main_line, bool dir_ori, const lv_area_ 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; - fill_fp(&draw_area, mask, style->line.color, opa); + 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) { - px_fp(draw_area.x1, draw_area.y1 - main_line->sy, mask, style->line.color, opa); + lv_draw_px(draw_area.x1, draw_area.y1 - main_line->sy, mask, style->line.color, opa); } } @@ -489,12 +489,12 @@ static void line_draw_skew(line_draw_t * main_line, bool dir_ori, const lv_area_ draw_area.x2 = draw_area.x1; draw_area.y2 = draw_area.y1 + main_line->p_act.y - prev_p.y - 1; - fill_fp(&draw_area, mask, style->line.color, opa); + 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) { - px_fp(draw_area.x1 - main_line->sx, draw_area.y1, mask, style->line.color, opa); + lv_draw_px(draw_area.x1 - main_line->sx, draw_area.y1, mask, style->line.color, opa); } } @@ -519,12 +519,12 @@ static void line_draw_skew(line_draw_t * main_line, bool dir_ori, const lv_area_ draw_area.x2 = draw_area.x1; draw_area.y2 = draw_area.y1 + main_line->p_act.y - prev_p.y; - fill_fp(&draw_area, mask, style->line.color, opa); + 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) { - px_fp(draw_area.x1 - main_line->sx, draw_area.y1, mask, style->line.color, opa); + lv_draw_px(draw_area.x1 - main_line->sx, draw_area.y1, mask, style->line.color, opa); } } diff --git a/lv_draw/lv_draw_rbasic.c b/lv_draw/lv_draw_rbasic.c deleted file mode 100644 index 369adf523..000000000 --- a/lv_draw/lv_draw_rbasic.c +++ /dev/null @@ -1,269 +0,0 @@ -/** - * @file lv_draw_rbasic.c - * - */ - -/********************* - * INCLUDES - *********************/ -#include "lv_draw_rbasic.h" -#if USE_LV_REAL_DRAW != 0 - -#include "../lv_hal/lv_hal_disp.h" -#include "../lv_misc/lv_font.h" -#include "lv_draw.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * STATIC PROTOTYPES - **********************/ - -/********************** - * STATIC VARIABLES - **********************/ -static lv_color_t letter_bg_color; - -/********************** - * MACROS - **********************/ - -/********************** - * GLOBAL FUNCTIONS - **********************/ - -/** - * Put a pixel to the display - * @param x x coordinate of the pixel - * @param y y coordinate of the pixel - * @param mask_p the pixel will be drawn on this area - * @param color color of the pixel - * @param opa opacity (ignored, only for compatibility with lv_vpx) - */ -void lv_rpx(lv_coord_t x, lv_coord_t y, const lv_area_t * mask_p, lv_color_t color, lv_opa_t opa) -{ - (void)opa; /*Opa is used only for compatibility with lv_vpx*/ - - lv_area_t area; - area.x1 = x; - area.y1 = y; - area.x2 = x; - area.y2 = y; - - lv_rfill(&area, mask_p, color, LV_OPA_COVER); -} - -/** - * Fill an area on the display - * @param cords_p coordinates of the area to fill - * @param mask_p fill only o this mask - * @param color fill color - * @param opa opacity (ignored, only for compatibility with lv_vfill) - */ -void lv_rfill(const lv_area_t * cords_p, const lv_area_t * mask_p, - lv_color_t color, lv_opa_t opa) -{ - - (void)opa; /*Opa is used only for compatibility with lv_vfill*/ - - lv_area_t masked_area; - bool union_ok = true; - - if(mask_p != NULL) { - union_ok = lv_area_intersect(&masked_area, cords_p, mask_p); - } else { - lv_area_t scr_area; - lv_area_set(&scr_area, 0, 0, LV_HOR_RES - 1, LV_VER_RES - 1); - union_ok = lv_area_intersect(&masked_area, cords_p, &scr_area); - } - - if(union_ok != false) { - lv_disp_fill(masked_area.x1, masked_area.y1, masked_area.x2, masked_area.y2, color); - } -} - -/** - * Draw a letter to the display - * @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 (ignored, only for compatibility with lv_vletter) - */ -void lv_rletter(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) -{ - (void)opa; /*Opa is used only for compatibility with lv_vletter*/ - - static uint8_t bpp1_opa_table[2] = {0, 255}; /*Opacity mapping with bpp = 1 (Just for compatibility)*/ - static uint8_t bpp2_opa_table[4] = {0, 85, 170, 255}; /*Opacity mapping with bpp = 2*/ - static 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 - }; - - if(font_p == NULL) return; - - uint8_t letter_w = lv_font_get_width(font_p, letter); - uint8_t letter_h = lv_font_get_height(font_p); - uint8_t bpp = lv_font_get_bpp(font_p, letter); /*Bit per pixel (1,2, 4 or 8)*/ - uint8_t * bpp_opa_table; - uint8_t mask_init; - uint8_t mask; - - switch(bpp) { - case 1: - bpp_opa_table = bpp1_opa_table; - mask_init = 0x80; - break; - case 2: - bpp_opa_table = bpp2_opa_table; - mask_init = 0xC0; - break; - case 4: - bpp_opa_table = bpp4_opa_table; - mask_init = 0xF0; - break; - case 8: - bpp_opa_table = NULL; - mask_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_bitmap(font_p, letter); - - if(map_p == NULL) return; - - /*If the letter is completely out of mask don't draw it */ - if(pos_p->x + letter_w < mask_p->x1 || pos_p->x > mask_p->x2 || - pos_p->y + letter_h < mask_p->y1 || pos_p->y > mask_p->y2) return; - - lv_coord_t col, row; - uint8_t col_bit; - uint8_t col_byte_cnt; - uint8_t width_byte_scr = letter_w >> 3; /*Width in bytes (on the screen finally) (e.g. w = 11 -> 2 bytes wide)*/ - if(letter_w & 0x7) width_byte_scr++; - uint8_t width_byte_bpp = (letter_w * bpp) >> 3; /*Letter width in byte. Real width in the font*/ - if((letter_w * bpp) & 0x7) width_byte_bpp++; - - /* Calculate the col/row start/end on the map*/ - lv_coord_t col_start = pos_p->x >= mask_p->x1 ? 0 : mask_p->x1 - pos_p->x; - lv_coord_t col_end = pos_p->x + letter_w <= mask_p->x2 ? letter_w : mask_p->x2 - pos_p->x + 1; - lv_coord_t row_start = pos_p->y >= mask_p->y1 ? 0 : mask_p->y1 - pos_p->y; - lv_coord_t row_end = pos_p->y + letter_h <= mask_p->y2 ? letter_h : mask_p->y2 - pos_p->y + 1; - - /*Move on the map too*/ - map_p += (row_start * width_byte_bpp) + ((col_start * bpp) >> 3); - - uint8_t letter_px; - for(row = row_start; row < row_end; row ++) { - col_byte_cnt = 0; - col_bit = (col_start * bpp) % 8; - mask = mask_init >> col_bit; - for(col = col_start; col < col_end; col ++) { - letter_px = (*map_p & mask) >> (8 - col_bit - bpp); - if(letter_px != 0) { - lv_rpx(pos_p->x + col, pos_p->y + row, mask_p, lv_color_mix(color, letter_bg_color, bpp == 8 ? letter_px : bpp_opa_table[letter_px]), LV_OPA_COVER); - } - - if(col_bit < 8 - bpp) { - col_bit += bpp; - mask = mask >> bpp; - } else { - col_bit = 0; - col_byte_cnt ++; - mask = mask_init; - map_p ++; - } - } - - map_p += (width_byte_bpp) - col_byte_cnt; - } -} - -/** - * When the letter is ant-aliased it needs to know the background color - * @param bg_color the background color of the currently drawn letter - */ -void lv_rletter_set_background(lv_color_t color) -{ - letter_bg_color = color; -} - -/** - * 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 - * @param map_p pointer to a lv_color_t array - * @param opa opacity of the map (ignored, only for compatibility with 'lv_vmap') - * @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 (not supported, only l'v_vmap' can draw it) - * @param recolor mix the pixels with this color - * @param recolor_opa the intense of recoloring - */ -void lv_rmap(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(alpha_byte) return; /*Pixel level opacity i not supported in real map drawing*/ - - (void)opa; /*opa is used only for compatibility with lv_vmap*/ - lv_area_t masked_a; - bool union_ok; - - union_ok = lv_area_intersect(&masked_a, cords_p, mask_p); - - /*If there are common part of the mask and map then draw the map*/ - if(union_ok == false) return; - - /*Go to the first pixel*/ - lv_coord_t map_width = lv_area_get_width(cords_p); - map_p += (masked_a.y1 - cords_p->y1) * map_width * sizeof(lv_color_t); - map_p += (masked_a.x1 - cords_p->x1) * sizeof(lv_color_t); - - lv_coord_t row; - if(recolor_opa == LV_OPA_TRANSP && chroma_key == false) { - lv_coord_t mask_w = lv_area_get_width(&masked_a) - 1; - for(row = masked_a.y1; row <= masked_a.y2; row++) { - lv_disp_map(masked_a.x1, row, masked_a.x1 + mask_w, row, (lv_color_t *)map_p); - map_p += map_width * sizeof(lv_color_t); /*Next row on the map*/ - } - } else { - lv_color_t chroma_key_color = LV_COLOR_TRANSP; - lv_coord_t col; - for(row = masked_a.y1; row <= masked_a.y2; row++) { - for(col = masked_a.x1; col <= masked_a.x2; col++) { - lv_color_t * px_color = (lv_color_t *) &map_p[(uint32_t)(col - masked_a.x1) * sizeof(lv_color_t)]; - - if(chroma_key && chroma_key_color.full == px_color->full) continue; - - if(recolor_opa != LV_OPA_TRANSP) { - lv_color_t recolored_px = lv_color_mix(recolor, *px_color, recolor_opa); - - lv_rpx(col, row, mask_p, recolored_px, LV_OPA_COVER); - } else { - lv_rpx(col, row, mask_p, *px_color, LV_OPA_COVER); - } - - } - map_p += map_width * sizeof(lv_color_t); /*Next row on the map*/ - } - } -} - -/********************** - * STATIC FUNCTIONS - **********************/ - -#endif /*USE_LV_REAL_DRAW*/ diff --git a/lv_draw/lv_draw_rbasic.h b/lv_draw/lv_draw_rbasic.h deleted file mode 100644 index b1d62f3fb..000000000 --- a/lv_draw/lv_draw_rbasic.h +++ /dev/null @@ -1,96 +0,0 @@ -/** - * @file lv_draw_rbasic..h - * - */ - -#ifndef LV_DRAW_RBASIC_H -#define LV_DRAW_RBASIC_H - -#ifdef __cplusplus -extern "C" { -#endif - -/********************* - * INCLUDES - *********************/ -#ifdef LV_CONF_INCLUDE_SIMPLE -#include "lv_conf.h" -#else -#include "../../lv_conf.h" -#endif - -#if USE_LV_REAL_DRAW != 0 - -#include "../lv_misc/lv_color.h" -#include "../lv_misc/lv_area.h" -#include "../lv_misc/lv_font.h" - -/********************* - * DEFINES - *********************/ - -/********************** - * TYPEDEFS - **********************/ - -/********************** - * GLOBAL PROTOTYPES - **********************/ - -void lv_rpx(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 on the display - * @param cords_p coordinates of the area to fill - * @param mask_p fill only o this mask - * @param color fill color - * @param opa opacity (ignored, only for compatibility with lv_vfill) - */ -void lv_rfill(const lv_area_t * cords_p, const lv_area_t * mask_p, - lv_color_t color, lv_opa_t opa); - -/** - * Draw a letter to the display - * @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 (ignored, only for compatibility with lv_vletter) - */ -void lv_rletter(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); - -/** - * When the letter is ant-aliased it needs to know the background color - * @param bg_color the background color of the currently drawn letter - */ -void lv_rletter_set_background(lv_color_t color); - - -/** - * 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 - * @param map_p pointer to a lv_color_t array - * @param opa opacity of the map (ignored, only for compatibility with 'lv_vmap') - * @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 (not supported, only l'v_vmap' can draw it) - * @param recolor mix the pixels with this color - * @param recolor_opa the intense of recoloring - */ -void lv_rmap(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 - **********************/ - -#endif /*USE_LV_REAL_DRAW*/ - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /*LV_DRAW_RBASIC_H*/ diff --git a/lv_draw/lv_draw_rect.c b/lv_draw/lv_draw_rect.c index 5b4ef1665..b1d341ad8 100644 --- a/lv_draw/lv_draw_rect.c +++ b/lv_draw/lv_draw_rect.c @@ -30,7 +30,7 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * 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 USE_LV_SHADOW && LV_VDB_SIZE +#if USE_LV_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); @@ -66,7 +66,7 @@ void lv_draw_rect(const lv_area_t * coords, const lv_area_t * mask, const lv_sty { if(lv_area_get_height(coords) < 1 || lv_area_get_width(coords) < 1) return; -#if USE_LV_SHADOW && LV_VDB_SIZE +#if USE_LV_SHADOW if(style->body.shadow.width != 0) { lv_draw_shadow(coords, mask, style, opa_scale); } @@ -133,7 +133,7 @@ static void lv_draw_rect_main_mid(const lv_area_t * coords, const lv_area_t * ma #endif } - fill_fp(&work_area, mask, mcolor, opa); + lv_draw_fill(&work_area, mask, mcolor, opa); } else { lv_coord_t row; lv_coord_t row_start = coords->y1 + radius; @@ -157,7 +157,7 @@ static void lv_draw_rect_main_mid(const lv_area_t * coords, const lv_area_t * ma mix = (uint32_t)((uint32_t)(coords->y2 - work_area.y1) * 255) / height; act_color = lv_color_mix(mcolor, gcolor, mix); - fill_fp(&work_area, mask, act_color, opa); + lv_draw_fill(&work_area, mask, act_color, opa); } } } @@ -263,19 +263,19 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * aa_opa = opa - lv_draw_aa_get_opa(seg_size, i, opa); } - px_fp(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); - px_fp(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); - px_fp(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); - px_fp(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); + 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); - px_fp(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); - px_fp(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); + 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); - px_fp(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); - px_fp(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); + 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; @@ -304,7 +304,7 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * mix = (uint32_t)((uint32_t)(coords->y2 - edge_top_area.y1) * 255) / height; act_color = lv_color_mix(mcolor, gcolor, mix); } - fill_fp(&edge_top_area, mask, act_color, opa); + lv_draw_fill(&edge_top_area, mask, act_color, opa); } if(mid_top_refr != 0) { @@ -313,7 +313,7 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * mix = (uint32_t)((uint32_t)(coords->y2 - mid_top_area.y1) * 255) / height; act_color = lv_color_mix(mcolor, gcolor, mix); } - fill_fp(&mid_top_area, mask, act_color, opa); + lv_draw_fill(&mid_top_area, mask, act_color, opa); } if(mid_bot_refr != 0) { @@ -322,7 +322,7 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * mix = (uint32_t)((uint32_t)(coords->y2 - mid_bot_area.y1) * 255) / height; act_color = lv_color_mix(mcolor, gcolor, mix); } - fill_fp(&mid_bot_area, mask, act_color, opa); + lv_draw_fill(&mid_bot_area, mask, act_color, opa); } if(edge_bot_refr != 0) { @@ -332,7 +332,7 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * mix = (uint32_t)((uint32_t)(coords->y2 - edge_bot_area.y1) * 255) / height; act_color = lv_color_mix(mcolor, gcolor, mix); } - fill_fp(&edge_bot_area, mask, act_color, opa); + lv_draw_fill(&edge_bot_area, mask, act_color, opa); } /*Save the current coordinates*/ @@ -364,7 +364,7 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * mix = (uint32_t)((uint32_t)(coords->y2 - edge_top_area.y1) * 255) / height; act_color = lv_color_mix(mcolor, gcolor, mix); } - fill_fp(&edge_top_area, mask, act_color, opa); + lv_draw_fill(&edge_top_area, mask, act_color, opa); if(edge_top_area.y1 != mid_top_area.y1) { @@ -373,7 +373,7 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * mix = (uint32_t)((uint32_t)(coords->y2 - mid_top_area.y1) * 255) / height; act_color = lv_color_mix(mcolor, gcolor, mix); } - fill_fp(&mid_top_area, mask, act_color, opa); + lv_draw_fill(&mid_top_area, mask, act_color, opa); } if(mcolor.full == gcolor.full) act_color = mcolor; @@ -381,7 +381,7 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * mix = (uint32_t)((uint32_t)(coords->y2 - mid_bot_area.y1) * 255) / height; act_color = lv_color_mix(mcolor, gcolor, mix); } - fill_fp(&mid_bot_area, mask, act_color, opa); + lv_draw_fill(&mid_bot_area, mask, act_color, opa); if(edge_bot_area.y1 != mid_bot_area.y1) { @@ -390,7 +390,7 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * mix = (uint32_t)((uint32_t)(coords->y2 - edge_bot_area.y1) * 255) / height; act_color = lv_color_mix(mcolor, gcolor, mix); } - fill_fp(&edge_bot_area, mask, act_color, opa); + lv_draw_fill(&edge_bot_area, mask, act_color, opa); } @@ -400,11 +400,11 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * edge_top_area.x2 = coords->x2 - radius - 2; edge_top_area.y1 = coords->y1; edge_top_area.y2 = coords->y1; - fill_fp(&edge_top_area, mask, style->body.main_color, opa); + lv_draw_fill(&edge_top_area, mask, style->body.main_color, opa); edge_top_area.y1 = coords->y2; edge_top_area.y2 = coords->y2; - fill_fp(&edge_top_area, mask, style->body.grad_color, opa); + lv_draw_fill(&edge_top_area, mask, style->body.grad_color, opa); /*Last parts of the anti-alias*/ out_y_seg_end = cir.y; @@ -421,19 +421,19 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * 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); - px_fp(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); - px_fp(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); - px_fp(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); - px_fp(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); + 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); - px_fp(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); - px_fp(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); + 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); - px_fp(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); - px_fp(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); + 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*/ @@ -446,10 +446,10 @@ static void lv_draw_rect_main_corner(const lv_area_t * coords, const lv_area_t * aa_color_hor_bottom = lv_color_mix(mcolor, gcolor, mix); lv_opa_t aa_opa = opa >> 1; - px_fp(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); - px_fp(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); - px_fp(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); - px_fp(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); + 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 @@ -498,7 +498,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area work_area.x2 = coords->x2; work_area.y1 = coords->y1; work_area.y2 = coords->y1 + bwidth; - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } /*Right top corner*/ @@ -507,7 +507,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area 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); - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } /*Left bottom corner*/ @@ -516,7 +516,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area 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); - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } /*Right bottom corner*/ @@ -525,7 +525,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area work_area.x2 = coords->x2; work_area.y1 = coords->y2 - bwidth; work_area.y2 = coords->y2; - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } return; } @@ -544,14 +544,14 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area if(part & LV_BORDER_LEFT) { work_area.x1 = coords->x1; work_area.x2 = work_area.x1 + bwidth; - fill_fp(&work_area, mask, color, opa); + 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; - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } work_area.x1 = coords->x1 + corner_size - length_corr; @@ -561,14 +561,14 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area if(part & LV_BORDER_TOP) { work_area.y1 = coords->y1; work_area.y2 = coords->y1 + bwidth; - fill_fp(&work_area, mask, color, opa); + 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; - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } /*Draw the a remaining rectangles if the radius is smaller then bwidth */ @@ -579,7 +579,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area work_area.x2 = coords->x1 + radius + LV_ANTIALIAS; work_area.y1 = coords->y1 + radius + 1 + LV_ANTIALIAS; work_area.y2 = coords->y1 + bwidth; - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } /*Right top correction*/ @@ -588,7 +588,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area work_area.x2 = coords->x2; work_area.y1 = coords->y1 + radius + 1 + LV_ANTIALIAS; work_area.y2 = coords->y1 + bwidth; - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } /*Left bottom correction*/ @@ -597,7 +597,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area work_area.x2 = coords->x1 + radius + LV_ANTIALIAS; work_area.y1 = coords->y2 - bwidth; work_area.y2 = coords->y2 - radius - 1 - LV_ANTIALIAS; - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } /*Right bottom correction*/ @@ -606,7 +606,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area work_area.x2 = coords->x2; work_area.y1 = coords->y2 - bwidth; work_area.y2 = coords->y2 - radius - 1 - LV_ANTIALIAS; - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } } @@ -618,7 +618,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area work_area.x2 = coords->x1 + LV_ANTIALIAS; work_area.y1 = coords->y1; work_area.y2 = coords->y1 + LV_ANTIALIAS; - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } /*Right top corner*/ @@ -627,7 +627,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area work_area.x2 = coords->x2; work_area.y1 = coords->y1; work_area.y2 = coords->y1 + LV_ANTIALIAS; - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } /*Left bottom corner*/ @@ -636,7 +636,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area work_area.x2 = coords->x1 + LV_ANTIALIAS; work_area.y1 = coords->y2 - LV_ANTIALIAS; work_area.y2 = coords->y2; - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } /*Right bottom corner*/ @@ -645,7 +645,7 @@ static void lv_draw_rect_border_straight(const lv_area_t * coords, const lv_area work_area.x2 = coords->x2; work_area.y1 = coords->y2 - LV_ANTIALIAS; work_area.y2 = coords->y2; - fill_fp(&work_area, mask, color, opa); + lv_draw_fill(&work_area, mask, color, opa); } } } @@ -756,24 +756,24 @@ static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t } if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_RIGHT)) { - px_fp(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); - px_fp(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); + 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)) { - px_fp(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); - px_fp(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); + 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)) { - px_fp(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); - px_fp(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); + 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)) { - px_fp(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); - px_fp(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); + 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); } } @@ -801,37 +801,37 @@ static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t } if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_RIGHT)) { - px_fp(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_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)) { - px_fp(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_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)) { - px_fp(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_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)) { - px_fp(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_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)) { - px_fp(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); + 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)) { - px_fp(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); + 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)) { - px_fp(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); + 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)) { - px_fp(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); + 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); } } @@ -851,13 +851,13 @@ static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t 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); - fill_fp(&circ_area, mask, color, opa); + 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); - fill_fp(&circ_area, mask, color, opa); + lv_draw_fill(&circ_area, mask, color, opa); } /*Draw the octets to the left bottom corner*/ @@ -866,13 +866,13 @@ static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t 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); - fill_fp(&circ_area, mask, color, opa); + 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); - fill_fp(&circ_area, mask, color, opa); + lv_draw_fill(&circ_area, mask, color, opa); } /*Draw the octets to the left top corner*/ @@ -883,14 +883,14 @@ static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t 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); - fill_fp(&circ_area, mask, color, opa); + 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; - fill_fp(&circ_area, mask, color, opa); + lv_draw_fill(&circ_area, mask, color, opa); } /*Draw the octets to the right top corner*/ @@ -899,7 +899,7 @@ static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t 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; - fill_fp(&circ_area, mask, color, opa); + 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)) { @@ -907,7 +907,7 @@ static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t 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); - fill_fp(&circ_area, mask, color, opa); + lv_draw_fill(&circ_area, mask, color, opa); } } lv_circ_next(&cir_out, &tmp_out); @@ -934,23 +934,23 @@ static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t 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)) { - px_fp(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); - px_fp(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); + 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)) { - px_fp(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); - px_fp(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); + 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)) { - px_fp(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); - px_fp(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); + 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)) { - px_fp(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); - px_fp(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); + 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); } } @@ -962,19 +962,19 @@ static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t lv_opa_t aa_opa = opa >> 1; if((part & LV_BORDER_BOTTOM) && (part & LV_BORDER_RIGHT)) { - px_fp(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); + 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)) { - px_fp(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); + 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)) { - px_fp(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); + 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)) { - px_fp(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); + 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); } } @@ -987,36 +987,36 @@ static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t 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)) { - px_fp(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_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)) { - px_fp(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_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)) { - px_fp(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_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)) { - px_fp(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_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)) { - px_fp(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); + 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)) { - px_fp(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); + 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)) { - px_fp(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); + 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)) { - px_fp(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); + 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); } } } @@ -1025,7 +1025,7 @@ static void lv_draw_rect_border_corner(const lv_area_t * coords, const lv_area_t } -#if USE_LV_SHADOW && LV_VDB_SIZE +#if USE_LV_SHADOW /** * Draw a shadow @@ -1089,9 +1089,9 @@ static void lv_draw_shadow_full(const lv_area_t * coords, const lv_area_t * mask lv_coord_t curve_x[radius + swidth + 1]; /*Stores the 'x' coordinates of a quarter circle.*/ #else # if LV_HOR_RES > LV_VER_RES - lv_coord_t curve_x[LV_HOR_RES]; + lv_coord_t curve_x[LV_HOR_RES_MAX]; # else - lv_coord_t curve_x[LV_VER_RES]; + lv_coord_t curve_x[LV_VER_RES_MAX]; # endif #endif memset(curve_x, 0, sizeof(curve_x)); @@ -1110,9 +1110,9 @@ static void lv_draw_shadow_full(const lv_area_t * coords, const lv_area_t * mask uint32_t line_1d_blur[filter_width]; #else # if LV_HOR_RES > LV_VER_RES - uint32_t line_1d_blur[LV_HOR_RES]; + uint32_t line_1d_blur[LV_HOR_RES_MAX]; # else - uint32_t line_1d_blur[LV_VER_RES]; + uint32_t line_1d_blur[LV_VER_RES_MAX]; # endif #endif /*1D Blur horizontally*/ @@ -1126,9 +1126,9 @@ static void lv_draw_shadow_full(const lv_area_t * coords, const lv_area_t * mask lv_opa_t line_2d_blur[radius + swidth + 1]; #else # if LV_HOR_RES > LV_VER_RES - lv_opa_t line_2d_blur[LV_HOR_RES]; + lv_opa_t line_2d_blur[LV_HOR_RES_MAX]; # else - lv_opa_t line_2d_blur[LV_VER_RES]; + lv_opa_t line_2d_blur[LV_VER_RES_MAX]; # endif #endif @@ -1203,19 +1203,19 @@ static void lv_draw_shadow_full(const lv_area_t * coords, const lv_area_t * mask for(d = 1; d < col; d++) { if(point_lt.x < ofs_lt.x && point_lt.y < ofs_lt.y) { - px_fp(point_lt.x, point_lt.y, mask, style->body.shadow.color, line_2d_blur[d]); + 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) { - px_fp(point_lb.x, point_lb.y, mask, style->body.shadow.color, line_2d_blur[d]); + 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) { - px_fp(point_rt.x, point_rt.y, mask, style->body.shadow.color, line_2d_blur[d]); + 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) { - px_fp(point_rb.x, point_rb.y, mask, style->body.shadow.color, line_2d_blur[d]); + lv_draw_px(point_rb.x, point_rb.y, mask, style->body.shadow.color, line_2d_blur[d]); } point_rb.x++; @@ -1247,9 +1247,9 @@ static void lv_draw_shadow_bottom(const lv_area_t * coords, const lv_area_t * ma lv_coord_t curve_x[radius + 1]; /*Stores the 'x' coordinates of a quarter circle.*/ #else # if LV_HOR_RES > LV_VER_RES - lv_coord_t curve_x[LV_HOR_RES]; + lv_coord_t curve_x[LV_HOR_RES_MAX]; # else - lv_coord_t curve_x[LV_VER_RES]; + lv_coord_t curve_x[LV_VER_RES_MAX]; # endif #endif lv_point_t circ; @@ -1266,9 +1266,9 @@ static void lv_draw_shadow_bottom(const lv_area_t * coords, const lv_area_t * ma lv_opa_t line_1d_blur[swidth]; #else # if LV_HOR_RES > LV_VER_RES - lv_opa_t line_1d_blur[LV_HOR_RES]; + lv_opa_t line_1d_blur[LV_HOR_RES_MAX]; # else - lv_opa_t line_1d_blur[LV_VER_RES]; + lv_opa_t line_1d_blur[LV_VER_RES_MAX]; # endif #endif @@ -1306,12 +1306,12 @@ static void lv_draw_shadow_bottom(const lv_area_t * coords, const lv_area_t * ma } else { px_opa = (uint16_t)((uint16_t)line_1d_blur[d] + line_1d_blur[d - diff]) >> 1; } - px_fp(point_l.x, point_l.y, mask, style->body.shadow.color, px_opa); + 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) { - px_fp(point_r.x, point_r.y, mask, style->body.shadow.color, px_opa); + lv_draw_px(point_r.x, point_r.y, mask, style->body.shadow.color, px_opa); } point_r.y ++; } @@ -1325,7 +1325,7 @@ static void lv_draw_shadow_bottom(const lv_area_t * coords, const lv_area_t * ma uint16_t d; for(d = 0; d < swidth; d++) { - fill_fp(&area_mid, mask, style->body.shadow.color, line_1d_blur[d]); + lv_draw_fill(&area_mid, mask, style->body.shadow.color, line_1d_blur[d]); area_mid.y1 ++; area_mid.y2 ++; } @@ -1370,19 +1370,19 @@ static void lv_draw_shadow_full_straight(const lv_area_t * coords, const lv_area for(d = 1 /*+ LV_ANTIALIAS*/; d <= swidth/* - LV_ANTIALIAS*/; d++) { opa_act = map[d]; - fill_fp(&right_area, mask, style->body.shadow.color, opa_act); + lv_draw_fill(&right_area, mask, style->body.shadow.color, opa_act); right_area.x1++; right_area.x2++; - fill_fp(&left_area, mask, style->body.shadow.color, opa_act); + lv_draw_fill(&left_area, mask, style->body.shadow.color, opa_act); left_area.x1--; left_area.x2--; - fill_fp(&top_area, mask, style->body.shadow.color, opa_act); + lv_draw_fill(&top_area, mask, style->body.shadow.color, opa_act); top_area.y1--; top_area.y2--; - fill_fp(&bottom_area, mask, style->body.shadow.color, opa_act); + lv_draw_fill(&bottom_area, mask, style->body.shadow.color, opa_act); bottom_area.y1++; bottom_area.y2++; } diff --git a/lv_draw/lv_draw_triangle.c b/lv_draw/lv_draw_triangle.c index 84c9d3f31..954d3541b 100644 --- a/lv_draw/lv_draw_triangle.c +++ b/lv_draw/lv_draw_triangle.c @@ -98,7 +98,7 @@ void lv_draw_triangle(const lv_point_t * points, const lv_area_t * mask, lv_colo draw_area.y1 = LV_MATH_MIN(act_area.y1, act_area.y2); draw_area.y2 = LV_MATH_MAX(act_area.y1, act_area.y2); draw_area.x2--; /*Do not draw most right pixel because it will be drawn by the adjacent triangle*/ - fill_fp(&draw_area, mask, color, LV_OPA_50); + lv_draw_fill(&draw_area, mask, color, LV_OPA_COVER); /*Calc. the next point of edge1*/ y1_tmp = edge1.y; diff --git a/lv_fonts/lv_font_builtin.h b/lv_fonts/lv_font_builtin.h index 1d5d82080..c7f93c136 100644 --- a/lv_fonts/lv_font_builtin.h +++ b/lv_fonts/lv_font_builtin.h @@ -48,74 +48,74 @@ void lv_font_builtin_init(void); /*10 px */ #if USE_LV_FONT_DEJAVU_10 -LV_FONT_DECLARE(lv_font_dejavu_10); +LV_FONT_DECLARE(lv_font_dejavu_10) #endif #if USE_LV_FONT_DEJAVU_10_LATIN_SUP -LV_FONT_DECLARE(lv_font_dejavu_10_latin_sup); +LV_FONT_DECLARE(lv_font_dejavu_10_latin_sup) #endif #if USE_LV_FONT_DEJAVU_10_CYRILLIC -LV_FONT_DECLARE(lv_font_dejavu_10_cyrillic); +LV_FONT_DECLARE(lv_font_dejavu_10_cyrillic) #endif #if USE_LV_FONT_SYMBOL_10 -LV_FONT_DECLARE(lv_font_symbol_10); +LV_FONT_DECLARE(lv_font_symbol_10) #endif /*20 px */ #if USE_LV_FONT_DEJAVU_20 -LV_FONT_DECLARE(lv_font_dejavu_20); +LV_FONT_DECLARE(lv_font_dejavu_20) #endif #if USE_LV_FONT_DEJAVU_20_LATIN_SUP -LV_FONT_DECLARE(lv_font_dejavu_20_latin_sup); +LV_FONT_DECLARE(lv_font_dejavu_20_latin_sup) #endif #if USE_LV_FONT_DEJAVU_20_CYRILLIC -LV_FONT_DECLARE(lv_font_dejavu_20_cyrillic); +LV_FONT_DECLARE(lv_font_dejavu_20_cyrillic) #endif #if USE_LV_FONT_SYMBOL_20 -LV_FONT_DECLARE(lv_font_symbol_20); +LV_FONT_DECLARE(lv_font_symbol_20) #endif /*30 px */ #if USE_LV_FONT_DEJAVU_30 -LV_FONT_DECLARE(lv_font_dejavu_30); +LV_FONT_DECLARE(lv_font_dejavu_30) #endif #if USE_LV_FONT_DEJAVU_30_LATIN_SUP -LV_FONT_DECLARE(lv_font_dejavu_30_latin_sup); +LV_FONT_DECLARE(lv_font_dejavu_30_latin_sup) #endif #if USE_LV_FONT_DEJAVU_30_CYRILLIC -LV_FONT_DECLARE(lv_font_dejavu_30_cyrillic); +LV_FONT_DECLARE(lv_font_dejavu_30_cyrillic) #endif #if USE_LV_FONT_SYMBOL_30 -LV_FONT_DECLARE(lv_font_symbol_30); +LV_FONT_DECLARE(lv_font_symbol_30) #endif /*40 px */ #if USE_LV_FONT_DEJAVU_40 -LV_FONT_DECLARE(lv_font_dejavu_40); +LV_FONT_DECLARE(lv_font_dejavu_40) #endif #if USE_LV_FONT_DEJAVU_40_LATIN_SUP -LV_FONT_DECLARE(lv_font_dejavu_40_latin_sup); +LV_FONT_DECLARE(lv_font_dejavu_40_latin_sup) #endif #if USE_LV_FONT_DEJAVU_40_CYRILLIC -LV_FONT_DECLARE(lv_font_dejavu_40_cyrillic); +LV_FONT_DECLARE(lv_font_dejavu_40_cyrillic) #endif #if USE_LV_FONT_SYMBOL_40 -LV_FONT_DECLARE(lv_font_symbol_40); +LV_FONT_DECLARE(lv_font_symbol_40) #endif #if USE_LV_FONT_MONOSPACE_8 -LV_FONT_DECLARE(lv_font_monospace_8); +LV_FONT_DECLARE(lv_font_monospace_8) #endif #ifdef __cplusplus diff --git a/lv_hal/lv_hal.h b/lv_hal/lv_hal.h index 5ab28f2a6..a5e0a1dd5 100644 --- a/lv_hal/lv_hal.h +++ b/lv_hal/lv_hal.h @@ -1,10 +1,10 @@ /** - * @file hal.h + * @file lv_hal.h * */ -#ifndef HAL_H -#define HAL_H +#ifndef LV_HAL_H +#define LV_HAL_H #ifdef __cplusplus extern "C" { diff --git a/lv_hal/lv_hal_disp.c b/lv_hal/lv_hal_disp.c index 3be8b927e..339f2853e 100644 --- a/lv_hal/lv_hal_disp.c +++ b/lv_hal/lv_hal_disp.c @@ -11,7 +11,7 @@ *********************/ #include #include -#include "../lv_hal/lv_hal_disp.h" +#include "lv_hal.h" #include "../lv_misc/lv_mem.h" #include "../lv_core/lv_obj.h" #include "../lv_misc/lv_gc.h" @@ -36,7 +36,7 @@ /********************** * STATIC VARIABLES **********************/ -static lv_disp_t * active; +static lv_disp_t * disp_def; /********************** * MACROS @@ -54,20 +54,48 @@ static lv_disp_t * active; */ void lv_disp_drv_init(lv_disp_drv_t * driver) { - driver->disp_fill = NULL; - driver->disp_map = NULL; - driver->disp_flush = NULL; + 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; #if USE_LV_GPU driver->mem_blend = NULL; driver->mem_fill = NULL; #endif -#if LV_VDB_SIZE - driver->vdb_wr = 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 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) +{ + 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; +} + + /** * Register an initialized display driver. * Automatically set the first display as active. @@ -76,167 +104,167 @@ void lv_disp_drv_init(lv_disp_drv_t * driver) */ lv_disp_t * lv_disp_drv_register(lv_disp_drv_t * driver) { - lv_disp_t * node; - - node = lv_mem_alloc(sizeof(lv_disp_t)); - lv_mem_assert(node); - if(node == NULL) return NULL; - - memcpy(&node->driver, driver, sizeof(lv_disp_drv_t)); - node->next = NULL; - - /* Set first display as active by default */ - if(LV_GC_ROOT(_lv_disp_list) == NULL) { - LV_GC_ROOT(_lv_disp_list) = node; - active = node; - lv_obj_invalidate(lv_scr_act()); - } else { - ((lv_disp_t*)LV_GC_ROOT(_lv_disp_list))->next = node; + lv_disp_t * disp = lv_ll_ins_head(&LV_GC_ROOT(_lv_disp_ll)); + if(!disp) { + lv_mem_assert(disp); + return NULL; } - return node; -} + memcpy(&disp->driver, driver, sizeof(lv_disp_drv_t)); + + lv_ll_init(&disp->scr_ll, sizeof(lv_obj_t)); + + 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->act_scr = lv_obj_create(NULL, NULL); /*Create a default screen on the display*/ + disp->top_layer = lv_obj_create(NULL, NULL); /*Create top layer on the display*/ + disp->sys_layer = lv_obj_create(NULL, NULL); /*Create top layer on the display*/ + lv_obj_set_style(disp->top_layer, &lv_style_transp); + lv_obj_set_style(disp->sys_layer, &lv_style_transp); + + disp->inv_p = 0; + + lv_obj_invalidate(disp->act_scr); + + disp_def = disp_def_tmp; /*Revert the default display*/ -/** - * Set the active display - * @param disp pointer to a display (return value of 'lv_disp_register') - */ -void lv_disp_set_active(lv_disp_t * disp) -{ - active = disp; - lv_obj_invalidate(lv_scr_act()); + return disp; } /** - * Get a pointer to the active display - * @return pointer to the active display + * Set a default screen. The new screens will be created on it by default. + * @param disp pointer to a display */ -lv_disp_t * lv_disp_get_active(void) +void lv_disp_set_default(lv_disp_t * disp) { - return active; + 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.hor_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.ver_res; +} + +/** + * 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) +{ + disp_drv->buffer->flushing = 0; + + /*If the screen is transparent initialize it when the flushing is ready*/ +#if LV_COLOR_SCREEN_TRANSP + memset(vdb_buf, 0x00, LV_VDB_SIZE_IN_BYTES); +#endif +} + + /** * 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_next(lv_disp_t * disp) +lv_disp_t * lv_disp_get_next(lv_disp_t * disp) { - if(disp == NULL) { - return LV_GC_ROOT(_lv_disp_list); - } else { - if(((lv_disp_t*)LV_GC_ROOT(_lv_disp_list))->next == NULL) return NULL; - else return ((lv_disp_t*)LV_GC_ROOT(_lv_disp_list))->next; - } + 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); } /** - * Write the content of the internal buffer (VDB) to the display - * @param x1 left coordinate of the rectangle - * @param x2 right coordinate of the rectangle - * @param y1 top coordinate of the rectangle - * @param y2 bottom coordinate of the rectangle - * @param color_p fill color + * Get the internal buffer of a display + * @param disp pointer to a display + * @return pointer to the internal buffers */ -void lv_disp_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t color) +lv_disp_buf_t * lv_disp_get_buf(lv_disp_t * disp) { - if(active == NULL) return; - if(active->driver.disp_fill != NULL) active->driver.disp_fill(x1, y1, x2, y2, color); + return disp->driver.buffer; } /** - * Fill a rectangular area with a color on the active display - * @param x1 left coordinate of the rectangle - * @param x2 right coordinate of the rectangle - * @param y1 top coordinate of the rectangle - * @param y2 bottom coordinate of the rectangle - * @param color_p pointer to an array of colors + * Get the number of areas in the buffer + * @return number of invalid areas */ -void lv_disp_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t * color_p) +uint16_t lv_disp_get_inv_buf_size(lv_disp_t * disp) { - if(active == NULL) return; - if(active->driver.disp_flush != NULL) { - - LV_LOG_TRACE("disp flush started"); - active->driver.disp_flush(x1, y1, x2, y2, color_p); - LV_LOG_TRACE("disp flush ready"); - - } else { - LV_LOG_WARN("disp flush function registered"); - } + return disp->inv_p; } /** - * Put a color map to a rectangular area on the active display - * @param x1 left coordinate of the rectangle - * @param x2 right coordinate of the rectangle - * @param y1 top coordinate of the rectangle - * @param y2 bottom coordinate of the rectangle - * @param color_map pointer to an array of colors + * Pop (delete) the last 'num' invalidated areas from the buffer + * @param num number of areas to delete */ -void lv_disp_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_map) +void lv_disp_pop_from_inv_buf(lv_disp_t * disp, uint16_t num) { - if(active == NULL) return; - if(active->driver.disp_map != NULL) active->driver.disp_map(x1, y1, x2, y2, color_map); -} -#if USE_LV_GPU - -/** - * Blend pixels to a destination memory from a source memory - * In 'lv_disp_drv_t' 'mem_blend' is optional. (NULL if not available) - * @param dest a memory address. Blend 'src' here. - * @param src pointer to pixel map. Blend it to 'dest'. - * @param length number of pixels in 'src' - * @param opa opacity (0, LV_OPA_TRANSP: transparent ... 255, LV_OPA_COVER, fully cover) - */ -void lv_disp_mem_blend(lv_color_t * dest, const lv_color_t * src, uint32_t length, lv_opa_t opa) -{ - if(active == NULL) return; - if(active->driver.mem_blend != NULL) active->driver.mem_blend(dest, src, length, opa); + if(disp->inv_p < num) disp->inv_p = 0; + else disp->inv_p -= num; } /** - * Fill a memory with a color (GPUs may support it) - * In 'lv_disp_drv_t' 'mem_fill' is optional. (NULL if not available) - * @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) + * 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 */ -void lv_disp_mem_fill(lv_color_t * dest, uint32_t length, lv_color_t color) +bool lv_disp_is_double_buf(lv_disp_t * disp) { - if(active == NULL) return; - if(active->driver.mem_fill != NULL) active->driver.mem_fill(dest, length, color); -} - -/** - * Shows if memory blending (by GPU) is supported or not - * @return false: 'mem_blend' is not supported in the driver; true: 'mem_blend' is supported in the driver - */ -bool lv_disp_is_mem_blend_supported(void) -{ - if(active == NULL) return false; - if(active->driver.mem_blend) return true; + if(disp->driver.buffer->buf1 && disp->driver.buffer->buf2) return true; else return false; } /** - * Shows if memory fill (by GPU) is supported or not - * @return false: 'mem_fill' is not supported in the drover; true: 'mem_fill' is supported in the driver + * 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_mem_fill_supported(void) +bool lv_disp_is_true_double_buf(lv_disp_t * disp) { - if(active == NULL) return false; - if(active->driver.mem_fill) return true; - else return false; + 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; + } } -#endif /********************** * STATIC FUNCTIONS **********************/ - diff --git a/lv_hal/lv_hal_disp.h b/lv_hal/lv_hal_disp.h index 131b948cc..a7e337a70 100644 --- a/lv_hal/lv_hal_disp.h +++ b/lv_hal/lv_hal_disp.h @@ -1,12 +1,12 @@ /** - * @file hal_disp.h + * @file lv_hal_disp.h * * @description Display Driver HAL interface header file * */ -#ifndef HAL_DISP_H -#define HAL_DISP_H +#ifndef LV_HAL_DISP_H +#define LV_HAL_DISP_H #ifdef __cplusplus extern "C" { @@ -20,46 +20,106 @@ extern "C" { #include "lv_hal.h" #include "../lv_misc/lv_color.h" #include "../lv_misc/lv_area.h" +#include "../lv_misc/lv_ll.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; + + +typedef struct +{ + void * buf1; + void * buf2; + + /*Used by the library*/ + void * buf_act; + uint32_t size; /*In pixel count*/ + lv_area_t area; + uint32_t flushing :1; +}lv_disp_buf_t; + + /** * Display Driver structure to be registered by HAL */ typedef struct _disp_drv_t { - /*Write the internal buffer (VDB) to the display. 'lv_flush_ready()' has to be called when finished*/ - void (*disp_flush)(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p); - /*Fill an area with a color on the display*/ - void (*disp_fill)(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t color); + /*Horizontal and vertical resolution*/ + lv_coord_t hor_res; + lv_coord_t ver_res; - /*Write pixel map (e.g. image) to the display*/ - void (*disp_map)(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p); + /* 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; + + /* MANDATORY: Write the internal buffer (VDB) to the display. 'lv_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 USE_LV_USER_DATA_SINGLE + lv_disp_drv_user_data_t user_data; +#endif + +#if USE_LV_USER_DATA_MULTI + lv_disp_drv_user_data_t flush_user_data; + lv_disp_drv_user_data_t rounder_user_data; + lv_disp_drv_user_data_t set_px_user_data; + lv_disp_drv_user_data_t monitor_user_data; +#endif - /*Optional interface functions to use GPU*/ #if USE_LV_GPU - /*Blend two memories using opacity (GPU only)*/ + /*OPTIONAL: Blend two memories using opacity (GPU only)*/ void (*mem_blend)(lv_color_t * dest, const lv_color_t * src, uint32_t length, lv_opa_t opa); - /*Fill a memory with a color (GPU only)*/ + /*OPTIONAL: Fill a memory with a color (GPU only)*/ void (*mem_fill)(lv_color_t * dest, uint32_t length, lv_color_t color); #endif -#if LV_VDB_SIZE - /*Optional: Set a pixel in a buffer according to the requirements of the display*/ - void (*vdb_wr)(uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa); -#endif } lv_disp_drv_t; +struct _lv_obj_t; + typedef struct _disp_t { + /*Driver to the display*/ lv_disp_drv_t driver; - struct _disp_t *next; + + /*Screens of the display*/ + lv_ll_t scr_ll; + struct _lv_obj_t * act_scr; + struct _lv_obj_t * top_layer; + struct _lv_obj_t * sys_layer; + + /*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; } lv_disp_t; /********************** @@ -72,7 +132,25 @@ typedef struct _disp_t { * 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); +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 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); /** * Register an initialized display driver. @@ -80,89 +158,81 @@ void lv_disp_drv_init(lv_disp_drv_t *driver); * @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 * lv_disp_drv_register(lv_disp_drv_t * driver); /** - * Set the active display - * @param disp pointer to a display (return value of 'lv_disp_register') + * Set a default screen. The new screens will be created on it by default. + * @param disp pointer to a display */ -void lv_disp_set_active(lv_disp_t * disp); +void lv_disp_set_default(lv_disp_t * disp); /** - * Get a pointer to the active display - * @return pointer to the active display + * Get the default display + * @return pointer to the default display */ -lv_disp_t * lv_disp_get_active(void); +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); + +/** + * 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); + /** * 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_next(lv_disp_t * disp); +lv_disp_t * lv_disp_get_next(lv_disp_t * disp); /** - * Fill a rectangular area with a color on the active display - * @param x1 left coordinate of the rectangle - * @param x2 right coordinate of the rectangle - * @param y1 top coordinate of the rectangle - * @param y2 bottom coordinate of the rectangle - * @param color_p pointer to an array of colors + * Get the internal buffer of a display + * @param disp pointer to a display + * @return pointer to the internal buffers */ -void lv_disp_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t *color_p); +lv_disp_buf_t * lv_disp_get_buf(lv_disp_t * disp); /** - * Fill a rectangular area with a color on the active display - * @param x1 left coordinate of the rectangle - * @param x2 right coordinate of the rectangle - * @param y1 top coordinate of the rectangle - * @param y2 bottom coordinate of the rectangle - * @param color fill color + * Get the number of areas in the buffer + * @return number of invalid areas */ -void lv_disp_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t color); +uint16_t lv_disp_get_inv_buf_size(lv_disp_t * disp); /** - * Put a color map to a rectangular area on the active display - * @param x1 left coordinate of the rectangle - * @param x2 right coordinate of the rectangle - * @param y1 top coordinate of the rectangle - * @param y2 bottom coordinate of the rectangle - * @param color_map pointer to an array of colors + * Pop (delete) the last 'num' invalidated areas from the buffer + * @param num number of areas to delete */ -void lv_disp_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_map); - -#if USE_LV_GPU -/** - * Blend pixels to a destination memory from a source memory - * In 'lv_disp_drv_t' 'mem_blend' is optional. (NULL if not available) - * @param dest a memory address. Blend 'src' here. - * @param src pointer to pixel map. Blend it to 'dest'. - * @param length number of pixels in 'src' - * @param opa opacity (0, LV_OPA_TRANSP: transparent ... 255, LV_OPA_COVER, fully cover) - */ -void lv_disp_mem_blend(lv_color_t * dest, const lv_color_t * src, uint32_t length, lv_opa_t opa); +void lv_disp_pop_from_inv_buf(lv_disp_t * disp, uint16_t num); /** - * Fill a memory with a color (GPUs may support it) - * In 'lv_disp_drv_t' 'mem_fill' is optional. (NULL if not available) - * @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) + * 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 */ -void lv_disp_mem_fill(lv_color_t * dest, uint32_t length, lv_color_t color); -/** - * Shows if memory blending (by GPU) is supported or not - * @return false: 'mem_blend' is not supported in the driver; true: 'mem_blend' is supported in the driver - */ -bool lv_disp_is_mem_blend_supported(void); +bool lv_disp_is_double_buf(lv_disp_t * disp); /** - * Shows if memory fill (by GPU) is supported or not - * @return false: 'mem_fill' is not supported in the drover; true: 'mem_fill' is supported in the driver + * 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_mem_fill_supported(void); -#endif +bool lv_disp_is_true_double_buf(lv_disp_t * disp); + /********************** * MACROS **********************/ diff --git a/lv_hal/lv_hal_indev.c b/lv_hal/lv_hal_indev.c index 6083c3fd2..7ee8530e3 100644 --- a/lv_hal/lv_hal_indev.c +++ b/lv_hal/lv_hal_indev.c @@ -11,6 +11,7 @@ #include "../lv_hal/lv_hal_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 @@ -49,9 +50,9 @@ */ void lv_indev_drv_init(lv_indev_drv_t * driver) { - driver->read = NULL; + memset(driver, 0, sizeof(lv_indev_drv_t)); + driver->type = LV_INDEV_TYPE_NONE; - driver->user_data = NULL; } /** @@ -61,30 +62,28 @@ void lv_indev_drv_init(lv_indev_drv_t * driver) */ lv_indev_t * lv_indev_drv_register(lv_indev_drv_t * driver) { - lv_indev_t * node; - node = lv_mem_alloc(sizeof(lv_indev_t)); - if(!node) return NULL; + 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 * node = lv_ll_ins_head(&LV_GC_ROOT(_lv_indev_ll)); + if(!node) { + lv_mem_assert(node); + return NULL; + } memset(node, 0, sizeof(lv_indev_t)); memcpy(&node->driver, driver, sizeof(lv_indev_drv_t)); - node->next = NULL; node->proc.reset_query = 1; node->cursor = NULL; node->group = NULL; node->btn_points = NULL; - if(LV_GC_ROOT(_lv_indev_list) == NULL) { - LV_GC_ROOT(_lv_indev_list) = node; - } else { - lv_indev_t * last = LV_GC_ROOT(_lv_indev_list); - while(last->next) - last = last->next; - - last->next = node; - } - return node; } @@ -95,13 +94,8 @@ lv_indev_t * lv_indev_drv_register(lv_indev_drv_t * driver) */ lv_indev_t * lv_indev_next(lv_indev_t * indev) { - - if(indev == NULL) { - return LV_GC_ROOT(_lv_indev_list); - } else { - if(indev->next == NULL) return NULL; - else return indev->next; - } + 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); } /** @@ -115,13 +109,11 @@ bool lv_indev_read(lv_indev_t * indev, lv_indev_data_t * data) bool cont = false; memset(data, 0, sizeof(lv_indev_data_t)); - data->state = LV_INDEV_STATE_REL; - if(indev->driver.read) { - data->user_data = indev->driver.user_data; + if(indev->driver.read_cb) { LV_LOG_TRACE("idnev read started"); - cont = indev->driver.read(data); + cont = indev->driver.read_cb(&indev->driver, data); LV_LOG_TRACE("idnev read finished"); } else { LV_LOG_WARN("indev function registered"); diff --git a/lv_hal/lv_hal_indev.h b/lv_hal/lv_hal_indev.h index 214b02754..d284958b1 100644 --- a/lv_hal/lv_hal_indev.h +++ b/lv_hal/lv_hal_indev.h @@ -1,12 +1,12 @@ /** - * @file hal_indev.h + * @file lv_hal_indev.h * * @description Input Device HAL interface layer header file * */ -#ifndef HAL_INDEV_H -#define HAL_INDEV_H +#ifndef LV_HAL_INDEV_H +#define LV_HAL_INDEV_H #ifdef __cplusplus extern "C" { @@ -15,11 +15,15 @@ extern "C" { /********************* * INCLUDES *********************/ +#ifdef LV_CONF_INCLUDE_SIMPLE +#include "lv_conf.h" +#else +#include "../../lv_conf.h" +#endif + #include #include -#include "lv_hal.h" #include "../lv_misc/lv_area.h" -#include "../lv_core/lv_obj.h" /********************* * DEFINES @@ -29,6 +33,11 @@ extern "C" { * 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, /*Show uninitialized state*/ @@ -49,23 +58,31 @@ typedef uint8_t lv_indev_state_t; /*Data type when an input device is read */ typedef struct { union { - 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; /*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_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*/ }; - void *user_data; /*'lv_indev_drv_t.priv' for this driver*/ + 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_hal_indev_type_t type; /*Input device type*/ - bool (*read)(lv_indev_data_t *data); /*Function pointer to read data. Return 'true' if there is still data to be read (buffered)*/ - void *user_data; /*Pointer to user defined data, passed in 'lv_indev_data_t' on read*/ +typedef struct _lv_indev_drv_t { + lv_hal_indev_type_t type; /*Input device type*/ + bool (*read_cb)(struct _lv_indev_drv_t * indev_drv, lv_indev_data_t *data); /*Function pointer to read_cb data. Return 'true' if there is still data to be read_cb (buffered)*/ + +#if USE_LV_USER_DATA_MULTI + lv_indev_drv_user_data_t read_user_data; /*Pointer to user defined data, passed in 'lv_indev_data_t' on read*/ +#endif + +#if USE_LV_USER_DATA_SINGLE + lv_indev_drv_user_data_t user_data; +#endif + struct _disp_t * disp; /*Pointer to the assigned display*/ } lv_indev_drv_t; -struct _lv_obj_t; /*Run time data of input devices*/ typedef struct _lv_indev_proc_t { @@ -83,12 +100,12 @@ typedef struct _lv_indev_proc_t { uint8_t drag_range_out :1; uint8_t drag_in_prog :1; uint8_t wait_unil_release :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*/ @@ -99,9 +116,7 @@ typedef struct _lv_indev_proc_t { uint8_t disabled :1; } lv_indev_proc_t; -struct _lv_indev_t; - -typedef void (*lv_indev_feedback_t)(struct _lv_indev_t *, lv_signal_t); +typedef void (*lv_indev_feedback_t)(struct _lv_indev_t *, uint8_t); struct _lv_obj_t; struct _lv_group_t; @@ -118,7 +133,6 @@ typedef struct _lv_indev_t { const lv_point_t * btn_points; /*Array points assigned to the button ()screen will be pressed here by the buttons*/ }; - struct _lv_indev_t *next; } lv_indev_t; /********************** @@ -143,7 +157,7 @@ lv_indev_t * lv_indev_drv_register(lv_indev_drv_t *driver); /** * 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. Gives the first input device when the parameter is NULL + * @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_next(lv_indev_t * indev); diff --git a/lv_misc/lv_color.h b/lv_misc/lv_color.h index 3d2d23157..6afdc06b0 100644 --- a/lv_misc/lv_color.h +++ b/lv_misc/lv_color.h @@ -393,14 +393,14 @@ static inline uint8_t lv_color_brightness(lv_color_t color) #endif -#define LV_COLOR_HEX(c) LV_COLOR_MAKE(((uint32_t)((uint32_t)c >> 16) & 0xFF), \ - ((uint32_t)((uint32_t)c >> 8) & 0xFF), \ - ((uint32_t) c & 0xFF)) +#define LV_COLOR_HEX(c) LV_COLOR_MAKE((uint8_t) ((uint32_t)((uint32_t)c >> 16) & 0xFF), \ + (uint8_t) ((uint32_t)((uint32_t)c >> 8) & 0xFF), \ + (uint8_t) ((uint32_t) c & 0xFF)) /*Usage LV_COLOR_HEX3(0x16C) which means LV_COLOR_HEX(0x1166CC)*/ -#define LV_COLOR_HEX3(c) LV_COLOR_MAKE((((c >> 4) & 0xF0) | ((c >> 8) & 0xF)), \ - ((uint32_t)(c & 0xF0) | ((c & 0xF0) >> 4)), \ - ((uint32_t)(c & 0xF) | ((c & 0xF) << 4))) +#define LV_COLOR_HEX3(c) LV_COLOR_MAKE((uint8_t) (((c >> 4) & 0xF0) | ((c >> 8) & 0xF)), \ + (uint8_t) ((uint32_t)(c & 0xF0) | ((c & 0xF0) >> 4)), \ + (uint8_t) ((uint32_t)(c & 0xF) | ((c & 0xF) << 4))) static inline lv_color_t lv_color_hex(uint32_t c){ return LV_COLOR_HEX(c); diff --git a/lv_misc/lv_fs.c b/lv_misc/lv_fs.c index 64edc1032..1e75ab28b 100644 --- a/lv_misc/lv_fs.c +++ b/lv_misc/lv_fs.c @@ -434,7 +434,7 @@ lv_fs_res_t lv_fs_dir_close(lv_fs_dir_t * rddir_p) * @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(char letter, uint32_t * total_p, uint32_t * free_p) +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); @@ -444,12 +444,12 @@ lv_fs_res_t lv_fs_free(char letter, uint32_t * total_p, uint32_t * free_p) lv_fs_res_t res; - if(drv->free == NULL) { + if(drv->free_space == NULL) { res = LV_FS_RES_NOT_IMP; } else { uint32_t total_tmp = 0; uint32_t free_tmp = 0; - res = drv->free(&total_tmp, &free_tmp); + res = drv->free_space(&total_tmp, &free_tmp); if(total_p != NULL) *total_p = total_tmp; if(free_p != NULL) *free_p = free_tmp; diff --git a/lv_misc/lv_fs.h b/lv_misc/lv_fs.h index d4e4e6a7b..e7180022b 100644 --- a/lv_misc/lv_fs.h +++ b/lv_misc/lv_fs.h @@ -90,7 +90,7 @@ typedef struct __lv_fs_drv_t lv_fs_res_t (*trunc) (void * file_p); lv_fs_res_t (*size) (void * file_p, uint32_t * size_p); lv_fs_res_t (*rename) (const char * oldname, const char * newname); - lv_fs_res_t (*free) (uint32_t * total_p, uint32_t * free_p); + lv_fs_res_t (*free_space) (uint32_t * total_p, uint32_t * free_p); lv_fs_res_t (*dir_open) (void * rddir_p, const char * path); lv_fs_res_t (*dir_read) (void * rddir_p, char * fn); @@ -234,7 +234,7 @@ lv_fs_res_t lv_fs_dir_close (lv_fs_dir_t * rddir_p); * @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 (char letter, uint32_t * total_p, uint32_t * free_p); +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 diff --git a/lv_misc/lv_gc.h b/lv_misc/lv_gc.h index 72b10fc45..35559f39b 100644 --- a/lv_misc/lv_gc.h +++ b/lv_misc/lv_gc.h @@ -31,17 +31,13 @@ extern "C" { #define LV_GC_ROOTS(prefix) \ prefix lv_ll_t _lv_task_ll; /*Linked list to store the lv_tasks*/ \ - prefix lv_ll_t _lv_scr_ll; /*Linked list of screens*/ \ + prefix lv_ll_t _lv_disp_ll; /*Linked list of screens*/ \ + prefix lv_ll_t _lv_indev_ll; /*Linked list of screens*/ \ prefix lv_ll_t _lv_drv_ll;\ prefix lv_ll_t _lv_file_ll;\ prefix lv_ll_t _lv_anim_ll;\ - prefix void * _lv_def_scr;\ - prefix void * _lv_act_scr;\ - prefix void * _lv_top_layer;\ - prefix void * _lv_sys_layer;\ + prefix lv_ll_t _lv_group_ll;\ prefix void * _lv_task_act;\ - prefix void * _lv_indev_list;\ - prefix void * _lv_disp_list;\ #define LV_NO_PREFIX diff --git a/lv_misc/lv_ll.c b/lv_misc/lv_ll.c index 43d8847d4..297b5a5f0 100644 --- a/lv_misc/lv_ll.c +++ b/lv_misc/lv_ll.c @@ -340,6 +340,21 @@ void lv_ll_move_before(lv_ll_t * ll_p, void * n_act, void * n_after) if(n_after == NULL) ll_p->tail = 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 **********************/ diff --git a/lv_misc/lv_ll.h b/lv_misc/lv_ll.h index 086ba4057..b49d0ea36 100644 --- a/lv_misc/lv_ll.h +++ b/lv_misc/lv_ll.h @@ -17,6 +17,7 @@ extern "C" { #include "lv_mem.h" #include #include +#include /********************* * DEFINES @@ -130,6 +131,12 @@ void * lv_ll_get_prev(const lv_ll_t * ll_p, const void * 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 **********************/ diff --git a/lv_misc/lv_math.c b/lv_misc/lv_math.c index a0d26053e..73c80ad40 100644 --- a/lv_misc/lv_math.c +++ b/lv_misc/lv_math.c @@ -8,6 +8,7 @@ *********************/ #include "lv_math.h" #include +#include /********************* * DEFINES @@ -34,7 +35,7 @@ static int16_t sin0_90_table[] = { 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 + 32767 }; @@ -54,53 +55,33 @@ static int16_t sin0_90_table[] = { */ char * lv_math_num_to_str(int32_t num, char * buf) { - char * buf_ori = buf; - if(num == 0) { + if (num == 0) { buf[0] = '0'; buf[1] = '\0'; return buf; - } else if(num < 0) { - (*buf) = '-'; - buf++; - num = LV_MATH_ABS(num); } - uint32_t output = 0; - int8_t i; - - for(i = 31; i >= 0; i--) { - if((output & 0xF) >= 5) - output += 3; - if(((output & 0xF0) >> 4) >= 5) - output += (3 << 4); - if(((output & 0xF00) >> 8) >= 5) - output += (3 << 8); - if(((output & 0xF000) >> 12) >= 5) - output += (3 << 12); - if(((output & 0xF0000) >> 16) >= 5) - output += (3 << 16); - if(((output & 0xF00000) >> 20) >= 5) - output += (3 << 20); - if(((output & 0xF000000) >> 24) >= 5) - output += (3 << 24); - if(((output & 0xF0000000) >> 28) >= 5) - output += (3 << 28); - output = (output << 1) | ((num >> i) & 1); + int8_t digitCount = 0; + int8_t i = 0; + if (num < 0) { + buf[digitCount++] = '-'; + num = abs(num); + ++i; } - - uint8_t digit; - bool leading_zero_ready = false; - for(i = 28; i >= 0; i -= 4) { - digit = ((output >> i) & 0xF) + '0'; - if(digit == '0' && leading_zero_ready == false) continue; - - leading_zero_ready = true; - (*buf) = digit; - buf++; + while (num) { + char digit = num % 10; + buf[digitCount++] = digit + 48; + num /= 10; } - - (*buf) = '\0'; - - return buf_ori; + buf[digitCount] = '\0'; + digitCount--; + while (digitCount > i) { + char temp = buf[i]; + buf[i] = buf[digitCount]; + buf[digitCount] = temp; + digitCount--; + i++; + } + return buf; } /** diff --git a/lv_misc/lv_math.h b/lv_misc/lv_math.h index 1f2e402d8..a0229eb1b 100644 --- a/lv_misc/lv_math.h +++ b/lv_misc/lv_math.h @@ -19,9 +19,9 @@ extern "C" { /********************* * DEFINES *********************/ -#define LV_MATH_MIN(a,b) (ab?a:b) -#define LV_MATH_ABS(x) ((x)>0?(x):(-(x))) +#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_TRIGO_SIN_MAX 32767 #define LV_TRIGO_SHIFT 15 /* >> LV_TRIGO_SHIFT to normalize*/ diff --git a/lv_misc/lv_symbol_def.h b/lv_misc/lv_symbol_def.h index e8ea76d57..e60952b6a 100644 --- a/lv_misc/lv_symbol_def.h +++ b/lv_misc/lv_symbol_def.h @@ -73,7 +73,7 @@ extern "C" { #define SYMBOL_BATTERY_EMPTY _SYMBOL_VALUE1(F0) #define SYMBOL_BLUETOOTH _SYMBOL_VALUE1(F1) #define LV_SYMBOL_GLYPH_LAST 0xF1 -#define SYMBOL_DUMMY _SYMBOL_VALUE1(xFF) /*Invalid symbol. If written before a string then `lv_img` will show it as a label*/ +#define SYMBOL_DUMMY _SYMBOL_VALUE1(FF) /*Invalid symbol. If written before a string then `lv_img` will show it as a label*/ #else #define LV_SYMBOL_GLYPH_FIRST 0xF800 diff --git a/lv_misc/lv_ufs.c b/lv_misc/lv_ufs.c index ef1a1653a..417ed45ef 100644 --- a/lv_misc/lv_ufs.c +++ b/lv_misc/lv_ufs.c @@ -72,7 +72,7 @@ void lv_ufs_init(void) ufs_drv.tell = lv_ufs_tell; ufs_drv.size = lv_ufs_size; ufs_drv.trunc = lv_ufs_trunc; - ufs_drv.free = lv_ufs_free; + ufs_drv.free_space = lv_ufs_free; ufs_drv.dir_open = lv_ufs_dir_open; ufs_drv.dir_read = lv_ufs_dir_read; diff --git a/lv_objx/lv_arc.c b/lv_objx/lv_arc.c index 683d34345..8f5ed9a6c 100644 --- a/lv_objx/lv_arc.c +++ b/lv_objx/lv_arc.c @@ -80,7 +80,7 @@ lv_obj_t * lv_arc_create(lv_obj_t * par, const lv_obj_t * copy) /*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->arc); + 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); } diff --git a/lv_objx/lv_bar.c b/lv_objx/lv_bar.c index d83a60934..656225eb4 100644 --- a/lv_objx/lv_bar.c +++ b/lv_objx/lv_bar.c @@ -84,8 +84,8 @@ lv_obj_t * lv_bar_create(lv_obj_t * par, const lv_obj_t * copy) lv_theme_t * th = lv_theme_get_current(); if(th) { - lv_bar_set_style(new_bar, LV_BAR_STYLE_BG, th->bar.bg); - lv_bar_set_style(new_bar, LV_BAR_STYLE_INDIC, th->bar.indic); + 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); } diff --git a/lv_objx/lv_btn.c b/lv_objx/lv_btn.c index 2bf8314b3..f96607683 100644 --- a/lv_objx/lv_btn.c +++ b/lv_objx/lv_btn.c @@ -123,11 +123,11 @@ lv_obj_t * lv_btn_create(lv_obj_t * par, const lv_obj_t * copy) /*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->btn.rel); - lv_btn_set_style(new_btn, LV_BTN_STYLE_PR, th->btn.pr); - lv_btn_set_style(new_btn, LV_BTN_STYLE_TGL_REL, th->btn.tgl_rel); - lv_btn_set_style(new_btn, LV_BTN_STYLE_TGL_PR, th->btn.tgl_pr); - lv_btn_set_style(new_btn, LV_BTN_STYLE_INA, th->btn.ina); + 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]); } diff --git a/lv_objx/lv_btn.h b/lv_objx/lv_btn.h index 097aff32b..b8e6932f8 100644 --- a/lv_objx/lv_btn.h +++ b/lv_objx/lv_btn.h @@ -142,15 +142,40 @@ static inline void lv_btn_set_layout(lv_obj_t * btn, lv_layout_t layout) } /** - * Enable the horizontal or vertical fit. - * The button size will be set to involve the children horizontally or vertically. + * Set the fit policy in all 4 directions separately. + * It tell how to change the button size automatically. * @param btn pointer to a button object - * @param hor_en true: enable the horizontal fit - * @param ver_en true: enable the vertical fit + * @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_btn_set_fit(lv_obj_t * btn, bool hor_en, bool ver_en) +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_fit(btn, hor_en, ver_en); + lv_cont_set_fit4(btn, left, right, top, bottom); +} + +/** + * Set the fit policy horizontally and vertically separately. + * It tell how to change the button size automatically. + * @param btn pointer to a button object + * @param hot 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 tell 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 * cont, lv_fit_t fit) +{ + lv_cont_set_fit(cont, fit); } /** @@ -218,25 +243,46 @@ static inline lv_layout_t lv_btn_get_layout(const lv_obj_t * btn) } /** - * Get horizontal fit enable attribute of a button + * Get the left fit mode * @param btn pointer to a button object - * @return true: horizontal fit is enabled; false: disabled + * @return an element of `lv_fit_t` */ -static inline bool lv_btn_get_hor_fit(const lv_obj_t * btn) +static inline lv_fit_t lv_btn_get_fit_left(const lv_obj_t * btn) { - return lv_cont_get_hor_fit(btn); + return lv_cont_get_fit_left(btn); } /** - * Get vertical fit enable attribute of a container + * Get the right fit mode * @param btn pointer to a button object - * @return true: vertical fit is enabled; false: disabled + * @return an element of `lv_fit_t` */ -static inline bool lv_btn_get_ver_fit(const lv_obj_t * btn) +static inline lv_fit_t lv_btn_get_fit_right(const lv_obj_t * btn) { - return lv_cont_get_ver_fit(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 diff --git a/lv_objx/lv_btnm.c b/lv_objx/lv_btnm.c index 18d078dc7..7b5f49a15 100644 --- a/lv_objx/lv_btnm.c +++ b/lv_objx/lv_btnm.c @@ -101,18 +101,18 @@ lv_obj_t * lv_btnm_create(lv_obj_t * par, const lv_obj_t * copy) /*Init the new button matrix object*/ if(copy == NULL) { - lv_obj_set_size(new_btnm, LV_HOR_RES / 2, LV_VER_RES / 4); + lv_obj_set_size(new_btnm, LV_DPI * 3, LV_DPI * 2); lv_btnm_set_map(new_btnm, lv_btnm_def_map); /*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->btnm.bg); - lv_btnm_set_style(new_btnm, LV_BTNM_STYLE_BTN_REL, th->btnm.btn.rel); - lv_btnm_set_style(new_btnm, LV_BTNM_STYLE_BTN_PR, th->btnm.btn.pr); - lv_btnm_set_style(new_btnm, LV_BTNM_STYLE_BTN_TGL_REL, th->btnm.btn.tgl_rel); - lv_btnm_set_style(new_btnm, LV_BTNM_STYLE_BTN_TGL_PR, th->btnm.btn.tgl_pr); - lv_btnm_set_style(new_btnm, LV_BTNM_STYLE_BTN_INA, th->btnm.btn.ina); + 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); } @@ -708,6 +708,7 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param) /*Invalidate to old and the new areas*/; //lv_obj_get_coords(btnm, &btnm_area); if(btn_pr != ext->btn_id_pr) { + lv_disp_t * disp = lv_obj_get_disp(btnm); lv_indev_reset_lpr(param); if(ext->btn_id_pr != LV_BTNM_PR_NONE) { invalidate_button_area(btnm, ext->btn_id_pr); @@ -736,6 +737,7 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param) if(button_is_inactive(ext->ctrl_bits[ext->btn_id_pr]) == false && txt_i != LV_BTNM_PR_NONE) { /*Ignore the inactive buttons and clicks between the buttons*/ if(ext->action) res = ext->action(btnm, cut_ctrl_byte(ext->map_p[txt_i])); if(res == LV_RES_OK) { + lv_disp_t * disp = lv_obj_get_disp(btnm); /*Invalidate to old pressed area*/; invalidate_button_area(btnm, ext->btn_id_pr); @@ -743,6 +745,7 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param) if(ext->toggle != 0) { /*Invalidate to old toggled area*/; invalidate_button_area(btnm, ext->btn_id_tgl); + ext->btn_id_tgl = ext->btn_id_pr; } diff --git a/lv_objx/lv_calendar.c b/lv_objx/lv_calendar.c index 217c08d56..f8260cf4c 100644 --- a/lv_objx/lv_calendar.c +++ b/lv_objx/lv_calendar.c @@ -130,14 +130,14 @@ lv_obj_t * lv_calendar_create(lv_obj_t * par, const lv_obj_t * copy) lv_theme_t * th = lv_theme_get_current(); if(th) { - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_BG, th->calendar.bg); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_HEADER, th->calendar.header); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_HEADER_PR, th->calendar.header_pr); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_DAY_NAMES, th->calendar.day_names); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_WEEK_BOX, th->calendar.week_box); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_TODAY_BOX, th->calendar.today_box); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_HIGHLIGHTED_DAYS, th->calendar.highlighted_days); - lv_calendar_set_style(new_calendar, LV_CALENDAR_STYLE_INACTIVE_DAYS, th->calendar.inactive_days); + 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); diff --git a/lv_objx/lv_cb.c b/lv_objx/lv_cb.c index 6b0277e14..e6fc49454 100644 --- a/lv_objx/lv_cb.c +++ b/lv_objx/lv_cb.c @@ -81,19 +81,19 @@ lv_obj_t * lv_cb_create(lv_obj_t * par, const lv_obj_t * copy) lv_cb_set_text(new_cb, "Check box"); lv_btn_set_layout(new_cb, LV_LAYOUT_ROW_M); - lv_btn_set_fit(new_cb, true, true); + 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->cb.bg); - lv_cb_set_style(new_cb, LV_CB_STYLE_BOX_REL, th->cb.box.rel); - lv_cb_set_style(new_cb, LV_CB_STYLE_BOX_PR, th->cb.box.pr); - lv_cb_set_style(new_cb, LV_CB_STYLE_BOX_TGL_REL, th->cb.box.tgl_rel); - lv_cb_set_style(new_cb, LV_CB_STYLE_BOX_TGL_PR, th->cb.box.tgl_pr); - lv_cb_set_style(new_cb, LV_CB_STYLE_BOX_INA, th->cb.box.ina); + 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); diff --git a/lv_objx/lv_chart.c b/lv_objx/lv_chart.c index 1dedaa7a4..8d3e97359 100644 --- a/lv_objx/lv_chart.c +++ b/lv_objx/lv_chart.c @@ -90,12 +90,12 @@ lv_obj_t * lv_chart_create(lv_obj_t * par, const lv_obj_t * copy) /*Init the new chart background object*/ if(copy == NULL) { - lv_obj_set_size(new_chart, LV_HOR_RES / 3, LV_VER_RES / 3); + 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, th->chart); + lv_chart_set_style(new_chart, th->style.chart); } else { lv_chart_set_style(new_chart, &lv_style_pretty); } @@ -175,9 +175,10 @@ void lv_chart_clear_serie(lv_obj_t * chart, lv_chart_series_t * serie) if(chart == NULL || serie == NULL) return; lv_chart_ext_t * ext = lv_obj_get_ext_attr(chart); - if(ext == NULL) - return; - for(uint32_t i = 0; i < ext->point_cnt; i++) + if(ext == NULL) return; + + uint32_t i; + for(i = 0; i < ext->point_cnt; i++) { serie->points[i] = LV_CHART_POINT_DEF; } @@ -764,12 +765,18 @@ 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) { + 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 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; @@ -789,47 +796,28 @@ static void lv_chart_draw_vertical_lines(lv_obj_t * chart, const lv_area_t * mas 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); - p1.y = LV_COORD_MIN; p2.y = h - y_tmp + y_ofs; + p1.y = p2.y; - if(ext->point_cnt == w) + for(i = 0; i < ext->point_cnt; i++) { - for(i = 0; i < ext->point_cnt; i++) + + y_tmp = (int32_t)((int32_t) ser->points[i] - 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++; + } - y_tmp = (int32_t)((int32_t) ser->points[i] - 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[i] != LV_CHART_POINT_DEF) { lv_draw_line(&p1, &p2, mask, &style, opa_scale); - - p2.x = ((w * i) / (ext->point_cnt - 1)) + x_ofs; - p1.x = p2.x; - p1.y = p2.y; } - } - else - { - 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; - - y_tmp = (int32_t)((int32_t) ser->points[i] - ext->ymin) * h; - y_tmp = y_tmp / (ext->ymax - ext->ymin); - p2.y = h - y_tmp + y_ofs; - - if(ser->points[i - 1] >= 0 && ser->points[i] >= 0) - { - lv_draw_line(&p1, &p2, mask, &style, opa_scale); - } - } + p2.x = ((w * i) / (ext->point_cnt - 1)) + x_ofs; + p1.x = p2.x; + p1.y = p2.y; } } } diff --git a/lv_objx/lv_chart.h b/lv_objx/lv_chart.h index 08d4c4eea..baea9d0f4 100644 --- a/lv_objx/lv_chart.h +++ b/lv_objx/lv_chart.h @@ -62,10 +62,10 @@ typedef struct /*Chart types*/ enum { - LV_CHART_TYPE_LINE = 0x01, - LV_CHART_TYPE_COLUMN = 0x02, - LV_CHART_TYPE_POINT = 0x04, - LV_CHART_TYPE_VERTICAL_LINE = 0x08, + 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)*/ }; typedef uint8_t lv_chart_type_t; diff --git a/lv_objx/lv_cont.c b/lv_objx/lv_cont.c index 304852a22..b39b44e3b 100644 --- a/lv_objx/lv_cont.c +++ b/lv_objx/lv_cont.c @@ -15,7 +15,7 @@ #include #include "../lv_draw/lv_draw.h" -#include "../lv_draw/lv_draw_vbasic.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" @@ -78,8 +78,10 @@ lv_obj_t * lv_cont_create(lv_obj_t * par, const lv_obj_t * copy) if(ext == NULL) return NULL; lv_mem_assert(ext); - ext->hor_fit = 0; - ext->ver_fit = 0; + 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_func(new_cont, lv_cont_signal); @@ -89,7 +91,7 @@ lv_obj_t * lv_cont_create(lv_obj_t * par, const lv_obj_t * copy) /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); if(th) { - lv_cont_set_style(new_cont, th->cont); + lv_cont_set_style(new_cont, th->style.cont); } else { lv_cont_set_style(new_cont, &lv_style_pretty); } @@ -97,8 +99,10 @@ lv_obj_t * lv_cont_create(lv_obj_t * par, const lv_obj_t * copy) /*Copy an existing object*/ else { lv_cont_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - ext->hor_fit = copy_ext->hor_fit; - ext->ver_fit = copy_ext->ver_fit; + 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*/ @@ -107,7 +111,6 @@ lv_obj_t * lv_cont_create(lv_obj_t * par, const lv_obj_t * copy) LV_LOG_INFO("container created"); - return new_cont; } @@ -131,22 +134,31 @@ void lv_cont_set_layout(lv_obj_t * cont, lv_layout_t layout) cont->signal_func(cont, LV_SIGNAL_CHILD_CHG, NULL); } - /** - * Enable the horizontal or vertical fit. - * The container size will be set to involve the children horizontally or vertically. + * 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 hor_en true: enable the horizontal fit - * @param ver_en true: enable the vertical fit + * @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_fit(lv_obj_t * cont, bool hor_en, bool ver_en) +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_obj_invalidate(cont); lv_cont_ext_t * ext = lv_obj_get_ext_attr(cont); - if(ext->hor_fit == hor_en && ext->ver_fit == ver_en) return; + if(ext->fit_left == left && + ext->fit_right == right && + ext->fit_top == top && + ext->fit_bottom == bottom) + { + return; + } - ext->hor_fit = hor_en == false ? 0 : 1; - ext->ver_fit = ver_en == false ? 0 : 1; + 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_func(cont, LV_SIGNAL_CHILD_CHG, NULL); @@ -168,25 +180,47 @@ lv_layout_t lv_cont_get_layout(const lv_obj_t * cont) } /** - * Get horizontal fit enable attribute of a container + * Get left fit mode of a container * @param cont pointer to a container object - * @return true: horizontal fit is enabled; false: disabled + * @return an element of `lv_fit_t` */ -bool lv_cont_get_hor_fit(const lv_obj_t * cont) +lv_fit_t lv_cont_get_fit_left(const lv_obj_t * cont) { lv_cont_ext_t * ext = lv_obj_get_ext_attr(cont); - return ext->hor_fit == 0 ? false : true; + return ext->fit_left; } /** - * Get vertical fit enable attribute of a container + * Get right fit mode of a container * @param cont pointer to a container object - * @return true: vertical fit is enabled; false: disabled + * @return an element of `lv_fit_t` */ -bool lv_cont_get_ver_fit(const lv_obj_t * cont) +lv_fit_t lv_cont_get_fit_right(const lv_obj_t * cont) { lv_cont_ext_t * ext = lv_obj_get_ext_attr(cont); - return ext->ver_fit == 0 ? false : true; + 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_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_cont_ext_t * ext = lv_obj_get_ext_attr(cont); + return ext->fit_bottom; } /** @@ -244,6 +278,10 @@ static lv_res_t lv_cont_signal(lv_obj_t * cont, lv_signal_t sign, void * 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); + } else if(sign == LV_SIGNAL_GET_TYPE) { lv_obj_type_t * buf = param; uint8_t i; @@ -574,70 +612,112 @@ static void lv_cont_refr_autofit(lv_obj_t * cont) { lv_cont_ext_t * ext = lv_obj_get_ext_attr(cont); - if(ext->hor_fit == 0 && - ext->ver_fit == 0) { + 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 new_cords; + lv_area_t tight_area; lv_area_t ori; lv_style_t * style = lv_obj_get_style(cont); lv_obj_t * i; lv_coord_t hpad = style->body.padding.hor; lv_coord_t vpad = style->body.padding.ver; + lv_obj_t * par = lv_obj_get_parent(cont); + 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.hor; + flood_area.x2 -= par_style->body.padding.hor; + flood_area.y1 += par_style->body.padding.ver; + flood_area.y2 -= par_style->body.padding.ver; + /*Search the side coordinates of the children*/ lv_obj_get_coords(cont, &ori); - lv_obj_get_coords(cont, &new_cords); + lv_obj_get_coords(cont, &tight_area); - new_cords.x1 = LV_COORD_MAX; - new_cords.y1 = LV_COORD_MAX; - new_cords.x2 = LV_COORD_MIN; - new_cords.y2 = LV_COORD_MIN; + bool has_children = lv_ll_is_empty(&cont->child_ll) ? false : true; - LL_READ(cont->child_ll, i) { - if(lv_obj_get_hidden(i) != false) continue; - new_cords.x1 = LV_MATH_MIN(new_cords.x1, i->coords.x1); - new_cords.y1 = LV_MATH_MIN(new_cords.y1, i->coords.y1); - new_cords.x2 = LV_MATH_MAX(new_cords.x2, i->coords.x2); - new_cords.y2 = LV_MATH_MAX(new_cords.y2, i->coords.y2); + 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; + + LL_READ(cont->child_ll, i) { + if(lv_obj_get_hidden(i) != false) continue; + tight_area.x1 = LV_MATH_MIN(tight_area.x1, i->coords.x1); + tight_area.y1 = LV_MATH_MIN(tight_area.y1, i->coords.y1); + tight_area.x2 = LV_MATH_MAX(tight_area.x2, i->coords.x2); + tight_area.y2 = LV_MATH_MAX(tight_area.y2, i->coords.y2); + } + + tight_area.x1 -= hpad; + tight_area.x2 += hpad; + tight_area.y1 -= vpad; + tight_area.y2 += vpad; } - /*If the value is not the init value then the page has >=1 child.*/ - if(new_cords.x1 != LV_COORD_MAX) { - if(ext->hor_fit != 0) { - new_cords.x1 -= hpad; - new_cords.x2 += hpad; - } else { - new_cords.x1 = cont->coords.x1; - new_cords.x2 = cont->coords.x2; - } - if(ext->ver_fit != 0) { - new_cords.y1 -= vpad; - new_cords.y2 += vpad; - } else { - new_cords.y1 = cont->coords.y1; - new_cords.y2 = cont->coords.y2; - } + lv_area_t new_area; + lv_area_copy(&new_area, &ori); - /*Do nothing if the coordinates are not changed*/ - if(cont->coords.x1 != new_cords.x1 || - cont->coords.y1 != new_cords.y1 || - cont->coords.x2 != new_cords.x2 || - cont->coords.y2 != new_cords.y2) { + 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; + } - lv_obj_invalidate(cont); - lv_area_copy(&cont->coords, &new_cords); - lv_obj_invalidate(cont); + 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; + } - /*Notify the object about its new coordinates*/ - cont->signal_func(cont, LV_SIGNAL_CORD_CHG, &ori); + 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; + } - /*Inform the parent about the new coordinates*/ - lv_obj_t * par = lv_obj_get_parent(cont); - par->signal_func(par, LV_SIGNAL_CHILD_CHG, cont); + 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_func(cont, LV_SIGNAL_CORD_CHG, &ori); + + /*Inform the parent about the new coordinates*/ + lv_obj_t * par = lv_obj_get_parent(cont); + par->signal_func(par, LV_SIGNAL_CHILD_CHG, cont); + + /*Tell the children the parent's size has changed*/ + lv_obj_t * i; + LL_READ(cont->child_ll, i) { + i->signal_func(i, LV_SIGNAL_PARENT_SIZE_CHG, NULL); } } + } #endif diff --git a/lv_objx/lv_cont.h b/lv_objx/lv_cont.h index 3259c772f..cf78574b5 100644 --- a/lv_objx/lv_cont.h +++ b/lv_objx/lv_cont.h @@ -47,13 +47,23 @@ enum }; typedef uint8_t lv_layout_t; + +typedef enum { + LV_FIT_NONE, /*Do not change the size automatically*/ + LV_FIT_TIGHT, /*Involve 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 involve it*/ +}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_cont_layout_t' enum*/ - uint8_t hor_fit :1; /*1: Enable horizontal fit to involve all children*/ - uint8_t ver_fit :1; /*1: Enable horizontal fit to involve all children*/ + 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; @@ -80,15 +90,41 @@ lv_obj_t * lv_cont_create(lv_obj_t * par, const lv_obj_t * copy); */ void lv_cont_set_layout(lv_obj_t * cont, lv_layout_t layout); +/** + * 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); /** - * Enable the horizontal or vertical fit. - * The container size will be set to involve the children horizontally or vertically. + * Set the fit policy horizontally and vertically separately. + * It tell how to change the container's size automatically. * @param cont pointer to a container object - * @param hor_en true: enable the horizontal fit - * @param ver_en true: enable the vertical fit + * @param hot horizontal fit policy from `lv_fit_t` + * @param ver vertical fit policy from `lv_fit_t` */ -void lv_cont_set_fit(lv_obj_t * cont, bool hor_en, bool ver_en); +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 policyin all 4 direction at once. + * It tell 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 @@ -112,18 +148,32 @@ static inline void lv_cont_set_style(lv_obj_t *cont, lv_style_t * style) lv_layout_t lv_cont_get_layout(const lv_obj_t * cont); /** - * Get horizontal fit enable attribute of a container + * Get left fit mode of a container * @param cont pointer to a container object - * @return true: horizontal fit is enabled; false: disabled + * @return an element of `lv_fit_t` */ -bool lv_cont_get_hor_fit(const lv_obj_t * cont); +lv_fit_t lv_cont_get_fit_left(const lv_obj_t * cont); /** - * Get vertical fit enable attribute of a container + * Get right fit mode of a container * @param cont pointer to a container object - * @return true: vertical fit is enabled; false: disabled + * @return an element of `lv_fit_t` */ -bool lv_cont_get_ver_fit(const lv_obj_t * cont); +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); /** diff --git a/lv_objx/lv_ddlist.c b/lv_objx/lv_ddlist.c index c8805d591..96ff47e6e 100644 --- a/lv_objx/lv_ddlist.c +++ b/lv_objx/lv_ddlist.c @@ -104,10 +104,10 @@ lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy) if(copy == NULL) { lv_obj_t * scrl = lv_page_get_scrl(new_ddlist); lv_obj_set_drag(scrl, false); - lv_page_set_scrl_fit(new_ddlist, true, true); + lv_page_set_scrl_fit2(new_ddlist, LV_FIT_TIGHT, LV_FIT_TIGHT); ext->label = lv_label_create(new_ddlist, NULL); - lv_cont_set_fit(new_ddlist, true, false); + lv_cont_set_fit2(new_ddlist, LV_FIT_TIGHT, LV_FIT_NONE); lv_page_set_rel_action(new_ddlist, lv_ddlist_release_action); lv_page_set_sb_mode(new_ddlist, LV_SB_MODE_DRAG); lv_page_set_sb_mode(new_ddlist, LV_SB_MODE_HIDE); @@ -118,9 +118,9 @@ lv_obj_t * lv_ddlist_create(lv_obj_t * par, const lv_obj_t * copy) /*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->ddlist.bg); - lv_ddlist_set_style(new_ddlist, LV_DDLIST_STYLE_SEL, th->ddlist.sel); - lv_ddlist_set_style(new_ddlist, LV_DDLIST_STYLE_SB, th->ddlist.sb); + 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); @@ -238,12 +238,11 @@ void lv_ddlist_set_fix_height(lv_obj_t * ddlist, lv_coord_t h) /** * Enable or disable the horizontal fit to the content * @param ddlist pointer to a drop down list - * @param en true: enable auto fit; false: disable auto fit + * @param fit fit mode fron `lv_fit_t` (Typically `LV_FIT_NONE` or `LV_FIT_TIGHT`) */ -void lv_ddlist_set_hor_fit(lv_obj_t * ddlist, bool en) +void lv_ddlist_set_hor_fit(lv_obj_t * ddlist, lv_fit_t fit) { - lv_cont_set_fit(ddlist, en, lv_cont_get_ver_fit(ddlist)); - lv_page_set_scrl_fit(ddlist, en, lv_page_get_scrl_fit_ver(ddlist)); + lv_cont_set_fit2(ddlist, fit, lv_cont_get_fit_top(ddlist)); lv_ddlist_refr_size(ddlist, false); } @@ -624,6 +623,7 @@ static lv_res_t lv_ddlist_signal(lv_obj_t * ddlist, lv_signal_t sign, void * par } else if(sign == LV_SIGNAL_CLEANUP) { ext->label = NULL; } else if(sign == LV_SIGNAL_FOCUS) { +#if USE_LV_GROUP lv_group_t * g = lv_obj_get_group(ddlist); bool editing = lv_group_get_editing(g); lv_hal_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); @@ -651,6 +651,7 @@ static lv_res_t lv_ddlist_signal(lv_obj_t * ddlist, lv_signal_t sign, void * par lv_ddlist_refr_size(ddlist, true); } } +#endif } else if(sign == LV_SIGNAL_DEFOCUS) { if(ext->opened) { ext->opened = false; @@ -686,9 +687,11 @@ static lv_res_t lv_ddlist_signal(lv_obj_t * ddlist, lv_signal_t sign, void * par ext->opened = 0; if(ext->action) ext->action(ddlist); +#if USE_LV_GROUP lv_group_t * g = lv_obj_get_group(ddlist); bool editing = lv_group_get_editing(g); if(editing) lv_group_set_editing(g, false); /*In edit mode go to navigate mode if an option is selected*/ +#endif } else { ext->opened = 1; } diff --git a/lv_objx/lv_ddlist.h b/lv_objx/lv_ddlist.h index a0aa62cbb..8d3a6599f 100644 --- a/lv_objx/lv_ddlist.h +++ b/lv_objx/lv_ddlist.h @@ -117,12 +117,13 @@ void lv_ddlist_set_action(lv_obj_t * ddlist, lv_action_t action); */ void lv_ddlist_set_fix_height(lv_obj_t * ddlist, lv_coord_t h); + /** * Enable or disable the horizontal fit to the content * @param ddlist pointer to a drop down list - * @param en true: enable auto fit; false: disable auto fit + * @param fit fit mode fron `lv_fit_t` (Typically `LV_FIT_NONE` or `LV_FIT_TIGHT`) */ -void lv_ddlist_set_hor_fit(lv_obj_t * ddlist, bool en); +void lv_ddlist_set_hor_fit(lv_obj_t * ddlist, lv_fit_t fit); /** * Set the scroll bar mode of a drop down list diff --git a/lv_objx/lv_gauge.c b/lv_objx/lv_gauge.c index ad2ef8d92..bdc6a179a 100644 --- a/lv_objx/lv_gauge.c +++ b/lv_objx/lv_gauge.c @@ -95,7 +95,7 @@ lv_obj_t * lv_gauge_create(lv_obj_t * par, const lv_obj_t * copy) /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); if(th) { - lv_gauge_set_style(new_gauge, th->gauge); + lv_gauge_set_style(new_gauge, th->style.gauge); } else { lv_gauge_set_style(new_gauge, &lv_style_pretty_color); } diff --git a/lv_objx/lv_img.c b/lv_objx/lv_img.c index c9fb42875..981c2919b 100644 --- a/lv_objx/lv_img.c +++ b/lv_objx/lv_img.c @@ -14,7 +14,7 @@ #error "lv_img: lv_label is required. Enable it in lv_conf.h (USE_LV_LABEL 1) " #endif -#include "../lv_core/lv_lang.h" +#include "../lv_core/lv_i18n.h" #include "../lv_themes/lv_theme.h" #include "../lv_misc/lv_fs.h" #include "../lv_misc/lv_ufs.h" @@ -78,9 +78,6 @@ lv_obj_t * lv_img_create(lv_obj_t * par, const lv_obj_t * copy) ext->w = lv_obj_get_width(new_img); ext->h = lv_obj_get_height(new_img); ext->auto_size = 1; -#if USE_LV_MULTI_LANG - ext->lang_txt_id = LV_LANG_TXT_ID_NONE; -#endif /*Init the new object*/ lv_obj_set_signal_func(new_img, lv_img_signal); @@ -129,7 +126,7 @@ void lv_img_set_src(lv_obj_t * img, const void * src_img) 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_LOG_LEVEL >= LV_LOG_LEVEL_INFO +#if USE_LV_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"); @@ -206,22 +203,6 @@ void lv_img_set_src(lv_obj_t * img, const void * src_img) lv_obj_invalidate(img); } -#if USE_LV_MULTI_LANG -/** - * Set an ID which means a the same source but in different languages - * @param img pointer to an image object - * @param src_id ID of the source - */ -void lv_img_set_src_id(lv_obj_t * img, uint32_t src_id) -{ - lv_img_ext_t * ext = lv_obj_get_ext_attr(img); - ext->lang_txt_id = src_id; - - /*Apply the new language*/ - img->signal_func(img, LV_SIGNAL_LANG_CHG, NULL); -} -#endif - /** * Enable the auto size feature. * If enabled the object size will be same as the picture size. @@ -266,19 +247,6 @@ const char * lv_img_get_file_name(const lv_obj_t * img) else return ""; } -#if USE_LV_MULTI_LANG -/** - * Get the source ID of the image. (Used by the multi-language feature) - * @param img pointer to an image - * @return ID of the source - */ -uint16_t lv_img_get_src_id(lv_obj_t * img) -{ - lv_img_ext_t * ext = lv_obj_get_ext_attr(img); - return ext->lang_txt_id; -} -#endif - /** * Get the auto size enable attribute * @param img pointer to an image @@ -382,17 +350,6 @@ static lv_res_t lv_img_signal(lv_obj_t * img, lv_signal_t sign, void * param) lv_img_set_src(img, ext->src); } - } else if(sign == LV_SIGNAL_LANG_CHG) { -#if USE_LV_MULTI_LANG - if(ext->lang_txt_id != LV_LANG_TXT_ID_NONE) { - const char * lang_src = lv_lang_get_text(ext->lang_txt_id); - if(lang_src) { - lv_img_set_src(img, lang_src); - } else { - LV_LOG_WARN("lv_lang_get_text return NULL for an image's source"); - } - } -#endif } else if(sign == LV_SIGNAL_GET_TYPE) { lv_obj_type_t * buf = param; uint8_t i; diff --git a/lv_objx/lv_img.h b/lv_objx/lv_img.h index 8ee861679..86c2170b9 100644 --- a/lv_objx/lv_img.h +++ b/lv_objx/lv_img.h @@ -43,9 +43,6 @@ typedef struct lv_coord_t w; /*Width of the image (Handled by the library)*/ lv_coord_t h; /*Height of the image (Handled by the library)*/ -#if USE_LV_MULTI_LANG - uint16_t lang_txt_id; /*The ID of the image to display. */ -#endif 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`*/ @@ -74,15 +71,6 @@ lv_obj_t * lv_img_create(lv_obj_t * par, const lv_obj_t * copy); */ void lv_img_set_src(lv_obj_t * img, const void * src_img); -#if USE_LV_MULTI_LANG -/** - * Set an ID which means a the same source but on different languages - * @param img pointer to an image object - * @param src_id ID of the source - */ -void lv_img_set_src_id(lv_obj_t * img, uint32_t txt_id); -#endif - /** * Obsolete since v5.1. Just for compatibility with v5.0. Will be removed in v6.0. * Use 'lv_img_set_src()' instead. @@ -142,15 +130,6 @@ const void * lv_img_get_src(lv_obj_t * img); */ const char * lv_img_get_file_name(const lv_obj_t * img); -#if USE_LV_MULTI_LANG -/** - * Get the source ID of the image. (Used by the multi-language feature) - * @param img pointer to an image - * @return ID of the source - */ -uint16_t lv_img_get_src_id(lv_obj_t * img); -#endif - /** * Get the auto size enable attribute * @param img pointer to an image diff --git a/lv_objx/lv_imgbtn.c b/lv_objx/lv_imgbtn.c index 75e545343..ed1d72b42 100644 --- a/lv_objx/lv_imgbtn.c +++ b/lv_objx/lv_imgbtn.c @@ -81,11 +81,10 @@ lv_obj_t * lv_imgbtn_create(lv_obj_t * par, const lv_obj_t * copy) } /*Copy an existing image button*/ else { -#if LV_IMGBTN_TILED == 0 - memset(ext->img_src, 0, sizeof(ext->img_src)); -#else lv_imgbtn_ext_t * copy_ext = lv_obj_get_ext_attr(copy); - +#if LV_IMGBTN_TILED == 0 + memcpy(ext->img_src, copy_ext->img_src, sizeof(ext->img_src)); +#else memcpy(ext->img_src_left, copy_ext->img_src_left, sizeof(ext->img_src_left)); memcpy(ext->img_src_mid, copy_ext->img_src_mid, sizeof(ext->img_src_mid)); memcpy(ext->img_src_right, copy_ext->img_src_right, sizeof(ext->img_src_right)); @@ -386,7 +385,7 @@ static void refr_img(lv_obj_t * imgbtn) ext->act_cf = LV_IMG_CF_UNKOWN; } - + lv_obj_invalidate(imgbtn); } #endif diff --git a/lv_objx/lv_kb.c b/lv_objx/lv_kb.c index 395fc8d5d..be7684760 100644 --- a/lv_objx/lv_kb.c +++ b/lv_objx/lv_kb.c @@ -102,7 +102,7 @@ lv_obj_t * lv_kb_create(lv_obj_t * par, const lv_obj_t * copy) /*Init the new keyboard keyboard*/ if(copy == NULL) { - lv_obj_set_size(new_kb, LV_HOR_RES, LV_VER_RES / 2); + lv_obj_set_size(new_kb, LV_DPI * 3, LV_DPI * 2); lv_obj_align(new_kb, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0); lv_btnm_set_action(new_kb, lv_kb_def_action); lv_btnm_set_map(new_kb, kb_map_lc); @@ -110,12 +110,12 @@ lv_obj_t * lv_kb_create(lv_obj_t * par, const lv_obj_t * copy) /*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->kb.bg); - lv_kb_set_style(new_kb, LV_KB_STYLE_BTN_REL, th->kb.btn.rel); - lv_kb_set_style(new_kb, LV_KB_STYLE_BTN_PR, th->kb.btn.pr); - lv_kb_set_style(new_kb, LV_KB_STYLE_BTN_TGL_REL, th->kb.btn.tgl_rel); - lv_kb_set_style(new_kb, LV_KB_STYLE_BTN_TGL_PR, th->kb.btn.tgl_pr); - lv_kb_set_style(new_kb, LV_KB_STYLE_BTN_INA, th->kb.btn.ina); + 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*/ } diff --git a/lv_objx/lv_label.c b/lv_objx/lv_label.c index 1ef781caf..a0d1963d3 100644 --- a/lv_objx/lv_label.c +++ b/lv_objx/lv_label.c @@ -11,7 +11,7 @@ #include "../lv_core/lv_obj.h" #include "../lv_core/lv_group.h" -#include "../lv_core/lv_lang.h" +#include "../lv_core/lv_i18n.h" #include "../lv_draw/lv_draw.h" #include "../lv_misc/lv_color.h" #include "../lv_misc/lv_math.h" @@ -91,9 +91,6 @@ lv_obj_t * lv_label_create(lv_obj_t * par, const lv_obj_t * copy) ext->anim_speed = LV_LABEL_SCROLL_SPEED; ext->offset.x = 0; ext->offset.y = 0; -#if USE_LV_MULTI_LANG - ext->lang_txt_id = LV_LANG_TXT_ID_NONE; -#endif lv_obj_set_design_func(new_label, lv_label_design); lv_obj_set_signal_func(new_label, lv_label_signal); @@ -237,22 +234,6 @@ void lv_label_set_static_text(lv_obj_t * label, const char * text) lv_label_refr_text(label); } -#if USE_LV_MULTI_LANG -/** - *Set a text ID which refers a the same text but in a different languages - * @param label pointer to a label object - * @param txt_id ID of the text - */ -void lv_label_set_text_id(lv_obj_t * label, uint32_t txt_id) -{ - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - ext->lang_txt_id = txt_id; - - /*Apply the new language*/ - label->signal_func(label, LV_SIGNAL_LANG_CHG, NULL); -} -#endif - /** * Set the behavior of the label with longer text then the object size * @param label pointer to a label object @@ -365,19 +346,6 @@ char * lv_label_get_text(const lv_obj_t * label) return ext->text; } -#if USE_LV_MULTI_LANG -/** - * Get the text ID of the label. (Used by the multi-language feature) - * @param label pointer to a label object - * @return ID of the text - */ -uint16_t lv_label_get_text_id(lv_obj_t * label) -{ - lv_label_ext_t * ext = lv_obj_get_ext_attr(label); - return ext->lang_txt_id; -} -#endif - /** * Get the long mode of a label * @param label pointer to a label object @@ -753,17 +721,6 @@ static lv_res_t lv_label_signal(lv_obj_t * label, lv_signal_t sign, void * param label->ext_size = LV_MATH_MAX(label->ext_size, style->body.padding.hor); label->ext_size = LV_MATH_MAX(label->ext_size, style->body.padding.ver); } - } else if(sign == LV_SIGNAL_LANG_CHG) { -#if USE_LV_MULTI_LANG - if(ext->lang_txt_id != LV_LANG_TXT_ID_NONE) { - const char * lang_txt = lv_lang_get_text(ext->lang_txt_id); - if(lang_txt) { - lv_label_set_text(label, lang_txt); - } else { - LV_LOG_WARN("lv_lang_get_text return NULL for a label's text"); - } - } -#endif } else if(sign == LV_SIGNAL_GET_TYPE) { lv_obj_type_t * buf = param; uint8_t i; diff --git a/lv_objx/lv_label.h b/lv_objx/lv_label.h index a2ee12684..84f5b5e5a 100644 --- a/lv_objx/lv_label.h +++ b/lv_objx/lv_label.h @@ -69,9 +69,6 @@ typedef struct char dot_tmp[LV_LABEL_DOT_NUM * 4 + 1]; /*Store the character which are replaced by dots (Handled by the library)*/ #endif -#if USE_LV_MULTI_LANG - uint16_t lang_txt_id; /*The ID of the text to display*/ -#endif uint16_t dot_end; /*The text end position in dot mode (Handled by the library)*/ uint16_t anim_speed; /*Speed of scroll and roll animation in px/sec unit*/ lv_point_t offset; /*Text draw position offset*/ @@ -123,15 +120,6 @@ void lv_label_set_array_text(lv_obj_t * label, const char * array, uint16_t size */ void lv_label_set_static_text(lv_obj_t * label, const char * text); -/** - *Set a text ID which means a the same text but on different languages - * @param label pointer to a label object - * @param txt_id ID of the text - */ -#if USE_LV_MULTI_LANG -void lv_label_set_text_id(lv_obj_t * label, uint32_t txt_id); -#endif - /** * Set the behavior of the label with longer text then the object size * @param label pointer to a label object @@ -188,15 +176,6 @@ static inline void lv_label_set_style(lv_obj_t *label, lv_style_t *style) */ char * lv_label_get_text(const lv_obj_t * label); -#if USE_LV_MULTI_LANG -/** - * Get the text ID of the label. (Used by the multi-language feature) - * @param label pointer to a label object - * @return ID of the text - */ -uint16_t lv_label_get_text_id(lv_obj_t * label); -#endif - /** * Get the long mode of a label * @param label pointer to a label object diff --git a/lv_objx/lv_led.c b/lv_objx/lv_led.c index 29fc967ee..3529eb545 100644 --- a/lv_objx/lv_led.c +++ b/lv_objx/lv_led.c @@ -79,7 +79,7 @@ lv_obj_t * lv_led_create(lv_obj_t * par, const lv_obj_t * copy) /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); if(th) { - lv_led_set_style(new_led, th->led); + lv_led_set_style(new_led, th->style.led); } else { lv_led_set_style(new_led, &lv_style_pretty_color); } diff --git a/lv_objx/lv_list.c b/lv_objx/lv_list.c index 8accb665a..17e1d8655 100644 --- a/lv_objx/lv_list.c +++ b/lv_objx/lv_list.c @@ -102,6 +102,7 @@ lv_obj_t * lv_list_create(lv_obj_t * par, const lv_obj_t * copy) /*Init the new list object*/ if(copy == NULL) { + 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); @@ -109,14 +110,14 @@ lv_obj_t * lv_list_create(lv_obj_t * par, const lv_obj_t * copy) /*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->list.bg); - lv_list_set_style(new_list, LV_LIST_STYLE_SCRL, th->list.scrl); - lv_list_set_style(new_list, LV_LIST_STYLE_SB, th->list.sb); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_REL, th->list.btn.rel); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_PR, th->list.btn.pr); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_TGL_REL, th->list.btn.tgl_rel); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_TGL_PR, th->list.btn.tgl_pr); - lv_list_set_style(new_list, LV_LIST_STYLE_BTN_INA, th->list.btn.ina); + 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); @@ -198,7 +199,7 @@ lv_obj_t * lv_list_add(lv_obj_t * list, const void * img_src, const char * txt, lv_btn_set_action(liste, LV_BTN_ACTION_CLICK, rel_action); lv_page_glue_obj(liste, true); lv_btn_set_layout(liste, LV_LAYOUT_ROW_M); - lv_btn_set_fit(liste, false, true); + lv_btn_set_fit2(liste, LV_FIT_FLOOD, LV_FIT_TIGHT); lv_obj_set_protect(liste, LV_PROTECT_PRESS_LOST); lv_obj_set_signal_func(liste, lv_list_btn_signal); @@ -300,6 +301,9 @@ void lv_list_set_btn_selected(lv_obj_t * list, lv_obj_t * btn) } ext->selected_btn = btn; + if( btn != NULL ) { + ext->last_sel = btn; + } if(ext->selected_btn) { lv_btn_state_t s = lv_btn_get_state(ext->selected_btn); @@ -760,7 +764,7 @@ static lv_res_t lv_list_signal(lv_obj_t * list, lv_signal_t sign, void * param) 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(NULL != ext->last_sel) { + if(ext->last_sel) { /* Select the last used button */ lv_list_set_btn_selected(list, ext->last_sel); } @@ -779,7 +783,7 @@ static lv_res_t lv_list_signal(lv_obj_t * list, lv_signal_t sign, void * param) lv_list_set_btn_selected(list, last_clicked_btn); } else { lv_list_ext_t * ext = lv_obj_get_ext_attr(list); - if(NULL != ext->last_sel) { + if(ext->last_sel) { /* Select the last used button */ lv_list_set_btn_selected(list, ext->last_sel); } diff --git a/lv_objx/lv_list.h b/lv_objx/lv_list.h index 0fe0c1291..a31877082 100644 --- a/lv_objx/lv_list.h +++ b/lv_objx/lv_list.h @@ -59,8 +59,8 @@ typedef struct uint32_t size; /*the number of items(buttons) in the list*/ bool single_mode; /* whether single selected mode is enabled */ #if USE_LV_GROUP - lv_obj_t * last_sel; /* Last btn selected */ - lv_obj_t * selected_btn; + 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*/ #endif } lv_list_ext_t; diff --git a/lv_objx/lv_lmeter.c b/lv_objx/lv_lmeter.c index 4d78d8ee2..e86e4aa54 100644 --- a/lv_objx/lv_lmeter.c +++ b/lv_objx/lv_lmeter.c @@ -84,7 +84,7 @@ lv_obj_t * lv_lmeter_create(lv_obj_t * par, const lv_obj_t * copy) /*Set the default styles*/ lv_theme_t * th = lv_theme_get_current(); if(th) { - lv_lmeter_set_style(new_lmeter, th->lmeter); + lv_lmeter_set_style(new_lmeter, th->style.lmeter); } else { lv_lmeter_set_style(new_lmeter, &lv_style_pretty_color); } diff --git a/lv_objx/lv_mbox.c b/lv_objx/lv_mbox.c index af53ddd4d..adaf4ad42 100644 --- a/lv_objx/lv_mbox.c +++ b/lv_objx/lv_mbox.c @@ -90,14 +90,14 @@ lv_obj_t * lv_mbox_create(lv_obj_t * par, const lv_obj_t * copy) lv_label_set_text(ext->text, "Message"); lv_cont_set_layout(new_mbox, LV_LAYOUT_COL_M); - lv_cont_set_fit(new_mbox, false, true); - lv_obj_set_width(new_mbox, LV_HOR_RES / 2); + 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); /*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->mbox.bg); + 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); } @@ -144,9 +144,9 @@ void lv_mbox_add_btns(lv_obj_t * mbox, const char ** btn_map, lv_btnm_action_t a /*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->mbox.btn.bg); - lv_mbox_set_style(mbox, LV_MBOX_STYLE_BTN_REL, th->mbox.btn.rel); - lv_mbox_set_style(mbox, LV_MBOX_STYLE_BTN_PR, th->mbox.btn.pr); + 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); } @@ -220,7 +220,7 @@ void lv_mbox_start_auto_close(lv_obj_t * mbox, uint16_t delay) lv_obj_animate(mbox, LV_ANIM_GROW_V | LV_ANIM_OUT, ext->anim_time, delay, lv_mbox_close_end_cb); /*Disable fit to let shrinking work*/ - lv_cont_set_fit(mbox, false, false); + lv_cont_set_fit(mbox, LV_FIT_NONE); } else { lv_obj_animate(mbox, LV_ANIM_NONE, ext->anim_time, delay, lv_mbox_close_end_cb); } diff --git a/lv_objx/lv_page.c b/lv_objx/lv_page.c index f01418d10..8b2f602d8 100644 --- a/lv_objx/lv_page.c +++ b/lv_objx/lv_page.c @@ -103,7 +103,7 @@ lv_obj_t * lv_page_create(lv_obj_t * par, const lv_obj_t * copy) 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_fit(ext->scrl, false, true); + lv_cont_set_fit4(ext->scrl, LV_FIT_FILL, LV_FIT_FILL, LV_FIT_FILL, LV_FIT_FILL); /* Add the signal function only if 'scrolling' is created * because everything has to be ready before any signal is received*/ @@ -116,14 +116,14 @@ lv_obj_t * lv_page_create(lv_obj_t * par, const lv_obj_t * copy) 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->bg); + 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->page.bg); - lv_page_set_style(new_page, LV_PAGE_STYLE_SCRL, th->page.scrl); + 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->page.sb); + 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); @@ -567,7 +567,7 @@ void lv_page_scroll_ver(lv_obj_t * page, lv_coord_t dist) a.repeat_pause = 0; lv_anim_create(&a); #else - lv_obj_set_y(scrl, lv_obj_get_x(scrl) + dist); + lv_obj_set_y(scrl, lv_obj_get_y(scrl) + dist); #endif } @@ -765,7 +765,6 @@ static lv_res_t lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param) if(res != LV_RES_OK) return res; lv_page_ext_t * ext = lv_obj_get_ext_attr(page); - lv_style_t * style = lv_obj_get_style(page); lv_obj_t * child; if(sign == LV_SIGNAL_CHILD_CHG) { /*Automatically move children to the scrollable object*/ child = lv_obj_get_child(page, NULL); @@ -773,18 +772,21 @@ static lv_res_t lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param) 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*/ + lv_style_t * style = lv_page_get_style(page, LV_PAGE_STYLE_SCRL); + child->coords.x1 += style->body.padding.hor; + child->coords.x2 += style->body.padding.hor; + child->coords.y1 += style->body.padding.ver; + child->coords.y2 += style->body.padding.ver; + lv_obj_set_parent(tmp, ext->scrl); } else { child = lv_obj_get_child(page, child); } } } else if(sign == LV_SIGNAL_STYLE_CHG) { - /*If no hor_fit enabled set the scrollable's width to the page's width*/ - if(lv_cont_get_hor_fit(ext->scrl) == false) { - lv_obj_set_width(ext->scrl, lv_obj_get_width(page) - 2 * style->body.padding.hor); - } else { - ext->scrl->signal_func(ext->scrl, LV_SIGNAL_CORD_CHG, &ext->scrl->coords); - } + ext->scrl->signal_func(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); @@ -796,10 +798,6 @@ static lv_res_t lv_page_signal(lv_obj_t * page, lv_signal_t sign, void * param) 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*/ - if(lv_cont_get_hor_fit(ext->scrl) == false) { - lv_obj_set_width(ext->scrl, lv_obj_get_width(page) - 2 * style->body.padding.hor); - } - ext->scrl->signal_func(ext->scrl, LV_SIGNAL_CORD_CHG, &ext->scrl->coords); /*The scrollbars are important only if they are visible now*/ @@ -1000,6 +998,7 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi /*Hide scrollbars if required*/ if(page_ext->sb.mode == LV_SB_MODE_DRAG) { + lv_disp_t * disp = lv_obj_get_disp(page); lv_area_t sb_area_tmp; if(page_ext->sb.hor_draw) { lv_area_copy(&sb_area_tmp, &page_ext->sb.hor_area); @@ -1007,7 +1006,7 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.x2 += page->coords.x1; sb_area_tmp.y2 += page->coords.y1; - lv_inv_area(&sb_area_tmp); + lv_inv_area(disp, &sb_area_tmp); page_ext->sb.hor_draw = 0; } if(page_ext->sb.ver_draw) { @@ -1016,7 +1015,7 @@ static lv_res_t lv_page_scrollable_signal(lv_obj_t * scrl, lv_signal_t sign, voi sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.x2 += page->coords.x1; sb_area_tmp.y2 += page->coords.y1; - lv_inv_area(&sb_area_tmp); + lv_inv_area(disp, &sb_area_tmp); page_ext->sb.ver_draw = 0; } } @@ -1068,6 +1067,7 @@ static void lv_page_sb_refresh(lv_obj_t * page) } /*Invalidate the current (old) scrollbar areas*/ + lv_disp_t * disp = lv_obj_get_disp(page); lv_area_t sb_area_tmp; if(ext->sb.hor_draw != 0) { lv_area_copy(&sb_area_tmp, &ext->sb.hor_area); @@ -1075,7 +1075,7 @@ static void lv_page_sb_refresh(lv_obj_t * page) sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.x2 += page->coords.x1; sb_area_tmp.y2 += page->coords.y1; - lv_inv_area(&sb_area_tmp); + lv_inv_area(disp, &sb_area_tmp); } if(ext->sb.ver_draw != 0) { lv_area_copy(&sb_area_tmp, &ext->sb.ver_area); @@ -1083,7 +1083,7 @@ static void lv_page_sb_refresh(lv_obj_t * page) sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.x2 += page->coords.x1; sb_area_tmp.y2 += page->coords.y1; - lv_inv_area(&sb_area_tmp); + lv_inv_area(disp, &sb_area_tmp); } @@ -1137,7 +1137,7 @@ static void lv_page_sb_refresh(lv_obj_t * page) sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.x2 += page->coords.x1; sb_area_tmp.y2 += page->coords.y1; - lv_inv_area(&sb_area_tmp); + lv_inv_area(disp, &sb_area_tmp); } if(ext->sb.ver_draw != 0) { lv_area_copy(&sb_area_tmp, &ext->sb.ver_area); @@ -1145,7 +1145,7 @@ static void lv_page_sb_refresh(lv_obj_t * page) sb_area_tmp.y1 += page->coords.y1; sb_area_tmp.x2 += page->coords.x1; sb_area_tmp.y2 += page->coords.y1; - lv_inv_area(&sb_area_tmp); + lv_inv_area(disp, &sb_area_tmp); } } diff --git a/lv_objx/lv_page.h b/lv_objx/lv_page.h index 32f6104db..4382aafc9 100644 --- a/lv_objx/lv_page.h +++ b/lv_objx/lv_page.h @@ -173,17 +173,42 @@ void lv_page_set_scroll_propagation(lv_obj_t * page, bool en); */ void lv_page_set_edge_flash(lv_obj_t * page, bool en); + /** - * Set the fit attribute of the scrollable part of a page. - * It means it can set its size automatically to involve all children. - * (Can be set separately horizontally and vertically) + * 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 hor_en true: enable horizontal fit - * @param ver_en true: enable vertical fit + * @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_fit(lv_obj_t *page, bool hor_en, bool ver_en) +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_fit(lv_page_get_scrl(page), hor_en, ver_en); + 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); } /** @@ -303,23 +328,43 @@ static inline lv_layout_t lv_page_get_scrl_layout(const lv_obj_t * page) } /** -* Get horizontal fit attribute of the scrollable part of a page -* @param page pointer to a page object -* @return true: horizontal fit is enabled; false: disabled -*/ -static inline bool lv_page_get_scrl_hor_fit(const lv_obj_t * 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_hor_fit(lv_page_get_scrl(page)); + return lv_cont_get_fit_left(lv_page_get_scrl(page)); } /** -* Get vertical fit attribute of the scrollable part of a page -* @param page pointer to a page object -* @return true: vertical fit is enabled; false: disabled -*/ -static inline bool lv_page_get_scrl_fit_ver(const lv_obj_t * 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_ver_fit(lv_page_get_scrl(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_get_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)); } /** diff --git a/lv_objx/lv_preload.c b/lv_objx/lv_preload.c index 1700a4dab..9532e53c8 100644 --- a/lv_objx/lv_preload.c +++ b/lv_objx/lv_preload.c @@ -93,7 +93,7 @@ lv_obj_t * lv_preload_create(lv_obj_t * par, const lv_obj_t * copy) /*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->preload); + lv_preload_set_style(new_preload, LV_PRELOAD_STYLE_MAIN, th->style.preload); } else { lv_obj_set_style(new_preload, &lv_style_pretty_color); } diff --git a/lv_objx/lv_roller.c b/lv_objx/lv_roller.c index ae3419ddb..cb5960d20 100644 --- a/lv_objx/lv_roller.c +++ b/lv_objx/lv_roller.c @@ -84,8 +84,8 @@ lv_obj_t * lv_roller_create(lv_obj_t * par, const lv_obj_t * copy) if(copy == NULL) { lv_obj_t * scrl = lv_page_get_scrl(new_roller); lv_obj_set_drag(scrl, true); /*In ddlist is might be disabled*/ - lv_page_set_rel_action(new_roller, NULL); /*Roller don't uses it (like ddlist)*/ - lv_page_set_scrl_fit(new_roller, true, false); /*Height is specified directly*/ + lv_page_set_rel_action(new_roller, NULL); /*Roller don't uses it (like ddlist)*/ + 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_ANIM_TIME); lv_roller_set_visible_row_count(new_roller, 3); @@ -96,8 +96,8 @@ lv_obj_t * lv_roller_create(lv_obj_t * par, const lv_obj_t * copy) /*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->roller.bg); - lv_roller_set_style(new_roller, LV_ROLLER_STYLE_SEL, th->roller.sel); + 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 { /*Let the ddlist's style*/ lv_obj_refresh_style(new_roller); /*To set scrollable size automatically*/ @@ -209,7 +209,7 @@ lv_label_align_t lv_roller_get_align(const lv_obj_t * roller) */ bool lv_roller_get_hor_fit(const lv_obj_t * roller) { - return lv_page_get_scrl_hor_fit(roller); + return lv_page_get_scrl_fit_left(roller); } /** @@ -361,6 +361,7 @@ static lv_res_t lv_roller_signal(lv_obj_t * roller, lv_signal_t sign, void * par refr_position(roller, false); } } else if(sign == LV_SIGNAL_FOCUS) { +#if USE_LV_GROUP lv_group_t * g = lv_obj_get_group(roller); bool editing = lv_group_get_editing(g); lv_hal_indev_type_t indev_type = lv_indev_get_type(lv_indev_get_act()); @@ -382,12 +383,15 @@ static lv_res_t lv_roller_signal(lv_obj_t * roller, lv_signal_t sign, void * par 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 USE_LV_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_CONTROLL) { char c = *((char *)param); if(c == LV_GROUP_KEY_RIGHT || c == LV_GROUP_KEY_DOWN) { @@ -402,9 +406,11 @@ static lv_res_t lv_roller_signal(lv_obj_t * roller, lv_signal_t sign, void * par ext->ddlist.sel_opt_id_ori = ext->ddlist.sel_opt_id; /*Set the entered value as default*/ if(ext->ddlist.action) ext->ddlist.action(roller); +#if USE_LV_GROUP lv_group_t * g = lv_obj_get_group(roller); bool editing = lv_group_get_editing(g); if(editing) lv_group_set_editing(g, false); /*In edit mode go to navigate mode if an option is selected*/ +#endif } } else if(sign == LV_SIGNAL_GET_TYPE) { lv_obj_type_t * buf = param; diff --git a/lv_objx/lv_slider.c b/lv_objx/lv_slider.c index eaf04e8c2..d75f84bd1 100644 --- a/lv_objx/lv_slider.c +++ b/lv_objx/lv_slider.c @@ -86,9 +86,9 @@ lv_obj_t * lv_slider_create(lv_obj_t * par, const lv_obj_t * copy) /*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->slider.bg); - lv_slider_set_style(new_slider, LV_SLIDER_STYLE_INDIC, th->slider.indic); - lv_slider_set_style(new_slider, LV_SLIDER_STYLE_KNOB, th->slider.knob); + 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); } diff --git a/lv_objx/lv_spinbox.c b/lv_objx/lv_spinbox.c index dc4c6086b..0d5e4edbf 100644 --- a/lv_objx/lv_spinbox.c +++ b/lv_objx/lv_spinbox.c @@ -10,6 +10,7 @@ #if USE_LV_SPINBOX != 0 #include "../lv_themes/lv_theme.h" +#include "../lv_misc/lv_math.h" /********************* * DEFINES @@ -64,19 +65,18 @@ lv_obj_t * lv_spinbox_create(lv_obj_t * par, const lv_obj_t * copy) /*Initialize the allocated 'ext'*/ ext->ta.one_line = 1; ext->ta.pwd_mode = 0; - ext->ta.accapted_chars = "1234567890+-."; + ext->ta.accapted_chars = "1234567890+-. "; ext->value = 0; - ext->dec_point_pos = 2; + ext->dec_point_pos = 0; ext->digit_count = 5; - ext->step = 100; + ext->digit_padding_left = 0; + ext->step = 1; ext->range_max = 99999; ext->range_min = -99999; ext->value_changed_cb = NULL; lv_ta_set_cursor_type(new_spinbox, LV_CURSOR_BLOCK | LV_CURSOR_HIDDEN); /*hidden by default*/ - lv_ta_set_cursor_pos(new_spinbox, 4); - /*The signal and design functions are not copied so set them here*/ lv_obj_set_signal_func(new_spinbox, lv_spinbox_signal); @@ -87,9 +87,9 @@ lv_obj_t * lv_spinbox_create(lv_obj_t * par, const lv_obj_t * copy) /*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->spinbox.bg); - lv_spinbox_set_style(new_spinbox, LV_SPINBOX_STYLE_CURSOR, th->spinbox.cursor); - lv_spinbox_set_style(new_spinbox, LV_SPINBOX_STYLE_SB, th->spinbox.sb); + 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*/ @@ -189,13 +189,11 @@ void lv_spinbox_set_range(lv_obj_t * spinbox, int32_t range_min, int32_t range_m ext->range_max = range_max; ext->range_min = range_min; - if(ext->value > ext->range_max) - { + if(ext->value > ext->range_max) { ext->value = ext->range_max; lv_obj_invalidate(spinbox); } - if(ext->value < ext->range_min) - { + if(ext->value < ext->range_min) { ext->value = ext->range_min; lv_obj_invalidate(spinbox); } @@ -252,11 +250,9 @@ void lv_spinbox_step_next(lv_obj_t * spinbox) { lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); - - if((ext->step / 10) < ext->range_max && (ext->step / 10) > ext->range_min && (ext->step / 10) > 0) - { - ext->step /= 10; - } + int32_t new_step = ext->step / 10; + if((new_step) > 0) ext->step = new_step; + else ext->step = 1; lv_spinbox_updatevalue(spinbox); } @@ -268,12 +264,10 @@ void lv_spinbox_step_next(lv_obj_t * spinbox) void lv_spinbox_step_previous(lv_obj_t * spinbox) { lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); - - - if((ext->step * 10) <= ext->range_max && (ext->step * 10) > ext->range_min && (ext->step * 10) > 0) - { - ext->step *= 10; - } + 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); } @@ -286,20 +280,16 @@ void lv_spinbox_increment(lv_obj_t * spinbox) { lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); - if(ext->value + ext->step <= ext->range_max) - { + 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; - }/*end special mode*/ + if((ext->value + ext->step) > 0 && ext->value < 0) ext->value = -ext->value; ext->value += ext->step; - if(ext->value_changed_cb != NULL) - { - ext->value_changed_cb(spinbox, ext->value); - } + } else { + ext->value = ext->range_max; } + + if(ext->value_changed_cb != NULL) ext->value_changed_cb(spinbox, ext->value); lv_spinbox_updatevalue(spinbox); } @@ -311,20 +301,15 @@ void lv_spinbox_decrement(lv_obj_t * spinbox) { lv_spinbox_ext_t * ext = lv_obj_get_ext_attr(spinbox); - if(ext->value - ext->step >= ext->range_min) - { + 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; - }/*end special mode*/ + if((ext->value - ext->step) < 0 && ext->value > 0) ext->value = -ext->value; ext->value -= ext->step; - - if(ext->value_changed_cb != NULL) - { - ext->value_changed_cb(spinbox, ext->value); - } + } else { + ext->value = ext->range_min; } + + if(ext->value_changed_cb != NULL) ext->value_changed_cb(spinbox, ext->value); lv_spinbox_updatevalue(spinbox); } @@ -366,131 +351,121 @@ static lv_res_t lv_spinbox_signal(lv_obj_t * spinbox, lv_signal_t sign, void * p if(buf->type[i] == NULL) break; } buf->type[i] = "lv_spinbox"; - }else if(sign == LV_SIGNAL_CONTROLL) - { + } + else if(sign == LV_SIGNAL_CONTROLL) { lv_hal_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_GROUP_KEY_RIGHT) - { - if(indev_type == LV_INDEV_TYPE_ENCODER) - { - lv_spinbox_increment(spinbox); - } - else - { - lv_spinbox_step_next(spinbox); - } + if(c == LV_GROUP_KEY_RIGHT) { + if(indev_type == LV_INDEV_TYPE_ENCODER) lv_spinbox_increment(spinbox); + else lv_spinbox_step_next(spinbox); } - else if(c == LV_GROUP_KEY_LEFT) - { - if(indev_type == LV_INDEV_TYPE_ENCODER) - { - lv_spinbox_decrement(spinbox); - } - else - { + else if(c == LV_GROUP_KEY_LEFT) { + if(indev_type == LV_INDEV_TYPE_ENCODER) lv_spinbox_decrement(spinbox); + else lv_spinbox_step_previous(spinbox); + } + else if(c == LV_GROUP_KEY_UP) { + lv_spinbox_increment(spinbox); + } + else if(c == LV_GROUP_KEY_DOWN) { + lv_spinbox_decrement(spinbox); + } + else if(c == LV_GROUP_KEY_ENTER) { + + 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_previous(spinbox); } } - else if(c == LV_GROUP_KEY_UP) - { - lv_spinbox_increment(spinbox); - } - else if(c == LV_GROUP_KEY_DOWN) - { - lv_spinbox_decrement(spinbox); - } - else - { - if(c == LV_GROUP_KEY_ENTER) - { - int p = lv_ta_get_cursor_pos(spinbox); - if(p == (1 + ext->digit_padding_left + ext->digit_count)) - { - for(int i = 0; i < ext->digit_count; i++) - lv_spinbox_step_previous(spinbox); - } else - { - lv_spinbox_step_next(spinbox); - } - - - lv_spinbox_updatevalue(spinbox); - } - else - { - lv_ta_add_char(spinbox, c); - } + 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); - int32_t v = ext->value; - int32_t intDigits, decDigits; - uint8_t dc = ext->digit_count; - intDigits = (ext->dec_point_pos==0) ? ext->digit_count : ext->dec_point_pos; - decDigits = ext->digit_count - intDigits; + char buf[LV_SPINBOX_MAX_DIGIT_COUNT + 8]; + memset(buf, 0, sizeof(buf)); + char * buf_p = buf; - ext->digits[0] = v>=0 ? '+' : '-'; + /*Add the sign*/ + (*buf_p) = ext->value >= 0 ? '+' : '-'; + buf_p++; - int pl; /*padding left*/ - for(pl = 0; pl < ext->digit_padding_left; pl++) - { - ext->digits[1 + pl] = ' '; + int i; + /*padding left*/ + for(i = 0; i < ext->digit_padding_left; i++) { + (*buf_p) = ' '; + buf_p++; } - int i = 0; - uint8_t digits[16]; + char digits[64]; + /*Convert the numbers to string (the sign is already handled so always covert positive number)*/ + lv_math_num_to_str(ext->value < 0 ? -ext->value : ext->value, digits); - if(v < 0) - v = -v; - for(i = 0; i < dc; i++) - { - digits[i] = v%10; - v = v/10; + /*Add leading zeros*/ + int lz_cnt = ext->digit_count - (int)strlen(digits); + if(lz_cnt > 0) { + for(i = strlen(digits); i >= 0; i--) { + digits[i + lz_cnt] = digits[i]; + } + for(i = 0; i < lz_cnt; i++) { + digits[i] = '0'; + } } - int k; - for(k = 0; k < intDigits; k++) - { - ext->digits[1 + pl + k] = '0' + digits[--i]; + 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++; } - ext->digits[1 + pl + intDigits] = '.'; + if(ext->dec_point_pos != 0) { + /*Insert the decimal point*/ + (*buf_p) = '.'; + buf_p++; - int d; - - for(d = 0; d < decDigits; d++) - { - ext->digits[1 + pl + intDigits + 1 + d] = '0' + digits[--i]; + for(/*Leave i*/ ;i < ext->digit_count && digits[i] != '\0'; i++) { + (*buf_p) = digits[i]; + buf_p++; + } } - ext->digits[1 + pl + intDigits + 1 + decDigits] = '\0'; + /*Refresh the text*/ + lv_ta_set_text(spinbox, (char*)buf); - lv_label_set_text(ext->ta.label, (char*)ext->digits); + /*Set the cursor position*/ int32_t step = ext->step; - uint8_t cPos = ext->digit_count + pl; + uint8_t cur_pos = ext->digit_count; while(step >= 10) { step /= 10; - cPos--; + cur_pos--; } - if(cPos > pl + intDigits ) - { - cPos ++; - } + if(cur_pos > intDigits ) cur_pos ++; /*Skip teh decimal point*/ - lv_ta_set_cursor_pos(spinbox, cPos); + cur_pos += ext->digit_padding_left; + + lv_ta_set_cursor_pos(spinbox, cur_pos); } #endif diff --git a/lv_objx/lv_spinbox.h b/lv_objx/lv_spinbox.h index c2956d055..ca5761487 100644 --- a/lv_objx/lv_spinbox.h +++ b/lv_objx/lv_spinbox.h @@ -50,11 +50,9 @@ typedef struct { int32_t range_max; int32_t range_min; int32_t step; - uint8_t digit_count:4; - uint8_t dec_point_pos:4; /*if 0, there is no separator and the number is an integer*/ - uint8_t digit_padding_left:4; - uint8_t digit_padding_right:4; - uint8_t digits[1+1+LV_SPINBOX_MAX_DIGIT_COUNT]; /*1 sign, 1 point, 16 num digits*/ + 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_value_changed_cb_t value_changed_cb; } lv_spinbox_ext_t; diff --git a/lv_objx/lv_sw.c b/lv_objx/lv_sw.c index 2b09354ae..35fe47674 100644 --- a/lv_objx/lv_sw.c +++ b/lv_objx/lv_sw.c @@ -88,10 +88,10 @@ lv_obj_t * lv_sw_create(lv_obj_t * par, const lv_obj_t * copy) /*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->sw.bg); - lv_sw_set_style(new_sw, LV_SW_STYLE_INDIC, th->sw.indic); - lv_sw_set_style(new_sw, LV_SW_STYLE_KNOB_OFF, th->sw.knob_off); - lv_sw_set_style(new_sw, LV_SW_STYLE_KNOB_ON, th->sw.knob_on); + 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*/ } diff --git a/lv_objx/lv_ta.c b/lv_objx/lv_ta.c index 8199cd3e3..a5a50c99f 100644 --- a/lv_objx/lv_ta.c +++ b/lv_objx/lv_ta.c @@ -108,6 +108,7 @@ lv_obj_t * lv_ta_create(lv_obj_t * par, const lv_obj_t * copy) ext->cursor.valid_x = 0; ext->one_line = 0; ext->label = NULL; + ext->placeholder = NULL; lv_obj_set_signal_func(new_ta, lv_ta_signal); lv_obj_set_signal_func(lv_page_get_scrl(new_ta), lv_ta_scrollable_signal); @@ -115,6 +116,8 @@ lv_obj_t * lv_ta_create(lv_obj_t * par, const lv_obj_t * copy) /*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_func(ext->page.scrl, lv_ta_scrollable_design); @@ -129,8 +132,8 @@ lv_obj_t * lv_ta_create(lv_obj_t * par, const lv_obj_t * copy) /*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->ta.area); - lv_ta_set_style(new_ta, LV_TA_STYLE_SB, th->ta.sb); + 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); } @@ -607,7 +610,7 @@ void lv_ta_set_one_line(lv_obj_t * ta, bool en) lv_coord_t font_h = lv_font_get_height(style_label->text.font); ext->one_line = 1; - lv_page_set_scrl_fit(ta, true, true); + lv_page_set_scrl_fit2(ta, LV_FIT_TIGHT, LV_FIT_FLOOD); lv_obj_set_height(ta, font_h + (style_ta->body.padding.ver + style_scrl->body.padding.ver) * 2); 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); @@ -616,7 +619,7 @@ void lv_ta_set_one_line(lv_obj_t * ta, bool en) lv_style_t * style_ta = lv_obj_get_style(ta); ext->one_line = 0; - lv_page_set_scrl_fit(ta, false, true); + 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); @@ -645,19 +648,17 @@ void lv_ta_set_text_align(lv_obj_t * ta, lv_label_align_t align) /*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_fit(ta, true, false); + lv_page_set_scrl_fit2(ta, LV_FIT_TIGHT, LV_FIT_FLOOD); lv_label_set_align(label, 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_fit(ta, false, false); - lv_page_set_scrl_width(ta, 1); /*To refresh the scrollable's width*/ + lv_page_set_scrl_fit2(ta, LV_FIT_FLOOD, LV_FIT_FLOOD); lv_label_set_align(label, align); - lv_style_t * bg_style = lv_ta_get_style(ta, LV_TA_STYLE_BG); - lv_obj_set_width(label, lv_obj_get_width(ta) - 2 * bg_style->body.padding.hor); + lv_obj_set_width(label, lv_page_get_fit_width(ta)); } } @@ -1230,13 +1231,14 @@ static void cursor_blink_anim(lv_obj_t * ta, uint8_t show) if(ext->cursor.type != LV_CURSOR_NONE && (ext->cursor.type & LV_CURSOR_HIDDEN) == 0) { + lv_disp_t * disp = lv_obj_get_disp(ta); 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_inv_area(&area_tmp); + lv_inv_area(disp, &area_tmp); } } } @@ -1421,13 +1423,14 @@ static void refr_cursor_area(lv_obj_t * ta) } /*Save the new area*/ + lv_disp_t * disp = lv_obj_get_disp(ta); 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_inv_area(&area_tmp); + lv_inv_area(disp, &area_tmp); lv_area_copy(&ext->cursor.area, &cur_area); @@ -1436,7 +1439,7 @@ static void refr_cursor_area(lv_obj_t * ta) area_tmp.y1 += ext->label->coords.y1; area_tmp.x2 += ext->label->coords.x1; area_tmp.y2 += ext->label->coords.y1; - lv_inv_area(&area_tmp); + lv_inv_area(disp, &area_tmp); } static void placeholder_update(lv_obj_t * ta) @@ -1470,9 +1473,12 @@ static void update_cursor_position_on_click(lv_obj_t * ta, lv_indev_t * click_so lv_obj_get_coords(ext->label, &label_coords); + lv_point_t point_act; + lv_indev_get_point(click_source, &point_act); + if(point_act.x < 0 || point_act.y < 0) return; /*Ignore event from keypad*/ lv_point_t relative_position; - relative_position.x = click_source->proc.act_point.x - label_coords.x1; - relative_position.y = click_source->proc.act_point.y - label_coords.y1; + relative_position.x = point_act.x - label_coords.x1; + relative_position.y = point_act.y - label_coords.y1; lv_coord_t label_width = lv_obj_get_width(ext->label); diff --git a/lv_objx/lv_table.c b/lv_objx/lv_table.c index f1446ce33..55cb12896 100644 --- a/lv_objx/lv_table.c +++ b/lv_objx/lv_table.c @@ -89,11 +89,11 @@ lv_obj_t * lv_table_create(lv_obj_t * par, const lv_obj_t * copy) /*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->table.bg); - lv_table_set_style(new_table, LV_TABLE_STYLE_CELL1, th->table.cell); - lv_table_set_style(new_table, LV_TABLE_STYLE_CELL2, th->table.cell); - lv_table_set_style(new_table, LV_TABLE_STYLE_CELL3, th->table.cell); - lv_table_set_style(new_table, LV_TABLE_STYLE_CELL4, th->table.cell); + 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); } diff --git a/lv_objx/lv_tabview.c b/lv_objx/lv_tabview.c index 8b16ec878..a777f33d5 100644 --- a/lv_objx/lv_tabview.c +++ b/lv_objx/lv_tabview.c @@ -106,7 +106,8 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) ext->tab_name_ptr[0] = ""; ext->tab_cnt = 0; - lv_obj_set_size(new_tabview, LV_HOR_RES, LV_VER_RES); + lv_disp_t * disp = lv_obj_get_disp(new_tabview); + lv_obj_set_size(new_tabview, lv_disp_get_hor_res(disp), lv_disp_get_ver_res(disp)); ext->btns = lv_btnm_create(new_tabview, NULL); lv_obj_set_height(ext->btns, 3 * LV_DPI / 4); @@ -120,22 +121,22 @@ lv_obj_t * lv_tabview_create(lv_obj_t * par, const lv_obj_t * copy) lv_obj_set_click(ext->indic, false); ext->content = lv_cont_create(new_tabview, NULL); - lv_cont_set_fit(ext->content, true, 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_style_transp_tight); - lv_obj_set_height(ext->content, LV_VER_RES - lv_obj_get_height(ext->btns)); + 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->tabview.bg); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_INDIC, th->tabview.indic); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BTN_BG, th->tabview.btn.bg); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BTN_REL, th->tabview.btn.rel); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BTN_PR, th->tabview.btn.pr); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BTN_TGL_REL, th->tabview.btn.tgl_rel); - lv_tabview_set_style(new_tabview, LV_TABVIEW_STYLE_BTN_TGL_PR, th->tabview.btn.tgl_pr); + 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_transp); @@ -621,12 +622,14 @@ static lv_res_t lv_tabview_signal(lv_obj_t * tabview, lv_signal_t sign, void * p lv_hal_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) { +#if USE_LV_GROUP lv_group_t * g = lv_obj_get_group(tabview); if(lv_group_get_editing(g)) { lv_btnm_ext_t * btnm_ext = lv_obj_get_ext_attr(ext->btns); btnm_ext->btn_id_pr = 0; lv_obj_invalidate(ext->btns); } +#endif } else { lv_btnm_ext_t * btnm_ext = lv_obj_get_ext_attr(ext->btns); btnm_ext->btn_id_pr = 0; diff --git a/lv_objx/lv_tileview.c b/lv_objx/lv_tileview.c index c80cfecad..4286a0470 100644 --- a/lv_objx/lv_tileview.c +++ b/lv_objx/lv_tileview.c @@ -89,15 +89,15 @@ lv_obj_t * lv_tileview_create(lv_obj_t * par, const lv_obj_t * copy) /*Init the new tileview*/ if(copy == NULL) { - lv_obj_set_size(new_tileview, LV_HOR_RES, LV_VER_RES); + lv_obj_set_size(new_tileview, LV_DPI * 3, LV_DPI * 3); lv_obj_set_drag_throw(lv_page_get_scrl(new_tileview), false); - lv_page_set_scrl_fit(new_tileview, true, true); + lv_page_set_scrl_fit(new_tileview, LV_FIT_TIGHT); /*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->tileview.bg); - lv_page_set_style(new_tileview, LV_PAGE_STYLE_SCRL, th->tileview.scrl); - lv_page_set_style(new_tileview, LV_PAGE_STYLE_SB, th->tileview.sb); + 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); @@ -343,14 +343,14 @@ static lv_res_t lv_tileview_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void /*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.drag_sum.x <= -LV_INDEV_DRAG_LIMIT) || - (ext->drag_left_en && indev->proc.drag_sum.x >= LV_INDEV_DRAG_LIMIT))) { + ((ext->drag_right_en && indev->proc.types.pointer.drag_sum.x <= -LV_INDEV_DRAG_LIMIT) || + (ext->drag_left_en && indev->proc.types.pointer.drag_sum.x >= LV_INDEV_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.drag_sum.y <= -LV_INDEV_DRAG_LIMIT) || - (ext->drag_top_en && indev->proc.drag_sum.y >= LV_INDEV_DRAG_LIMIT))) { + ((ext->drag_bottom_en && indev->proc.types.pointer.drag_sum.y <= -LV_INDEV_DRAG_LIMIT) || + (ext->drag_top_en && indev->proc.types.pointer.drag_sum.y >= LV_INDEV_DRAG_LIMIT))) { ext->drag_ver = 1; } @@ -369,7 +369,7 @@ static lv_res_t lv_tileview_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void 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.vect.y > 0 && ext->drag_hor == 0) { + if(y > -(ext->act_id.y * h) && indev->proc.types.pointer.vect.y > 0 && ext->drag_hor == 0) { 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) { @@ -380,7 +380,7 @@ static lv_res_t lv_tileview_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void lv_obj_set_y(scrl, -ext->act_id.y * h); } } - if(ext->drag_bottom_en == 0 && indev->proc.vect.y < 0 && ext->drag_hor == 0) { + 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(ext->page.edge_flash.enabled && ext->page.edge_flash.left_ip == 0 && ext->page.edge_flash.right_ip == 0 && @@ -393,7 +393,7 @@ static lv_res_t lv_tileview_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void lv_obj_set_y(scrl, -ext->act_id.y * h); } if(ext->drag_left_en == 0) { - if(x > -(ext->act_id.x * w) && indev->proc.vect.x > 0 && ext->drag_ver == 0) { + if(x > -(ext->act_id.x * w) && indev->proc.types.pointer.vect.x > 0 && ext->drag_ver == 0) { 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) { @@ -404,7 +404,7 @@ static lv_res_t lv_tileview_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void lv_obj_set_x(scrl, -ext->act_id.x * w); } } - if(ext->drag_right_en == 0 && indev->proc.vect.x < 0 && ext->drag_ver == 0) { + 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(ext->page.edge_flash.enabled && ext->page.edge_flash.left_ip == 0 && ext->page.edge_flash.right_ip == 0 && @@ -475,14 +475,14 @@ static lv_res_t element_signal_func(lv_obj_t * element, lv_signal_t sign, void * * 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(indev->proc.drag_in_prog && (ext->drag_hor || ext->drag_ver)) { + if(lv_indev_is_dragging(indev) && (ext->drag_hor || ext->drag_ver)) { lv_obj_t * drag_obj = element; while(lv_obj_get_drag_parent(drag_obj)) { drag_obj = lv_obj_get_parent(drag_obj); if(drag_obj == NULL) break; } - indev->proc.drag_in_prog = 0; + indev->proc.types.pointer.drag_in_prog = 0; if(drag_obj) drag_obj->signal_func(drag_obj, LV_SIGNAL_DRAG_END, NULL); } @@ -506,8 +506,8 @@ static void drag_end_handler(lv_obj_t * tileview) lv_obj_t * scrl = lv_page_get_scrl(tileview); lv_point_t p; - p.x = - (scrl->coords.x1 - LV_HOR_RES / 2); - p.y = - (scrl->coords.y1 - LV_VER_RES / 2); + 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) { diff --git a/lv_objx/lv_win.c b/lv_objx/lv_win.c index 3bc968dda..bbeee6736 100644 --- a/lv_objx/lv_win.c +++ b/lv_objx/lv_win.c @@ -10,6 +10,7 @@ #if USE_LV_WIN != 0 #include "../lv_themes/lv_theme.h" +#include "../lv_core/lv_disp.h" /********************* * DEFINES @@ -70,7 +71,10 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy) /*Init the new window object*/ if(copy == NULL) { - lv_obj_set_size(new_win, LV_HOR_RES, LV_VER_RES); + lv_disp_t * disp = lv_obj_get_disp(new_win); + lv_coord_t hres = lv_disp_get_hor_res(disp); + lv_coord_t vres = lv_disp_get_ver_res(disp); + lv_obj_set_size(new_win, hres, vres); lv_obj_set_pos(new_win, 0, 0); lv_obj_set_style(new_win, &lv_style_pretty); @@ -92,13 +96,13 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy) /*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->win.bg); - lv_win_set_style(new_win, LV_WIN_STYLE_SB, th->win.sb); - lv_win_set_style(new_win, LV_WIN_STYLE_HEADER, th->win.header); - lv_win_set_style(new_win, LV_WIN_STYLE_CONTENT_BG, th->win.content.bg); - lv_win_set_style(new_win, LV_WIN_STYLE_CONTENT_SCRL, th->win.content.scrl); - lv_win_set_style(new_win, LV_WIN_STYLE_BTN_REL, th->win.btn.rel); - lv_win_set_style(new_win, LV_WIN_STYLE_BTN_PR, th->win.btn.pr); + 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_BG, th->style.win.content.bg); + lv_win_set_style(new_win, LV_WIN_STYLE_CONTENT_SCRL, th->style.win.content.scrl); + 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_BG, &lv_style_plain); @@ -107,7 +111,6 @@ lv_obj_t * lv_win_create(lv_obj_t * par, const lv_obj_t * copy) } lv_obj_set_signal_func(new_win, lv_win_signal); - lv_obj_set_size(new_win, LV_HOR_RES, LV_VER_RES); } /*Copy an existing object*/ else { diff --git a/lv_porting/lv_port_disp_templ.c b/lv_porting/lv_port_disp_templ.c index 18e676372..39f928d23 100644 --- a/lv_porting/lv_port_disp_templ.c +++ b/lv_porting/lv_port_disp_templ.c @@ -24,9 +24,7 @@ **********************/ static void disp_init(void); -static void disp_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p); -static void disp_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p); -static void disp_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t color); +static void disp_flush(lv_disp_t * disp, const lv_area_t * area, lv_color_t * color_p); #if USE_LV_GPU static void mem_blend(lv_color_t * dest, const lv_color_t * src, uint32_t length, lv_opa_t opa); static void mem_fill(lv_color_t * dest, uint32_t length, lv_color_t color); @@ -51,6 +49,41 @@ void lv_port_disp_init(void) * -----------------------*/ disp_init(); + /*----------------------------- + * Create a buffer for drawing + *----------------------------*/ + + /* LittlevGL requires a buffer where it draw the objects. The buffer's has to be greater than 1 display row + * + * There are three buffering configurations: + * 1. Create ONE buffer some rows: LittlevGL will draw the display's content here and writes it to your display + * 2. Create TWO buffer some rows: LittlevGL will draw the display's content to a buffer and writes it your display. + * You should use DMA to write the buffer's content to the display. + * It will enable LittlevGL to draw the next part of the screen to the other buffer while + * the data is being sent form the first buffer. It makes rendering and flushing parallel. + * 3. Create TWO screen buffer: Similar to 2) but the buffer have to be screen sized. When LittlevGL is ready it will give the + * whole frame to display. This way you only need to change the frame buffer's address instead of + * copying the pixels. + * */ + + /* Example for 1) */ + static lv_disp_buf_t disp_buf_1; + static lv_color_t buf1_1[LV_HOR_RES_MAX * 10]; /*A buffer for 10 rows*/ + lv_disp_buf_init(&disp_buf_1, buf1_1, NULL, LV_HOR_RES_MAX * 10); /*Initialize the display buffer*/ + + /* Example for 2) */ + static lv_disp_buf_t disp_buf_2; + static lv_color_t buf2_1[LV_HOR_RES_MAX * 10]; /*A buffer for 10 rows*/ + static lv_color_t buf2_2[LV_HOR_RES_MAX * 10]; /*An other buffer for 10 rows*/ + lv_disp_buf_init(&disp_buf_2, buf2_1, buf2_2, LV_HOR_RES_MAX * 10); /*Initialize the display buffer*/ + + /* Example for 3) */ + static lv_disp_buf_t disp_buf_3; + static lv_color_t buf3_1[LV_HOR_RES_MAX * LV_VER_RES_MAX]; /*A screen sized buffer*/ + static lv_color_t buf3_2[LV_HOR_RES_MAX * LV_VER_RES_MAX]; /*An other screen sized buffer*/ + lv_disp_buf_init(&disp_buf_3, buf3_1, buf3_2, LV_HOR_RES_MAX * LV_VER_RES_MAX); /*Initialize the display buffer*/ + + /*----------------------------------- * Register the display in LittlevGL *----------------------------------*/ @@ -60,14 +93,15 @@ void lv_port_disp_init(void) /*Set up the functions to access to your display*/ - /*Used in buffered mode (LV_VDB_SIZE != 0 in lv_conf.h)*/ - disp_drv.disp_flush = disp_flush; + /*Set the resolution of the display*/ + disp_drv.hor_res = 480; + disp_drv.ver_res = 320; - /*Used in unbuffered mode (LV_VDB_SIZE == 0 in lv_conf.h)*/ - disp_drv.disp_fill = disp_fill; + /*Used to copy the buffer's content to the display*/ + disp_drv.flush_cb = disp_flush; - /*Used in unbuffered mode (LV_VDB_SIZE == 0 in lv_conf.h)*/ - disp_drv.disp_map = disp_map; + /*Set a display buffer*/ + disp_drv.buffer = &disp_buf_2; #if USE_LV_GPU /*Optionally add functions to access the GPU. (Only in buffered mode, LV_VDB_SIZE != 0)*/ @@ -95,16 +129,15 @@ static void disp_init(void) /* Flush the content of the internal buffer the specific area on the display * You can use DMA or any hardware acceleration to do this operation in the background but - * 'lv_flush_ready()' has to be called when finished - * This function is required only when LV_VDB_SIZE != 0 in lv_conf.h*/ -static void disp_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p) + * 'lv_disp_flush_ready()' has to be called when finished. */ +static void disp_flush(lv_disp_t * disp, const lv_area_t * area, lv_color_t * color_p) { /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/ int32_t x; int32_t y; - for(y = y1; y <= y2; y++) { - for(x = x1; x <= x2; x++) { + for(y = area->y1; y <= area->y2; y++) { + for(x = area->x1; x <= area->x2; x++) { /* Put a pixel to the display. For example: */ /* put_px(x, y, *color_p)*/ color_p++; @@ -113,46 +146,10 @@ static void disp_flush(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_ /* IMPORTANT!!! * Inform the graphics library that you are ready with the flushing*/ - lv_flush_ready(); + lv_disp_flush_ready(disp); } -/* Write a pixel array (called 'map') to the a specific area on the display - * This function is required only when LV_VDB_SIZE == 0 in lv_conf.h*/ -static void disp_map(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const lv_color_t * color_p) -{ - /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/ - - int32_t x; - int32_t y; - for(y = y1; y <= y2; y++) { - for(x = x1; x <= x2; x++) { - /* Put a pixel to the display. For example: */ - /* put_px(x, y, *color_p)*/ - color_p++; - } - } -} - - -/* Write a pixel array (called 'map') to the a specific area on the display - * This function is required only when LV_VDB_SIZE == 0 in lv_conf.h*/ -static void disp_fill(int32_t x1, int32_t y1, int32_t x2, int32_t y2, lv_color_t color) -{ - /*The most simple case (but also the slowest) to put all pixels to the screen one-by-one*/ - - int32_t x; - int32_t y; - for(y = y1; y <= y2; y++) { - for(x = x1; x <= x2; x++) { - /* Put a pixel to the display. For example: */ - /* put_px(x, y, *color)*/ - } - } - - (void)color; /*Just to avid warnings*/ -} - /*OPTIONAL: GPU INTERFACE*/ #if USE_LV_GPU diff --git a/lv_porting/lv_port_indev_templ.c b/lv_porting/lv_port_indev_templ.c index 102c16f90..c89eb0744 100644 --- a/lv_porting/lv_port_indev_templ.c +++ b/lv_porting/lv_port_indev_templ.c @@ -24,25 +24,25 @@ **********************/ static void touchpad_init(void); -static bool touchpad_read(lv_indev_data_t * data); +static bool touchpad_read(lv_indev_t * indev, lv_indev_data_t * data); static bool touchpad_is_pressed(void); static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y); static void mouse_init(void); -static bool mouse_read(lv_indev_data_t * data); +static bool mouse_read(lv_indev_t * indev, lv_indev_data_t * data); static bool mouse_is_pressed(void); static void mouse_get_xy(lv_coord_t * x, lv_coord_t * y); static void keypad_init(void); -static bool keypad_read(lv_indev_data_t * data); +static bool keypad_read(lv_indev_t * indev, lv_indev_data_t * data); static uint32_t keypad_get_key(void); static void encoder_init(void); -static bool encoder_read(lv_indev_data_t * data); +static bool encoder_read(lv_indev_t * indev, lv_indev_data_t * data); static void encoder_handler(void); static void button_init(void); -static bool button_read(lv_indev_data_t * data); +static bool button_read(lv_indev_t * indev, lv_indev_data_t * data); static int8_t button_get_pressed_id(void); static bool button_is_pressed(uint8_t id); @@ -92,7 +92,7 @@ void lv_port_indev_init(void) /*Register a touchpad input device*/ lv_indev_drv_init(&indev_drv); indev_drv.type = LV_INDEV_TYPE_POINTER; - indev_drv.read = touchpad_read; + indev_drv.read_cb = touchpad_read; indev_touchpad = lv_indev_drv_register(&indev_drv); /*------------------ @@ -105,11 +105,11 @@ void lv_port_indev_init(void) /*Register a mouse input device*/ lv_indev_drv_init(&indev_drv); indev_drv.type = LV_INDEV_TYPE_POINTER; - indev_drv.read = mouse_read; + indev_drv.read_cb = mouse_read; indev_mouse = lv_indev_drv_register(&indev_drv); /*Set cursor. For simplicity set a HOME symbol now.*/ - lv_obj_t * mouse_cursor = lv_img_create(lv_scr_act(), NULL); + lv_obj_t * mouse_cursor = lv_img_create(lv_disp_get_scr_act(NULL), NULL); lv_img_set_src(mouse_cursor, SYMBOL_HOME); lv_indev_set_cursor(indev_mouse, mouse_cursor); @@ -123,7 +123,7 @@ void lv_port_indev_init(void) /*Register a keypad input device*/ lv_indev_drv_init(&indev_drv); indev_drv.type = LV_INDEV_TYPE_KEYPAD; - indev_drv.read = keypad_read; + indev_drv.read_cb = keypad_read; indev_keypad = lv_indev_drv_register(&indev_drv); /* Later you should create group(s) with `lv_group_t * group = lv_group_create()`, @@ -141,7 +141,7 @@ void lv_port_indev_init(void) /*Register a encoder input device*/ lv_indev_drv_init(&indev_drv); indev_drv.type = LV_INDEV_TYPE_KEYPAD; - indev_drv.read = encoder_read; + indev_drv.read_cb = encoder_read; indev_encoder = lv_indev_drv_register(&indev_drv); /* Later you should create group(s) with `lv_group_t * group = lv_group_create()`, @@ -159,7 +159,7 @@ void lv_port_indev_init(void) /*Register a button input device*/ lv_indev_drv_init(&indev_drv); indev_drv.type = LV_INDEV_TYPE_BUTTON; - indev_drv.read = button_read; + indev_drv.read_cb = button_read; indev_button = lv_indev_drv_register(&indev_drv); /*Assign buttons to points on the screen*/ @@ -187,7 +187,7 @@ static void touchpad_init(void) } /* Will be called by the library to read the touchpad */ -static bool touchpad_read(lv_indev_data_t * data) +static bool touchpad_read(lv_indev_t * indev, lv_indev_data_t * data) { static lv_coord_t last_x = 0; static lv_coord_t last_y = 0; @@ -237,7 +237,7 @@ static void mouse_init(void) } /* Will be called by the library to read the mouse */ -static bool mouse_read(lv_indev_data_t * data) +static bool mouse_read(lv_indev_t * indev, lv_indev_data_t * data) { /*Get the current x and y coordinates*/ mouse_get_xy(&data->point.x, &data->point.y); @@ -281,7 +281,7 @@ static void keypad_init(void) } /* Will be called by the library to read the mouse */ -static bool keypad_read(lv_indev_data_t * data) +static bool keypad_read(lv_indev_t * indev, lv_indev_data_t * data) { static uint32_t last_key = 0; @@ -342,7 +342,7 @@ static void encoder_init(void) } /* Will be called by the library to read the encoder */ -static bool encoder_read(lv_indev_data_t * data) +static bool encoder_read(lv_indev_t * indev, lv_indev_data_t * data) { data->enc_diff = encoder_diff; @@ -373,7 +373,7 @@ static void button_init(void) } /* Will be called by the library to read the button */ -static bool button_read(lv_indev_data_t * data) +static bool button_read(lv_indev_t * indev, lv_indev_data_t * data) { static uint8_t last_btn = 0; @@ -389,7 +389,7 @@ static bool button_read(lv_indev_data_t * data) } /*Save the last pressed button's ID*/ - data->btn = last_btn; + data->btn_id = last_btn; /*Return `false` because we are not buffering and no more data to read*/ return false; diff --git a/lv_themes/lv_theme.c b/lv_themes/lv_theme.c index 59a048991..3db5a4cdc 100644 --- a/lv_themes/lv_theme.c +++ b/lv_themes/lv_theme.c @@ -34,10 +34,8 @@ static lv_theme_t * current_theme; * 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. - * Can't determine the size in compile time because sizeof is not evaluated (should be `sizeof(lv_theme_t) / sizeof(lv_style_t*)`). - * Error will be generated in run time if too small.*/ -static lv_style_t th_styles[120]; +/* 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 @@ -60,18 +58,12 @@ void lv_theme_set_current(lv_theme_t * th) #if LV_THEME_LIVE_UPDATE == 0 current_theme = th; #else - uint32_t style_num = sizeof(lv_theme_t) / sizeof(lv_style_t *); /*Number of styles in a theme*/ + uint32_t style_num = sizeof(th->style) / sizeof(lv_style_t *); /*Number of styles in a theme*/ if(!inited) { - /*It's not sure `th_styles` is big enough. Check it now!*/ - if(style_num > sizeof(th_styles) / sizeof(lv_style_t)) { - LV_LOG_ERROR("Themes: th_styles array is too small. Increase it's size!"); - while(1); - } - /*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; + 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 *)); @@ -82,14 +74,24 @@ void lv_theme_set_current(lv_theme_t * th) /*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; + 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 USE_LV_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); + +#if USE_LV_GROUP + lv_group_report_style_mod(NULL); +#endif + #endif } diff --git a/lv_themes/lv_theme.h b/lv_themes/lv_theme.h index 72c40aec5..66bbd3d2d 100644 --- a/lv_themes/lv_theme.h +++ b/lv_themes/lv_theme.h @@ -20,6 +20,7 @@ extern "C" { #endif #include "../lv_core/lv_style.h" +#include "../lv_core/lv_group.h" /********************* * DEFINES @@ -30,264 +31,274 @@ extern "C" { **********************/ typedef struct { - lv_style_t *bg; - lv_style_t *panel; + struct { + lv_style_t *bg; + lv_style_t *panel; #if USE_LV_CONT != 0 - lv_style_t *cont; + lv_style_t *cont; #endif #if USE_LV_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; + 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 USE_LV_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; + 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 USE_LV_LABEL != 0 - struct { - lv_style_t *prim; - lv_style_t *sec; - lv_style_t *hint; - } label; + struct { + lv_style_t *prim; + lv_style_t *sec; + lv_style_t *hint; + } label; #endif #if USE_LV_IMG != 0 - struct { - lv_style_t *light; - lv_style_t *dark; - } img; + struct { + lv_style_t *light; + lv_style_t *dark; + } img; #endif #if USE_LV_LINE != 0 - struct { - lv_style_t *decor; - } line; + struct { + lv_style_t *decor; + } line; #endif #if USE_LV_LED != 0 - lv_style_t *led; + lv_style_t *led; #endif #if USE_LV_BAR != 0 - struct { - lv_style_t *bg; - lv_style_t *indic; - } bar; + struct { + lv_style_t *bg; + lv_style_t *indic; + } bar; #endif #if USE_LV_SLIDER != 0 - struct { - lv_style_t *bg; - lv_style_t *indic; - lv_style_t *knob; - } slider; + struct { + lv_style_t *bg; + lv_style_t *indic; + lv_style_t *knob; + } slider; #endif #if USE_LV_LMETER != 0 - lv_style_t *lmeter; + lv_style_t *lmeter; #endif #if USE_LV_GAUGE != 0 - lv_style_t *gauge; + lv_style_t *gauge; #endif #if USE_LV_ARC != 0 - lv_style_t *arc; + lv_style_t *arc; #endif #if USE_LV_PRELOAD != 0 - lv_style_t *preload; + lv_style_t *preload; #endif #if USE_LV_SW != 0 - struct { - lv_style_t *bg; - lv_style_t *indic; - lv_style_t *knob_off; - lv_style_t *knob_on; - } sw; + struct { + lv_style_t *bg; + lv_style_t *indic; + lv_style_t *knob_off; + lv_style_t *knob_on; + } sw; #endif #if USE_LV_CHART != 0 - lv_style_t *chart; + lv_style_t *chart; #endif #if USE_LV_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; + 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 USE_LV_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; + 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 USE_LV_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; + 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 USE_LV_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; + 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 USE_LV_MBOX != 0 - struct { - lv_style_t *bg; struct { lv_style_t *bg; - lv_style_t *rel; - lv_style_t *pr; - } btn; - } mbox; + struct { + lv_style_t *bg; + lv_style_t *rel; + lv_style_t *pr; + } btn; + } mbox; #endif #if USE_LV_PAGE != 0 - struct { - lv_style_t *bg; - lv_style_t *scrl; - lv_style_t *sb; - } page; -#endif - -#if USE_LV_TA != 0 - struct { - lv_style_t *area; - lv_style_t *oneline; - lv_style_t *cursor; - lv_style_t *sb; - } ta; -#endif - -#if USE_LV_SPINBOX != 0 - struct { - lv_style_t *bg; - lv_style_t *cursor; - lv_style_t *sb; - } spinbox; -#endif - -#if USE_LV_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 USE_LV_DDLIST != 0 - struct { - lv_style_t *bg; - lv_style_t *sel; - lv_style_t *sb; - } ddlist; -#endif - -#if USE_LV_ROLLER != 0 - struct { - lv_style_t *bg; - lv_style_t *sel; - } roller; -#endif - -#if USE_LV_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 USE_LV_TILEVIEW != 0 - struct { - lv_style_t *bg; - lv_style_t *scrl; - lv_style_t *sb; - } tileview; -#endif - -#if USE_LV_TABLE != 0 - struct { - lv_style_t *bg; - lv_style_t *cell; - } table; -#endif - -#if USE_LV_WIN != 0 - struct { - lv_style_t *bg; - lv_style_t *sb; - lv_style_t *header; struct { lv_style_t *bg; lv_style_t *scrl; - } content; + lv_style_t *sb; + } page; +#endif + +#if USE_LV_TA != 0 struct { - lv_style_t *rel; - lv_style_t *pr; - } btn; - } win; + lv_style_t *area; + lv_style_t *oneline; + lv_style_t *cursor; + lv_style_t *sb; + } ta; +#endif + +#if USE_LV_SPINBOX != 0 + struct { + lv_style_t *bg; + lv_style_t *cursor; + lv_style_t *sb; + } spinbox; +#endif + +#if USE_LV_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 USE_LV_DDLIST != 0 + struct { + lv_style_t *bg; + lv_style_t *sel; + lv_style_t *sb; + } ddlist; +#endif + +#if USE_LV_ROLLER != 0 + struct { + lv_style_t *bg; + lv_style_t *sel; + } roller; +#endif + +#if USE_LV_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 USE_LV_TILEVIEW != 0 + struct { + lv_style_t *bg; + lv_style_t *scrl; + lv_style_t *sb; + } tileview; +#endif + +#if USE_LV_TABLE != 0 + struct { + lv_style_t *bg; + lv_style_t *cell; + } table; +#endif + +#if USE_LV_WIN != 0 + struct { + lv_style_t *bg; + lv_style_t *sb; + lv_style_t *header; + struct { + lv_style_t *bg; + lv_style_t *scrl; + } content; + struct { + lv_style_t *rel; + lv_style_t *pr; + } btn; + } win; +#endif + } style; + +#if USE_LV_GROUP + struct + { + lv_group_style_mod_func_t style_mod; + lv_group_style_mod_func_t style_mod_edit; + } group; #endif } lv_theme_t; @@ -312,6 +323,9 @@ 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 *********************/ diff --git a/lv_themes/lv_theme_alien.c b/lv_themes/lv_theme_alien.c index 7b4ea6026..45f706ee4 100644 --- a/lv_themes/lv_theme_alien.c +++ b/lv_themes/lv_theme_alien.c @@ -114,6 +114,7 @@ static void basic_init(void) 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*/ @@ -129,15 +130,15 @@ static void basic_init(void) sb.body.padding.ver = 1; sb.body.padding.inner = LV_DPI / 15; /*Scrollbar width*/ - theme.bg = &bg; - theme.panel = &panel; + theme.style.bg = &bg; + theme.style.panel = &panel; } static void cont_init(void) { #if USE_LV_CONT != 0 - theme.cont = &panel; + theme.style.cont = &panel; #endif } @@ -156,6 +157,7 @@ static void btn_init(void) 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; @@ -165,6 +167,7 @@ static void btn_init(void) 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; @@ -175,6 +178,7 @@ static void btn_init(void) 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; @@ -185,6 +189,7 @@ static void btn_init(void) 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; @@ -192,11 +197,11 @@ static void btn_init(void) btn_ina.text.font = _font; btn_ina.text.color = lv_color_hsv_to_rgb(_hue, 10, 90); - theme.btn.rel = &btn_rel; - theme.btn.pr = &btn_pr; - theme.btn.tgl_rel = &btn_trel; - theme.btn.tgl_pr = &btn_tpr; - theme.btn.ina = &btn_ina; + 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 } @@ -216,9 +221,9 @@ static void label_init(void) lv_style_copy(&label_hint, &label_prim); label_hint.text.color = lv_color_hsv_to_rgb(_hue, 20, 70); - theme.label.prim = &label_prim; - theme.label.sec = &label_sec; - theme.label.hint = &label_hint; + theme.style.label.prim = &label_prim; + theme.style.label.sec = &label_sec; + theme.style.label.hint = &label_hint; #endif } @@ -250,8 +255,8 @@ static void bar_init(void) 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.bar.bg = &bar_bg; - theme.bar.indic = &bar_indic; + theme.style.bar.bg = &bar_bg; + theme.style.bar.indic = &bar_indic; #endif } @@ -267,8 +272,8 @@ static void img_init(void) img_light.image.color = lv_color_hsv_to_rgb(_hue, 85, 65); img_light.image.intense = LV_OPA_80; - theme.img.light = &img_light; - theme.img.dark = &img_dark; + theme.style.img.light = &img_light; + theme.style.img.dark = &img_dark; #endif } @@ -280,7 +285,7 @@ static void line_init(void) line_decor.line.color = lv_color_hsv_to_rgb(_hue, 50, 50); line_decor.line.width = 1; - theme.line.decor = &line_decor; + theme.style.line.decor = &line_decor; #endif } @@ -298,7 +303,7 @@ static void led_init(void) 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.led = &led; + theme.style.led = &led; #endif } @@ -314,9 +319,9 @@ static void slider_init(void) slider_knob.body.border.color = LV_COLOR_GRAY; slider_knob.body.border.opa = LV_OPA_50; - theme.slider.bg = &bar_bg; - theme.slider.indic = &bar_indic; - theme.slider.knob = &slider_knob; + theme.style.slider.bg = &bar_bg; + theme.style.slider.indic = &bar_indic; + theme.style.slider.knob = &slider_knob; #endif } @@ -341,10 +346,10 @@ static void sw_init(void) lv_style_copy(&sw_knob, &slider_knob); sw_knob.body.opa = LV_OPA_80; - theme.sw.bg = &sw_bg; - theme.sw.indic = &sw_indic; - theme.sw.knob_off = &sw_knob; - theme.sw.knob_on = &sw_knob; + 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 } @@ -359,7 +364,7 @@ static void lmeter_init(void) lmeter_bg.line.color = LV_COLOR_HEX3(0x222); lmeter_bg.line.width = 2; - theme.lmeter = &lmeter_bg; + theme.style.lmeter = &lmeter_bg; #endif } @@ -380,7 +385,7 @@ static void gauge_init(void) gauge_bg.text.color = lv_color_hsv_to_rgb(_hue, 10, 90); gauge_bg.text.font = _font; - theme.gauge = &gauge_bg; + theme.style.gauge = &gauge_bg; #endif } @@ -400,7 +405,7 @@ static void arc_init(void) arc.body.padding.hor = 3; arc.body.padding.ver = 3; - theme.arc = &arc; + theme.style.arc = &arc; #endif } @@ -408,14 +413,14 @@ static void preload_init(void) { #if USE_LV_PRELOAD != 0 - theme.preload = theme.arc; + theme.style.preload = theme.style.arc; #endif } static void chart_init(void) { #if USE_LV_CHART - theme.chart = &panel; + theme.style.chart = &panel; #endif } @@ -449,13 +454,13 @@ static void calendar_init(void) lv_style_copy(&gray_text, &def); gray_text.text.color = lv_color_hsv_to_rgb(_hue, 10, 65); - theme.calendar.bg = &panel; - theme.calendar.header = &header; - theme.calendar.week_box = &header; - theme.calendar.today_box = &today_box; - theme.calendar.day_names = &color_text; - theme.calendar.highlighted_days = &color_text; - theme.calendar.inactive_days = &gray_text; + 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 } @@ -501,12 +506,12 @@ static void cb_init(void) cb_ina.body.main_color = LV_COLOR_SILVER; cb_ina.body.grad_color = LV_COLOR_SILVER; - theme.cb.bg = &cb_bg; - theme.cb.box.rel = &cb_rel; - theme.cb.box.pr = &cb_pr; - theme.cb.box.tgl_rel = &cb_trel; - theme.cb.box.tgl_pr = &cb_tpr; - theme.cb.box.ina = &cb_ina; + 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 } @@ -540,24 +545,24 @@ static void btnm_init(void) lv_style_copy(&btnm_ina, &btnm_rel); btnm_ina.text.color = lv_color_hsv_to_rgb(_hue, 10, 60); - theme.btnm.bg = &btnm_bg; - theme.btnm.btn.rel = &btnm_rel; - theme.btnm.btn.pr = &btnm_pr; - theme.btnm.btn.tgl_rel = &btnm_trel; - theme.btnm.btn.tgl_pr = &btnm_pr; - theme.btnm.btn.ina = &btnm_ina; + 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 USE_LV_KB - theme.kb.bg = &btnm_bg; - theme.kb.btn.rel = &btnm_rel; - theme.kb.btn.pr = &btnm_pr; - theme.kb.btn.tgl_rel = &btnm_trel; - theme.kb.btn.tgl_pr = &btnm_pr; - theme.kb.btn.ina = &btnm_ina; + 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 } @@ -569,38 +574,38 @@ static void mbox_init(void) lv_style_copy(&mbox_bg, &panel); mbox_bg.body.shadow.width = LV_DPI / 12; - theme.mbox.bg = &mbox_bg; - theme.mbox.btn.bg = &lv_style_transp; - theme.mbox.btn.rel = &btn_trel; - theme.mbox.btn.pr = &btn_tpr; + 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 USE_LV_PAGE - theme.page.bg = &panel; - theme.page.scrl = &lv_style_transp_fit; - theme.page.sb = &sb; + 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 USE_LV_TA - theme.ta.area = &panel; - theme.ta.oneline = &panel; - theme.ta.cursor = NULL; - theme.ta.sb = &sb; + 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 USE_LV_SPINBOX - theme.spinbox.bg= &panel; - theme.spinbox.cursor = theme.ta.cursor; - theme.spinbox.sb = theme.ta.sb; + theme.style.spinbox.bg= &panel; + theme.style.spinbox.cursor = theme.style.ta.cursor; + theme.style.spinbox.sb = theme.style.ta.sb; #endif } @@ -615,6 +620,7 @@ static void list_init(void) 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.empty = 0; @@ -622,6 +628,7 @@ static void list_init(void) 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); @@ -631,14 +638,14 @@ static void list_init(void) list_bg.body.padding.hor = 0; list_bg.body.padding.ver = 0; - theme.list.sb = &sb; - theme.list.bg = &list_bg; - theme.list.scrl = &lv_style_transp_tight; - theme.list.btn.rel = &list_rel; - theme.list.btn.pr = &list_pr; - theme.list.btn.tgl_rel = &list_trel; - theme.list.btn.tgl_pr = &list_tpr; - theme.list.btn.ina = &list_ina; + 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 } @@ -656,9 +663,9 @@ static void ddlist_init(void) ddlist_sel.body.opa = LV_OPA_COVER; ddlist_sel.body.radius = 0; - theme.ddlist.bg = &ddlist_bg; - theme.ddlist.sel = &ddlist_sel; - theme.ddlist.sb = &sb; + theme.style.ddlist.bg = &ddlist_bg; + theme.style.ddlist.sel = &ddlist_sel; + theme.style.ddlist.sb = &sb; #endif } @@ -682,8 +689,8 @@ static void roller_init(void) roller_sel.text.opa = LV_OPA_COVER; roller_sel.text.color = lv_color_hsv_to_rgb(_hue, 70, 95); - theme.roller.bg = &roller_bg; - theme.roller.sel = &roller_sel; + theme.style.roller.bg = &roller_bg; + theme.style.roller.sel = &roller_sel; #endif } @@ -736,22 +743,22 @@ static void tabview_init(void) tab_indic.body.grad_color = lv_color_hsv_to_rgb(_hue, 80, 87); tab_indic.body.padding.inner = LV_DPI / 10; /*Indicator height*/ - theme.tabview.bg = &bg; - theme.tabview.indic = &tab_indic; - theme.tabview.btn.bg = &lv_style_transp_tight; - theme.tabview.btn.rel = &tab_rel; - theme.tabview.btn.pr = &tab_pr; - theme.tabview.btn.tgl_rel = &tab_trel; - theme.tabview.btn.tgl_pr = &tab_tpr; + 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 USE_LV_TILEVIEW != 0 - theme.tileview.bg = &lv_style_transp_tight; - theme.tileview.scrl = &lv_style_transp_tight; - theme.tileview.sb = theme.page.sb; + 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 } @@ -766,8 +773,8 @@ static void table_init(void) cell.body.padding.ver = LV_DPI / 12; - theme.table.bg = &lv_style_transp_tight; - theme.table.cell = &cell; + theme.style.table.bg = &lv_style_transp_tight; + theme.style.table.cell = &cell; #endif } @@ -787,17 +794,57 @@ static void win_init(void) 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.win.bg = &bg; - theme.win.sb = &sb; - theme.win.header = &header; - theme.win.content.bg = &lv_style_transp; - theme.win.content.scrl = &lv_style_transp; - theme.win.btn.rel = &btn_rel; - theme.win.btn.pr = &btn_pr; + theme.style.win.bg = &bg; + theme.style.win.sb = &sb; + theme.style.win.header = &header; + theme.style.win.content.bg = &lv_style_transp; + theme.style.win.content.scrl = &lv_style_transp; + theme.style.win.btn.rel = &btn_rel; + theme.style.win.btn.pr = &btn_pr; #endif } +#if USE_LV_GROUP + +static void style_mod(lv_style_t * style) +{ +#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_style_t * style) +{ +#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.empty == 0 || 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 /*USE_LV_GROUP*/ + /********************** * GLOBAL FUNCTIONS **********************/ @@ -817,8 +864,8 @@ lv_theme_t * lv_theme_alien_init(uint16_t hue, lv_font_t * font) /*For backward compatibility initialize all theme elements with a default style */ uint16_t i; - lv_style_t ** style_p = (lv_style_t **) &theme; - for(i = 0; i < sizeof(lv_theme_t) / sizeof(lv_style_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++; } @@ -854,6 +901,11 @@ lv_theme_t * lv_theme_alien_init(uint16_t hue, lv_font_t * font) table_init(); win_init(); +#if USE_LV_GROUP + theme.group.style_mod = style_mod; + theme.group.style_mod_edit = style_mod_edit; +#endif + return &theme; } diff --git a/lv_themes/lv_theme_default.c b/lv_themes/lv_theme_default.c index a6ddb7276..3a65455d4 100644 --- a/lv_themes/lv_theme_default.c +++ b/lv_themes/lv_theme_default.c @@ -63,19 +63,19 @@ static void basic_init(void) plain_bordered.body.border.width = 2; plain_bordered.body.border.color = LV_COLOR_HEX3(0xbbb); - theme.bg = &lv_style_plain; - theme.panel = &lv_style_pretty; + theme.style.bg = &lv_style_plain; + theme.style.panel = &lv_style_pretty; } static void btn_init(void) { #if USE_LV_BTN != 0 - theme.btn.rel = &lv_style_btn_rel; - theme.btn.pr = &lv_style_btn_pr; - theme.btn.tgl_rel = &lv_style_btn_tgl_rel; - theme.btn.tgl_pr = &lv_style_btn_tgl_pr; - theme.btn.ina = &lv_style_btn_ina; + 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 } @@ -92,9 +92,9 @@ static void label_init(void) label_hint.text.color = LV_COLOR_HEX3(0xaaa); - theme.label.prim = &label_prim; - theme.label.sec = &label_sec; - theme.label.hint = &label_hint; + theme.style.label.prim = &label_prim; + theme.style.label.sec = &label_sec; + theme.style.label.hint = &label_hint; #endif } @@ -104,8 +104,8 @@ static void img_init(void) #if USE_LV_IMG != 0 - theme.img.light = &def; - theme.img.dark = &def; + theme.style.img.light = &def; + theme.style.img.dark = &def; #endif } @@ -113,7 +113,7 @@ static void line_init(void) { #if USE_LV_LINE != 0 - theme.line.decor = &def; + theme.style.line.decor = &def; #endif } @@ -130,7 +130,7 @@ static void led_init(void) led.body.shadow.color = led.body.main_color; - theme.led = &led; + theme.style.led = &led; #endif } @@ -138,8 +138,8 @@ static void bar_init(void) { #if USE_LV_BAR - theme.bar.bg = &lv_style_pretty; - theme.bar.indic = &lv_style_pretty_color; + theme.style.bar.bg = &lv_style_pretty; + theme.style.bar.indic = &lv_style_pretty_color; #endif } @@ -150,9 +150,9 @@ static void slider_init(void) slider_bg.body.padding.hor = LV_DPI / 20; slider_bg.body.padding.ver = LV_DPI / 20; - theme.slider.bg = &slider_bg; - theme.slider.indic = &lv_style_pretty_color; - theme.slider.knob = &lv_style_pretty; + theme.style.slider.bg = &slider_bg; + theme.style.slider.indic = &lv_style_pretty_color; + theme.style.slider.knob = &lv_style_pretty; #endif } @@ -163,10 +163,10 @@ static void sw_init(void) sw_bg.body.padding.hor = 3; sw_bg.body.padding.ver = 3; - theme.sw.bg = &sw_bg; - theme.sw.indic = &lv_style_pretty_color; - theme.sw.knob_off = &lv_style_pretty; - theme.sw.knob_on = &lv_style_pretty; + 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 } @@ -181,7 +181,7 @@ static void lmeter_init(void) 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.lmeter = &lmeter; + theme.style.lmeter = &lmeter; #endif } @@ -196,7 +196,7 @@ static void gauge_init(void) gauge.body.grad_color = lmeter.body.main_color; gauge.text.color = LV_COLOR_HEX3(0x888); - theme.gauge = &gauge; + theme.style.gauge = &gauge; #endif } @@ -205,7 +205,7 @@ static void chart_init(void) #if USE_LV_CHART - theme.chart = &lv_style_pretty; + theme.style.chart = &lv_style_pretty; #endif } @@ -214,12 +214,12 @@ static void cb_init(void) #if USE_LV_CB != 0 - theme.cb.bg = &lv_style_transp; - theme.cb.box.rel = &lv_style_pretty; - theme.cb.box.pr = &lv_style_btn_pr; - theme.cb.box.tgl_rel = &lv_style_btn_tgl_rel; - theme.cb.box.tgl_pr = &lv_style_btn_tgl_pr; - theme.cb.box.ina = &lv_style_btn_ina; + 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 } @@ -229,12 +229,12 @@ static void btnm_init(void) #if USE_LV_BTNM - theme.btnm.bg = &lv_style_pretty; - theme.btnm.btn.rel = &lv_style_btn_rel; - theme.btnm.btn.pr = &lv_style_btn_pr; - theme.btnm.btn.tgl_rel = &lv_style_btn_tgl_rel; - theme.btnm.btn.tgl_pr = &lv_style_btn_tgl_pr; - theme.btnm.btn.ina = &lv_style_btn_ina; + 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 } @@ -243,12 +243,12 @@ static void kb_init(void) #if USE_LV_KB - theme.kb.bg = &lv_style_pretty; - theme.kb.btn.rel = &lv_style_btn_rel; - theme.kb.btn.pr = &lv_style_btn_pr; - theme.kb.btn.tgl_rel = &lv_style_btn_tgl_rel; - theme.kb.btn.tgl_pr = &lv_style_btn_tgl_pr; - theme.kb.btn.ina = &lv_style_btn_ina; + 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 } @@ -258,10 +258,10 @@ static void mbox_init(void) #if USE_LV_MBOX - theme.mbox.bg = &lv_style_pretty; - theme.mbox.btn.bg = &lv_style_transp; - theme.mbox.btn.rel = &lv_style_btn_rel; - theme.mbox.btn.pr = &lv_style_btn_tgl_pr; + 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 } @@ -270,9 +270,9 @@ static void page_init(void) #if USE_LV_PAGE - theme.page.bg = &lv_style_pretty; - theme.page.scrl = &lv_style_transp_tight; - theme.page.sb = &sb; + theme.style.page.bg = &lv_style_pretty; + theme.style.page.scrl = &lv_style_transp_tight; + theme.style.page.sb = &sb; #endif } @@ -281,10 +281,10 @@ static void ta_init(void) #if USE_LV_TA - theme.ta.area = &lv_style_pretty; - theme.ta.oneline = &lv_style_pretty; - theme.ta.cursor = NULL; - theme.ta.sb = &sb; + 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 } @@ -292,14 +292,14 @@ static void list_init(void) { #if USE_LV_LIST != 0 - theme.list.bg = &lv_style_pretty; - theme.list.scrl = &lv_style_transp_fit; - theme.list.sb = &sb; - theme.list.btn.rel = &lv_style_btn_rel; - theme.list.btn.pr = &lv_style_btn_pr; - theme.list.btn.tgl_rel = &lv_style_btn_tgl_rel; - theme.list.btn.tgl_pr = &lv_style_btn_tgl_pr; - theme.list.btn.ina = &lv_style_btn_ina; + 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 } @@ -308,9 +308,9 @@ static void ddlist_init(void) #if USE_LV_DDLIST != 0 - theme.ddlist.bg = &lv_style_pretty; - theme.ddlist.sel = &lv_style_plain_color; - theme.ddlist.sb = &sb; + theme.style.ddlist.bg = &lv_style_pretty; + theme.style.ddlist.sel = &lv_style_plain_color; + theme.style.ddlist.sb = &sb; #endif } @@ -319,8 +319,8 @@ static void roller_init(void) #if USE_LV_ROLLER != 0 - theme.roller.bg = &lv_style_pretty; - theme.roller.sel = &lv_style_plain_color; + theme.style.roller.bg = &lv_style_pretty; + theme.style.roller.sel = &lv_style_plain_color; #endif } @@ -329,13 +329,13 @@ static void tabview_init(void) #if USE_LV_TABVIEW != 0 - theme.tabview.bg = &plain_bordered; - theme.tabview.indic = &lv_style_plain_color; - theme.tabview.btn.bg = &lv_style_transp; - theme.tabview.btn.rel = &lv_style_btn_rel; - theme.tabview.btn.pr = &lv_style_btn_pr; - theme.tabview.btn.tgl_rel = &lv_style_btn_tgl_rel; - theme.tabview.btn.tgl_pr = &lv_style_btn_tgl_pr; + 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 } @@ -345,16 +345,64 @@ static void win_init(void) #if USE_LV_WIN != 0 - theme.win.bg = &plain_bordered; - theme.win.sb = &sb; - theme.win.header = &lv_style_plain_color; - theme.win.content.bg = &lv_style_transp; - theme.win.content.scrl = &lv_style_transp; - theme.win.btn.rel = &lv_style_btn_rel; - theme.win.btn.pr = &lv_style_btn_pr; + theme.style.win.bg = &plain_bordered; + theme.style.win.sb = &sb; + theme.style.win.header = &lv_style_plain_color; + theme.style.win.content.bg = &lv_style_transp; + theme.style.win.content.scrl = &lv_style_transp; + theme.style.win.btn.rel = &lv_style_btn_rel; + theme.style.win.btn.pr = &lv_style_btn_pr; #endif } +#if USE_LV_GROUP + +static void style_mod(lv_style_t * style) +{ +#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.empty == 0 || 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_style_t * style) +{ +#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.empty == 0 || 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 /*USE_LV_GROUP*/ + /********************** * GLOBAL FUNCTIONS **********************/ @@ -376,8 +424,8 @@ lv_theme_t * lv_theme_default_init(uint16_t hue, lv_font_t * font) /*For backward compatibility initialize all theme elements with a default style */ uint16_t i; - lv_style_t ** style_p = (lv_style_t **) &theme; - for(i = 0; i < sizeof(lv_theme_t) / sizeof(lv_style_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++; } @@ -406,6 +454,11 @@ lv_theme_t * lv_theme_default_init(uint16_t hue, lv_font_t * font) tabview_init(); win_init(); +#if USE_LV_GROUP + theme.group.style_mod = style_mod; + theme.group.style_mod_edit = style_mod_edit; +#endif + return &theme; } diff --git a/lv_themes/lv_theme_material.c b/lv_themes/lv_theme_material.c index e46c94391..812dfd362 100644 --- a/lv_themes/lv_theme_material.c +++ b/lv_themes/lv_theme_material.c @@ -72,6 +72,7 @@ static void basic_init(void) panel.body.padding.ver = 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; @@ -79,8 +80,8 @@ static void basic_init(void) sb.body.opa = LV_OPA_40; sb.body.padding.hor = LV_DPI / 25; - theme.bg = &bg; - theme.panel = &panel; + theme.style.bg = &bg; + theme.style.panel = &panel; } @@ -89,7 +90,7 @@ static void cont_init(void) #if USE_LV_CONT != 0 - theme.cont = theme.panel; + theme.style.cont = theme.style.panel; #endif } @@ -109,6 +110,7 @@ static void btn_init(void) 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); @@ -131,12 +133,13 @@ static void btn_init(void) 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.btn.rel = &rel; - theme.btn.pr = ≺ - theme.btn.tgl_rel = &tgl_rel; - theme.btn.tgl_pr = &tgl_pr; - theme.btn.ina = &ina; + 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 } @@ -156,9 +159,9 @@ static void label_init(void) lv_style_copy(&hint, &prim); hint.text.color = lv_color_hsv_to_rgb(_hue, 40, 90); - theme.label.prim = &prim; - theme.label.sec = &sec; - theme.label.hint = &hint; + theme.style.label.prim = &prim; + theme.style.label.sec = &sec; + theme.style.label.hint = &hint; #endif } @@ -175,8 +178,8 @@ static void img_init(void) img_light.image.intense = LV_OPA_80; - theme.img.light = &def; - theme.img.dark = &def; + theme.style.img.light = &def; + theme.style.img.dark = &def; #endif } @@ -185,7 +188,7 @@ static void line_init(void) #if USE_LV_LINE != 0 - theme.line.decor = &def; + theme.style.line.decor = &def; #endif } @@ -204,7 +207,7 @@ static void led_init(void) led.body.shadow.color = lv_color_hsv_to_rgb(_hue, 100, 100); - theme.led = &led; + theme.style.led = &led; #endif } @@ -227,8 +230,8 @@ static void bar_init(void) bar_indic.body.padding.hor = 0; bar_indic.body.padding.ver = 0; - theme.bar.bg = &bar_bg; - theme.bar.indic = &bar_indic; + theme.style.bar.bg = &bar_bg; + theme.style.bar.indic = &bar_indic; #endif } @@ -240,12 +243,12 @@ static void slider_init(void) lv_style_copy(&knob, &def); knob.body.radius = LV_RADIUS_CIRCLE; knob.body.border.width = 0; - knob.body.main_color = theme.bar.indic->body.main_color; + knob.body.main_color = theme.style.bar.indic->body.main_color; knob.body.grad_color = knob.body.main_color; - theme.slider.bg = theme.bar.bg; - theme.slider.indic = theme.bar.indic; - theme.slider.knob = &knob; + theme.style.slider.bg = theme.style.bar.bg; + theme.style.slider.indic = theme.style.bar.indic; + theme.style.slider.knob = &knob; #endif } @@ -253,13 +256,13 @@ static void sw_init(void) { #if USE_LV_SW != 0 static lv_style_t sw_bg, sw_indic, sw_knob_off, sw_knob_on; - lv_style_copy(&sw_bg, theme.slider.bg); + lv_style_copy(&sw_bg, theme.style.slider.bg); sw_bg.body.radius = LV_RADIUS_CIRCLE; - lv_style_copy(&sw_indic, theme.slider.bg); + lv_style_copy(&sw_indic, theme.style.slider.bg); sw_indic.body.radius = LV_RADIUS_CIRCLE; - lv_style_copy(&sw_knob_on, theme.slider.knob); + 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; @@ -272,10 +275,10 @@ static void sw_init(void) sw_knob_off.body.border.color = LV_COLOR_HEX3(0x999); sw_knob_off.body.border.opa = LV_OPA_COVER; - theme.sw.bg = &sw_bg; - theme.sw.indic = &sw_indic; - theme.sw.knob_off = &sw_knob_off; - theme.sw.knob_on = &sw_knob_on; + 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 } @@ -291,7 +294,7 @@ static void lmeter_init(void) lmeter.line.color = LV_COLOR_HEX3(0x999); lmeter.line.width = 2; - theme.lmeter = &lmeter; + theme.style.lmeter = &lmeter; #endif } @@ -310,7 +313,7 @@ static void gauge_init(void) gauge.line.width = 3; gauge.line.color = lv_color_hsv_to_rgb(_hue, 95, 70); - theme.gauge = &gauge; + theme.style.gauge = &gauge; #endif } @@ -329,7 +332,7 @@ static void arc_init(void) arc.body.padding.hor = 0; arc.body.padding.ver = 0; - theme.arc = &arc; + theme.style.arc = &arc; #endif } @@ -337,14 +340,14 @@ static void preload_init(void) { #if USE_LV_PRELOAD != 0 - theme.preload = theme.arc; + theme.style.preload = theme.style.arc; #endif } static void chart_init(void) { #if USE_LV_CHART - theme.chart = theme.panel; + theme.style.chart = theme.style.panel; #endif } @@ -364,9 +367,9 @@ static void calendar_init(void) 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.ver = LV_DPI / 20; - week_box.body.padding.hor = theme.panel->body.padding.hor; - week_box.body.border.color = theme.panel->body.border.color; - week_box.body.border.width = theme.panel->body.border.width; + week_box.body.padding.hor = theme.style.panel->body.padding.hor; + 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; @@ -377,12 +380,12 @@ static void calendar_init(void) today_box.body.padding.ver = LV_DPI / 20; today_box.body.radius = 0; - theme.calendar.bg = theme.panel; - theme.calendar.header = &lv_style_transp; - theme.calendar.inactive_days = &ina_days; - theme.calendar.highlighted_days = &high_days; - theme.calendar.week_box = &week_box; - theme.calendar.today_box = &today_box; + 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 } @@ -390,7 +393,7 @@ static void cb_init(void) { #if USE_LV_CB != 0 static lv_style_t rel, pr, tgl_rel, tgl_pr, ina; - lv_style_copy(&rel, theme.panel); + lv_style_copy(&rel, theme.style.panel); rel.body.shadow.type = LV_SHADOW_BOTTOM; rel.body.shadow.width = 3; @@ -410,14 +413,14 @@ static void cb_init(void) tgl_pr.body.grad_color = tgl_pr.body.main_color; tgl_pr.body.shadow.width = 0; - lv_style_copy(&ina, theme.btn.ina); + lv_style_copy(&ina, theme.style.btn.ina); - theme.cb.bg = &lv_style_transp; - theme.cb.box.rel = &rel; - theme.cb.box.pr = ≺ - theme.cb.box.tgl_rel = &tgl_rel; - theme.cb.box.tgl_pr = &tgl_pr; - theme.cb.box.ina = &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 } @@ -427,13 +430,13 @@ static void btnm_init(void) #if USE_LV_BTNM static lv_style_t bg, rel, pr, tgl_rel, tgl_pr, ina; - lv_style_copy(&bg, theme.panel); + lv_style_copy(&bg, theme.style.panel); bg.body.padding.hor = 0; bg.body.padding.ver = 0; bg.body.padding.inner = 0; bg.text.color = LV_COLOR_HEX3(0x555); - lv_style_copy(&rel, theme.panel); + 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); @@ -462,12 +465,12 @@ static void btnm_init(void) ina.body.main_color = LV_COLOR_HEX3(0xccc); ina.body.grad_color = ina.body.main_color; - theme.btnm.bg = &bg; - theme.btnm.btn.rel = &rel; - theme.btnm.btn.pr = ≺ - theme.btnm.btn.tgl_rel = &tgl_rel; - theme.btnm.btn.tgl_pr = &tgl_pr; - theme.btnm.btn.ina = &def; + 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 } @@ -479,12 +482,12 @@ static void kb_init(void) lv_style_copy(&rel, &lv_style_transp); rel.text.font = _font; - theme.kb.bg = theme.btnm.bg; - theme.kb.btn.rel = &rel; - theme.kb.btn.pr = theme.btnm.btn.pr; - theme.kb.btn.tgl_rel = theme.btnm.btn.tgl_rel; - theme.kb.btn.tgl_pr = theme.btnm.btn.tgl_pr; - theme.kb.btn.ina = theme.btnm.btn.ina; + 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 } @@ -499,13 +502,13 @@ static void mbox_init(void) rel.text.font = _font; rel.text.color = lv_color_hsv_to_rgb(_hue, 85, 75); - lv_style_copy(&pr, theme.btnm.btn.pr); + lv_style_copy(&pr, theme.style.btnm.btn.pr); pr.text.color = lv_color_hsv_to_rgb(_hue, 85, 60); - theme.mbox.bg = theme.panel; - theme.mbox.btn.bg = &lv_style_transp; - theme.mbox.btn.rel = &rel; - theme.mbox.btn.pr = ≺ + 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 } @@ -514,9 +517,9 @@ static void page_init(void) #if USE_LV_PAGE - theme.page.bg = theme.panel; - theme.page.scrl = &lv_style_transp; - theme.page.sb = &sb; + theme.style.page.bg = theme.style.panel; + theme.style.page.scrl = &lv_style_transp; + theme.style.page.sb = &sb; #endif } @@ -534,19 +537,19 @@ static void ta_init(void) oneline.body.border.opa = LV_OPA_COVER; oneline.text.color = LV_COLOR_HEX3(0x333); - theme.ta.area = theme.panel; - theme.ta.oneline = &oneline; - theme.ta.cursor = NULL; /*Let library to calculate the cursor's style*/ - theme.ta.sb = &sb; + 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 USE_LV_SPINBOX - theme.spinbox.bg= theme.panel; - theme.spinbox.cursor = theme.ta.cursor; - theme.spinbox.sb = theme.ta.sb; + theme.style.spinbox.bg= theme.style.panel; + theme.style.spinbox.cursor = theme.style.ta.cursor; + theme.style.spinbox.sb = theme.style.ta.sb; #endif } @@ -556,7 +559,7 @@ static void list_init(void) static lv_style_t list_bg, rel, pr, tgl_rel, tgl_pr, ina; - lv_style_copy(&list_bg, theme.panel); + lv_style_copy(&list_bg, theme.style.panel); list_bg.body.padding.hor = 0; list_bg.body.padding.ver = 0; list_bg.body.padding.inner = 0; @@ -594,14 +597,14 @@ static void list_init(void) ina.body.grad_color = ina.body.main_color; - theme.list.sb = &sb; - theme.list.bg = &list_bg; - theme.list.scrl = &lv_style_transp_tight; - theme.list.btn.rel = &rel; - theme.list.btn.pr = ≺ - theme.list.btn.tgl_rel = &tgl_rel; - theme.list.btn.tgl_pr = &tgl_pr; - theme.list.btn.ina = &ina; + 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 } @@ -609,7 +612,7 @@ static void ddlist_init(void) { #if USE_LV_DDLIST != 0 static lv_style_t bg, sel; - lv_style_copy(&bg, theme.panel); + lv_style_copy(&bg, theme.style.panel); bg.body.padding.hor = LV_DPI / 6; bg.body.padding.ver = LV_DPI / 6; bg.text.line_space = LV_DPI / 8; @@ -623,9 +626,9 @@ static void ddlist_init(void) sel.text.color = lv_color_hsv_to_rgb(_hue, 5, 95); - theme.ddlist.bg = &bg; - theme.ddlist.sel = &sel; - theme.ddlist.sb = &sb; + theme.style.ddlist.bg = &bg; + theme.style.ddlist.sel = &sel; + theme.style.ddlist.sb = &sb; #endif } @@ -645,8 +648,8 @@ static void roller_init(void) roller_sel.text.color = lv_color_hsv_to_rgb(_hue, 90, 70); - theme.roller.bg = &roller_bg; - theme.roller.sel = &roller_sel; + theme.style.roller.bg = &roller_bg; + theme.style.roller.sel = &roller_sel; #endif } @@ -708,22 +711,22 @@ static void tabview_init(void) tgl_pr.body.radius = 0; tgl_pr.text.color = lv_color_hsv_to_rgb(_hue, 90, 60); - theme.tabview.bg = theme.bg; - theme.tabview.indic = &indic; - theme.tabview.btn.bg = &btn_bg; - theme.tabview.btn.rel = &rel; - theme.tabview.btn.pr = ≺ - theme.tabview.btn.tgl_rel = &tgl_rel; - theme.tabview.btn.tgl_pr = &tgl_pr; + 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 USE_LV_TILEVIEW != 0 - theme.tileview.bg = &lv_style_transp_tight; - theme.tileview.scrl = &lv_style_transp_tight; - theme.tileview.sb = theme.page.sb; + 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 } @@ -731,15 +734,15 @@ static void table_init(void) { #if USE_LV_TABLE != 0 static lv_style_t cell; - lv_style_copy(&cell, theme.panel); + lv_style_copy(&cell, theme.style.panel); cell.body.radius = 0; cell.body.border.width = 1; cell.body.padding.hor = LV_DPI / 12; cell.body.padding.ver = LV_DPI / 12; - theme.table.bg = &lv_style_transp_tight; - theme.table.cell = &cell; + theme.style.table.bg = &lv_style_transp_tight; + theme.style.table.cell = &cell; #endif } @@ -760,6 +763,7 @@ static void win_init(void) header.body.padding.hor = 0; header.body.padding.ver = 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); @@ -768,18 +772,67 @@ static void win_init(void) pr.body.empty = 0; pr.body.radius = 0; pr.text.color = LV_COLOR_HEX3(0x111); + pr.image.color = LV_COLOR_HEX3(0x111); - theme.win.bg = theme.panel; - theme.win.sb = &sb; - theme.win.header = &header; - theme.win.content.bg = &lv_style_transp; - theme.win.content.scrl = &lv_style_transp; - theme.win.btn.rel = &lv_style_transp; - theme.win.btn.pr = ≺ + theme.style.win.bg = theme.style.panel; + theme.style.win.sb = &sb; + theme.style.win.header = &header; + theme.style.win.content.bg = &lv_style_transp; + theme.style.win.content.scrl = &lv_style_transp; + theme.style.win.btn.rel = &lv_style_transp; + theme.style.win.btn.pr = ≺ #endif } +#if USE_LV_GROUP + +static void style_mod(lv_style_t * style) +{ +#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, 90, 70); + + /*If not empty or has border then emphasis the border*/ + if (style->body.empty == 0 || 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_hsv_to_rgb(_hue, 90, 70), LV_OPA_70); + style->body.grad_color = lv_color_mix(style->body.grad_color, lv_color_hsv_to_rgb(_hue, 90, 70), LV_OPA_70); + style->body.shadow.color = lv_color_mix(style->body.shadow.color, lv_color_hsv_to_rgb(_hue, 90, 70), LV_OPA_60); + + style->text.color = lv_color_mix(style->text.color, lv_color_hsv_to_rgb(_hue, 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_style_t * style) +{ +#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.empty == 0 || 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 /*USE_LV_GROUP*/ + /********************** * GLOBAL FUNCTIONS **********************/ @@ -801,8 +854,8 @@ lv_theme_t * lv_theme_material_init(uint16_t hue, lv_font_t * font) /*For backward compatibility initialize all theme elements with a default style */ uint16_t i; - lv_style_t ** style_p = (lv_style_t **) &theme; - for(i = 0; i < sizeof(lv_theme_t) / sizeof(lv_style_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++; } @@ -838,6 +891,11 @@ lv_theme_t * lv_theme_material_init(uint16_t hue, lv_font_t * font) table_init(); win_init(); +#if USE_LV_GROUP + theme.group.style_mod = style_mod; + theme.group.style_mod_edit = style_mod_edit; +#endif + return &theme; } diff --git a/lv_themes/lv_theme_mono.c b/lv_themes/lv_theme_mono.c index af18f8a5d..25ce93f89 100644 --- a/lv_themes/lv_theme_mono.c +++ b/lv_themes/lv_theme_mono.c @@ -91,8 +91,8 @@ static void basic_init(void) lv_style_copy(&dark_frame, &dark_plain); dark_frame.body.radius = LV_DPI / 20; - theme.bg = &def; - theme.panel = &light_frame; + theme.style.bg = &def; + theme.style.panel = &light_frame; } @@ -101,7 +101,7 @@ static void cont_init(void) #if USE_LV_CONT != 0 - theme.cont = &def; + theme.style.cont = &def; #endif } @@ -110,11 +110,11 @@ static void btn_init(void) #if USE_LV_BTN != 0 - theme.btn.rel = &light_frame; - theme.btn.pr = &dark_frame; - theme.btn.tgl_rel = &dark_frame; - theme.btn.tgl_pr = &light_frame; - theme.btn.ina = &light_frame; + 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 } @@ -124,9 +124,9 @@ static void label_init(void) #if USE_LV_LABEL != 0 - theme.label.prim = NULL; - theme.label.sec = NULL; - theme.label.hint = NULL; + theme.style.label.prim = NULL; + theme.style.label.sec = NULL; + theme.style.label.hint = NULL; #endif } @@ -135,15 +135,15 @@ static void img_init(void) #if USE_LV_IMG != 0 - theme.img.light = &def; - theme.img.dark = &def; + theme.style.img.light = &def; + theme.style.img.dark = &def; #endif } static void line_init(void) { #if USE_LV_LINE != 0 - theme.line.decor = NULL; + theme.style.line.decor = NULL; #endif } @@ -157,7 +157,7 @@ static void led_init(void) led.body.shadow.color = LV_COLOR_BLACK; led.body.shadow.type = LV_SHADOW_FULL; - theme.led = &led; + theme.style.led = &led; #endif } @@ -177,8 +177,8 @@ static void bar_init(void) bar_indic.body.padding.ver = LV_DPI / 30; bar_indic.body.radius = LV_RADIUS_CIRCLE; - theme.bar.bg = &bar_bg; - theme.bar.indic = &bar_indic; + theme.style.bar.bg = &bar_bg; + theme.style.bar.indic = &bar_indic; #endif } @@ -191,9 +191,9 @@ static void slider_init(void) slider_knob.body.padding.hor = LV_DPI / 30; slider_knob.body.padding.ver = LV_DPI / 30; - theme.slider.bg = theme.bar.bg; - theme.slider.indic = theme.bar.indic; - theme.slider.knob = &slider_knob; + theme.style.slider.bg = theme.style.bar.bg; + theme.style.slider.indic = theme.style.bar.indic; + theme.style.slider.knob = &slider_knob; #endif } @@ -202,10 +202,10 @@ static void sw_init(void) #if USE_LV_SW != 0 - theme.sw.bg = theme.slider.bg; - theme.sw.indic = theme.slider.indic; - theme.sw.knob_off = theme.slider.knob; - theme.sw.knob_on = theme.slider.knob; + 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 } @@ -223,7 +223,7 @@ static void lmeter_init(void) lmeter_bg.line.color = LV_COLOR_WHITE; lmeter_bg.line.width = 1; - theme.lmeter = &lmeter_bg; + theme.style.lmeter = &lmeter_bg; #endif } @@ -231,19 +231,19 @@ static void gauge_init(void) { #if USE_LV_GAUGE != 0 static lv_style_t gauge_bg; - lv_style_copy(&gauge_bg, theme.lmeter); + lv_style_copy(&gauge_bg, theme.style.lmeter); gauge_bg.line.color = LV_COLOR_BLACK; gauge_bg.line.width = 1; - theme.gauge = &gauge_bg; + theme.style.gauge = &gauge_bg; #endif } static void chart_init(void) { #if USE_LV_CHART - theme.chart = &light_frame; + theme.style.chart = &light_frame; #endif } @@ -255,8 +255,8 @@ static void calendar_init(void) box.body.padding.ver = LV_DPI / 20; /*Can't handle highlighted dates in this theme*/ - theme.calendar.week_box = &box; - theme.calendar.today_box = &box; + theme.style.calendar.week_box = &box; + theme.style.calendar.today_box = &box; #endif } @@ -265,12 +265,12 @@ static void cb_init(void) #if USE_LV_CB != 0 - theme.cb.bg = &lv_style_transp; - theme.cb.box.rel = &light_frame; - theme.cb.box.pr = &dark_frame; - theme.cb.box.tgl_rel = &dark_frame; - theme.cb.box.tgl_pr = &light_frame; - theme.cb.box.ina = &light_frame; + 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 } @@ -280,24 +280,24 @@ static void btnm_init(void) #if USE_LV_BTNM - theme.btnm.bg = &light_frame; - theme.btnm.btn.rel = &light_frame; - theme.btnm.btn.pr = &dark_frame; - theme.btnm.btn.tgl_rel = &dark_frame; - theme.btnm.btn.tgl_pr = &light_frame; - theme.btnm.btn.ina = &light_frame; + 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 USE_LV_KB - theme.kb.bg = &lv_style_transp_fit; - theme.kb.btn.rel = &light_frame; - theme.kb.btn.pr = &light_frame; - theme.kb.btn.tgl_rel = &dark_frame; - theme.kb.btn.tgl_pr = &dark_frame; - theme.kb.btn.ina = &light_frame; + 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 } @@ -307,10 +307,10 @@ static void mbox_init(void) #if USE_LV_MBOX - theme.mbox.bg = &dark_frame; - theme.mbox.btn.bg = &lv_style_transp_fit; - theme.mbox.btn.rel = &light_frame; - theme.mbox.btn.pr = &dark_frame; + 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 } @@ -319,9 +319,9 @@ static void page_init(void) #if USE_LV_PAGE - theme.page.bg = &light_frame; - theme.page.scrl = &light_frame; - theme.page.sb = &dark_frame; + theme.style.page.bg = &light_frame; + theme.style.page.scrl = &light_frame; + theme.style.page.sb = &dark_frame; #endif } @@ -330,10 +330,10 @@ static void ta_init(void) #if USE_LV_TA - theme.ta.area = &light_frame; - theme.ta.oneline = &light_frame; - theme.ta.cursor = NULL; /*Let library to calculate the cursor's style*/ - theme.ta.sb = &dark_frame; + 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 } @@ -342,14 +342,14 @@ static void list_init(void) #if USE_LV_LIST != 0 - theme.list.sb = &dark_frame; - theme.list.bg = &light_frame; - theme.list.scrl = &lv_style_transp_fit; - theme.list.btn.rel = &light_plain; - theme.list.btn.pr = &dark_plain; - theme.list.btn.tgl_rel = &dark_plain; - theme.list.btn.tgl_pr = &light_plain; - theme.list.btn.ina = &light_plain; + 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 } @@ -360,9 +360,9 @@ static void ddlist_init(void) lv_style_copy(&bg, &light_frame); bg.text.line_space = LV_DPI / 12; - theme.ddlist.bg = &bg; - theme.ddlist.sel = &dark_plain; - theme.ddlist.sb = &dark_frame; + theme.style.ddlist.bg = &bg; + theme.style.ddlist.sel = &dark_plain; + theme.style.ddlist.sb = &dark_frame; #endif } @@ -373,8 +373,8 @@ static void roller_init(void) lv_style_copy(&bg, &light_frame); bg.text.line_space = LV_DPI / 12; - theme.roller.bg = &bg; - theme.roller.sel = &dark_frame; + theme.style.roller.bg = &bg; + theme.style.roller.sel = &dark_frame; #endif } @@ -383,13 +383,13 @@ static void tabview_init(void) #if USE_LV_TABVIEW != 0 - theme.tabview.bg = &light_frame; - theme.tabview.indic = &light_plain; - theme.tabview.btn.bg = &lv_style_transp_fit; - theme.tabview.btn.rel = &light_frame; - theme.tabview.btn.pr = &dark_frame; - theme.tabview.btn.tgl_rel = &dark_frame; - theme.tabview.btn.tgl_pr = &light_frame; + 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 } @@ -402,16 +402,52 @@ static void win_init(void) win_header.body.padding.hor = LV_DPI / 30; win_header.body.padding.ver = LV_DPI / 30; - theme.win.bg = &light_frame; - theme.win.sb = &dark_frame; - theme.win.header = &win_header; - theme.win.content.bg = &lv_style_transp; - theme.win.content.scrl = &lv_style_transp; - theme.win.btn.rel = &light_frame; - theme.win.btn.pr = &dark_frame; + theme.style.win.bg = &light_frame; + theme.style.win.sb = &dark_frame; + theme.style.win.header = &win_header; + theme.style.win.content.bg = &lv_style_transp; + theme.style.win.content.scrl = &lv_style_transp; + theme.style.win.btn.rel = &light_frame; + theme.style.win.btn.pr = &dark_frame; #endif } +#if USE_LV_GROUP + +static void style_mod(lv_style_t * style) +{ +#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.empty == 0 || 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_style_t * style) +{ +#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.empty == 0 || 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 /*USE_LV_GROUP*/ + /********************** * GLOBAL FUNCTIONS **********************/ @@ -435,8 +471,8 @@ lv_theme_t * lv_theme_mono_init(uint16_t hue, lv_font_t * font) /*For backward compatibility initialize all theme elements with a default style */ uint16_t i; - lv_style_t ** style_p = (lv_style_t **) &theme; - for(i = 0; i < sizeof(lv_theme_t) / sizeof(lv_style_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++; } @@ -467,6 +503,11 @@ lv_theme_t * lv_theme_mono_init(uint16_t hue, lv_font_t * font) tabview_init(); win_init(); +#if USE_LV_GROUP + theme.group.style_mod = style_mod; + theme.group.style_mod_edit = style_mod_edit; +#endif + return &theme; } diff --git a/lv_themes/lv_theme_nemo.c b/lv_themes/lv_theme_nemo.c index 0e6cb0a88..5550a5352 100644 --- a/lv_themes/lv_theme_nemo.c +++ b/lv_themes/lv_theme_nemo.c @@ -132,8 +132,8 @@ static void basic_init(void) sb.body.padding.ver = 1; sb.body.padding.inner = LV_DPI / 15; /*Scrollbar width*/ - theme.bg = &bg; - theme.panel = &panel; + theme.style.bg = &bg; + theme.style.panel = &panel; } @@ -188,11 +188,11 @@ static void btn_init(void) btn_ina.text.font = _font; btn_ina.text.color = lv_color_hsv_to_rgb(_hue, 10, 90); - theme.btn.rel = &btn_rel; - theme.btn.pr = &btn_pr; - theme.btn.tgl_rel = &btn_trel; - theme.btn.tgl_pr = &btn_tpr; - theme.btn.ina = &btn_ina; + 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 } @@ -214,9 +214,9 @@ static void label_init(void) lv_style_copy(&label_hint, &label_prim); label_hint.text.color = lv_color_hsv_to_rgb(_hue, 20, 70); - theme.label.prim = &label_prim; - theme.label.sec = &label_sec; - theme.label.hint = &label_hint; + theme.style.label.prim = &label_prim; + theme.style.label.sec = &label_sec; + theme.style.label.hint = &label_hint; #endif } @@ -248,8 +248,8 @@ static void bar_init(void) 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.bar.bg = &bar_bg; - theme.bar.indic = &bar_indic; + theme.style.bar.bg = &bar_bg; + theme.style.bar.indic = &bar_indic; #endif } @@ -265,8 +265,8 @@ static void img_init(void) img_light.image.color = lv_color_hsv_to_rgb(_hue, 85, 65); img_light.image.intense = LV_OPA_80; - theme.img.light = &img_light; - theme.img.dark = &img_dark; + theme.style.img.light = &img_light; + theme.style.img.dark = &img_dark; #endif } @@ -278,7 +278,7 @@ static void line_init(void) line_decor.line.color = lv_color_hsv_to_rgb(_hue, 50, 50); line_decor.line.width = 1; - theme.line.decor = &line_decor; + theme.style.line.decor = &line_decor; #endif } @@ -296,7 +296,7 @@ static void led_init(void) 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.led = &led; + theme.style.led = &led; #endif } @@ -312,9 +312,9 @@ static void slider_init(void) slider_knob.body.border.color = LV_COLOR_ORANGE; slider_knob.body.border.opa = LV_OPA_50; - theme.slider.bg = &bar_bg; - theme.slider.indic = &bar_indic; - theme.slider.knob = &slider_knob; + theme.style.slider.bg = &bar_bg; + theme.style.slider.indic = &bar_indic; + theme.style.slider.knob = &slider_knob; #endif } @@ -339,10 +339,10 @@ static void sw_init(void) lv_style_copy(&sw_knob, &slider_knob); sw_knob.body.opa = LV_OPA_80; - theme.sw.bg = &sw_bg; - theme.sw.indic = &sw_indic; - theme.sw.knob_off = &sw_knob; - theme.sw.knob_on = &sw_knob; + 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 } @@ -357,7 +357,7 @@ static void lmeter_init(void) lmeter_bg.line.color = LV_COLOR_HEX3(0x500); lmeter_bg.line.width = 2; - theme.lmeter = &lmeter_bg; + theme.style.lmeter = &lmeter_bg; #endif } @@ -378,7 +378,7 @@ static void gauge_init(void) gauge_bg.text.color = lv_color_hsv_to_rgb(_hue, 10, 90); gauge_bg.text.font = _font; - theme.gauge = &gauge_bg; + theme.style.gauge = &gauge_bg; #endif } @@ -395,7 +395,7 @@ static void arc_init(void) /*For preloader*/ arc.body.border.width = 0; - theme.arc = &arc; + theme.style.arc = &arc; #endif } @@ -403,14 +403,14 @@ static void preload_init(void) { #if USE_LV_PRELOAD != 0 - theme.preload = theme.arc; + theme.style.preload = theme.style.arc; #endif } static void chart_init(void) { #if USE_LV_CHART - theme.chart = &panel; + theme.style.chart = &panel; #endif } @@ -428,7 +428,7 @@ static void calendar_init(void) static lv_style_t week_box; lv_style_copy(&week_box, &def); week_box.body.empty = 1; - week_box.body.border.color = theme.panel->body.border.color; + week_box.body.border.color = theme.style.panel->body.border.color; week_box.body.padding.ver = LV_DPI / 20; static lv_style_t today_box; @@ -438,13 +438,13 @@ static void calendar_init(void) today_box.body.padding.ver = LV_DPI / 20; today_box.body.radius = 0; - theme.calendar.bg = theme.panel; - theme.calendar.header = theme.label.prim; - theme.calendar.inactive_days = theme.label.hint; - theme.calendar.highlighted_days = theme.label.sec; - theme.calendar.week_box = &week_box; - theme.calendar.today_box = &week_box; - theme.calendar.header_pr = theme.label.prim; + 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 } @@ -490,12 +490,12 @@ static void cb_init(void) cb_ina.body.main_color = LV_COLOR_PURPLE; cb_ina.body.grad_color = LV_COLOR_SILVER; - theme.cb.bg = &cb_bg; - theme.cb.box.rel = &cb_rel; - theme.cb.box.pr = &cb_pr; - theme.cb.box.tgl_rel = &cb_trel; - theme.cb.box.tgl_pr = &cb_tpr; - theme.cb.box.ina = &cb_ina; + 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 } @@ -529,24 +529,24 @@ static void btnm_init(void) lv_style_copy(&btnm_ina, &btnm_rel); btnm_ina.text.color = lv_color_hsv_to_rgb(_hue, 10, 60); - theme.btnm.bg = &btnm_bg; - theme.btnm.btn.rel = &btnm_rel; - theme.btnm.btn.pr = &btnm_pr; - theme.btnm.btn.tgl_rel = &btnm_trel; - theme.btnm.btn.tgl_pr = &btnm_pr; - theme.btnm.btn.ina = &btnm_ina; + 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 USE_LV_KB - theme.kb.bg = &btnm_bg; - theme.kb.btn.rel = &btnm_rel; - theme.kb.btn.pr = &btnm_pr; - theme.kb.btn.tgl_rel = &btnm_trel; - theme.kb.btn.tgl_pr = &btnm_pr; - theme.kb.btn.ina = &btnm_ina; + 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 } @@ -558,38 +558,38 @@ static void mbox_init(void) lv_style_copy(&mbox_bg, &panel); mbox_bg.body.shadow.width = LV_DPI / 12; - theme.mbox.bg = &mbox_bg; - theme.mbox.btn.bg = &lv_style_transp; - theme.mbox.btn.rel = &btn_trel; - theme.mbox.btn.pr = &btn_tpr; + 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 USE_LV_PAGE - theme.page.bg = &panel; - theme.page.scrl = &lv_style_transp_fit; - theme.page.sb = &sb; + 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 USE_LV_TA - theme.ta.area = &panel; - theme.ta.oneline = &panel; - theme.ta.cursor = NULL; - theme.ta.sb = &sb; + 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 USE_LV_SPINBOX - theme.spinbox.bg= &panel; - theme.spinbox.cursor = theme.ta.cursor; - theme.spinbox.sb = theme.ta.sb; + theme.style.spinbox.bg= &panel; + theme.style.spinbox.cursor = theme.style.ta.cursor; + theme.style.spinbox.sb = theme.style.ta.sb; #endif } @@ -620,14 +620,14 @@ static void list_init(void) list_bg.body.padding.hor = 0; list_bg.body.padding.ver = 0; - theme.list.sb = &sb; - theme.list.bg = &list_bg; - theme.list.scrl = &lv_style_transp_tight; - theme.list.btn.rel = &list_rel; - theme.list.btn.pr = &list_pr; - theme.list.btn.tgl_rel = &list_trel; - theme.list.btn.tgl_pr = &list_tpr; - theme.list.btn.ina = &list_ina; + 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 } @@ -645,9 +645,9 @@ static void ddlist_init(void) ddlist_sel.body.opa = LV_OPA_COVER; ddlist_sel.body.radius = 0; - theme.ddlist.bg = &ddlist_bg; - theme.ddlist.sel = &ddlist_sel; - theme.ddlist.sb = &sb; + theme.style.ddlist.bg = &ddlist_bg; + theme.style.ddlist.sel = &ddlist_sel; + theme.style.ddlist.sb = &sb; #endif } @@ -671,8 +671,8 @@ static void roller_init(void) roller_sel.text.opa = LV_OPA_COVER; roller_sel.text.color = lv_color_hsv_to_rgb(_hue, 70, 95); - theme.roller.bg = &roller_bg; - theme.roller.sel = &roller_sel; + theme.style.roller.bg = &roller_bg; + theme.style.roller.sel = &roller_sel; #endif } @@ -725,22 +725,22 @@ static void tabview_init(void) tab_indic.body.grad_color = lv_color_hsv_to_rgb(_hue, 80, 87); tab_indic.body.padding.inner = LV_DPI / 10; /*Indicator height*/ - theme.tabview.bg = &bg; - theme.tabview.indic = &tab_indic; - theme.tabview.btn.bg = &lv_style_transp_tight; - theme.tabview.btn.rel = &tab_rel; - theme.tabview.btn.pr = &tab_pr; - theme.tabview.btn.tgl_rel = &tab_trel; - theme.tabview.btn.tgl_pr = &tab_tpr; + 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 USE_LV_TILEVIEW != 0 - theme.tileview.bg = &lv_style_transp_tight; - theme.tileview.scrl = &lv_style_transp_tight; - theme.tileview.sb = theme.page.sb; + 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 } @@ -752,8 +752,8 @@ static void table_init(void) cell.body.radius = 0; cell.body.border.width = 1; - theme.table.bg = &lv_style_transp_tight; - theme.table.cell = &cell; + theme.style.table.bg = &lv_style_transp_tight; + theme.style.table.cell = &cell; #endif } @@ -771,16 +771,39 @@ static void win_init(void) 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.win.bg = &bg; - theme.win.sb = &sb; - theme.win.header = &win_header; - theme.win.content.bg = &lv_style_transp; - theme.win.content.scrl = &lv_style_transp; - theme.win.btn.rel = &btn_rel; - theme.win.btn.pr = &btn_pr; + theme.style.win.bg = &bg; + theme.style.win.sb = &sb; + theme.style.win.header = &win_header; + theme.style.win.content.bg = &lv_style_transp; + theme.style.win.content.scrl = &lv_style_transp; + theme.style.win.btn.rel = &btn_rel; + theme.style.win.btn.pr = &btn_pr; #endif } +#if USE_LV_GROUP + +static void style_mod(lv_style_t * style) +{ +#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.padding.hor = 0; + style->body.padding.ver = 0; + 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 +} + +#endif /*USE_LV_GROUP*/ + /********************** * GLOBAL FUNCTIONS **********************/ @@ -800,8 +823,8 @@ lv_theme_t * lv_theme_nemo_init(uint16_t hue, lv_font_t * font) /*For backward compatibility initialize all theme elements with a default style */ uint16_t i; - lv_style_t ** style_p = (lv_style_t **) &theme; - for(i = 0; i < sizeof(lv_theme_t) / sizeof(lv_style_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++; } @@ -836,6 +859,11 @@ lv_theme_t * lv_theme_nemo_init(uint16_t hue, lv_font_t * font) table_init(); win_init(); +#if USE_LV_GROUP + theme.group.style_mod = style_mod; + theme.group.style_mod_edit = style_mod; +#endif + return &theme; } diff --git a/lv_themes/lv_theme_night.c b/lv_themes/lv_theme_night.c index ed3823fdc..047c811a6 100644 --- a/lv_themes/lv_theme_night.c +++ b/lv_themes/lv_theme_night.c @@ -59,6 +59,7 @@ static void basic_init(void) 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(&sb, &def); sb.body.main_color = lv_color_hsv_to_rgb(_hue, 30, 60); @@ -81,8 +82,8 @@ static void basic_init(void) panel.body.padding.hor = LV_DPI / 10; panel.line.color = lv_color_hsv_to_rgb(_hue, 20, 40); panel.line.width = 1; - theme.bg = &bg; - theme.panel = &def; + theme.style.bg = &bg; + theme.style.panel = &def; } static void cont_init(void) @@ -90,7 +91,7 @@ static void cont_init(void) #if USE_LV_CONT != 0 - theme.cont = &panel; + theme.style.cont = &panel; #endif } static void btn_init(void) @@ -109,6 +110,7 @@ static void btn_init(void) 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); @@ -119,24 +121,27 @@ static void btn_init(void) 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.text.color = LV_COLOR_HEX3(0xaaa); btn_ina.body.shadow.width = 0; + btn_ina.text.color = LV_COLOR_HEX3(0xaaa); + btn_ina.image.color = LV_COLOR_HEX3(0xaaa); - theme.btn.rel = &btn_rel; - theme.btn.pr = &btn_pr; - theme.btn.tgl_rel = &btn_tgl_rel; - theme.btn.tgl_pr = &btn_tgl_pr; - theme.btn.ina = &btn_ina; + 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 } @@ -154,9 +159,9 @@ static void label_init(void) lv_style_copy(&hint, &bg); hint.text.color = lv_color_hsv_to_rgb(_hue, 20, 55); - theme.label.prim = &prim; - theme.label.sec = &sec; - theme.label.hint = &hint; + theme.style.label.prim = &prim; + theme.style.label.sec = &sec; + theme.style.label.hint = &hint; #endif } @@ -165,7 +170,7 @@ static void line_init(void) #if USE_LV_LINE != 0 - theme.line.decor = &def; + theme.style.line.decor = &def; #endif } @@ -183,7 +188,7 @@ static void led_init(void) 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.led = &led; + theme.style.led = &led; #endif } @@ -192,8 +197,8 @@ static void img_init(void) #if USE_LV_IMG != 0 - theme.img.light = &def; - theme.img.dark = &def; + theme.style.img.light = &def; + theme.style.img.dark = &def; #endif } @@ -215,8 +220,8 @@ static void bar_init(void) bar_indic.body.padding.hor = 0; bar_indic.body.padding.ver = 0; - theme.bar.bg = &bar_bg; - theme.bar.indic = &bar_indic; + theme.style.bar.bg = &bar_bg; + theme.style.bar.indic = &bar_indic; #endif } @@ -227,9 +232,9 @@ static void slider_init(void) lv_style_copy(&slider_knob, &btn_rel); slider_knob.body.radius = LV_RADIUS_CIRCLE; - theme.slider.bg = &bar_bg; - theme.slider.indic = &bar_indic; - theme.slider.knob = &slider_knob; + theme.style.slider.bg = &bar_bg; + theme.style.slider.indic = &bar_indic; + theme.style.slider.knob = &slider_knob; #endif } @@ -238,10 +243,10 @@ static void sw_init(void) #if USE_LV_SW != 0 - theme.sw.bg = &bar_bg; - theme.sw.indic = &bar_indic; - theme.sw.knob_off = &slider_knob; - theme.sw.knob_on = &slider_knob; + theme.style.sw.bg = &bar_bg; + theme.style.sw.indic = &bar_indic; + theme.style.sw.knob_off = &slider_knob; + theme.style.sw.knob_on = &slider_knob; #endif } @@ -259,7 +264,7 @@ static void lmeter_init(void) lmeter_bg.line.width = 1; lmeter_bg.text.color = LV_COLOR_HEX3(0xddd); - theme.lmeter = &lmeter_bg; + theme.style.lmeter = &lmeter_bg; #endif } @@ -274,7 +279,7 @@ static void gauge_init(void) gauge_bg.line.width = 1; gauge_bg.text.color = LV_COLOR_HEX3(0xddd); - theme.gauge = &gauge_bg; + theme.style.gauge = &gauge_bg; #endif } @@ -294,7 +299,7 @@ static void arc_init(void) arc.body.padding.hor = 1; arc.body.padding.ver = 1; - theme.arc = &arc; + theme.style.arc = &arc; #endif } @@ -302,14 +307,14 @@ static void preload_init(void) { #if USE_LV_PRELOAD != 0 - theme.preload = theme.arc; + theme.style.preload = theme.style.arc; #endif } static void chart_init(void) { #if USE_LV_CHART - theme.chart = &panel; + theme.style.chart = &panel; #endif } @@ -361,13 +366,13 @@ static void calendar_init(void) lv_style_copy(&ina_days, &bg); ina_days.text.color = lv_color_hsv_to_rgb(_hue, 0, 60); - theme.calendar.bg = &cal_bg; - theme.calendar.header = &cal_header; - theme.calendar.week_box = &week_box; - theme.calendar.today_box = &today_box; - theme.calendar.highlighted_days = &highlighted_days; - theme.calendar.day_names = &cal_bg; - theme.calendar.inactive_days = &ina_days; + 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 } @@ -407,12 +412,12 @@ static void cb_init(void) ina.body.grad_color = LV_COLOR_HEX3(0x777); ina.body.border.width = 0; - theme.cb.bg = &lv_style_transp; - theme.cb.box.rel = &rel; - theme.cb.box.pr = ≺ - theme.cb.box.tgl_rel = &tgl_rel; - theme.cb.box.tgl_pr = &tgl_pr; - theme.cb.box.ina = &def; + 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 } @@ -453,24 +458,24 @@ static void btnm_init(void) ina.body.border.width = rel.body.border.width; ina.body.radius = rel.body.radius; - theme.btnm.bg = &btnm_bg; - theme.btnm.btn.rel = &rel; - theme.btnm.btn.pr = ≺ - theme.btnm.btn.tgl_rel = &tgl_rel; - theme.btnm.btn.tgl_pr = &tgl_pr; - theme.btnm.btn.ina = &ina; + 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 USE_LV_KB - theme.kb.bg = &bg; - theme.kb.btn.rel = &btn_rel; - theme.kb.btn.pr = &btn_pr; - theme.kb.btn.tgl_rel = &btn_tgl_rel; - theme.kb.btn.tgl_pr = &btn_tgl_pr; - theme.kb.btn.ina = &btn_ina; + theme.style.kb.bg = &bg; + theme.style.kb.btn.rel = &btn_rel; + theme.style.kb.btn.pr = &btn_pr; + theme.style.kb.btn.tgl_rel = &btn_tgl_rel; + theme.style.kb.btn.tgl_pr = &btn_tgl_pr; + theme.style.kb.btn.ina = &btn_ina; #endif } @@ -487,10 +492,10 @@ static void mbox_init(void) 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.mbox.bg = &mbox_bg; - theme.mbox.btn.bg = &lv_style_transp; - theme.mbox.btn.rel = &btn_rel; - theme.mbox.btn.pr = &btn_pr; + theme.style.mbox.bg = &mbox_bg; + theme.style.mbox.btn.bg = &lv_style_transp; + theme.style.mbox.btn.rel = &btn_rel; + theme.style.mbox.btn.pr = &btn_pr; #endif } @@ -506,28 +511,28 @@ static void page_init(void) page_scrl.body.border.width = 1; page_scrl.body.radius = LV_DPI / 20; - theme.page.bg = &panel; - theme.page.scrl = &page_scrl; - theme.page.sb = &sb; + theme.style.page.bg = &panel; + theme.style.page.scrl = &page_scrl; + theme.style.page.sb = &sb; #endif } static void ta_init(void) { #if USE_LV_TA - theme.ta.area = &panel; - theme.ta.oneline = &panel; - theme.ta.cursor = NULL; - theme.ta.sb = &def; + 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 USE_LV_SPINBOX - theme.spinbox.bg= &panel; - theme.spinbox.cursor = theme.ta.cursor; - theme.spinbox.sb = theme.ta.sb; + theme.style.spinbox.bg= &panel; + theme.style.spinbox.cursor = theme.style.ta.cursor; + theme.style.spinbox.sb = theme.style.ta.sb; #endif } @@ -571,14 +576,14 @@ static void list_init(void) list_btn_tgl_pr.body.main_color = btn_tgl_pr.body.main_color; list_btn_tgl_pr.body.grad_color = btn_tgl_pr.body.grad_color; - theme.list.sb = &sb; - theme.list.bg = &list_bg; - theme.list.scrl = &lv_style_transp_tight; - theme.list.btn.rel = &list_btn_rel; - theme.list.btn.pr = &list_btn_pr; - theme.list.btn.tgl_rel = &list_btn_tgl_rel; - theme.list.btn.tgl_pr = &list_btn_tgl_pr; - theme.list.btn.ina = &def; + 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 } @@ -596,9 +601,9 @@ static void ddlist_init(void) ddlist_sel.body.grad_color = lv_color_hsv_to_rgb(_hue, 20, 50); ddlist_sel.body.radius = 0; - theme.ddlist.bg = &ddlist_bg; - theme.ddlist.sel = &ddlist_sel; - theme.ddlist.sb = &def; + theme.style.ddlist.bg = &ddlist_bg; + theme.style.ddlist.sel = &ddlist_sel; + theme.style.ddlist.sb = &def; #endif } @@ -613,30 +618,30 @@ static void roller_init(void) roller_bg.text.color = lv_color_hsv_to_rgb(_hue, 5, 70); roller_bg.text.opa = LV_OPA_60; - theme.roller.bg = &roller_bg; - theme.roller.sel = &ddlist_sel; + theme.style.roller.bg = &roller_bg; + theme.style.roller.sel = &ddlist_sel; #endif } static void tabview_init(void) { #if USE_LV_TABVIEW != 0 - theme.tabview.bg = &bg; - theme.tabview.indic = &lv_style_transp; - theme.tabview.btn.bg = &lv_style_transp; - theme.tabview.btn.rel = &btn_rel; - theme.tabview.btn.pr = &btn_pr; - theme.tabview.btn.tgl_rel = &btn_tgl_rel; - theme.tabview.btn.tgl_pr = &btn_tgl_pr; + 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 = &btn_rel; + theme.style.tabview.btn.pr = &btn_pr; + theme.style.tabview.btn.tgl_rel = &btn_tgl_rel; + theme.style.tabview.btn.tgl_pr = &btn_tgl_pr; #endif } static void tileview_init(void) { #if USE_LV_TILEVIEW != 0 - theme.tileview.bg = &lv_style_transp_tight; - theme.tileview.scrl = &lv_style_transp_tight; - theme.tileview.sb = theme.page.sb; + 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 } @@ -651,8 +656,8 @@ static void table_init(void) cell.body.padding.ver = LV_DPI / 12; - theme.table.bg = &lv_style_transp_tight; - theme.table.cell = &cell; + theme.style.table.bg = &lv_style_transp_tight; + theme.style.table.cell = &cell; #endif } @@ -678,17 +683,54 @@ static void win_init(void) 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.win.bg = &win_bg; - theme.win.sb = &sb; - theme.win.header = &win_header; - theme.win.content.bg = &lv_style_transp; - theme.win.content.scrl = &lv_style_transp; - theme.win.btn.rel = &lv_style_transp; - theme.win.btn.pr = &win_btn_pr; + theme.style.win.bg = &win_bg; + theme.style.win.sb = &sb; + theme.style.win.header = &win_header; + theme.style.win.content.bg = &lv_style_transp; + theme.style.win.content.scrl = &lv_style_transp; + theme.style.win.btn.rel = &lv_style_transp; + theme.style.win.btn.pr = &win_btn_pr; #endif } +#if USE_LV_GROUP + +static void style_mod(lv_style_t * style) +{ +#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.empty == 0 || 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_style_t * style) +{ +#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.empty == 0 || 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 /*USE_LV_GROUP*/ + /********************** * GLOBAL FUNCTIONS **********************/ @@ -710,8 +752,8 @@ lv_theme_t * lv_theme_night_init(uint16_t hue, lv_font_t * font) /*For backward compatibility initialize all theme elements with a default style */ uint16_t i; - lv_style_t ** style_p = (lv_style_t **) &theme; - for(i = 0; i < sizeof(lv_theme_t) / sizeof(lv_style_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++; } @@ -747,6 +789,11 @@ lv_theme_t * lv_theme_night_init(uint16_t hue, lv_font_t * font) table_init(); win_init(); +#if USE_LV_GROUP + theme.group.style_mod = style_mod; + theme.group.style_mod_edit = style_mod_edit; +#endif + return &theme; } diff --git a/lv_themes/lv_theme_templ.c b/lv_themes/lv_theme_templ.c index b9359d4bc..46f3793b7 100644 --- a/lv_themes/lv_theme_templ.c +++ b/lv_themes/lv_theme_templ.c @@ -47,8 +47,8 @@ static void basic_init(void) lv_style_copy(&def, &lv_style_pretty); /*Initialize the default style*/ def.text.font = _font; - theme.bg = &def; - theme.panel = &def; + theme.style.bg = &def; + theme.style.panel = &def; } @@ -57,7 +57,7 @@ static void cont_init(void) #if USE_LV_CONT != 0 - theme.cont = &def; + theme.style.cont = &def; #endif } @@ -66,22 +66,22 @@ static void btn_init(void) #if USE_LV_BTN != 0 - theme.btn.rel = &def; - theme.btn.pr = &def; - theme.btn.tgl_rel = &def; - theme.btn.tgl_pr = &def; - theme.btn.ina = &def; + 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 USE_LV_IMGBTN != 0 - theme.imgbtn.rel = &def; - theme.imgbtn.pr = &def; - theme.imgbtn.tgl_rel = &def; - theme.imgbtn.tgl_pr = &def; - theme.imgbtn.ina = &def; + 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 } @@ -90,9 +90,9 @@ static void label_init(void) #if USE_LV_LABEL != 0 - theme.label.prim = &def; - theme.label.sec = &def; - theme.label.hint = &def; + theme.style.label.prim = &def; + theme.style.label.sec = &def; + theme.style.label.hint = &def; #endif } @@ -101,8 +101,8 @@ static void img_init(void) #if USE_LV_IMG != 0 - theme.img.light = &def; - theme.img.dark = &def; + theme.style.img.light = &def; + theme.style.img.dark = &def; #endif } @@ -111,7 +111,7 @@ static void line_init(void) #if USE_LV_LINE != 0 - theme.line.decor = &def; + theme.style.line.decor = &def; #endif } @@ -120,7 +120,7 @@ static void led_init(void) #if USE_LV_LED != 0 - theme.led = &def; + theme.style.led = &def; #endif } @@ -129,8 +129,8 @@ static void bar_init(void) #if USE_LV_BAR - theme.bar.bg = &def; - theme.bar.indic = &def; + theme.style.bar.bg = &def; + theme.style.bar.indic = &def; #endif } @@ -139,9 +139,9 @@ static void slider_init(void) #if USE_LV_SLIDER != 0 - theme.slider.bg = &def; - theme.slider.indic = &def; - theme.slider.knob = &def; + theme.style.slider.bg = &def; + theme.style.slider.indic = &def; + theme.style.slider.knob = &def; #endif } @@ -150,10 +150,10 @@ static void sw_init(void) #if USE_LV_SW != 0 - theme.sw.bg = &def; - theme.sw.indic = &def; - theme.sw.knob_off = &def; - theme.sw.knob_on = &def; + theme.style.sw.bg = &def; + theme.style.sw.indic = &def; + theme.style.sw.knob_off = &def; + theme.style.sw.knob_on = &def; #endif } @@ -163,7 +163,7 @@ static void lmeter_init(void) #if USE_LV_LMETER != 0 - theme.lmeter = &def; + theme.style.lmeter = &def; #endif } @@ -172,7 +172,7 @@ static void gauge_init(void) #if USE_LV_GAUGE != 0 - theme.gauge = &def; + theme.style.gauge = &def; #endif } @@ -181,7 +181,7 @@ static void arc_init(void) #if USE_LV_ARC != 0 - theme.arc = &def; + theme.style.arc = &def; #endif } @@ -190,7 +190,7 @@ static void preload_init(void) #if USE_LV_PRELOAD != 0 - theme.preload = &def; + theme.style.preload = &def; #endif } @@ -198,7 +198,7 @@ static void chart_init(void) { #if USE_LV_CHART - theme.chart = &def; + theme.style.chart = &def; #endif } @@ -206,14 +206,14 @@ static void calendar_init(void) { #if USE_LV_CALENDAR - theme.calendar.bg = theme.panel; - theme.calendar.header = &def; - theme.calendar.inactive_days = &def; - theme.calendar.highlighted_days = &def; - theme.calendar.week_box = &def; - theme.calendar.today_box = &def; - theme.calendar.header_pr = &def; - theme.calendar.day_names = &def; + 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 } @@ -222,12 +222,12 @@ static void cb_init(void) #if USE_LV_CB != 0 - theme.cb.bg = &def; - theme.cb.box.rel = &def; - theme.cb.box.pr = &def; - theme.cb.box.tgl_rel = &def; - theme.cb.box.tgl_pr = &def; - theme.cb.box.ina = &def; + 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 } @@ -237,12 +237,12 @@ static void btnm_init(void) #if USE_LV_BTNM - theme.btnm.bg = &def; - theme.btnm.btn.rel = &def; - theme.btnm.btn.pr = &def; - theme.btnm.btn.tgl_rel = &def; - theme.btnm.btn.tgl_pr = &def; - theme.btnm.btn.ina = &def; + 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 } @@ -251,12 +251,12 @@ static void kb_init(void) #if USE_LV_KB - theme.kb.bg = &def; - theme.kb.btn.rel = &def; - theme.kb.btn.pr = &def; - theme.kb.btn.tgl_rel = &def; - theme.kb.btn.tgl_pr = &def; - theme.kb.btn.ina = &def; + 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 } @@ -266,10 +266,10 @@ static void mbox_init(void) #if USE_LV_MBOX - theme.mbox.bg = &def; - theme.mbox.btn.bg = &def; - theme.mbox.btn.rel = &def; - theme.mbox.btn.pr = &def; + theme.style.mbox.bg = &def; + theme.style.mbox.btn.bg = &def; + theme.style.mbox.btn.rel = &def; + theme.style.mbox.btn.pr = &def; #endif } @@ -278,9 +278,9 @@ static void page_init(void) #if USE_LV_PAGE - theme.page.bg = &def; - theme.page.scrl = &def; - theme.page.sb = &def; + theme.style.page.bg = &def; + theme.style.page.scrl = &def; + theme.style.page.sb = &def; #endif } @@ -289,10 +289,10 @@ static void ta_init(void) #if USE_LV_TA - theme.ta.area = &def; - theme.ta.oneline = &def; - theme.ta.cursor = NULL; /*Let library to calculate the cursor's style*/ - theme.ta.sb = &def; + 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 } @@ -301,14 +301,14 @@ static void list_init(void) #if USE_LV_LIST != 0 - theme.list.sb = &def; - theme.list.bg = &def; - theme.list.scrl = &def; - theme.list.btn.rel = &def; - theme.list.btn.pr = &def; - theme.list.btn.tgl_rel = &def; - theme.list.btn.tgl_pr = &def; - theme.list.btn.ina = &def; + 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 } @@ -317,9 +317,9 @@ static void ddlist_init(void) #if USE_LV_DDLIST != 0 - theme.ddlist.bg = &def; - theme.ddlist.sel = &def; - theme.ddlist.sb = &def; + theme.style.ddlist.bg = &def; + theme.style.ddlist.sel = &def; + theme.style.ddlist.sb = &def; #endif } @@ -328,8 +328,8 @@ static void roller_init(void) #if USE_LV_ROLLER != 0 - theme.roller.bg = &def; - theme.roller.sel = &def; + theme.style.roller.bg = &def; + theme.style.roller.sel = &def; #endif } @@ -338,13 +338,13 @@ static void tabview_init(void) #if USE_LV_TABVIEW != 0 - theme.tabview.bg = &def; - theme.tabview.indic = &def; - theme.tabview.btn.bg = &def; - theme.tabview.btn.rel = &def; - theme.tabview.btn.pr = &def; - theme.tabview.btn.tgl_rel = &def; - theme.tabview.btn.tgl_pr = &def; + 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 } @@ -354,16 +354,64 @@ static void win_init(void) #if USE_LV_WIN != 0 - theme.win.bg = &def; - theme.win.sb = &def; - theme.win.header = &def; - theme.win.content.bg = &def; - theme.win.content.scrl = &def; - theme.win.btn.rel = &def; - theme.win.btn.pr = &def; + theme.style.win.bg = &def; + theme.style.win.sb = &def; + theme.style.win.header = &def; + theme.style.win.content.bg = &def; + theme.style.win.content.scrl = &def; + theme.style.win.btn.rel = &def; + theme.style.win.btn.pr = &def; #endif } +#if USE_LV_GROUP + +static void style_mod(lv_style_t * style) +{ +#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.empty == 0 || 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_style_t * style) +{ +#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.empty == 0 || 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 /*USE_LV_GROUP*/ + /********************** * GLOBAL FUNCTIONS **********************/ @@ -385,8 +433,8 @@ lv_theme_t * lv_theme_templ_init(uint16_t hue, lv_font_t * font) /*For backward compatibility initialize all theme elements with a default style */ uint16_t i; - lv_style_t ** style_p = (lv_style_t **) &theme; - for(i = 0; i < sizeof(lv_theme_t) / sizeof(lv_style_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++; } @@ -419,6 +467,11 @@ lv_theme_t * lv_theme_templ_init(uint16_t hue, lv_font_t * font) tabview_init(); win_init(); +#if USE_LV_GROUP + theme.group.style_mod = style_mod; + theme.group.style_mod_edit = style_mod_edit; +#endif + return &theme; } diff --git a/lv_themes/lv_theme_zen.c b/lv_themes/lv_theme_zen.c index 7cdf5a10c..c55e8c8de 100644 --- a/lv_themes/lv_theme_zen.c +++ b/lv_themes/lv_theme_zen.c @@ -52,6 +52,7 @@ static void basic_init(void) 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; @@ -78,8 +79,8 @@ static void basic_init(void) sb.body.radius = LV_RADIUS_CIRCLE; sb.body.padding.inner = LV_DPI / 10; - theme.bg = &bg; - theme.panel = &panel; + theme.style.bg = &bg; + theme.style.panel = &panel; } static void cont_init(void) @@ -87,7 +88,7 @@ static void cont_init(void) #if USE_LV_CONT != 0 - theme.cont = theme.panel; + theme.style.cont = theme.style.panel; #endif } @@ -106,25 +107,29 @@ static void btn_init(void) rel.body.padding.hor = LV_DPI / 4; rel.body.padding.ver = 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.text.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.btn.rel = &rel; - theme.btn.pr = ≺ - theme.btn.tgl_rel = ≺ - theme.btn.tgl_pr = &tgl_pr; - theme.btn.ina = &ina; + 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 } @@ -140,9 +145,9 @@ static void label_init(void) sec.text.color = lv_color_hsv_to_rgb(_hue, 50, 80); hint.text.color = lv_color_hsv_to_rgb(_hue, 25, 85); - theme.label.prim = &prim; - theme.label.sec = &sec; - theme.label.hint = &hint; + theme.style.label.prim = &prim; + theme.style.label.sec = &sec; + theme.style.label.hint = &hint; #endif } @@ -158,8 +163,8 @@ static void img_init(void) img_light.image.color = lv_color_hsv_to_rgb(_hue, 85, 55); img_light.image.intense = LV_OPA_80; - theme.img.light = &img_light; - theme.img.dark = &img_dark; + theme.style.img.light = &img_light; + theme.style.img.dark = &img_dark; #endif } @@ -168,7 +173,7 @@ static void line_init(void) #if USE_LV_LINE != 0 - theme.line.decor = &def; + theme.style.line.decor = &def; #endif } @@ -187,7 +192,7 @@ static void led_init(void) 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.led = &led; + theme.style.led = &led; #endif } @@ -212,8 +217,8 @@ static void bar_init(void) indic.body.padding.ver = LV_DPI / 20; - theme.bar.bg = &bg; - theme.bar.indic = &indic; + theme.style.bar.bg = &bg; + theme.style.bar.indic = &indic; #endif } @@ -223,14 +228,14 @@ static void slider_init(void) static lv_style_t knob; lv_style_copy(&knob, &def); - knob.body.main_color = theme.bar.indic->body.main_color; + 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.slider.bg = theme.bar.bg; - theme.slider.indic = theme.bar.indic; - theme.slider.knob = &knob; + theme.style.slider.bg = theme.style.bar.bg; + theme.style.slider.indic = theme.style.bar.indic; + theme.style.slider.knob = &knob; #endif } @@ -239,22 +244,22 @@ static void sw_init(void) #if USE_LV_SW != 0 static lv_style_t indic; - lv_style_copy(&indic, theme.slider.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.slider.bg->body.border.width; - indic.body.border.color = theme.slider.bg->body.border.color; - indic.body.border.opa = theme.slider.bg->body.border.opa; + 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.hor = 0; indic.body.padding.ver = 0; - theme.sw.bg = theme.slider.bg; - theme.sw.indic = &indic; - theme.sw.knob_off = theme.slider.knob; - theme.sw.knob_on = theme.slider.knob; + 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 } @@ -271,7 +276,7 @@ static void lmeter_init(void) lmeter.body.grad_color = lmeter.body.main_color; lmeter.body.padding.hor = LV_DPI / 8; - theme.lmeter = &lmeter; + theme.style.lmeter = &lmeter; #endif } @@ -288,7 +293,7 @@ static void gauge_init(void) gauge.body.padding.hor = LV_DPI / 16; gauge.body.border.color = LV_COLOR_HEX3(0x666); /*Needle middle color*/ - theme.gauge = &gauge; + theme.style.gauge = &gauge; #endif } @@ -305,7 +310,7 @@ static void arc_init(void) /*For preloader*/ arc.body.border.width = 0; - theme.arc = &arc; + theme.style.arc = &arc; #endif } @@ -313,14 +318,14 @@ static void preload_init(void) { #if USE_LV_PRELOAD != 0 - theme.preload = theme.arc; + theme.style.preload = theme.style.arc; #endif } static void chart_init(void) { #if USE_LV_CHART - theme.chart = theme.panel; + theme.style.chart = theme.style.panel; #endif } @@ -338,16 +343,16 @@ static void calendar_init(void) static lv_style_t today_box; lv_style_copy(&today_box, &def); today_box.body.empty = 1; - today_box.body.border.color = theme.panel->body.border.color; + today_box.body.border.color = theme.style.panel->body.border.color; today_box.body.padding.ver = LV_DPI / 20; today_box.body.radius = LV_RADIUS_CIRCLE; - theme.calendar.bg = theme.panel; - theme.calendar.header = &lv_style_transp; - theme.calendar.inactive_days = &ina_days; - theme.calendar.highlighted_days = &high_days; - theme.calendar.week_box = &lv_style_transp_fit; - theme.calendar.today_box = &today_box; + 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 } @@ -384,12 +389,12 @@ static void cb_init(void) ina.body.border.color = LV_COLOR_HEX3(0xaaa); - theme.cb.bg = &lv_style_transp; - theme.cb.box.rel = &rel; - theme.cb.box.pr = ≺ - theme.cb.box.tgl_rel = &tgl_rel; - theme.cb.box.tgl_pr = &tgl_pr; - theme.cb.box.ina = &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 } @@ -434,12 +439,12 @@ static void btnm_init(void) ina.body.grad_color = tgl_pr.body.main_color; ina.text.color = LV_COLOR_HEX3(0x888);; - theme.btnm.bg = &bg; - theme.btnm.btn.rel = &rel; - theme.btnm.btn.pr = ≺ - theme.btnm.btn.tgl_rel = &tgl_rel; - theme.btnm.btn.tgl_pr = &tgl_pr; - theme.btnm.btn.ina = &ina; + 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 } @@ -489,12 +494,12 @@ static void kb_init(void) ina.body.grad_color = ina.body.main_color; ina.text.color = LV_COLOR_HEX3(0xbbb); - theme.kb.bg = &bg; - theme.kb.btn.rel = &rel; - theme.kb.btn.pr = ≺ - theme.kb.btn.tgl_rel = &tgl_rel; - theme.kb.btn.tgl_pr = &tgl_pr; - theme.kb.btn.ina = &ina; + 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 } @@ -503,7 +508,7 @@ static void mbox_init(void) { #if USE_LV_MBOX static lv_style_t bg, rel, pr; - lv_style_copy(&bg, theme.panel); + 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); @@ -525,10 +530,10 @@ static void mbox_init(void) pr.body.grad_color = pr.body.main_color; - theme.mbox.bg = &bg; - theme.mbox.btn.bg = &lv_style_transp; - theme.mbox.btn.rel = &rel; - theme.mbox.btn.pr = ≺ + 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 } @@ -537,9 +542,9 @@ static void page_init(void) #if USE_LV_PAGE - theme.page.bg = theme.panel; - theme.page.scrl = &lv_style_transp; - theme.page.sb = &sb; + theme.style.page.bg = theme.style.panel; + theme.style.page.scrl = &lv_style_transp; + theme.style.page.sb = &sb; #endif } @@ -547,25 +552,25 @@ static void ta_init(void) { #if USE_LV_TA static lv_style_t oneline; - lv_style_copy(&oneline, theme.panel); + lv_style_copy(&oneline, theme.style.panel); oneline.body.radius = LV_RADIUS_CIRCLE; oneline.body.padding.ver = LV_DPI / 10; oneline.body.shadow.width = 0; - theme.ta.area = theme.panel; - theme.ta.oneline = &oneline; - theme.ta.cursor = NULL; /*Let library to calculate the cursor's style*/ - theme.ta.sb = &def; + 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 USE_LV_SPINBOX - theme.spinbox.bg= theme.panel; - theme.spinbox.cursor = theme.ta.cursor; - theme.spinbox.sb = theme.ta.sb; + theme.style.spinbox.bg= theme.style.panel; + theme.style.spinbox.cursor = theme.style.ta.cursor; + theme.style.spinbox.sb = theme.style.ta.sb; #endif } @@ -574,7 +579,7 @@ static void list_init(void) #if USE_LV_LIST != 0 static lv_style_t bg, rel, pr, tgl_rel, tgl_pr, ina; - lv_style_copy(&bg, theme.panel); + lv_style_copy(&bg, theme.style.panel); bg.body.padding.hor = 0; bg.body.padding.ver = 0; @@ -584,27 +589,31 @@ static void list_init(void) rel.body.padding.hor = LV_DPI / 8; rel.body.padding.ver = 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.btn.pr->text.color; + 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.btn.tgl_pr->text.color; + 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.btn.ina->text.color; + ina.text.color = theme.style.btn.ina->text.color; + ina.image.color = theme.style.btn.ina->image.color; - theme.list.sb = &sb; - theme.list.bg = &bg; - theme.list.scrl = &lv_style_transp_tight; - theme.list.btn.rel = &rel; - theme.list.btn.pr = ≺ - theme.list.btn.tgl_rel = &tgl_rel; - theme.list.btn.tgl_pr = &tgl_pr; - theme.list.btn.ina = &ina; + 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 } @@ -612,7 +621,7 @@ static void ddlist_init(void) { #if USE_LV_DDLIST != 0 static lv_style_t bg, sel; - lv_style_copy(&bg, theme.panel); + lv_style_copy(&bg, theme.style.panel); bg.text.line_space = LV_DPI / 8; bg.body.padding.hor = LV_DPI / 6; bg.body.padding.ver = LV_DPI / 8; @@ -623,9 +632,9 @@ static void ddlist_init(void) sel.body.border.width = 0; sel.text.color = lv_color_hsv_to_rgb(_hue, 50, 80); - theme.ddlist.bg = &bg; - theme.ddlist.sel = &sel; - theme.ddlist.sb = &def; + theme.style.ddlist.bg = &bg; + theme.style.ddlist.sel = &sel; + theme.style.ddlist.sb = &def; #endif } @@ -639,12 +648,12 @@ static void roller_init(void) bg.text.line_space = LV_DPI / 6; bg.text.color = LV_COLOR_HEX3(0x999); - lv_style_copy(&sel, theme.panel); + lv_style_copy(&sel, theme.style.panel); sel.body.radius = LV_RADIUS_CIRCLE; sel.body.empty = 1; - theme.roller.bg = &bg; - theme.roller.sel = &sel; + theme.style.roller.bg = &bg; + theme.style.roller.sel = &sel; #endif } @@ -681,22 +690,22 @@ static void tabview_init(void) lv_style_copy(&tgl_pr, &rel); tgl_pr.text.color = lv_color_hsv_to_rgb(_hue, 50, 70); - theme.tabview.bg = theme.bg; - theme.tabview.indic = &indic; - theme.tabview.btn.bg = &btn_bg; - theme.tabview.btn.rel = &rel; - theme.tabview.btn.pr = ≺ - theme.tabview.btn.tgl_rel = &tgl_rel; - theme.tabview.btn.tgl_pr = &tgl_pr; + 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 USE_LV_TILEVIEW != 0 - theme.tileview.bg = &lv_style_transp_tight; - theme.tileview.scrl = &lv_style_transp_tight; - theme.tileview.sb = theme.page.sb; + 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 } @@ -704,15 +713,15 @@ static void table_init(void) { #if USE_LV_TABLE != 0 static lv_style_t cell; - lv_style_copy(&cell, theme.panel); + lv_style_copy(&cell, theme.style.panel); cell.body.radius = 0; cell.body.border.width = 1; cell.body.shadow.width = 0; cell.body.padding.hor = LV_DPI / 12; cell.body.padding.ver = LV_DPI / 12; - theme.table.bg = &lv_style_transp_tight; - theme.table.cell = &cell; + theme.style.table.bg = &lv_style_transp_tight; + theme.style.table.cell = &cell; #endif } @@ -727,25 +736,70 @@ static void win_init(void) 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); lv_style_copy(&rel, &def); rel.body.empty = 1; 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.win.bg = theme.panel; - theme.win.sb = &sb; - theme.win.header = &header; - theme.win.content.bg = &lv_style_transp; - theme.win.content.scrl = &lv_style_transp; - theme.win.btn.rel = &rel; - theme.win.btn.pr = ≺ + theme.style.win.bg = theme.style.panel; + theme.style.win.sb = &sb; + theme.style.win.header = &header; + theme.style.win.content.bg = &lv_style_transp; + theme.style.win.content.scrl = &lv_style_transp; + theme.style.win.btn.rel = &rel; + theme.style.win.btn.pr = ≺ #endif } +#if USE_LV_GROUP + +static void style_mod(lv_style_t * style) +{ +#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.empty == 0 || 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_style_t * style) +{ +#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.empty == 0 || 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 /*USE_LV_GROUP*/ + /********************** * GLOBAL FUNCTIONS **********************/ @@ -767,8 +821,8 @@ lv_theme_t * lv_theme_zen_init(uint16_t hue, lv_font_t * font) /*For backward compatibility initialize all theme elements with a default style */ uint16_t i; - lv_style_t ** style_p = (lv_style_t **) &theme; - for(i = 0; i < sizeof(lv_theme_t) / sizeof(lv_style_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++; } @@ -804,6 +858,11 @@ lv_theme_t * lv_theme_zen_init(uint16_t hue, lv_font_t * font) table_init(); win_init(); +#if USE_LV_GROUP + theme.group.style_mod = style_mod; + theme.group.style_mod_edit = style_mod_edit; +#endif + return &theme; } diff --git a/lv_version.h b/lv_version.h index 1e62e1e2b..b718be951 100644 --- a/lv_version.h +++ b/lv_version.h @@ -14,10 +14,10 @@ extern "C" { * INCLUDES *********************/ /*Current version of LittlevGL*/ -#define LVGL_VERSION_MAJOR 5 -#define LVGL_VERSION_MINOR 3 +#define LVGL_VERSION_MAJOR 6 +#define LVGL_VERSION_MINOR 0 #define LVGL_VERSION_PATCH 0 -#define LVGL_VERSION_INFO "" +#define LVGL_VERSION_INFO "dev" /********************* diff --git a/lvgl.h b/lvgl.h index 2d0dd560d..4654578f6 100644 --- a/lvgl.h +++ b/lvgl.h @@ -23,9 +23,10 @@ extern "C" { #include "lv_core/lv_obj.h" #include "lv_core/lv_group.h" -#include "lv_core/lv_lang.h" -#include "lv_core/lv_vdb.h" + +#include "lv_core/lv_i18n.h" #include "lv_core/lv_refr.h" +#include "lv_core/lv_disp.h" #include "lv_themes/lv_theme.h"