Compare commits

..

5 Commits

Author SHA1 Message Date
Gabor Kiss-Vamosi
b25519abce docs(README): fix the image links (#6760) 2024-08-30 01:05:30 +08:00
Liam
fe821204a7 fix(roller): avoid divided-by-zero during draw event (#6285) (#6661)
Co-authored-by: ymh-masuda <160470322+ymh-masuda@users.noreply.github.com>
2024-08-12 14:47:46 +02:00
Liam
533386b030 fix(roller): set the position of the selected text correctly (lvgl#6083) (#6515)
Co-authored-by: Gabor Kiss-Vamosi <kisvegabor@gmail.com>
2024-07-22 10:58:39 +02:00
Gabor Kiss-Vamosi
cac17b5807 chore: kick CI to rebuild the docs 2024-04-23 16:28:43 +02:00
Gabor Kiss-Vamosi
c5109ccceb docs: update changelog 2024-03-20 09:07:23 +01:00
157 changed files with 1509 additions and 2510 deletions

View File

@@ -19,4 +19,4 @@ jobs:
- name: Switch to the development version - name: Switch to the development version
run: pio upgrade --dev run: pio upgrade --dev
- name: Publish - name: Publish
run: pio pkg publish --no-interactive --owner lvgl . run: pio pkg publish --owner lvgl .

21
Kconfig
View File

@@ -335,20 +335,6 @@ menu "LVGL configuration"
which usually improves performance, which usually improves performance,
but does not guarantee the same rendering quality as the software. but does not guarantee the same rendering quality as the software.
config LV_VG_LITE_LINEAER_GRAD_CACHE_CNT
int "VG-Lite linear gradient image maximum cache number."
default 32
depends on LV_USE_DRAW_VG_LITE
help
The memory usage of a single gradient image is 4K bytes.
config LV_VG_LITE_RADIAL_GRAD_CACHE_CNT
int "VG-Lite radial gradient image maximum cache number."
default 32
depends on LV_USE_DRAW_VG_LITE
help
The memory usage of a single gradient image is radial grad radius * 4 bytes.
config LV_USE_VECTOR_GRAPHIC config LV_USE_VECTOR_GRAPHIC
bool "Use Vector Graphic APIs" bool "Use Vector Graphic APIs"
default n default n
@@ -1080,13 +1066,6 @@ menu "LVGL configuration"
default 0 default 0
depends on LV_USE_FS_LITTLEFS depends on LV_USE_FS_LITTLEFS
config LV_USE_FS_ARDUINO_ESP_LITTLEFS
bool "File system on top of Arduino ESP littlefs API"
config LV_FS_ARDUINO_ESP_LITTLEFS_LETTER
int "Set an upper cased letter on which the drive will accessible (e.g. 'A' i.e. 65)"
default 0
depends on LV_USE_FS_ARDUINO_ESP_LITTLEFS
config LV_USE_LODEPNG config LV_USE_LODEPNG
bool "PNG decoder library" bool "PNG decoder library"

View File

@@ -1,5 +1,6 @@
<a href="https://github.com/sponsors/lvgl" target="_blank"><img align="left" src="https://lvgl.io/assets/images/sponsor.png" height="32px"></a>
<a href="https://github.com/sponsors/lvgl" target="_blank"><img align="left" src="https://lvgl.io/github-assets/sponsor.png" height="32px"></a>
<p align="right"> <p align="right">
<b>English</b> | <a href="./docs/README_zh.rst">中文</a> | <a href="./docs/README_pt_BR.rst">Português do Brasil</a> | <a href="./docs/README_jp.rst">日本語</a> <b>English</b> | <a href="./docs/README_zh.rst">中文</a> | <a href="./docs/README_pt_BR.rst">Português do Brasil</a> | <a href="./docs/README_jp.rst">日本語</a>
@@ -8,16 +9,17 @@
<br> <br>
<p align="center"> <p align="center">
  <img src="https://lvgl.io/assets/images/logo_lvgl.png">   <img src="https://lvgl.io/github-assets/logo-colored.png" width=300px>
</p> </p>
  <h1 align="center">Light and Versatile Graphics Library</h1>   <h1 align="center">Light and Versatile Graphics Library</h1>
  <br>   <br>
<div align="center"> <div align="center">
<img src="https://github.com/kisvegabor/test/raw/master/smartwatch_demo.gif"> <img src="https://lvgl.io/github-assets/smartwatch-demo.gif">
&nbsp; &nbsp;
  <img border="1px" src="https://lvgl.io/assets/images/lvgl_widgets_demo.gif">   <img border="1px" src="https://lvgl.io/github-assets/widgets-demo.gif">
</div> </div>
<br> <br>
<p align="center"> <p align="center">
<a href="https://lvgl.io" title="Homepage of LVGL">Website </a> | <a href="https://lvgl.io" title="Homepage of LVGL">Website </a> |
@@ -102,7 +104,6 @@ LVGL is available as:
- CMSIS-Pack - CMSIS-Pack
- [RIOT OS package](https://doc.riot-os.org/group__pkg__lvgl.html#details) - [RIOT OS package](https://doc.riot-os.org/group__pkg__lvgl.html#details)
## :robot: Examples ## :robot: Examples
See some examples of creating widgets, using layouts and applying styles. You will find C and MicroPython code, and links to try out or edit the examples in an online MicroPython editor. See some examples of creating widgets, using layouts and applying styles. You will find C and MicroPython code, and links to try out or edit the examples in an online MicroPython editor.

View File

@@ -20,9 +20,7 @@ extern "C" {
* DEFINES * DEFINES
*********************/ *********************/
#ifndef ARRAY_SIZE
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
#endif
/********************** /**********************
* TYPEDEFS * TYPEDEFS

View File

@@ -203,7 +203,7 @@ static void ta_event_cb(lv_event_t * e)
lv_keyboard_set_textarea(kb, ta); lv_keyboard_set_textarea(kb, ta);
lv_obj_remove_flag(kb, LV_OBJ_FLAG_HIDDEN); lv_obj_remove_flag(kb, LV_OBJ_FLAG_HIDDEN);
lv_group_focus_obj(kb); lv_group_focus_obj(kb);
lv_group_set_editing(lv_obj_get_group(kb), kb != NULL); lv_group_set_editing(lv_obj_get_group(kb), kb);
lv_obj_set_height(tv, LV_VER_RES / 2); lv_obj_set_height(tv, LV_VER_RES / 2);
lv_obj_align(kb, LV_ALIGN_BOTTOM_MID, 0, 0); lv_obj_align(kb, LV_ALIGN_BOTTOM_MID, 0, 0);
} }

View File

@@ -12,7 +12,7 @@
#include "lvgl/lvgl.h" #include "lvgl/lvgl.h"
#endif #endif
#if defined(LV_USE_DEMO_MULTILANG) || defined(LV_USE_DEMO_TRANSFORM) #if LV_USE_DEMO_MULTILANG
#ifndef LV_ATTRIBUTE_MEM_ALIGN #ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN #define LV_ATTRIBUTE_MEM_ALIGN

View File

@@ -9,200 +9,388 @@ Changelog
New Features New Features
~~~~~~~~~~~~ ~~~~~~~~~~~~
- **feat(indev) Add crown support to pointer input device** `5057 <https://github.com/lvgl/lvgl/pull/5057>`__ - **feat(indev) Add crown support to pointer input device**
- **feat(test): test bin image loaded to RAM or not** `5895 <https://github.com/lvgl/lvgl/pull/5895>`__ `5057 <https://github.com/lvgl/lvgl/pull/5057>`__
- **feat(script): change trace_filter default trace log file to log_file.systrace** `5900 <https://github.com/lvgl/lvgl/pull/5900>`__ - **feat(test): test bin image loaded to RAM or not**
- **feat(vg_lite): automatically select path type based on opa** `5896 <https://github.com/lvgl/lvgl/pull/5896>`__ `5895 <https://github.com/lvgl/lvgl/pull/5895>`__
- **feat(freertos): support Espressif's FreeRTOS flavor** `5862 <https://github.com/lvgl/lvgl/pull/5862>`__ - **feat(script): change trace_filter default trace log file to log_file.systrace**
- **feat(tests): add freetype font stress tests** `5828 <https://github.com/lvgl/lvgl/pull/5828>`__ `5900 <https://github.com/lvgl/lvgl/pull/5900>`__
- **feat(vg_lite): add stroke path support** `5831 <https://github.com/lvgl/lvgl/pull/5831>`__ - **feat(vg_lite): automatically select path type based on opa**
- **feat(docs): add Chinese translation (jump link)** `5839 <https://github.com/lvgl/lvgl/pull/5839>`__ `5896 <https://github.com/lvgl/lvgl/pull/5896>`__
- **feat(ci): update distro to ubuntu 22.02 to fix freetype build problem** `5834 <https://github.com/lvgl/lvgl/pull/5834>`__ - **feat(freertos): support Espressif's FreeRTOS flavor**
- **feat(image_cache): add resize function to image cache** `5829 <https://github.com/lvgl/lvgl/pull/5829>`__ `5862 <https://github.com/lvgl/lvgl/pull/5862>`__
- **feat(nuttx): add cpu idle getter** `5814 <https://github.com/lvgl/lvgl/pull/5814>`__ - **feat(tests): add freetype font stress tests**
- **feat(test): add multiple color formats to stride adjust test** `5690 <https://github.com/lvgl/lvgl/pull/5690>`__ `5828 <https://github.com/lvgl/lvgl/pull/5828>`__
- **feat(libjpeg_turbo): add JPEG image EXIF data parsing** `5263 <https://github.com/lvgl/lvgl/pull/5263>`__ - **feat(vg_lite): add stroke path support**
- **feat(freetype): change the tilt of freetype fonts in italics** `5812 <https://github.com/lvgl/lvgl/pull/5812>`__ `5831 <https://github.com/lvgl/lvgl/pull/5831>`__
- **feat(vg_lite): add matrix assert** `5766 <https://github.com/lvgl/lvgl/pull/5766>`__ - **feat(docs): add Chinese translation (jump link)**
- **feat(vg_lite): add grad cache size config and auto release cache** `5731 <https://github.com/lvgl/lvgl/pull/5731>`__ `5839 <https://github.com/lvgl/lvgl/pull/5839>`__
- **feat(draw_buf): support indexed image in draw_buf_copy** `5686 <https://github.com/lvgl/lvgl/pull/5686>`__ - **feat(ci): update distro to ubuntu 22.02 to fix freetype build problem**
- **feat(nuttx): update display driver** `5752 <https://github.com/lvgl/lvgl/pull/5752>`__ `5834 <https://github.com/lvgl/lvgl/pull/5834>`__
- **feat(fs): implement littlefs lfs.h driver support** `5562 <https://github.com/lvgl/lvgl/pull/5562>`__ - **feat(image_cache): add resize function to image cache**
- **feat(test_keyboard): add keyboard test** `5739 <https://github.com/lvgl/lvgl/pull/5739>`__ `5829 <https://github.com/lvgl/lvgl/pull/5829>`__
- **feat(x11): add LV_KEYs** `5704 <https://github.com/lvgl/lvgl/pull/5704>`__ - **feat(nuttx): add cpu idle getter**
- **feat(display): add save screenshot to file support** `5481 <https://github.com/lvgl/lvgl/pull/5481>`__ `5814 <https://github.com/lvgl/lvgl/pull/5814>`__
- **feat(decoder): do not even try cache if 'no_cache' is set** `5688 <https://github.com/lvgl/lvgl/pull/5688>`__ - **feat(test): add multiple color formats to stride adjust test**
- **feat(event): return event dsc for later to remove** `5630 <https://github.com/lvgl/lvgl/pull/5630>`__ `5690 <https://github.com/lvgl/lvgl/pull/5690>`__
- **feat(keyboard) add Home and End keys mapping** `5675 <https://github.com/lvgl/lvgl/pull/5675>`__ - **feat(libjpeg_turbo): add JPEG image EXIF data parsing**
- **feat(draw_buf): distinguish between lv_image_dsc_t and lv_draw_buf_t** `5496 <https://github.com/lvgl/lvgl/pull/5496>`__ `5263 <https://github.com/lvgl/lvgl/pull/5263>`__
- **feat(indev): remove the PRESSED state on scroll** `5660 <https://github.com/lvgl/lvgl/pull/5660>`__ - **feat(freetype): change the tilt of freetype fonts in italics**
- **feat(sysmon): show max memory usage** `5661 <https://github.com/lvgl/lvgl/pull/5661>`__ `5812 <https://github.com/lvgl/lvgl/pull/5812>`__
- **feat(image_decoder): add stride warning** `5471 <https://github.com/lvgl/lvgl/pull/5471>`__ - **feat(vg_lite): add matrix assert**
- **feat(image, layer): add bitmap mask feature** `5545 <https://github.com/lvgl/lvgl/pull/5545>`__ `5766 <https://github.com/lvgl/lvgl/pull/5766>`__
- **feat(draw-sw): add simple Helium acceleration** `5596 <https://github.com/lvgl/lvgl/pull/5596>`__ - **feat(vg_lite): add grad cache size config and auto release cache**
- **feat(cache): use unified cache entry free callback** `5612 <https://github.com/lvgl/lvgl/pull/5612>`__ `5731 <https://github.com/lvgl/lvgl/pull/5731>`__
- **feat(draw_buf): use draw_buf as parameter of invalidate_cache API** `5602 <https://github.com/lvgl/lvgl/pull/5602>`__ - **feat(draw_buf): support indexed image in draw_buf_copy**
- **feat(script): add ARGB8565 format support** `5593 <https://github.com/lvgl/lvgl/pull/5593>`__ `5686 <https://github.com/lvgl/lvgl/pull/5686>`__
- **feat(vg_lite): add ARGB8565 support** `5592 <https://github.com/lvgl/lvgl/pull/5592>`__ - **feat(nuttx): update display driver**
- **feat(vg_lite): add gpu idle flush** `5571 <https://github.com/lvgl/lvgl/pull/5571>`__ `5752 <https://github.com/lvgl/lvgl/pull/5752>`__
- **feat(vg_lite_tvg): add buffer address alignment config** `5576 <https://github.com/lvgl/lvgl/pull/5576>`__ - **feat(fs): implement littlefs lfs.h driver support**
- **feat(vg_lite/vector): add compatible processing for non-scissor support** `5572 <https://github.com/lvgl/lvgl/pull/5572>`__ `5562 <https://github.com/lvgl/lvgl/pull/5562>`__
- **feat(vg_lite): remove support for RGB565A8** `5574 <https://github.com/lvgl/lvgl/pull/5574>`__ - **feat(test_keyboard): add keyboard test**
- **feat(vg_lite_label): upgrade path quality to HIGH** `5556 <https://github.com/lvgl/lvgl/pull/5556>`__ `5739 <https://github.com/lvgl/lvgl/pull/5739>`__
- **feat(font_glyph_format): refactor draw and font format into `lv_font_glyph_format_t`** `5540 <https://github.com/lvgl/lvgl/pull/5540>`__ - **feat(x11): add LV_KEYs**
- **feat(vg_lite): add index format decode support** `5476 <https://github.com/lvgl/lvgl/pull/5476>`__ `5704 <https://github.com/lvgl/lvgl/pull/5704>`__
- **feat(vector): add API to append arc** `5510 <https://github.com/lvgl/lvgl/pull/5510>`__ - **feat(display): add save screenshot to file support**
- **feat(nuttx_image_cache): add independent image cache heap support** `5528 <https://github.com/lvgl/lvgl/pull/5528>`__ `5481 <https://github.com/lvgl/lvgl/pull/5481>`__
- **feat(cache): refactor cache framework and add new APIs** `5501 <https://github.com/lvgl/lvgl/pull/5501>`__ - **feat(decoder): do not even try cache if 'no_cache' is set**
- **feat(drivers): add libinput/xkb driver** `5486 <https://github.com/lvgl/lvgl/pull/5486>`__ `5688 <https://github.com/lvgl/lvgl/pull/5688>`__
- **feat(draw_buf): misc update** `5498 <https://github.com/lvgl/lvgl/pull/5498>`__ - **feat(event): return event dsc for later to remove**
- **feat(draw): add convenience methods for safely getting correct draw descriptor** `5505 <https://github.com/lvgl/lvgl/pull/5505>`__ `5630 <https://github.com/lvgl/lvgl/pull/5630>`__
- **feat(profiler): add multithreading support and testcase** `5490 <https://github.com/lvgl/lvgl/pull/5490>`__ - **feat(keyboard) add Home and End keys mapping**
- **feat(doc): Update display-related documentation to new API** `5489 <https://github.com/lvgl/lvgl/pull/5489>`__ `5675 <https://github.com/lvgl/lvgl/pull/5675>`__
- **feat(image_cache): add image header cache drop** `5472 <https://github.com/lvgl/lvgl/pull/5472>`__ - **feat(draw_buf): distinguish between lv_image_dsc_t and lv_draw_buf_t**
- **feat(fbdev): add docs and allow forcing refresh** `5444 <https://github.com/lvgl/lvgl/pull/5444>`__ `5496 <https://github.com/lvgl/lvgl/pull/5496>`__
- **feat(script): add tool to view bin image** `5451 <https://github.com/lvgl/lvgl/pull/5451>`__ - **feat(indev): remove the PRESSED state on scroll**
- **feat(vg_lite): add profiler instrumentation** `5434 <https://github.com/lvgl/lvgl/pull/5434>`__ `5660 <https://github.com/lvgl/lvgl/pull/5660>`__
- **feat(draw_letter): adapt `lv_font_glyph_format_t` for draw_letter process** `3c1a765 <https://github.com/lvgl/lvgl/commit/3c1a76506e8d948d5c8e029f3467139bdddf7e16>`__ - **feat(sysmon): show max memory usage**
- **feat(color): add color format ARGB8565** `86016a8 <https://github.com/lvgl/lvgl/commit/86016a819a134b2d71777406cfacb3a25d7685cc>`__ `5661 <https://github.com/lvgl/lvgl/pull/5661>`__
- **feat(image_decoder): add stride warning**
`5471 <https://github.com/lvgl/lvgl/pull/5471>`__
- **feat(image, layer): add bitmap mask feature**
`5545 <https://github.com/lvgl/lvgl/pull/5545>`__
- **feat(draw-sw): add simple Helium acceleration**
`5596 <https://github.com/lvgl/lvgl/pull/5596>`__
- **feat(cache): use unified cache entry free callback**
`5612 <https://github.com/lvgl/lvgl/pull/5612>`__
- **feat(draw_buf): use draw_buf as parameter of invalidate_cache API**
`5602 <https://github.com/lvgl/lvgl/pull/5602>`__
- **feat(script): add ARGB8565 format support**
`5593 <https://github.com/lvgl/lvgl/pull/5593>`__
- **feat(vg_lite): add ARGB8565 support**
`5592 <https://github.com/lvgl/lvgl/pull/5592>`__
- **feat(vg_lite): add gpu idle flush**
`5571 <https://github.com/lvgl/lvgl/pull/5571>`__
- **feat(vg_lite_tvg): add buffer address alignment config**
`5576 <https://github.com/lvgl/lvgl/pull/5576>`__
- **feat(vg_lite/vector): add compatible processing for non-scissor support**
`5572 <https://github.com/lvgl/lvgl/pull/5572>`__
- **feat(vg_lite): remove support for RGB565A8**
`5574 <https://github.com/lvgl/lvgl/pull/5574>`__
- **feat(vg_lite_label): upgrade path quality to HIGH**
`5556 <https://github.com/lvgl/lvgl/pull/5556>`__
- **feat(font_glyph_format): refactor draw and font format into `lv_font_glyph_format_t`**
`5540 <https://github.com/lvgl/lvgl/pull/5540>`__
- **feat(vg_lite): add index format decode support**
`5476 <https://github.com/lvgl/lvgl/pull/5476>`__
- **feat(vector): add API to append arc**
`5510 <https://github.com/lvgl/lvgl/pull/5510>`__
- **feat(nuttx_image_cache): add independent image cache heap support**
`5528 <https://github.com/lvgl/lvgl/pull/5528>`__
- **feat(cache): refactor cache framework and add new APIs**
`5501 <https://github.com/lvgl/lvgl/pull/5501>`__
- **feat(drivers): add libinput/xkb driver**
`5486 <https://github.com/lvgl/lvgl/pull/5486>`__
- **feat(draw_buf): misc update**
`5498 <https://github.com/lvgl/lvgl/pull/5498>`__
- **feat(draw): add convenience methods for safely getting correct draw descriptor**
`5505 <https://github.com/lvgl/lvgl/pull/5505>`__
- **feat(profiler): add multithreading support and testcase**
`5490 <https://github.com/lvgl/lvgl/pull/5490>`__
- **feat(doc): Update display-related documentation to new API**
`5489 <https://github.com/lvgl/lvgl/pull/5489>`__
- **feat(image_cache): add image header cache drop**
`5472 <https://github.com/lvgl/lvgl/pull/5472>`__
- **feat(fbdev): add docs and allow forcing refresh**
`5444 <https://github.com/lvgl/lvgl/pull/5444>`__
- **feat(script): add tool to view bin image**
`5451 <https://github.com/lvgl/lvgl/pull/5451>`__
- **feat(vg_lite): add profiler instrumentation**
`5434 <https://github.com/lvgl/lvgl/pull/5434>`__
- **feat(draw_letter): adapt `lv_font_glyph_format_t` for draw_letter process**
`3c1a765 <https://github.com/lvgl/lvgl/commit/3c1a76506e8d948d5c8e029f3467139bdddf7e16>`__
- **feat(color): add color format ARGB8565**
`86016a8 <https://github.com/lvgl/lvgl/commit/86016a819a134b2d71777406cfacb3a25d7685cc>`__
Performance Performance
~~~~~~~~~~~ ~~~~~~~~~~~
- **perf(draw): minor optimization on rgb565 color blending** `5603 <https://github.com/lvgl/lvgl/pull/5603>`__ - **perf(draw): minor optimization on rgb565 color blending**
- **perf(draw): use the simpler layer clear method** `5470 <https://github.com/lvgl/lvgl/pull/5470>`__ `5603 <https://github.com/lvgl/lvgl/pull/5603>`__
- **perf(vg_lite): add asynchronous rendering support** `5398 <https://github.com/lvgl/lvgl/pull/5398>`__ - **perf(draw): use the simpler layer clear method**
`5470 <https://github.com/lvgl/lvgl/pull/5470>`__
- **perf(vg_lite): add asynchronous rendering support**
`5398 <https://github.com/lvgl/lvgl/pull/5398>`__
Fixes Fixes
~~~~~ ~~~~~
- **fix(obj_tree): fix unintended click triggers on object deletion** `5907 <https://github.com/lvgl/lvgl/pull/5907>`__ - **fix(obj_tree): fix unintended click triggers on object deletion**
- **fix(monkey): add missing include** `5903 <https://github.com/lvgl/lvgl/pull/5903>`__ `5907 <https://github.com/lvgl/lvgl/pull/5907>`__
- **fix(demo/vector_graphic): add missing buffer clear** `5898 <https://github.com/lvgl/lvgl/pull/5898>`__ - **fix(monkey): add missing include**
- **fix(image): fix the image decoder if LV_BIN_DECODER_RAM_LOAD == 0** `5892 <https://github.com/lvgl/lvgl/pull/5892>`__ `5903 <https://github.com/lvgl/lvgl/pull/5903>`__
- **fix(indev): Fix scroll obj cannot be cleared when waiting until release** `5833 <https://github.com/lvgl/lvgl/pull/5833>`__ - **fix(demo/vector_graphic): add missing buffer clear**
- **fix(vglite): update NXP's VGLite implementation** `5887 <https://github.com/lvgl/lvgl/pull/5887>`__ `5898 <https://github.com/lvgl/lvgl/pull/5898>`__
- **fix(imagebutton): clipped area of mid part** `5849 <https://github.com/lvgl/lvgl/pull/5849>`__ - **fix(image): fix the image decoder if LV_BIN_DECODER_RAM_LOAD == 0**
- **fix(drm): default to XRGB8888 framebuffer** `5851 <https://github.com/lvgl/lvgl/pull/5851>`__ `5892 <https://github.com/lvgl/lvgl/pull/5892>`__
- **fix(vg_lite): fix stroke path memory leak** `5883 <https://github.com/lvgl/lvgl/pull/5883>`__ - **fix(indev): Fix scroll obj cannot be cleared when waiting until release**
- **fix(ci): workaround ASAN error in CI with Ubuntu 22.04 image** `5867 <https://github.com/lvgl/lvgl/pull/5867>`__ `5833 <https://github.com/lvgl/lvgl/pull/5833>`__
- **fix(conf): fix typo cause thorvg not enabled** `5837 <https://github.com/lvgl/lvgl/pull/5837>`__ - **fix(vglite): update NXP's VGLite implementation**
- **fix(indev): always save the last key** `5795 <https://github.com/lvgl/lvgl/pull/5795>`__ `5887 <https://github.com/lvgl/lvgl/pull/5887>`__
- **fix(fsdrv/fatfs): fix does not detect the end of entries in fs_dir_read** `5826 <https://github.com/lvgl/lvgl/pull/5826>`__ - **fix(imagebutton): clipped area of mid part**
- **fix(layer): update the cached layer type on state change** `5801 <https://github.com/lvgl/lvgl/pull/5801>`__ `5849 <https://github.com/lvgl/lvgl/pull/5849>`__
- **fix(file_explorer): fix quick access compiler error** `5783 <https://github.com/lvgl/lvgl/pull/5783>`__ - **fix(drm): default to XRGB8888 framebuffer**
- **fix(msgbox): return the footer in lv_msgbox_get_footer** `5804 <https://github.com/lvgl/lvgl/pull/5804>`__ `5851 <https://github.com/lvgl/lvgl/pull/5851>`__
- **fix(x11): fix assert on delete** `5799 <https://github.com/lvgl/lvgl/pull/5799>`__ - **fix(vg_lite): fix stroke path memory leak**
- **fix(demo_music): fix the previous button in the music demo is not clickable** `5808 <https://github.com/lvgl/lvgl/pull/5808>`__ `5883 <https://github.com/lvgl/lvgl/pull/5883>`__
- **fix(draw): fix non antialiased rgb565a8 transformation** `5782 <https://github.com/lvgl/lvgl/pull/5782>`__ - **fix(ci): workaround ASAN error in CI with Ubuntu 22.04 image**
- **fix(freetpye): fix the problem of incomplete font drawing when setting with italic** `5807 <https://github.com/lvgl/lvgl/pull/5807>`__ `5867 <https://github.com/lvgl/lvgl/pull/5867>`__
- **fix(fsdrv): add missing lv_fs_littlefs_init function declaration** `5778 <https://github.com/lvgl/lvgl/pull/5778>`__ - **fix(conf): fix typo cause thorvg not enabled**
- **fix(vg_lite):fix bug for wrong rendering in vertical or horizontal dir** `5789 <https://github.com/lvgl/lvgl/pull/5789>`__ `5837 <https://github.com/lvgl/lvgl/pull/5837>`__
- **fix(env): added *.cpp glob in ESP configuration** `5761 <https://github.com/lvgl/lvgl/pull/5761>`__ - **fix(indev): always save the last key**
- **fix(draw): fix the invalidation of scaled areas** `5548 <https://github.com/lvgl/lvgl/pull/5548>`__ `5795 <https://github.com/lvgl/lvgl/pull/5795>`__
- **fix(warning): variable set but unused.** `5757 <https://github.com/lvgl/lvgl/pull/5757>`__ - **fix(fsdrv/fatfs): fix does not detect the end of entries in fs_dir_read**
- **fix(draw): fix rgb565 with LV_BLEND_MODE_MULTIPLY** `5749 <https://github.com/lvgl/lvgl/pull/5749>`__ `5826 <https://github.com/lvgl/lvgl/pull/5826>`__
- **fix(api_map_v8): add some missing functions** `5710 <https://github.com/lvgl/lvgl/pull/5710>`__ - **fix(layer): update the cached layer type on state change**
- **fix(refr): fix ARGB8888 buffer clearing in DIRECT mode (#5741)** `5758 <https://github.com/lvgl/lvgl/pull/5758>`__ `5801 <https://github.com/lvgl/lvgl/pull/5801>`__
- **fix(draw_buf): init struct member in order** `5753 <https://github.com/lvgl/lvgl/pull/5753>`__ - **fix(file_explorer): fix quick access compiler error**
- **fix(refr): fix clearing the partial buffers in case of ARGB8888 format** `5741 <https://github.com/lvgl/lvgl/pull/5741>`__ `5783 <https://github.com/lvgl/lvgl/pull/5783>`__
- **fix(x11): fix typo** `5742 <https://github.com/lvgl/lvgl/pull/5742>`__ - **fix(msgbox): return the footer in lv_msgbox_get_footer**
- **fix(draw_vector): check the point length of path in lv_vector_path_get_bounding** `5734 <https://github.com/lvgl/lvgl/pull/5734>`__ `5804 <https://github.com/lvgl/lvgl/pull/5804>`__
- **fix(vg_lite): fix draw layer drawing is incomplete** `5729 <https://github.com/lvgl/lvgl/pull/5729>`__ - **fix(x11): fix assert on delete**
- **fix(test_span): fix an issue where img has span_1.png, but it is not in the code** `5736 <https://github.com/lvgl/lvgl/pull/5736>`__ `5799 <https://github.com/lvgl/lvgl/pull/5799>`__
- **fix(vg_lite): fix drawing command accumulation** `5730 <https://github.com/lvgl/lvgl/pull/5730>`__ - **fix(demo_music): fix the previous button in the music demo is not clickable**
- **fix(vg_lite): fix vector rendering fill dsc matrix not taking effect** `5728 <https://github.com/lvgl/lvgl/pull/5728>`__ `5808 <https://github.com/lvgl/lvgl/pull/5808>`__
- **fix(stdlib): fix issues when using LVGL TLSF memory pool to manage more than 4 GiB of memory** `5720 <https://github.com/lvgl/lvgl/pull/5720>`__ - **fix(draw): fix non antialiased rgb565a8 transformation**
- **fix(vg_lite): remove redundant MOVE_TO operations** `5713 <https://github.com/lvgl/lvgl/pull/5713>`__ `5782 <https://github.com/lvgl/lvgl/pull/5782>`__
- **fix(nuttx): fix compile warning** `5701 <https://github.com/lvgl/lvgl/pull/5701>`__ - **fix(freetpye): fix the problem of incomplete font drawing when setting with italic**
- **fix(draw_vector): remove redundant MOVE_TO operations** `5715 <https://github.com/lvgl/lvgl/pull/5715>`__ `5807 <https://github.com/lvgl/lvgl/pull/5807>`__
- **fix(draw_buf): use height as loop condition instead of checking data pointers** `5687 <https://github.com/lvgl/lvgl/pull/5687>`__ - **fix(fsdrv): add missing lv_fs_littlefs_init function declaration**
- **fix(vg_lite): fix the loss of display accuracy of rounded rectangles** `5714 <https://github.com/lvgl/lvgl/pull/5714>`__ `5778 <https://github.com/lvgl/lvgl/pull/5778>`__
- **fix(test): check compiler flag should not contain '_'** `5706 <https://github.com/lvgl/lvgl/pull/5706>`__ - **fix(vg_lite):fix bug for wrong rendering in vertical or horizontal dir**
- **fix(imagebutton): fix the example** `5719 <https://github.com/lvgl/lvgl/pull/5719>`__ `5789 <https://github.com/lvgl/lvgl/pull/5789>`__
- **fix(drm): eliminate use of non-existent lv_api_map.h and enable smoke tests** `5694 <https://github.com/lvgl/lvgl/pull/5694>`__ - **fix(env): added *.cpp glob in ESP configuration**
- **fix(test): enable -Wpedantic** `5676 <https://github.com/lvgl/lvgl/pull/5676>`__ `5761 <https://github.com/lvgl/lvgl/pull/5761>`__
- **fix(pxp): fix issues in pxp cache management callback** `5685 <https://github.com/lvgl/lvgl/pull/5685>`__ - **fix(draw): fix the invalidation of scaled areas**
- **fix(windows): improve graphic performance via using high resolution tick count and timer delay implementation** `5711 <https://github.com/lvgl/lvgl/pull/5711>`__ `5548 <https://github.com/lvgl/lvgl/pull/5548>`__
- **fix(windows): improve the document** `5699 <https://github.com/lvgl/lvgl/pull/5699>`__ - **fix(warning): variable set but unused.**
- **fix(example): fix lv_example_obj_2** `5697 <https://github.com/lvgl/lvgl/pull/5697>`__ `5757 <https://github.com/lvgl/lvgl/pull/5757>`__
- **fix(draw): fix compiler error when LV_DRAW_SW_COMPLEX is disabled** `5695 <https://github.com/lvgl/lvgl/pull/5695>`__ - **fix(draw): fix rgb565 with LV_BLEND_MODE_MULTIPLY**
- **fix(test): allow to run test locally on mac** `5672 <https://github.com/lvgl/lvgl/pull/5672>`__ `5749 <https://github.com/lvgl/lvgl/pull/5749>`__
- **fix(sdl): fix buf memleak on lv_display_delete** `5692 <https://github.com/lvgl/lvgl/pull/5692>`__ - **fix(api_map_v8): add some missing functions**
- **fix(decoder): decoded image should always have same w,h as original image** `5689 <https://github.com/lvgl/lvgl/pull/5689>`__ `5710 <https://github.com/lvgl/lvgl/pull/5710>`__
- **fix(cache): fix warnings** `5671 <https://github.com/lvgl/lvgl/pull/5671>`__ - ** fix(refr): fix ARGB8888 buffer clearing in DIRECT mode (#5741)**
- **fix(dave2d): follow lvgl changes** `5659 <https://github.com/lvgl/lvgl/pull/5659>`__ `5758 <https://github.com/lvgl/lvgl/pull/5758>`__
- **fix(vg_lite): fix typo in decoder_close** `5683 <https://github.com/lvgl/lvgl/pull/5683>`__ - **fix(draw_buf): init struct member in order**
- **fix(vg_lite): use float instead of int to avoid type conversion** `5682 <https://github.com/lvgl/lvgl/pull/5682>`__ `5753 <https://github.com/lvgl/lvgl/pull/5753>`__
- **fix(formatting): fix code formatting** `5673 <https://github.com/lvgl/lvgl/pull/5673>`__ - **fix(refr): fix clearing the partial buffers in case of ARGB8888 format**
- **fix(freetype): fix build break when disable LV_USE_FS_MEMFS** `5651 <https://github.com/lvgl/lvgl/pull/5651>`__ `5741 <https://github.com/lvgl/lvgl/pull/5741>`__
- **fix(array): use memmove instead of memcopy** `5656 <https://github.com/lvgl/lvgl/pull/5656>`__ - **fix(x11): fix typo**
- **fix(image): fix wrong log level statement** `5655 <https://github.com/lvgl/lvgl/pull/5655>`__ `5742 <https://github.com/lvgl/lvgl/pull/5742>`__
- **fix(tests): fix test_img_emoji_F617.c error include path** `5652 <https://github.com/lvgl/lvgl/pull/5652>`__ - **fix(draw_vector): check the point length of path in lv_vector_path_get_bounding**
- **fix(FreeRTOS): Stacksize calculation** `5647 <https://github.com/lvgl/lvgl/pull/5647>`__ `5734 <https://github.com/lvgl/lvgl/pull/5734>`__
- **fix(benchmark): fix FPS calculation** `5646 <https://github.com/lvgl/lvgl/pull/5646>`__ - **fix(vg_lite): fix draw layer drawing is incomplete**
- **fix(label): consider max-width** `5644 <https://github.com/lvgl/lvgl/pull/5644>`__ `5729 <https://github.com/lvgl/lvgl/pull/5729>`__
- **fix(demo): fix memory leak in vector demo** `5643 <https://github.com/lvgl/lvgl/pull/5643>`__ - **fix(test_span): fix an issue where img has span_1.png, but it is not in the code**
- **fix(calendar): fix crash when no default is set** `5621 <https://github.com/lvgl/lvgl/pull/5621>`__ `5736 <https://github.com/lvgl/lvgl/pull/5736>`__
- **fix(freetype): fix using memfs to create a FT font** `5627 <https://github.com/lvgl/lvgl/pull/5627>`__ - **fix(vg_lite): fix drawing command accumulation**
- **fix(indev): fix variable name in preprocessor warning** `5637 <https://github.com/lvgl/lvgl/pull/5637>`__ `5730 <https://github.com/lvgl/lvgl/pull/5730>`__
- **fix(rle): avoid buffer overflow when compressed data is not in pixel unit** `5619 <https://github.com/lvgl/lvgl/pull/5619>`__ - **fix(vg_lite): fix vector rendering fill dsc matrix not taking effect**
- **fix(LVGLImage): use lv_image_dsc_t instead of lv_img_dsc_t** `5629 <https://github.com/lvgl/lvgl/pull/5629>`__ `5728 <https://github.com/lvgl/lvgl/pull/5728>`__
- **fix(vg_lite): fix linear image use after free** `5618 <https://github.com/lvgl/lvgl/pull/5618>`__ - **fix(stdlib): fix issues when using LVGL TLSF memory pool to manage more than 4 GiB of memory**
- **fix(kconfig): skip lv_conf.h by default** `5617 <https://github.com/lvgl/lvgl/pull/5617>`__ `5720 <https://github.com/lvgl/lvgl/pull/5720>`__
- **fix(image): add data_size filed to all c-array images** `5608 <https://github.com/lvgl/lvgl/pull/5608>`__ - **fix(vg_lite): remove redundant MOVE_TO operations**
- **fix(doc): wrong code for Displays transparency** `5607 <https://github.com/lvgl/lvgl/pull/5607>`__ `5713 <https://github.com/lvgl/lvgl/pull/5713>`__
- **fix(refr): take stride into consideration in partial update mode** `5583 <https://github.com/lvgl/lvgl/pull/5583>`__ - **fix(nuttx): fix compile warning**
- **fix(test): fix typo related to #5559** `5594 <https://github.com/lvgl/lvgl/pull/5594>`__ `5701 <https://github.com/lvgl/lvgl/pull/5701>`__
- **fix(sysmon): fix build error when LV_USE_PERF_MONITOR_LOG_MODE is enabled** `5597 <https://github.com/lvgl/lvgl/pull/5597>`__ - **fix(draw_vector): remove redundant MOVE_TO operations**
- **fix(sdl): use the new draw buffer structure in the layers** `5578 <https://github.com/lvgl/lvgl/pull/5578>`__ `5715 <https://github.com/lvgl/lvgl/pull/5715>`__
- **fix(benchmark): improve the benchmark** `5558 <https://github.com/lvgl/lvgl/pull/5558>`__ - **fix(draw_buf): use height as loop condition instead of checking data pointers**
- **fix(ffmpeg): add missing stride setting to ffmpeg image** `5580 <https://github.com/lvgl/lvgl/pull/5580>`__ `5687 <https://github.com/lvgl/lvgl/pull/5687>`__
- **fix(sysmon): fix build break** `5585 <https://github.com/lvgl/lvgl/pull/5585>`__ - **fix(vg_lite): fix the loss of display accuracy of rounded rectangles**
- **fix(tileview): on size change auto. update the pos. of the tiles** `5577 <https://github.com/lvgl/lvgl/pull/5577>`__ `5714 <https://github.com/lvgl/lvgl/pull/5714>`__
- **fix(sdl): fix keyboard handling** `5575 <https://github.com/lvgl/lvgl/pull/5575>`__ - **fix(test): check compiler flag should not contain '_'**
- **fix(lv_conf): minor typo fixes in lv_conf_template.h** `5570 <https://github.com/lvgl/lvgl/pull/5570>`__ `5706 <https://github.com/lvgl/lvgl/pull/5706>`__
- **fix(vg_lite): fix arc img not move to arc center** `5554 <https://github.com/lvgl/lvgl/pull/5554>`__ - **fix(imagebutton): fix the example**
- **fix(vg_lite): add grad image buffer check** `5552 <https://github.com/lvgl/lvgl/pull/5552>`__ `5719 <https://github.com/lvgl/lvgl/pull/5719>`__
- **fix(obj): fix cover change with semi transparent gradients** `5531 <https://github.com/lvgl/lvgl/pull/5531>`__ - **fix(drm): eliminate use of non-existent lv_api_map.h and enable smoke tests**
- **fix(vg_lite): path matrix should use main vector matrix** `5538 <https://github.com/lvgl/lvgl/pull/5538>`__ `5694 <https://github.com/lvgl/lvgl/pull/5694>`__
- **fix(vg_lite): fix LV_RADIUS_CIRCLE not round** `5543 <https://github.com/lvgl/lvgl/pull/5543>`__ - **fix(test): enable -Wpedantic**
- **fix(vg_lite): add config to disable draw shadow** `5534 <https://github.com/lvgl/lvgl/pull/5534>`__ `5676 <https://github.com/lvgl/lvgl/pull/5676>`__
- **fix(neon): update stride from px to bytes** `5526 <https://github.com/lvgl/lvgl/pull/5526>`__ - **fix(pxp): fix issues in pxp cache management callback**
- **fix(script): Remove TRUECOLOR for LVGLImage.py** `5523 <https://github.com/lvgl/lvgl/pull/5523>`__ `5685 <https://github.com/lvgl/lvgl/pull/5685>`__
- **fix(sysmon): support starting LVGL without having a display** `5518 <https://github.com/lvgl/lvgl/pull/5518>`__ - **fix(windows): improve graphic performance via using high resolution tick count and timer delay implementation**
- **fix(chart): set the series id correctly** `5482 <https://github.com/lvgl/lvgl/pull/5482>`__ `5711 <https://github.com/lvgl/lvgl/pull/5711>`__
- **fix(vg_lite): fix clip corner image display error** `5517 <https://github.com/lvgl/lvgl/pull/5517>`__ - **fix(windows): improve the document**
- **fix(arduino): update example LVGL_Arduino.ino for v9** `5499 <https://github.com/lvgl/lvgl/pull/5499>`__ `5699 <https://github.com/lvgl/lvgl/pull/5699>`__
- **fix(fb): set DPI to correctly** `5508 <https://github.com/lvgl/lvgl/pull/5508>`__ - **fix(example): fix lv_example_obj_2**
- **fix(layer): Update calculation for overlay used memory** `5504 <https://github.com/lvgl/lvgl/pull/5504>`__ `5697 <https://github.com/lvgl/lvgl/pull/5697>`__
- **fix(bin_decoder): fix potential free garbage address** `5509 <https://github.com/lvgl/lvgl/pull/5509>`__ - **fix(draw): fix compiler error when LV_DRAW_SW_COMPLEX is disabled**
- **fix(decoder): treat ALLOCATED c-array image as draw buffer** `5483 <https://github.com/lvgl/lvgl/pull/5483>`__ `5695 <https://github.com/lvgl/lvgl/pull/5695>`__
- **fix(vg_lite_tvg): fix use after free when change target canvas** `5497 <https://github.com/lvgl/lvgl/pull/5497>`__ - **fix(test): allow to run test locally on mac**
- **fix(keyboard): in the example set Arabic font if enabled** `5457 <https://github.com/lvgl/lvgl/pull/5457>`__ `5672 <https://github.com/lvgl/lvgl/pull/5672>`__
- **fix(codespaces): fix the issue where lv_conf.h in codespaces is not enable** `5484 <https://github.com/lvgl/lvgl/pull/5484>`__ - **fix(sdl): fix buf memleak on lv_display_delete**
- **fix(textarea): fix accepted chars issue on big endian systems** `5479 <https://github.com/lvgl/lvgl/pull/5479>`__ `5692 <https://github.com/lvgl/lvgl/pull/5692>`__
- **fix(draw_line): fix the issue where dash_dap equals 1 and cannot display properly when the line is a horizontal line** `5473 <https://github.com/lvgl/lvgl/pull/5473>`__ - **fix(decoder): decoded image should always have same w,h as original image**
- **fix: removed LV_ATTRIBUTE_FAST_MEM function attribute from prototypes** `5467 <https://github.com/lvgl/lvgl/pull/5467>`__ `5689 <https://github.com/lvgl/lvgl/pull/5689>`__
- **fix(arm2d): apply a temporary patch to arm-2d acceleration** `5466 <https://github.com/lvgl/lvgl/pull/5466>`__ - **fix(cache): fix warnings**
- **fix(snapshot): update the layout of the component before the screenshot** `5475 <https://github.com/lvgl/lvgl/pull/5475>`__ `5671 <https://github.com/lvgl/lvgl/pull/5671>`__
- **fix(vg_lite): add missing 24bit color support check** `5469 <https://github.com/lvgl/lvgl/pull/5469>`__ - **fix(dave2d): follow lvgl changes**
- **fix(display): set last_activity_time to the current time in lv_display** `5463 <https://github.com/lvgl/lvgl/pull/5463>`__ `5659 <https://github.com/lvgl/lvgl/pull/5659>`__
- **fix(observer): fixed lv_subject_remove_all_obj** `5464 <https://github.com/lvgl/lvgl/pull/5464>`__ - **fix(vg_lite): fix typo in decoder_close**
- **fix(image_decoder): fix decoder not close** `5437 <https://github.com/lvgl/lvgl/pull/5437>`__ `5683 <https://github.com/lvgl/lvgl/pull/5683>`__
- **fix(nuttx): fix build break** `5440 <https://github.com/lvgl/lvgl/pull/5440>`__ - **fix(vg_lite): use float instead of int to avoid type conversion**
- **fix: fix warnings with -flto on GCC 11** `5433 <https://github.com/lvgl/lvgl/pull/5433>`__ `5682 <https://github.com/lvgl/lvgl/pull/5682>`__
- **fix(assert): add new macro to format assert message** `5453 <https://github.com/lvgl/lvgl/pull/5453>`__ - **fix(formatting): fix code formatting**
- **fix(decoder): if draw unit supports indexed image, don't add to cache** `5438 <https://github.com/lvgl/lvgl/pull/5438>`__ `5673 <https://github.com/lvgl/lvgl/pull/5673>`__
- **fix(bar): mask the background to fix it on value adjustment** `5426 <https://github.com/lvgl/lvgl/pull/5426>`__ - **fix(freetype): fix build break when disable LV_USE_FS_MEMFS**
- **fix(lvgl.mk): fix vg_lite_tvg.cpp not compiling** `5435 <https://github.com/lvgl/lvgl/pull/5435>`__ `5651 <https://github.com/lvgl/lvgl/pull/5651>`__
- **fix(ci): use the dev branch of PlatformIO** `5432 <https://github.com/lvgl/lvgl/pull/5432>`__ - **fix(array): use memmove instead of memcopy**
- **fix(vector) : add path bounding and matrix transform functions.** `5389 <https://github.com/lvgl/lvgl/pull/5389>`__ `5656 <https://github.com/lvgl/lvgl/pull/5656>`__
- **fix(warning): fix shadown variable warning** `47750f1 <https://github.com/lvgl/lvgl/commit/47750f1b866e5ea0617035fd208c727878bebc44>`__ - **fix(image): fix wrong log level statement**
- **fix(thorvg): link lvgl_thorvgl with lvgl** `9b09182 <https://github.com/lvgl/lvgl/commit/9b09182fc76032ef0bc8a2d930fa1cf4fd081431>`__ `5655 <https://github.com/lvgl/lvgl/pull/5655>`__
- **fix(warning): error: no newline at end of file** `9a6a194 <https://github.com/lvgl/lvgl/commit/9a6a194680db9ea12f59e94eab6e812cb28d504f>`__ - **fix(tests): fix test_img_emoji_F617.c error include path**
- **fix(color): treat RGB565A8 bpp same as RGB565** `52426ec <https://github.com/lvgl/lvgl/commit/52426ec1919274e282889129f00e00a9a2a9ce60>`__ `5652 <https://github.com/lvgl/lvgl/pull/5652>`__
- **fix(warning): error: a function declaration without a prototype is deprecated in all versions of C** `c81f654 <https://github.com/lvgl/lvgl/commit/c81f654026501ba37d8df2d8ec02c58bd14eb1c3>`__ - **fix(FreeRTOS): Stacksize calculation**
`5647 <https://github.com/lvgl/lvgl/pull/5647>`__
- **fix(benchmark): fix FPS calculation**
`5646 <https://github.com/lvgl/lvgl/pull/5646>`__
- **fix(label): consider max-width**
`5644 <https://github.com/lvgl/lvgl/pull/5644>`__
- **fix(demo): fix memory leak in vector demo**
`5643 <https://github.com/lvgl/lvgl/pull/5643>`__
- **fix(calendar): fix crash when no default is set**
`5621 <https://github.com/lvgl/lvgl/pull/5621>`__
- **fix(freetype): fix using memfs to create a FT font**
`5627 <https://github.com/lvgl/lvgl/pull/5627>`__
- **fix(indev): fix variable name in preprocessor warning**
`5637 <https://github.com/lvgl/lvgl/pull/5637>`__
- **fix(rle): avoid buffer overflow when compressed data is not in pixel unit**
`5619 <https://github.com/lvgl/lvgl/pull/5619>`__
- **fix(LVGLImage): use lv_image_dsc_t instead of lv_img_dsc_t**
`5629 <https://github.com/lvgl/lvgl/pull/5629>`__
- **fix(vg_lite): fix linear image use after free**
`5618 <https://github.com/lvgl/lvgl/pull/5618>`__
- **fix(kconfig): skip lv_conf.h by default**
`5617 <https://github.com/lvgl/lvgl/pull/5617>`__
- **fix(image): add data_size filed to all c-array images**
`5608 <https://github.com/lvgl/lvgl/pull/5608>`__
- **fix(doc): wrong code for Displays transparency**
`5607 <https://github.com/lvgl/lvgl/pull/5607>`__
- **fix(refr): take stride into consideration in partial update mode**
`5583 <https://github.com/lvgl/lvgl/pull/5583>`__
- **fix(test): fix typo related to #5559**
`5594 <https://github.com/lvgl/lvgl/pull/5594>`__
- **fix(sysmon): fix build error when LV_USE_PERF_MONITOR_LOG_MODE is enabled**
`5597 <https://github.com/lvgl/lvgl/pull/5597>`__
- **fix(sdl): use the new draw buffer structure in the layers**
`5578 <https://github.com/lvgl/lvgl/pull/5578>`__
- **fix(benchmark): improve the benchmark**
`5558 <https://github.com/lvgl/lvgl/pull/5558>`__
- **fix(ffmpeg): add missing stride setting to ffmpeg image**
`5580 <https://github.com/lvgl/lvgl/pull/5580>`__
- **fix(sysmon): fix build break**
`5585 <https://github.com/lvgl/lvgl/pull/5585>`__
- **fix(tileview): on size change auto. update the pos. of the tiles**
`5577 <https://github.com/lvgl/lvgl/pull/5577>`__
- **fix(sdl): fix keyboard handling**
`5575 <https://github.com/lvgl/lvgl/pull/5575>`__
- **fix(lv_conf): minor typo fixes in lv_conf_template.h**
`5570 <https://github.com/lvgl/lvgl/pull/5570>`__
- **fix(vg_lite): fix arc img not move to arc center**
`5554 <https://github.com/lvgl/lvgl/pull/5554>`__
- **fix(vg_lite): add grad image buffer check**
`5552 <https://github.com/lvgl/lvgl/pull/5552>`__
- **fix(obj): fix cover change with semi transparent gradients**
`5531 <https://github.com/lvgl/lvgl/pull/5531>`__
- **fix(vg_lite): path matrix should use main vector matrix**
`5538 <https://github.com/lvgl/lvgl/pull/5538>`__
- **fix(vg_lite): fix LV_RADIUS_CIRCLE not round**
`5543 <https://github.com/lvgl/lvgl/pull/5543>`__
- **fix(vg_lite): add config to disable draw shadow**
`5534 <https://github.com/lvgl/lvgl/pull/5534>`__
- **fix(neon): update stride from px to bytes**
`5526 <https://github.com/lvgl/lvgl/pull/5526>`__
- **fix(script): Remove TRUECOLOR for LVGLImage.py**
`5523 <https://github.com/lvgl/lvgl/pull/5523>`__
- **fix(sysmon): support starting LVGL without having a display**
`5518 <https://github.com/lvgl/lvgl/pull/5518>`__
- **fix(chart): set the series id correctly**
`5482 <https://github.com/lvgl/lvgl/pull/5482>`__
- **fix(vg_lite): fix clip corner image display error**
`5517 <https://github.com/lvgl/lvgl/pull/5517>`__
- **fix(arduino): update example LVGL_Arduino.ino for v9**
`5499 <https://github.com/lvgl/lvgl/pull/5499>`__
- **fix(fb): set DPI to correctly**
`5508 <https://github.com/lvgl/lvgl/pull/5508>`__
- **fix(layer): Update calculation for overlay used memory**
`5504 <https://github.com/lvgl/lvgl/pull/5504>`__
- **fix(bin_decoder): fix potential free garbage address**
`5509 <https://github.com/lvgl/lvgl/pull/5509>`__
- **fix(decoder): treat ALLOCATED c-array image as draw buffer**
`5483 <https://github.com/lvgl/lvgl/pull/5483>`__
- **fix(vg_lite_tvg): fix use after free when change target canvas**
`5497 <https://github.com/lvgl/lvgl/pull/5497>`__
- **fix(keyboard): in the example set Arabic font if enabled**
`5457 <https://github.com/lvgl/lvgl/pull/5457>`__
- **fix(codespaces): fix the issue where lv_conf.h in codespaces is not enable**
`5484 <https://github.com/lvgl/lvgl/pull/5484>`__
- **fix(textarea): fix accepted chars issue on big endian systems**
`5479 <https://github.com/lvgl/lvgl/pull/5479>`__
- **fix(draw_line): fix the issue where dash_dap equals 1 and cannot display properly when the line is a horizontal line**
`5473 <https://github.com/lvgl/lvgl/pull/5473>`__
- **fix: removed LV_ATTRIBUTE_FAST_MEM function attribute from prototypes**
`5467 <https://github.com/lvgl/lvgl/pull/5467>`__
- **fix(arm2d): apply a temporary patch to arm-2d acceleration**
`5466 <https://github.com/lvgl/lvgl/pull/5466>`__
- **fix(snapshot): update the layout of the component before the screenshot**
`5475 <https://github.com/lvgl/lvgl/pull/5475>`__
- **fix(vg_lite): add missing 24bit color support check**
`5469 <https://github.com/lvgl/lvgl/pull/5469>`__
- **fix(display): set last_activity_time to the current time in lv_display**
`5463 <https://github.com/lvgl/lvgl/pull/5463>`__
- **fix(observer): fixed lv_subject_remove_all_obj**
`5464 <https://github.com/lvgl/lvgl/pull/5464>`__
- **fix(image_decoder): fix decoder not close**
`5437 <https://github.com/lvgl/lvgl/pull/5437>`__
- **fix(nuttx): fix build break**
`5440 <https://github.com/lvgl/lvgl/pull/5440>`__
- **fix: fix warnings with -flto on GCC 11**
`5433 <https://github.com/lvgl/lvgl/pull/5433>`__
- **fix(assert): add new macro to format assert message**
`5453 <https://github.com/lvgl/lvgl/pull/5453>`__
- **fix(decoder): if draw unit supports indexed image, don't add to cache**
`5438 <https://github.com/lvgl/lvgl/pull/5438>`__
- **fix(bar): mask the background to fix it on value adjustment**
`5426 <https://github.com/lvgl/lvgl/pull/5426>`__
- **fix(lvgl.mk): fix vg_lite_tvg.cpp not compiling**
`5435 <https://github.com/lvgl/lvgl/pull/5435>`__
- **fix(ci): use the dev branch of PlatformIO**
`5432 <https://github.com/lvgl/lvgl/pull/5432>`__
- **fix(vector) : add path bounding and matrix transform functions. **
`5389 <https://github.com/lvgl/lvgl/pull/5389>`__
- **fix(warning): fix shadown variable warning**
`47750f1 <https://github.com/lvgl/lvgl/commit/47750f1b866e5ea0617035fd208c727878bebc44>`__
- **fix(thorvg): link lvgl_thorvgl with lvgl**
`9b09182 <https://github.com/lvgl/lvgl/commit/9b09182fc76032ef0bc8a2d930fa1cf4fd081431>`__
- **fix(warning): error: no newline at end of file**
`9a6a194 <https://github.com/lvgl/lvgl/commit/9a6a194680db9ea12f59e94eab6e812cb28d504f>`__
- **fix(color): treat RGB565A8 bpp same as RGB565**
`52426ec <https://github.com/lvgl/lvgl/commit/52426ec1919274e282889129f00e00a9a2a9ce60>`__
- **fix(warning): error: a function declaration without a prototype is deprecated in all versions of C**
`c81f654 <https://github.com/lvgl/lvgl/commit/c81f654026501ba37d8df2d8ec02c58bd14eb1c3>`__
Examples Examples
~~~~~~~~ ~~~~~~~~
@@ -210,108 +398,197 @@ Examples
Docs Docs
~~~~ ~~~~
- **docs: update README** `5841 <https://github.com/lvgl/lvgl/pull/5841>`__ - **docs: update README**
- **docs: make it easy to add more other translations** `5874 <https://github.com/lvgl/lvgl/pull/5874>`__ `5841 <https://github.com/lvgl/lvgl/pull/5841>`__
- **docs: ignore the READMEs when building the docs** `5840 <https://github.com/lvgl/lvgl/pull/5840>`__ - **docs: make it easy to add more other translations**
- **docs(st7789): updated the docs + added code example and step-by-step guide for STM32** `5511 <https://github.com/lvgl/lvgl/pull/5511>`__ `5874 <https://github.com/lvgl/lvgl/pull/5874>`__
- **docs(arduino): update tick setup** `5832 <https://github.com/lvgl/lvgl/pull/5832>`__ - **docs: ignore the READMEs when building the docs**
- **docs(display): use lv_display_delete_refr_timer to delete display timer** `5835 <https://github.com/lvgl/lvgl/pull/5835>`__ `5840 <https://github.com/lvgl/lvgl/pull/5840>`__
- **docs(lv_conf): show how to include something in lv_conf.h** `5740 <https://github.com/lvgl/lvgl/pull/5740>`__ - **docs(st7789): updated the docs + added code example and step-by-step guide for STM32**
- **docs(tick): simplify and promote lv_tick_set_cb** `5781 <https://github.com/lvgl/lvgl/pull/5781>`__ `5511 <https://github.com/lvgl/lvgl/pull/5511>`__
- **docs(style): output the style properties to style-props.rst** `5802 <https://github.com/lvgl/lvgl/pull/5802>`__ - **docs(arduino): update tick setup**
- **docs(changelog): mention that LV_COLOR_DEPTH 8 is not supported yet** `5796 <https://github.com/lvgl/lvgl/pull/5796>`__ `5832 <https://github.com/lvgl/lvgl/pull/5832>`__
- **docs(image): update align to inner_align** `5721 <https://github.com/lvgl/lvgl/pull/5721>`__ - **docs(display): use lv_display_delete_refr_timer to delete display timer**
- **docs(README_Zh): remove mentions of SquareLine Studio** `5640 <https://github.com/lvgl/lvgl/pull/5640>`__ `5835 <https://github.com/lvgl/lvgl/pull/5835>`__
- **docs(profiler): fix my_get_cpu_cb implementation** `5641 <https://github.com/lvgl/lvgl/pull/5641>`__ - **docs(lv_conf): show how to include something in lv_conf.h**
- **docs(demos): remove inconsistent READMEs** `5626 <https://github.com/lvgl/lvgl/pull/5626>`__ `5740 <https://github.com/lvgl/lvgl/pull/5740>`__
- **docs(README): remove mentions of SquareLine Studio** `5638 <https://github.com/lvgl/lvgl/pull/5638>`__ - **docs(tick): simplify and promote lv_tick_set_cb**
- **docs(changelog): mention more features removed in v9** `5632 <https://github.com/lvgl/lvgl/pull/5632>`__ `5781 <https://github.com/lvgl/lvgl/pull/5781>`__
- **docs(micropython): update MicroPython examples in documentation** `5622 <https://github.com/lvgl/lvgl/pull/5622>`__ - **docs(style): output the style properties to style-props.rst**
- **docs(contributing): fix links** `5615 <https://github.com/lvgl/lvgl/pull/5615>`__ `5802 <https://github.com/lvgl/lvgl/pull/5802>`__
- **docs(porting): add missing colon in porting docs** `5613 <https://github.com/lvgl/lvgl/pull/5613>`__ - **docs(changelog): mention that LV_COLOR_DEPTH 8 is not supported yet**
- **docs(contributing): update the feature development workflow** `5601 <https://github.com/lvgl/lvgl/pull/5601>`__ `5796 <https://github.com/lvgl/lvgl/pull/5796>`__
- **docs(tabview): fix tabview doc** `5588 <https://github.com/lvgl/lvgl/pull/5588>`__ - **docs(image): update align to inner_align**
- **docs(indev): Document the relation between LV_INDEV_MODE_EVENT and data-&gt;continue_reading** `5586 <https://github.com/lvgl/lvgl/pull/5586>`__ `5721 <https://github.com/lvgl/lvgl/pull/5721>`__
- **docs(pc-simulator): Document how to set up SDL manually, without IDE** `5563 <https://github.com/lvgl/lvgl/pull/5563>`__ - **docs(README_Zh): remove mentions of SquareLine Studio**
- **docs(disp): document lv_refr_now** `5480 <https://github.com/lvgl/lvgl/pull/5480>`__ `5640 <https://github.com/lvgl/lvgl/pull/5640>`__
- **docs(disp): Fix pointer cast in flush_cb example** `5439 <https://github.com/lvgl/lvgl/pull/5439>`__ - **docs(profiler): fix my_get_cpu_cb implementation**
- **docs(font): about "base dir"** `5429 <https://github.com/lvgl/lvgl/pull/5429>`__ `5641 <https://github.com/lvgl/lvgl/pull/5641>`__
- **docs(demos): remove inconsistent READMEs**
`5626 <https://github.com/lvgl/lvgl/pull/5626>`__
- **docs(README): remove mentions of SquareLine Studio**
`5638 <https://github.com/lvgl/lvgl/pull/5638>`__
- **docs(changelog): mention more features removed in v9**
`5632 <https://github.com/lvgl/lvgl/pull/5632>`__
- **docs(micropython): update MicroPython examples in documentation**
`5622 <https://github.com/lvgl/lvgl/pull/5622>`__
- **docs(contributing): fix links**
`5615 <https://github.com/lvgl/lvgl/pull/5615>`__
- **docs(porting): add missing colon in porting docs**
`5613 <https://github.com/lvgl/lvgl/pull/5613>`__
- **docs(contributing): update the feature development workflow**
`5601 <https://github.com/lvgl/lvgl/pull/5601>`__
- **docs(tabview): fix tabview doc**
`5588 <https://github.com/lvgl/lvgl/pull/5588>`__
- **docs(indev): Document the relation between LV_INDEV_MODE_EVENT and data-&gt;continue_reading**
`5586 <https://github.com/lvgl/lvgl/pull/5586>`__
- **docs(pc-simulator): Document how to set up SDL manually, without IDE**
`5563 <https://github.com/lvgl/lvgl/pull/5563>`__
- **docs(disp): document lv_refr_now**
`5480 <https://github.com/lvgl/lvgl/pull/5480>`__
- **docs(disp): Fix pointer cast in flush_cb example**
`5439 <https://github.com/lvgl/lvgl/pull/5439>`__
- **docs(font): about "base dir"**
`5429 <https://github.com/lvgl/lvgl/pull/5429>`__
CI and tests CI and tests
~~~~~~~~~~~~ ~~~~~~~~~~~~
- **test(conf): update conf and remove deprecated configs** `5881 <https://github.com/lvgl/lvgl/pull/5881>`__ - **test(conf): update conf and remove deprecated configs**
- **tests(freetype): refactor code structure** `5871 <https://github.com/lvgl/lvgl/pull/5871>`__ `5881 <https://github.com/lvgl/lvgl/pull/5881>`__
- **ci(micropython): catch event failure in the test** `5787 <https://github.com/lvgl/lvgl/pull/5787>`__ - **tests(freetype): refactor code structure**
- **ci(ref_imgs): automatically generate the missing reference image folders** `5696 <https://github.com/lvgl/lvgl/pull/5696>`__ `5871 <https://github.com/lvgl/lvgl/pull/5871>`__
- **ci(assets): add LV_BUILD_TEST guard** `5616 <https://github.com/lvgl/lvgl/pull/5616>`__ - **ci(micropython): catch event failure in the test**
- **ci(codecov): disable CodeCov** `5623 <https://github.com/lvgl/lvgl/pull/5623>`__ `5787 <https://github.com/lvgl/lvgl/pull/5787>`__
- **test(asset): add guard to test_img_emoji_F617** `5559 <https://github.com/lvgl/lvgl/pull/5559>`__ - **ci(ref_imgs): automatically generate the missing reference image folders**
- **ci(micropython): use the master branch** `5460 <https://github.com/lvgl/lvgl/pull/5460>`__ `5696 <https://github.com/lvgl/lvgl/pull/5696>`__
- **test(snapshot): add testcase for #5475** `5478 <https://github.com/lvgl/lvgl/pull/5478>`__ - **ci(assets): add LV_BUILD_TEST guard**
`5616 <https://github.com/lvgl/lvgl/pull/5616>`__
- **ci(codecov): disable CodeCov**
`5623 <https://github.com/lvgl/lvgl/pull/5623>`__
- **test(asset): add guard to test_img_emoji_F617**
`5559 <https://github.com/lvgl/lvgl/pull/5559>`__
- **ci(micropython): use the master branch**
`5460 <https://github.com/lvgl/lvgl/pull/5460>`__
- **test(snapshot): add testcase for #5475**
`5478 <https://github.com/lvgl/lvgl/pull/5478>`__
Others Others
~~~~~~ ~~~~~~
- **chore(cmsis-pack): prepare for v9.1.0** `5917 <https://github.com/lvgl/lvgl/pull/5917>`__ - **chore(cmsis-pack): prepare for v9.1.0**
- **chore: fix header files include recursion** `5844 <https://github.com/lvgl/lvgl/pull/5844>`__ `5917 <https://github.com/lvgl/lvgl/pull/5917>`__
- **chore(group): avoid null pointer access** `5863 <https://github.com/lvgl/lvgl/pull/5863>`__ - **chore: fix header files include recursion**
- **refactor(conf): rename LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE to LV_DRAW_LAYER_SIMPLE_BUF_SIZE** `5798 <https://github.com/lvgl/lvgl/pull/5798>`__ `5844 <https://github.com/lvgl/lvgl/pull/5844>`__
- **chore(freetype): remove unused codes** `5885 <https://github.com/lvgl/lvgl/pull/5885>`__ - **chore(group): avoid null pointer access**
- **chore: fix compile time warnings** `5872 <https://github.com/lvgl/lvgl/pull/5872>`__ `5863 <https://github.com/lvgl/lvgl/pull/5863>`__
- **adds `extern "C"` to the header files that were missing it.** `5857 <https://github.com/lvgl/lvgl/pull/5857>`__ - **refactor(conf): rename LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE to LV_DRAW_LAYER_SIMPLE_BUF_SIZE**
- **chore(stdlib): remove duplicate function declaration** `5845 <https://github.com/lvgl/lvgl/pull/5845>`__ `5798 <https://github.com/lvgl/lvgl/pull/5798>`__
- **chore(benchmark): add warning for probably low memory** `5797 <https://github.com/lvgl/lvgl/pull/5797>`__ - **chore(freetype): remove unused codes**
- **chore(group): add assertion to avoid null pointer access** `5769 <https://github.com/lvgl/lvgl/pull/5769>`__ `5885 <https://github.com/lvgl/lvgl/pull/5885>`__
- **refact(Kconfig): update as per lv_conf_template.h** `5780 <https://github.com/lvgl/lvgl/pull/5780>`__ - **chore: fix compile time warnings**
- **Fix the compilation error problem of lvgl9.x on rtthread** `5794 <https://github.com/lvgl/lvgl/pull/5794>`__ `5872 <https://github.com/lvgl/lvgl/pull/5872>`__
- **refact(vg_lite): abstract common pending release logic** `5756 <https://github.com/lvgl/lvgl/pull/5756>`__ - **adds `extern "C"` to the header files that were missing it.**
- **doc(stm32): fix typo** `5772 <https://github.com/lvgl/lvgl/pull/5772>`__ `5857 <https://github.com/lvgl/lvgl/pull/5857>`__
- **doc(cache): add doc strings for cache APIs** `5718 <https://github.com/lvgl/lvgl/pull/5718>`__ - **chore(stdlib): remove duplicate function declaration**
- **chore(docs): fix typo** `5738 <https://github.com/lvgl/lvgl/pull/5738>`__ `5845 <https://github.com/lvgl/lvgl/pull/5845>`__
- **chore(font): remove unused defines** `5716 <https://github.com/lvgl/lvgl/pull/5716>`__ - **chore(benchmark): add warning for probably low memory**
- **chore: add stride information in the image resource file** `5653 <https://github.com/lvgl/lvgl/pull/5653>`__ `5797 <https://github.com/lvgl/lvgl/pull/5797>`__
- **chore(draw_buf): remove unnecessary info logs** `5634 <https://github.com/lvgl/lvgl/pull/5634>`__ - **chore(group): add assertion to avoid null pointer access**
- **chore(cmsis-pack): catchup update** `5611 <https://github.com/lvgl/lvgl/pull/5611>`__ `5769 <https://github.com/lvgl/lvgl/pull/5769>`__
- **More chore work in indev files** `5604 <https://github.com/lvgl/lvgl/pull/5604>`__ - **refact(Kconfig): update as per lv_conf_template.h**
- **Stride adjust in place** `5423 <https://github.com/lvgl/lvgl/pull/5423>`__ `5780 <https://github.com/lvgl/lvgl/pull/5780>`__
- **chore(conf): use EXTERNAL and INTERNAL macro to config libs** `5046 <https://github.com/lvgl/lvgl/pull/5046>`__ - **Fix the compilation error problem of lvgl9.x on rtthread**
- **chore(vg_lite): use pointer to access matrix element** `5591 <https://github.com/lvgl/lvgl/pull/5591>`__ `5794 <https://github.com/lvgl/lvgl/pull/5794>`__
- **refactor(image): rename align to inner_align** `5560 <https://github.com/lvgl/lvgl/pull/5560>`__ - **refact(vg_lite): abstract common pending release logic**
- **chore(deps): bump codecov/codecov-action from 3 to 4** `5567 <https://github.com/lvgl/lvgl/pull/5567>`__ `5756 <https://github.com/lvgl/lvgl/pull/5756>`__
- **chore(deps): bump carlosperate/arm-none-eabi-gcc-action from 1.8.0 to 1.8.1** `5565 <https://github.com/lvgl/lvgl/pull/5565>`__ - **doc(stm32): fix typo**
- **chore(deps): bump mymindstorm/setup-emsdk from 13 to 14** `5566 <https://github.com/lvgl/lvgl/pull/5566>`__ `5772 <https://github.com/lvgl/lvgl/pull/5772>`__
- **chore(deps): bump actions/cache from 3 to 4** `5568 <https://github.com/lvgl/lvgl/pull/5568>`__ - **doc(cache): add doc strings for cache APIs**
- **chore(deps): bump uraimo/run-on-arch-action from 2.6.0 to 2.7.1** `5569 <https://github.com/lvgl/lvgl/pull/5569>`__ `5718 <https://github.com/lvgl/lvgl/pull/5718>`__
- **optionally install demos and libs as well** `5387 <https://github.com/lvgl/lvgl/pull/5387>`__ - **chore(docs): fix typo**
- **chore(arc): fix typo** `5553 <https://github.com/lvgl/lvgl/pull/5553>`__ `5738 <https://github.com/lvgl/lvgl/pull/5738>`__
- **Revert "feat(font_glyph_format): refactor draw and font format into `lv_font_glyph_format_t`"** `5550 <https://github.com/lvgl/lvgl/pull/5550>`__ - **chore(font): remove unused defines**
- **chore(thorvg): fix warning** `5535 <https://github.com/lvgl/lvgl/pull/5535>`__ `5716 <https://github.com/lvgl/lvgl/pull/5716>`__
- **refactor(snapshot): use draw buffer interface** `5487 <https://github.com/lvgl/lvgl/pull/5487>`__ - **chore: add stride information in the image resource file**
- **chore(vg_lite): fix typo** `5525 <https://github.com/lvgl/lvgl/pull/5525>`__ `5653 <https://github.com/lvgl/lvgl/pull/5653>`__
- **demo(music): add png assets** `5520 <https://github.com/lvgl/lvgl/pull/5520>`__ - **chore(draw_buf): remove unnecessary info logs**
- **chore(indev): Cleanup before working in double and triple click support** `5512 <https://github.com/lvgl/lvgl/pull/5512>`__ `5634 <https://github.com/lvgl/lvgl/pull/5634>`__
- **chore(demos): Remove unused definitions** `5506 <https://github.com/lvgl/lvgl/pull/5506>`__ - **chore(cmsis-pack): catchup update**
- **chore(obj_draw): remove duplicate invalidate** `5503 <https://github.com/lvgl/lvgl/pull/5503>`__ `5611 <https://github.com/lvgl/lvgl/pull/5611>`__
- **chore(widgets): add parentheses to MY_CLASS definition** `5485 <https://github.com/lvgl/lvgl/pull/5485>`__ - **More chore work in indev files**
- **chore(draw-sw-transform): remove duplicated code** `5488 <https://github.com/lvgl/lvgl/pull/5488>`__ `5604 <https://github.com/lvgl/lvgl/pull/5604>`__
- **chore(README): Fixed #5491 Typo** `5492 <https://github.com/lvgl/lvgl/pull/5492>`__ - **Stride adjust in place**
- **chore(vg_lite): remove 64-bytes alignment requirement** `5477 <https://github.com/lvgl/lvgl/pull/5477>`__ `5423 <https://github.com/lvgl/lvgl/pull/5423>`__
- **chore(refr): fix typo** `5474 <https://github.com/lvgl/lvgl/pull/5474>`__ - **chore(conf): use EXTERNAL and INTERNAL macro to config libs**
- **chore(array): use array_front and use it like an array** `5448 <https://github.com/lvgl/lvgl/pull/5448>`__ `5046 <https://github.com/lvgl/lvgl/pull/5046>`__
- **chore(cache): only cache header info for file type of image** `5455 <https://github.com/lvgl/lvgl/pull/5455>`__ - **chore(vg_lite): use pointer to access matrix element**
- **refactor(indev_scroll): refactor code** `5456 <https://github.com/lvgl/lvgl/pull/5456>`__ `5591 <https://github.com/lvgl/lvgl/pull/5591>`__
- **chore(draw_buf): add header magic to draw buff** `5449 <https://github.com/lvgl/lvgl/pull/5449>`__ - **refactor(image): rename align to inner_align**
- **chore(Kconfig): add missing profiler trace buffer size config** `5436 <https://github.com/lvgl/lvgl/pull/5436>`__ `5560 <https://github.com/lvgl/lvgl/pull/5560>`__
- **chore(libpng): fix warning** `5431 <https://github.com/lvgl/lvgl/pull/5431>`__ - **chore(deps): bump codecov/codecov-action from 3 to 4**
`5567 <https://github.com/lvgl/lvgl/pull/5567>`__
- **chore(deps): bump carlosperate/arm-none-eabi-gcc-action from 1.8.0 to 1.8.1**
`5565 <https://github.com/lvgl/lvgl/pull/5565>`__
- **chore(deps): bump mymindstorm/setup-emsdk from 13 to 14**
`5566 <https://github.com/lvgl/lvgl/pull/5566>`__
- **chore(deps): bump actions/cache from 3 to 4**
`5568 <https://github.com/lvgl/lvgl/pull/5568>`__
- **chore(deps): bump uraimo/run-on-arch-action from 2.6.0 to 2.7.1**
`5569 <https://github.com/lvgl/lvgl/pull/5569>`__
- **optionally install demos and libs as well**
`5387 <https://github.com/lvgl/lvgl/pull/5387>`__
- **chore(arc): fix typo**
`5553 <https://github.com/lvgl/lvgl/pull/5553>`__
- **Revert "feat(font_glyph_format): refactor draw and font format into `lv_font_glyph_format_t`"**
`5550 <https://github.com/lvgl/lvgl/pull/5550>`__
- **chore(thorvg): fix warning**
`5535 <https://github.com/lvgl/lvgl/pull/5535>`__
- **refactor(snapshot): use draw buffer interface**
`5487 <https://github.com/lvgl/lvgl/pull/5487>`__
- **chore(vg_lite): fix typo**
`5525 <https://github.com/lvgl/lvgl/pull/5525>`__
- **demo(music): add png assets**
`5520 <https://github.com/lvgl/lvgl/pull/5520>`__
- **chore(indev): Cleanup before working in double and triple click support**
`5512 <https://github.com/lvgl/lvgl/pull/5512>`__
- **chore(demos): Remove unused definitions**
`5506 <https://github.com/lvgl/lvgl/pull/5506>`__
- **chore(obj_draw): remove duplicate invalidate**
`5503 <https://github.com/lvgl/lvgl/pull/5503>`__
- **chore(widgets): add parentheses to MY_CLASS definition**
`5485 <https://github.com/lvgl/lvgl/pull/5485>`__
- **chore(draw-sw-transform): remove duplicated code**
`5488 <https://github.com/lvgl/lvgl/pull/5488>`__
- **chore(README): Fixed #5491 Typo**
`5492 <https://github.com/lvgl/lvgl/pull/5492>`__
- **chore(vg_lite): remove 64-bytes alignment requirement**
`5477 <https://github.com/lvgl/lvgl/pull/5477>`__
- **chore(refr): fix typo**
`5474 <https://github.com/lvgl/lvgl/pull/5474>`__
- **chore(array): use array_front and use it like an array**
`5448 <https://github.com/lvgl/lvgl/pull/5448>`__
- **chore(cache): only cache header info for file type of image**
`5455 <https://github.com/lvgl/lvgl/pull/5455>`__
- **refactor(indev_scroll): refactor code**
`5456 <https://github.com/lvgl/lvgl/pull/5456>`__
- **chore(draw_buf): add header magic to draw buff**
`5449 <https://github.com/lvgl/lvgl/pull/5449>`__
- **chore(Kconfig): add missing profiler trace buffer size config**
`5436 <https://github.com/lvgl/lvgl/pull/5436>`__
- **chore(libpng): fix warning**
`5431 <https://github.com/lvgl/lvgl/pull/5431>`__
Others Others
~~~~~~ ~~~~~~
- **refactor(freetype): refactor freetype params** `0c84cc0 <https://github.com/lvgl/lvgl/commit/0c84cc0b3b9b1ea37bd6aa5300e91eee0f2feb98>`__ - **refactor(freetype): refactor freetype params**
- **refactor(freetype): refactor glyph_index acquire method** `0b3016c <https://github.com/lvgl/lvgl/commit/0b3016c0e5b5d57141220c030c0aadd9d9c3387e>`__ `0c84cc0 <https://github.com/lvgl/lvgl/commit/0c84cc0b3b9b1ea37bd6aa5300e91eee0f2feb98>`__
- **chore(README): Fixed #5491 Typo (#5492)** `9c025d3 <https://github.com/lvgl/lvgl/commit/9c025d357f358c281db441a96a27ce2a01434a8d>`__ - **refactor(freetype): refactor glyph_index acquire method**
`0b3016c <https://github.com/lvgl/lvgl/commit/0b3016c0e5b5d57141220c030c0aadd9d9c3387e>`__
- **chore(README): Fixed #5491 Typo (#5492)**
`9c025d3 <https://github.com/lvgl/lvgl/commit/9c025d357f358c281db441a96a27ce2a01434a8d>`__
v9.0 v9.0

View File

@@ -1,22 +0,0 @@
.. _arduino_esp_littlefs:
====================
Arduino ESP littlefs
====================
LittleFS is a little fail-safe filesystem designed for microcontrollers and integrated in the Arduino framework
when used with ESP32 and ESP8266.
Detailed introduction:
- https://github.com/esp8266/Arduino
- https://github.com/espressif/arduino-esp32
Usage
-----
Enable :c:macro:`LV_USE_FS_ARDUINO_ESP_LITTLEFS` and define a :c:macro`LV_FS_ARDUINO_ESP_LITTLEFS_LETTER` in ``lv_conf.h``.
API
---

View File

@@ -15,7 +15,6 @@ LVG has built in support for:
- WIN32 (Windows using Win32 API function .e.g ``CreateFileA``, ``ReadFile``) - WIN32 (Windows using Win32 API function .e.g ``CreateFileA``, ``ReadFile``)
- MEMFS (read a file from a memory buffer) - MEMFS (read a file from a memory buffer)
- LITTLEFS (a little fail-safe filesystem designed for microcontrollers) - LITTLEFS (a little fail-safe filesystem designed for microcontrollers)
- Arduino ESP LITTLEFS (a little fail-safe filesystem designed for Arduino ESP)
You still need to provide the drivers and libraries, this extension You still need to provide the drivers and libraries, this extension
provides only the bridge between FATFS, STDIO, POSIX, WIN32 and LVGL. provides only the bridge between FATFS, STDIO, POSIX, WIN32 and LVGL.

View File

@@ -22,5 +22,4 @@
rlottie rlottie
ffmpeg ffmpeg
rle rle
arduino_esp_littlefs
lfs lfs

View File

@@ -152,17 +152,6 @@ reconfiguring the hardware. In lack of hardware display rotation support
:cpp:expr:`lv_draw_sw_rotate` can be used to rotate the buffer in the :cpp:expr:`lv_draw_sw_rotate` can be used to rotate the buffer in the
``flush_cb``. ``flush_cb``.
:cpp:expr:`lv_display_rotate_area(display, &area)` rotates the rendered area
according to the current rotation settings of the display.
Note that in :cpp:enumerator:`LV_DISPLAY_RENDER_MODE_DIRECT` the small changed areas
are rendered directly in the frame buffer so they cannot be
rotated later. Therefore in direct mode only the whole frame buffer can be rotated.
The same is true for :cpp:enumerator:`LV_DISPLAY_RENDER_MODE_FULL`.
In the case of :cpp:enumerator:`LV_DISPLAY_RENDER_MODE_PARTIAL`the small rendered areas
can be rotated on their own before flushing to the frame buffer.
Color format Color format
------------ ------------

View File

@@ -184,15 +184,10 @@
* but does not guarantee the same rendering quality as the software. */ * but does not guarantee the same rendering quality as the software. */
#define LV_VG_LITE_USE_BOX_SHADOW 0 #define LV_VG_LITE_USE_BOX_SHADOW 0
/* VG-Lite linear gradient image maximum cache number. /* VG-Lite gradient image maximum cache number.
* NOTE: The memory usage of a single gradient image is 4K bytes. * NOTE: The memory usage of a single gradient image is 4K bytes.
*/ */
#define LV_VG_LITE_LINEAER_GRAD_CACHE_CNT 32 #define LV_VG_LITE_GRAD_CACHE_SIZE 32
/* VG-Lite radial gradient image maximum cache size.
* NOTE: The memory usage of a single gradient image is radial grad radius * 4 bytes.
*/
#define LV_VG_LITE_RADIAL_GRAD_CACHE_CNT 32
#endif #endif

View File

@@ -1,6 +1,5 @@
#include "../../lv_examples.h" #include "../../lv_examples.h"
#if LV_USE_QRCODE && LV_BUILD_EXAMPLES #if LV_USE_QRCODE && LV_BUILD_EXAMPLES
#include <string.h>
/** /**
* Create a QR Code * Create a QR Code

View File

@@ -59,7 +59,7 @@ static lv_subject_t auth_state_subject;
static void textarea_event_cb(lv_event_t * e) static void textarea_event_cb(lv_event_t * e)
{ {
lv_obj_t * ta = lv_event_get_target(e); lv_obj_t * ta = lv_event_get_target(e);
if(lv_strcmp(lv_textarea_get_text(ta), "hello") == 0) { if(strcmp(lv_textarea_get_text(ta), "hello") == 0) {
lv_subject_set_int(&auth_state_subject, LOGGED_IN); lv_subject_set_int(&auth_state_subject, LOGGED_IN);
} }
else { else {

View File

@@ -14,8 +14,8 @@ static void btnm_event_handler(lv_event_t * e)
lv_obj_t * ta = lv_event_get_user_data(e); lv_obj_t * ta = lv_event_get_user_data(e);
const char * txt = lv_buttonmatrix_get_button_text(obj, lv_buttonmatrix_get_selected_button(obj)); const char * txt = lv_buttonmatrix_get_button_text(obj, lv_buttonmatrix_get_selected_button(obj));
if(lv_strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) lv_textarea_delete_char(ta); if(strcmp(txt, LV_SYMBOL_BACKSPACE) == 0) lv_textarea_delete_char(ta);
else if(lv_strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) lv_obj_send_event(ta, LV_EVENT_READY, NULL); else if(strcmp(txt, LV_SYMBOL_NEW_LINE) == 0) lv_obj_send_event(ta, LV_EVENT_READY, NULL);
else lv_textarea_add_text(ta, txt); else lv_textarea_add_text(ta, txt);
} }

View File

@@ -44,12 +44,6 @@
#define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN #define LV_USE_STDLIB_STRING LV_STDLIB_BUILTIN
#define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN #define LV_USE_STDLIB_SPRINTF LV_STDLIB_BUILTIN
#define LV_STDINT_INCLUDE <stdint.h>
#define LV_STDDEF_INCLUDE <stddef.h>
#define LV_STDBOOL_INCLUDE <stdbool.h>
#define LV_INTTYPES_INCLUDE <inttypes.h>
#define LV_LIMITS_INCLUDE <limits.h>
#define LV_STDARG_INCLUDE <stdarg.h>
#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN #if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN
/*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/
@@ -198,15 +192,10 @@
* but does not guarantee the same rendering quality as the software. */ * but does not guarantee the same rendering quality as the software. */
#define LV_VG_LITE_USE_BOX_SHADOW 0 #define LV_VG_LITE_USE_BOX_SHADOW 0
/* VG-Lite linear gradient image maximum cache number. /* VG-Lite gradient image maximum cache number.
* NOTE: The memory usage of a single gradient image is 4K bytes. * NOTE: The memory usage of a single gradient image is 4K bytes.
*/ */
#define LV_VG_LITE_LINEAER_GRAD_CACHE_CNT 32 #define LV_VG_LITE_GRAD_CACHE_SIZE 32
/* VG-Lite radial gradient image maximum cache size.
* NOTE: The memory usage of a single gradient image is radial grad radius * 4 bytes.
*/
#define LV_VG_LITE_RADIAL_GRAD_CACHE_CNT 32
#endif #endif
@@ -668,12 +657,6 @@
#define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/ #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#endif #endif
/*API for Arduino LittleFs. */
#define LV_USE_FS_ARDUINO_ESP_LITTLEFS 0
#if LV_USE_FS_ARDUINO_ESP_LITTLEFS
#define LV_FS_ARDUINO_ESP_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#endif
/*LODEPNG decoder library*/ /*LODEPNG decoder library*/
#define LV_USE_LODEPNG 0 #define LV_USE_LODEPNG 0

View File

@@ -6,117 +6,144 @@
~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
{{#commit-list merges heading='' message='BREAKING CHANGE'}} {{#commit-list merges heading='' message='BREAKING CHANGE'}}
- .. warning: {{message}} `{{id}} <{{href}}>`__ - .. warning: {{message}}
`{{id}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list commits heading='' message='BREAKING CHANGE'}} {{#commit-list commits heading='' message='BREAKING CHANGE'}}
- .. warning: {{subject}} `{{shorthash}} <{{href}}>`__ - .. warning: {{subject}}
`{{shorthash}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list fixes heading='' message='BREAKING CHANGE'}} {{#commit-list fixes heading='' message='BREAKING CHANGE'}}
- **{{commit.subject}}** `{{commit.shorthash}} <{{commit.href}}>`__ - **{{commit.subject}}**
`{{commit.shorthash}} <{{commit.href}}>`__
{{/commit-list}} {{/commit-list}}
Architectural Architectural
~~~~~~~~~~~~~ ~~~~~~~~~~~~~
{{#commit-list merges heading='' message='^arch' exclude='BREAKING CHANGE'}} {{#commit-list merges heading='' message='^arch' exclude='BREAKING CHANGE'}}
- **{{message}}** `{{id}} <{{href}}>`__ - **{{message}}**
`{{id}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list commits heading='' message='^arch' exclude='BREAKING CHANGE'}} {{#commit-list commits heading='' message='^arch' exclude='BREAKING CHANGE'}}
- **{{subject}}** `{{shorthash}} <{{href}}>`__ - **{{subject}}**
`{{shorthash}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list fixes heading='' message='^arch' exclude='BREAKING CHANGE'}} {{#commit-list fixes heading='' message='^arch' exclude='BREAKING CHANGE'}}
- **{{commit.subject}}** `{{commit.shorthash}} <{{commit.href}}>`__ - **{{commit.subject}}**
`{{commit.shorthash}} <{{commit.href}}>`__
{{/commit-list}} {{/commit-list}}
New Features New Features
~~~~~~~~~~~~ ~~~~~~~~~~~~
{{#commit-list merges heading='' message='^feat' exclude='BREAKING CHANGE'}} {{#commit-list merges heading='' message='^feat' exclude='BREAKING CHANGE'}}
- **{{message}}** `{{id}} <{{href}}>`__ - **{{message}}**
`{{id}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list commits heading='' message='^feat' exclude='BREAKING CHANGE'}} {{#commit-list commits heading='' message='^feat' exclude='BREAKING CHANGE'}}
- **{{subject}}** `{{shorthash}} <{{href}}>`__ - **{{subject}}**
`{{shorthash}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list fixes heading='' message='^feat' exclude='BREAKING CHANGE'}} {{#commit-list fixes heading='' message='^feat' exclude='BREAKING CHANGE'}}
- **{{commit.subject}}** `{{commit.shorthash}} <{{commit.href}}>`__ - **{{commit.subject}}**
`{{commit.shorthash}} <{{commit.href}}>`__
{{/commit-list}} {{/commit-list}}
Performance Performance
~~~~~~~~~~~ ~~~~~~~~~~~
{{#commit-list merges heading='' message='^perf' exclude='BREAKING CHANGE'}} {{#commit-list merges heading='' message='^perf' exclude='BREAKING CHANGE'}}
- **{{message}}** `{{id}} <{{href}}>`__ - **{{message}}**
`{{id}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list commits heading='' message='^perf' exclude='BREAKING CHANGE'}} {{#commit-list commits heading='' message='^perf' exclude='BREAKING CHANGE'}}
- **{{subject}}** `{{shorthash}} <{{href}}>`__ - **{{subject}}**
`{{shorthash}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list fixes heading='' message='^perf' exclude='BREAKING CHANGE'}} {{#commit-list fixes heading='' message='^perf' exclude='BREAKING CHANGE'}}
- **{{commit.subject}}** `{{commit.shorthash}} <{{commit.href}}>`__ - **{{commit.subject}}**
`{{commit.shorthash}} <{{commit.href}}>`__
{{/commit-list}} {{/commit-list}}
Fixes Fixes
~~~~~ ~~~~~
{{#commit-list merges heading='' message='^fix' exclude='(^fix conflict|^fix warning|BREAKING CHANGE)'}} {{#commit-list merges heading='' message='^fix' exclude='(^fix conflict|^fix warning|BREAKING CHANGE)'}}
- **{{message}}** `{{id}} <{{href}}>`__ - **{{message}}**
`{{id}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list commits heading='' message='^fix' exclude='(^fix conflict|^fix warning|BREAKING CHANGE)'}} {{#commit-list commits heading='' message='^fix' exclude='(^fix conflict|^fix warning|BREAKING CHANGE)'}}
- **{{subject}}** `{{shorthash}} <{{href}}>`__ - **{{subject}}**
`{{shorthash}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list fixes heading='' message='^fix' exclude='(^fix conflict|^fix warning|BREAKING CHANGE)'}} {{#commit-list fixes heading='' message='^fix' exclude='(^fix conflict|^fix warning|BREAKING CHANGE)'}}
- **{{commit.subject}}** `{{commit.shorthash}} <{{commit.href}}>`__ - **{{commit.subject}}**
`{{commit.shorthash}} <{{commit.href}}>`__
{{/commit-list}} {{/commit-list}}
Examples Examples
~~~~~~~~ ~~~~~~~~
{{#commit-list merges heading='' message='^example'}} {{#commit-list merges heading='' message='^example'}}
- **{{message}}** `{{id}} <({{href}})>`__ - **{{message}}**
`{{id}} <({{href}})>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list commits heading='' message='^example'}} {{#commit-list commits heading='' message='^example'}}
- **{{subject}}** `{{shorthash}} <{{href}}>`__ - **{{subject}}**
`{{shorthash}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list fixes heading='' message='^example'}} {{#commit-list fixes heading='' message='^example'}}
- **{{commit.subject}}** `{{commit.shorthash}} <{{commit.href}}>`__ - **{{commit.subject}}**
`{{commit.shorthash}} <{{commit.href}}>`__
{{/commit-list}} {{/commit-list}}
Docs Docs
~~~~ ~~~~
{{#commit-list merges heading='' message='^docs'}} {{#commit-list merges heading='' message='^docs'}}
- **{{message}}** `{{id}} <{{href}}>`__ - **{{message}}**
`{{id}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list commits heading='' message='^docs'}} {{#commit-list commits heading='' message='^docs'}}
- **{{subject}}** `{{shorthash}} <{{href}}>`__ - **{{subject}}**
`{{shorthash}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list fixes heading='' message='^docs'}} {{#commit-list fixes heading='' message='^docs'}}
- **{{commit.subject}}** `{{commit.shorthash}} <{{commit.href}}>`__ - **{{commit.subject}}**
`{{commit.shorthash}} <{{commit.href}}>`__
{{/commit-list}} {{/commit-list}}
CI and tests CI and tests
~~~~~~~~~~~~ ~~~~~~~~~~~~
{{#commit-list merges heading='' message='(^ci|^test)'}} {{#commit-list merges heading='' message='(^ci|^test)'}}
- **{{message}}** `{{id}} <{{href}}>`__ - **{{message}}**
`{{id}} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list commits heading='' message='(^ci|^test)'}} {{#commit-list commits heading='' message='(^ci|^test)'}}
- **{{subject}}** `{{shorthash }} <{{href}}>`__ - **{{subject}}**
`{{shorthash }} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list fixes heading='' message='(^ci|^test)'}} {{#commit-list fixes heading='' message='(^ci|^test)'}}
- **{{commit.subject}}** `{{commit.shorthash}} <{{commit.href}}>`__ - **{{commit.subject}}**
`{{commit.shorthash}} <{{commit.href}}>`__
{{/commit-list}} {{/commit-list}}
Others Others
~~~~~~ ~~~~~~
{{#commit-list merges heading='' exclude='(^fix|^feat|^perf|^docs|^example|^ci|^test)'}} {{#commit-list merges heading='' exclude='(^fix|^feat|^perf|^docs|^example|^ci|^test)'}}
- **{{message}}** `{{id }} <{{href}}>`__ - **{{message}}**
`{{id }} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list commits heading='' exclude='(^fix|^feat|^perf|^docs|^example|^ci|^test)'}} {{#commit-list commits heading='' exclude='(^fix|^feat|^perf|^docs|^example|^ci|^test)'}}
- **{{subject}}** `{{shorthash }} <{{href}}>`__ - **{{subject}}**
`{{shorthash }} <{{href}}>`__
{{/commit-list}} {{/commit-list}}
{{#commit-list fixes heading='' exclude='(^fix|^feat|^perf|^docs|^example|^ci|^test)'}} {{#commit-list fixes heading='' exclude='(^fix|^feat|^perf|^docs|^example|^ci|^test)'}}
- **{{commit.subject}}** `{{commit.shorthash}} <{{commit.href}}>`__ - **{{commit.subject}}**
`{{commit.shorthash}} <{{commit.href}}>`__
{{/commit-list}} {{/commit-list}}
{{/each}} {{/each}}

View File

@@ -189,11 +189,6 @@ LV_EXPORT_CONST_INT(LV_DRAW_BUF_ALIGN);
#define LV_LOG_TRACE_ANIM 0 #define LV_LOG_TRACE_ANIM 0
#endif /*LV_USE_LOG*/ #endif /*LV_USE_LOG*/
#if LV_USE_SYSMON == 0
#define LV_USE_PERF_MONITOR 0
#define LV_USE_MEM_MONITOR 0
#endif /*LV_USE_SYSMON*/
#ifndef LV_USE_LZ4 #ifndef LV_USE_LZ4
#define LV_USE_LZ4 (LV_USE_LZ4_INTERNAL || LV_USE_LZ4_EXTERNAL) #define LV_USE_LZ4 (LV_USE_LZ4_INTERNAL || LV_USE_LZ4_EXTERNAL)
#endif #endif

View File

@@ -15,6 +15,8 @@ extern "C" {
*********************/ *********************/
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
#include <stdbool.h>
#include "../misc/lv_types.h" #include "../misc/lv_types.h"
#include "../draw/lv_draw.h" #include "../draw/lv_draw.h"
#if LV_USE_DRAW_SW #if LV_USE_DRAW_SW
@@ -37,8 +39,6 @@ extern "C" {
#include "../tick/lv_tick.h" #include "../tick/lv_tick.h"
#include "../layouts/lv_layout.h" #include "../layouts/lv_layout.h"
#include "../misc/lv_types.h"
/********************* /*********************
* DEFINES * DEFINES
*********************/ *********************/
@@ -163,10 +163,6 @@ typedef struct _lv_global_t {
lv_fs_drv_t littlefs_fs_drv; lv_fs_drv_t littlefs_fs_drv;
#endif #endif
#if LV_USE_FS_ARDUINO_ESP_LITTLEFS
lv_fs_drv_t arduino_esp_littlefs_fs_drv;
#endif
#if LV_USE_FREETYPE #if LV_USE_FREETYPE
struct _lv_freetype_context_t * ft_context; struct _lv_freetype_context_t * ft_context;
#endif #endif
@@ -191,11 +187,11 @@ typedef struct _lv_global_t {
lv_style_t fe_list_button_style; lv_style_t fe_list_button_style;
#endif #endif
#if LV_USE_PERF_MONITOR #if LV_USE_SYSMON && LV_USE_PERF_MONITOR
lv_sysmon_backend_data_t sysmon_perf; lv_sysmon_backend_data_t sysmon_perf;
#endif #endif
#if LV_USE_MEM_MONITOR #if LV_USE_SYSMON && LV_USE_MEM_MONITOR
lv_sysmon_backend_data_t sysmon_mem; lv_sysmon_backend_data_t sysmon_mem;
#endif #endif

View File

@@ -6,11 +6,12 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stddef.h>
#include "lv_group.h" #include "lv_group.h"
#include "../core/lv_obj.h" #include "../core/lv_obj.h"
#include "../core/lv_global.h" #include "../core/lv_global.h"
#include "../indev/lv_indev.h" #include "../indev/lv_indev.h"
#include "../misc/lv_types.h"
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -13,8 +13,11 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
#include <stdint.h>
#include <stdbool.h>
#include "../misc/lv_types.h" #include "../misc/lv_types.h"
#include "../misc/lv_ll.h" #include "../misc/lv_ll.h"

View File

@@ -17,9 +17,10 @@
#include "../misc/lv_assert.h" #include "../misc/lv_assert.h"
#include "../misc/lv_math.h" #include "../misc/lv_math.h"
#include "../misc/lv_log.h" #include "../misc/lv_log.h"
#include "../misc/lv_types.h"
#include "../tick/lv_tick.h" #include "../tick/lv_tick.h"
#include "../stdlib/lv_string.h" #include "../stdlib/lv_string.h"
#include <stdint.h>
#include <string.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -15,6 +15,8 @@ extern "C" {
*********************/ *********************/
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
#include <stddef.h>
#include <stdbool.h>
#include "../misc/lv_types.h" #include "../misc/lv_types.h"
#include "../misc/lv_style.h" #include "../misc/lv_style.h"
#include "../misc/lv_area.h" #include "../misc/lv_area.h"

View File

@@ -13,6 +13,8 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdint.h>
#include <stdbool.h>
#include "../misc/lv_types.h" #include "../misc/lv_types.h"
#include "../misc/lv_area.h" #include "../misc/lv_area.h"
#include "lv_obj_property.h" #include "lv_obj_property.h"

View File

@@ -13,6 +13,7 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdbool.h>
#include "../misc/lv_types.h" #include "../misc/lv_types.h"
#include "../misc/lv_event.h" #include "../misc/lv_event.h"
#include "../indev/lv_indev.h" #include "../indev/lv_indev.h"

View File

@@ -13,9 +13,10 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdint.h>
#include <stdbool.h>
#include "../misc/lv_bidi.h" #include "../misc/lv_bidi.h"
#include "../misc/lv_style.h" #include "../misc/lv_style.h"
#include "../misc/lv_types.h"
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -6,6 +6,8 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdlib.h>
#include "lv_obj.h" #include "lv_obj.h"
#include "../indev/lv_indev.h" #include "../indev/lv_indev.h"
#include "../indev/lv_indev_private.h" #include "../indev/lv_indev_private.h"

View File

@@ -13,6 +13,8 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stddef.h>
#include <stdbool.h>
#include "../misc/lv_types.h" #include "../misc/lv_types.h"
#include "../misc/lv_anim.h" #include "../misc/lv_anim.h"
#include "../display/lv_display.h" #include "../display/lv_display.h"

View File

@@ -6,6 +6,7 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stddef.h>
#include "lv_refr.h" #include "lv_refr.h"
#include "../display/lv_display.h" #include "../display/lv_display.h"
#include "../display/lv_display_private.h" #include "../display/lv_display_private.h"
@@ -13,7 +14,6 @@
#include "../misc/lv_timer.h" #include "../misc/lv_timer.h"
#include "../misc/lv_math.h" #include "../misc/lv_math.h"
#include "../misc/lv_profiler.h" #include "../misc/lv_profiler.h"
#include "../misc/lv_types.h"
#include "../draw/lv_draw.h" #include "../draw/lv_draw.h"
#include "../font/lv_font_fmt_txt.h" #include "../font/lv_font_fmt_txt.h"
#include "../stdlib/lv_string.h" #include "../stdlib/lv_string.h"
@@ -331,7 +331,7 @@ void _lv_display_refr_timer(lv_timer_t * tmr)
/* Ensure the timer does not run again automatically. /* Ensure the timer does not run again automatically.
* This is done before refreshing in case refreshing invalidates something else. * This is done before refreshing in case refreshing invalidates something else.
* However if the performance monitor is enabled keep the timer running to count the FPS.*/ * However if the performance monitor is enabled keep the timer running to count the FPS.*/
#if LV_USE_PERF_MONITOR #if !(defined(LV_USE_PERF_MONITOR) && LV_USE_PERF_MONITOR)
lv_timer_pause(tmr); lv_timer_pause(tmr);
#endif #endif
} }

View File

@@ -15,7 +15,7 @@ extern "C" {
*********************/ *********************/
#include "lv_obj.h" #include "lv_obj.h"
#include "../display/lv_display.h" #include "../display/lv_display.h"
#include "../misc/lv_types.h" #include <stdbool.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -13,7 +13,6 @@
#include "../stdlib/lv_string.h" #include "../stdlib/lv_string.h"
#include "../themes/lv_theme.h" #include "../themes/lv_theme.h"
#include "../core/lv_global.h" #include "../core/lv_global.h"
#include "../others/sysmon/lv_sysmon.h"
#if LV_USE_DRAW_SW #if LV_USE_DRAW_SW
#include "../draw/sw/lv_draw_sw.h" #include "../draw/sw/lv_draw_sw.h"
@@ -140,14 +139,6 @@ lv_display_t * lv_display_create(int32_t hor_res, int32_t ver_res)
lv_timer_ready(disp->refr_timer); /*Be sure the screen will be refreshed immediately on start up*/ lv_timer_ready(disp->refr_timer); /*Be sure the screen will be refreshed immediately on start up*/
#if LV_USE_PERF_MONITOR
lv_sysmon_show_performance(disp);
#endif
#if LV_USE_MEM_MONITOR
lv_sysmon_show_memory(disp);
#endif
return disp; return disp;
} }
@@ -933,37 +924,6 @@ lv_draw_buf_t * lv_display_get_buf_active(lv_display_t * disp)
return disp->buf_act; return disp->buf_act;
} }
void lv_display_rotate_area(lv_display_t * disp, lv_area_t * area)
{
lv_display_rotation_t rotation = lv_display_get_rotation(disp);
int32_t w = lv_area_get_width(area);
int32_t h = lv_area_get_height(area);
switch(rotation) {
case LV_DISPLAY_ROTATION_0:
return;
case LV_DISPLAY_ROTATION_90:
area->y2 = disp->ver_res - area->x1 - 1;
area->x1 = area->y1;
area->x2 = area->x1 + h - 1;
area->y1 = area->y2 - w + 1;
break;
case LV_DISPLAY_ROTATION_180:
area->y2 = disp->ver_res - area->y1 - 1;
area->y1 = area->y2 - h + 1;
area->x2 = disp->hor_res - area->x1 - 1;
area->x1 = area->x2 - w + 1;
break;
case LV_DISPLAY_ROTATION_270:
area->x1 = disp->hor_res - area->y2 - 1;
area->y2 = area->x2;
area->x2 = area->x1 + h - 1;
area->y1 = area->y2 - w + 1;
break;
}
}
/********************** /**********************
* STATIC FUNCTIONS * STATIC FUNCTIONS
**********************/ **********************/

View File

@@ -536,13 +536,6 @@ void * lv_display_get_user_data(lv_display_t * disp);
void * lv_display_get_driver_data(lv_display_t * disp); void * lv_display_get_driver_data(lv_display_t * disp);
lv_draw_buf_t * lv_display_get_buf_active(lv_display_t * disp); lv_draw_buf_t * lv_display_get_buf_active(lv_display_t * disp);
/**
* Rotate an area in-place according to the display's rotation
* @param disp pointer to a display
* @param area pointer to an area to rotate
*/
void lv_display_rotate_area(lv_display_t * disp, lv_area_t * area);
/********************** /**********************
* MACROS * MACROS
**********************/ **********************/

View File

@@ -18,10 +18,6 @@ extern "C" {
#include "../draw/lv_draw.h" #include "../draw/lv_draw.h"
#include "lv_display.h" #include "lv_display.h"
#if LV_USE_PERF_MONITOR
#include "../others/sysmon/lv_sysmon.h"
#endif
/********************* /*********************
* DEFINES * DEFINES
*********************/ *********************/
@@ -152,17 +148,6 @@ struct _lv_display_t {
/** The area being refreshed*/ /** The area being refreshed*/
lv_area_t refreshed_area; lv_area_t refreshed_area;
#if LV_USE_PERF_MONITOR
lv_obj_t * perf_label;
lv_sysmon_backend_data_t perf_sysmon_backend;
lv_sysmon_perf_info_t perf_sysmon_info;
#endif
#if LV_USE_MEM_MONITOR
lv_obj_t * mem_label;
#endif
}; };
/********************** /**********************

View File

@@ -6,9 +6,9 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdbool.h>
#include "../core/lv_refr.h" #include "../core/lv_refr.h"
#include "../misc/lv_math.h" #include "../misc/lv_math.h"
#include "../misc/lv_types.h"
#include "../stdlib/lv_string.h" #include "../stdlib/lv_string.h"
/********************* /*********************

View File

@@ -6,10 +6,10 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdbool.h>
#include "lv_draw_mask.h" #include "lv_draw_mask.h"
#include "../core/lv_refr.h" #include "../core/lv_refr.h"
#include "../misc/lv_math.h" #include "../misc/lv_math.h"
#include "../misc/lv_types.h"
#include "../stdlib/lv_string.h" #include "../stdlib/lv_string.h"
/********************* /*********************

View File

@@ -11,8 +11,8 @@
#if LV_USE_VECTOR_GRAPHIC #if LV_USE_VECTOR_GRAPHIC
#include "../misc/lv_ll.h" #include "../misc/lv_ll.h"
#include "../misc/lv_types.h"
#include "../stdlib/lv_string.h" #include "../stdlib/lv_string.h"
#include <stdbool.h>
#include <math.h> #include <math.h>
#include <float.h> #include <float.h>

View File

@@ -38,10 +38,19 @@ static uint32_t img_width_to_stride(lv_image_header_t * header);
*/ */
static lv_image_decoder_t * image_decoder_get_info(const void * src, lv_image_header_t * header); static lv_image_decoder_t * image_decoder_get_info(const void * src, lv_image_header_t * header);
#if LV_CACHE_DEF_SIZE > 0 #if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc); static lv_cache_compare_res_t image_decoder_header_cache_compare_cb(const lv_image_header_cache_data_t * lhs,
const lv_image_header_cache_data_t * rhs);
static void image_decoder_header_cache_free_cb(lv_image_header_cache_data_t * entry, void * user_data);
#endif #endif
#if LV_CACHE_DEF_SIZE > 0
static lv_cache_compare_res_t image_decoder_cache_compare_cb(const lv_image_cache_data_t * lhs,
const lv_image_cache_data_t * rhs);
static void image_decoder_cache_free_cb(lv_image_cache_data_t * entry, void * user_data);
static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc);
#endif
/********************** /**********************
* STATIC VARIABLES * STATIC VARIABLES
**********************/ **********************/
@@ -61,13 +70,23 @@ void _lv_image_decoder_init(void)
{ {
_lv_ll_init(img_decoder_ll_p, sizeof(lv_image_decoder_t)); _lv_ll_init(img_decoder_ll_p, sizeof(lv_image_decoder_t));
/*Initialize the cache*/
#if LV_CACHE_DEF_SIZE > 0 #if LV_CACHE_DEF_SIZE > 0
lv_image_cache_init(); img_cache_p = lv_cache_create(&lv_cache_class_lru_rb_size,
sizeof(lv_image_cache_data_t), LV_CACHE_DEF_SIZE, (lv_cache_ops_t) {
.compare_cb = (lv_cache_compare_cb_t)image_decoder_cache_compare_cb,
.create_cb = NULL,
.free_cb = (lv_cache_free_cb_t)image_decoder_cache_free_cb,
});
#endif #endif
#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0 #if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
lv_image_header_cache_init(); img_header_cache_p = lv_cache_create(&lv_cache_class_lru_rb_count,
sizeof(lv_image_header_cache_data_t), LV_IMAGE_HEADER_CACHE_DEF_CNT, (lv_cache_ops_t) {
.compare_cb = (lv_cache_compare_cb_t)image_decoder_header_cache_compare_cb,
.create_cb = NULL,
.free_cb = (lv_cache_free_cb_t)image_decoder_header_cache_free_cb
});
#endif #endif
} }
@@ -201,6 +220,11 @@ void lv_image_decoder_set_close_cb(lv_image_decoder_t * decoder, lv_image_decode
decoder->close_cb = close_cb; decoder->close_cb = close_cb;
} }
void lv_image_decoder_set_cache_free_cb(lv_image_decoder_t * decoder, lv_cache_free_cb_t cache_free_cb)
{
decoder->cache_free_cb = cache_free_cb;
}
#if LV_CACHE_DEF_SIZE > 0 #if LV_CACHE_DEF_SIZE > 0
lv_cache_entry_t * lv_image_decoder_add_to_cache(lv_image_decoder_t * decoder, lv_cache_entry_t * lv_image_decoder_add_to_cache(lv_image_decoder_t * decoder,
lv_image_cache_data_t * search_key, lv_image_cache_data_t * search_key,
@@ -356,7 +380,73 @@ static uint32_t img_width_to_stride(lv_image_header_t * header)
} }
} }
#if LV_CACHE_DEF_SIZE > 0 || LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
inline static lv_cache_compare_res_t image_decoder_common_compare(const void * lhs_src, lv_image_src_t lhs_src_type,
const void * rhs_src, lv_image_src_t rhs_src_type)
{
if(lhs_src_type == rhs_src_type) {
if(lhs_src_type == LV_IMAGE_SRC_FILE) {
int32_t cmp_res = lv_strcmp(lhs_src, rhs_src);
if(cmp_res != 0) {
return cmp_res > 0 ? 1 : -1;
}
}
else if(lhs_src_type == LV_IMAGE_SRC_VARIABLE) {
if(lhs_src != rhs_src) {
return lhs_src > rhs_src ? 1 : -1;
}
}
return 0;
}
return lhs_src_type > rhs_src_type ? 1 : -1;
}
#endif
#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
static lv_cache_compare_res_t image_decoder_header_cache_compare_cb(
const lv_image_header_cache_data_t * lhs,
const lv_image_header_cache_data_t * rhs)
{
return image_decoder_common_compare(lhs->src, lhs->src_type, rhs->src, rhs->src_type);
}
static void image_decoder_header_cache_free_cb(lv_image_header_cache_data_t * entry, void * user_data)
{
LV_UNUSED(user_data); /*Unused*/
if(entry->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)entry->src);
}
#endif
#if LV_CACHE_DEF_SIZE > 0 #if LV_CACHE_DEF_SIZE > 0
static lv_cache_compare_res_t image_decoder_cache_compare_cb(
const lv_image_cache_data_t * lhs,
const lv_image_cache_data_t * rhs)
{
return image_decoder_common_compare(lhs->src, lhs->src_type, rhs->src, rhs->src_type);
}
static void image_decoder_cache_free_cb(lv_image_cache_data_t * entry, void * user_data)
{
const lv_image_decoder_t * decoder = entry->decoder;
if(decoder == NULL) return; /* Why ? */
if(decoder->cache_free_cb) {
/* Decoder wants to free the cache by itself. */
decoder->cache_free_cb(entry, user_data);
}
else {
/* Destroy the decoded draw buffer if necessary. */
lv_draw_buf_t * decoded = (lv_draw_buf_t *)entry->decoded;
if(lv_draw_buf_has_flag(decoded, LV_IMAGE_FLAGS_ALLOCATED)) {
lv_draw_buf_destroy(decoded);
}
/*Free the duplicated file name*/
if(entry->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)entry->src);
}
}
static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc) static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc)
{ {
lv_cache_t * cache = dsc->cache; lv_cache_t * cache = dsc->cache;

View File

@@ -15,6 +15,7 @@ extern "C" {
*********************/ *********************/
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
#include <stdint.h>
#include "lv_draw_buf.h" #include "lv_draw_buf.h"
#include "../misc/lv_fs.h" #include "../misc/lv_fs.h"
#include "../misc/lv_types.h" #include "../misc/lv_types.h"
@@ -109,6 +110,7 @@ struct _lv_image_decoder_t {
lv_image_decoder_get_area_cb_t get_area_cb; lv_image_decoder_get_area_cb_t get_area_cb;
lv_image_decoder_close_f_t close_cb; lv_image_decoder_close_f_t close_cb;
lv_cache_free_cb_t cache_free_cb;
void * user_data; void * user_data;
}; };
@@ -276,6 +278,17 @@ void lv_image_decoder_set_get_area_cb(lv_image_decoder_t * decoder, lv_image_dec
*/ */
void lv_image_decoder_set_close_cb(lv_image_decoder_t * decoder, lv_image_decoder_close_f_t close_cb); void lv_image_decoder_set_close_cb(lv_image_decoder_t * decoder, lv_image_decoder_close_f_t close_cb);
/**
* Set a custom method to free cache data.
* Normally this is not needed. If the custom decoder allocates additional memory other than dsc->decoded
* draw buffer, then you need to register your own method to free it. By default the cache entry is free'ed
* in `image_decoder_cache_free_cb`.
*
* @param decoder pointer to the image decoder
* @param cache_free_cb the custom callback to free cache data. Refer to `image_decoder_cache_free_cb`.
*/
void lv_image_decoder_set_cache_free_cb(lv_image_decoder_t * decoder, lv_cache_free_cb_t cache_free_cb);
#if LV_CACHE_DEF_SIZE > 0 #if LV_CACHE_DEF_SIZE > 0
lv_cache_entry_t * lv_image_decoder_add_to_cache(lv_image_decoder_t * decoder, lv_cache_entry_t * lv_image_decoder_add_to_cache(lv_image_decoder_t * decoder,
lv_image_cache_data_t * search_key, lv_image_cache_data_t * search_key,

View File

@@ -17,6 +17,7 @@ reciprocal:
.text .text
.syntax unified .syntax unified
.altmacro
.p2align 2 .p2align 2
TMP .req r0 TMP .req r0
@@ -31,158 +32,118 @@ MASK_STRIDE .req r8
H .req r9 H .req r9
OPA .req r10 OPA .req r10
RCP .req r11 RCP .req r11
S_B .qn q0
S_G .qn q1
S_R .qn q2
S_A .qn q3
D_B .qn q4
D_G .qn q5
D_R .qn q6
D_A .qn q7
N .qn q0
V .qn q1
R .qn q2
L .qn q4
S_B .req q0 .macro conv_888_to_565 reg
S_G .req q1 vsri.8 reg&_R, reg&_G, #5
S_R .req q2 vshr.u8 reg&_G, reg&_G, #2
S_A .req q3 vshr.u8 reg&_B, reg&_B, #3
D_B .req q4 vsli.8 reg&_B, reg&_G, #5
D_G .req q5 .endm
D_R .req q6
D_A .req q7
N .req q0
V .req q1
R .req q2
L .req q4
S_565 .req q0
D_565 .req q1
S_L .req q2
D_L .req q4
D_T .req q5
BITMASK .req q6
.macro ldst st, op, bpp, mem, reg, areg, cvt, alt_index, wb, aligned @ 16bpp is stored on R & B
.if \bpp == 0 .macro ldst op, bpp, mem, reg, areg, cvt, alt_index, wb
.if \cvt .if bpp == 0
ldr TMP, [\mem\()_ADDR] .if (reg == S) || (wb&1) @ exclude reg == D and !
bfi TMP, TMP, #2, #8 ldr TMP, [mem&_ADDR]
bfi TMP, TMP, #3, #16 vdup.8 reg&_B, TMP
lsr TMP, TMP, #8
vdup.16 \reg\()_565, TMP
.else
ldr TMP, [\mem\()_ADDR]
vdup.8 \reg\()_B, TMP
lsr TMP, #8 lsr TMP, #8
vdup.8 \reg\()_G, TMP vdup.8 reg&_G, TMP
lsr TMP, #8 lsr TMP, #8
vdup.8 \reg\()_R, TMP vdup.8 reg&_R, TMP
.if cvt && (wb&1)
conv_888_to_565 reg
.endif .endif
.elseif \bpp == 8 .endif
.if \cvt .elseif bpp == 8
v\op\()rb.u16 \reg\()_A, [\mem\()_ADDR], #8 v&op&rb.8 reg&_A, [mem&_ADDR], #16
.elseif bpp == 16
.if cvt && (op == st)
conv_888_to_565 reg
.endif
.if alt_index
v&op&rb.8 reg&_B, [mem&_ADDR, areg&_A]
add mem&_ADDR, #1
v&op&rb.8 reg&_R, [mem&_ADDR, areg&_A]
.else .else
v\op\()rb.8 \reg\()_A, [\mem\()_ADDR], #16 v&op&rb.8 reg&_B, [mem&_ADDR, reg&_A]
add mem&_ADDR, #1
v&op&rb.8 reg&_R, [mem&_ADDR, reg&_A]
.endif .endif
.elseif \bpp == 16 .if cvt && (op == ld)
.if \cvt vshl.u8 reg&_G, reg&_R, #5
.if \st vsri.u8 reg&_G, reg&_B, #3
vsri.8 \reg\()_R, \reg\()_G, #5 vshl.u8 reg&_B, reg&_B, #3
vshr.u8 \reg\()_G, \reg\()_G, #2 vsri.u8 reg&_R, reg&_R, #5
vshr.u8 \reg\()_B, \reg\()_B, #3 vsri.u8 reg&_G, reg&_G, #6
vsli.8 \reg\()_B, \reg\()_G, #5 vsri.u8 reg&_B, reg&_B, #5
.endif .endif
.if \alt_index .if wb&0
v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, S_B] add mem&_ADDR, #31
v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, S_G]
.else .else
v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, \reg\()_A] sub mem&_ADDR, #1
add \mem\()_ADDR, #1
v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, \reg\()_A]
.endif .endif
.if \st == 0 .elseif bpp >= 24
vshl.u8 \reg\()_G, \reg\()_R, #5 .if alt_index || (bpp >= 31)
vsri.u8 \reg\()_G, \reg\()_B, #3 v&op&rb.8 reg&_B, [mem&_ADDR, areg&_A]
vshl.u8 \reg\()_B, \reg\()_B, #3 add mem&_ADDR, #1
vsri.u8 \reg\()_R, \reg\()_R, #5 v&op&rb.8 reg&_G, [mem&_ADDR, areg&_A]
vsri.u8 \reg\()_G, \reg\()_G, #6 add mem&_ADDR, #1
vsri.u8 \reg\()_B, \reg\()_B, #5 v&op&rb.8 reg&_R, [mem&_ADDR, areg&_A]
.endif
.ifc \wb, !
.if \alt_index
add \mem\()_ADDR, #32
.else .else
add \mem\()_ADDR, #31 v&op&rb.8 reg&_B, [mem&_ADDR, reg&_A]
add mem&_ADDR, #1
v&op&rb.8 reg&_G, [mem&_ADDR, reg&_A]
add mem&_ADDR, #1
v&op&rb.8 reg&_R, [mem&_ADDR, reg&_A]
.endif .endif
.elseif \alt_index == 0 .if (bpp == 32) || (bpp == 31) && (op == st)
sub \mem\()_ADDR, #1 add mem&_ADDR, #1
v&op&rb.8 reg&_A, [mem&_ADDR, areg&_A]
.endif .endif
.else @ cvt .if wb&0
.ifc \wb, ! .if bpp == 24
v\op\()rh.16 \reg\()_565, [\mem\()_ADDR], #16 add mem&_ADDR, #46
.else .elseif (bpp == 32) || (bpp == 31) && (op == st)
v\op\()rh.16 \reg\()_565, [\mem\()_ADDR] add mem&_ADDR, #61
.endif
.endif
.elseif \bpp == 24
.if \alt_index == 1
v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, S_B]
v\op\()rb.8 \reg\()_G, [\mem\()_ADDR, S_G]
v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, S_R]
.elseif \alt_index == 2
v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, S_R]
v\op\()rb.8 \reg\()_G, [\mem\()_ADDR, S_A]
v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, D_A]
.else
v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, \reg\()_A]
add \mem\()_ADDR, #1
v\op\()rb.8 \reg\()_G, [\mem\()_ADDR, \reg\()_A]
add \mem\()_ADDR, #1
v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, \reg\()_A]
.endif
.ifc \wb, !
.if \alt_index
add \mem\()_ADDR, #48
.else
add \mem\()_ADDR, #46
.endif
.elseif \alt_index == 0
sub \mem\()_ADDR, #2
.endif
.elseif \aligned
v\op\()40.8 {\reg\()_B, \reg\()_G, \reg\()_R, \reg\()_A}, [\mem\()_ADDR]
v\op\()41.8 {\reg\()_B, \reg\()_G, \reg\()_R, \reg\()_A}, [\mem\()_ADDR]
v\op\()42.8 {\reg\()_B, \reg\()_G, \reg\()_R, \reg\()_A}, [\mem\()_ADDR]
v\op\()43.8 {\reg\()_B, \reg\()_G, \reg\()_R, \reg\()_A}, [\mem\()_ADDR]\wb
.else
v\op\()rb.8 \reg\()_B, [\mem\()_ADDR, \areg\()_A]
add \mem\()_ADDR, #1
v\op\()rb.8 \reg\()_G, [\mem\()_ADDR, \areg\()_A]
add \mem\()_ADDR, #1
v\op\()rb.8 \reg\()_R, [\mem\()_ADDR, \areg\()_A]
.if (\bpp == 32) || (\bpp == 31) && \st
add \mem\()_ADDR, #1
v\op\()rb.8 \reg\()_A, [\mem\()_ADDR, \areg\()_A]
.endif
.ifc \wb, !
.if (\bpp == 32) || (\bpp == 31) && \st
add \mem\()_ADDR, #61
.else .else
add \mem\()_ADDR, #62 add mem&_ADDR, #62
.endif .endif
.else .else
.if (\bpp == 32) || (\bpp == 31) && \st .if (bpp == 32) || (bpp == 31) && (op == st)
sub \mem\()_ADDR, #3 sub mem&_ADDR, #3
.else .else
sub \mem\()_ADDR, #2 sub mem&_ADDR, #2
.endif .endif
.endif .endif
.endif .endif
.endm .endm
.macro load_index bpp, reg, areg, aligned .macro load_index bpp, reg, areg
.if (\bpp > 0) && ((\bpp < 31) || (\aligned == 0)) .if bpp > 0
mov TMP, #0 mov TMP, #0
.if \bpp == 8
vidup.u8 \reg\()_A, TMP, #1
.elseif \bpp == 16
vidup.u8 \reg\()_A, TMP, #2
.elseif \bpp == 24
vidup.u8 \reg\()_A, TMP, #1
mov TMP, #3
vmul.u8 \reg\()_A, \reg\()_A, TMP
.else
vidup.u8 \areg\()_A, TMP, #4
.endif .endif
.if bpp == 8
vidup.u8 reg&_A, TMP, #1
.elseif bpp == 16
vidup.u8 reg&_A, TMP, #2
.elseif bpp == 24
vidup.u8 reg&_A, TMP, #1
mov TMP, #3
vmul.i8 reg&_A, reg&_A, TMP
.elseif bpp >= 31
vidup.u8 areg&_A, TMP, #4
.endif .endif
.endm .endm
@@ -192,227 +153,89 @@ BITMASK .req q6
ldr DST_H, [r0, #12] ldr DST_H, [r0, #12]
ldr DST_STRIDE, [r0, #16] ldr DST_STRIDE, [r0, #16]
ldr SRC_ADDR, [r0, #20] ldr SRC_ADDR, [r0, #20]
.if \src_bpp > 0 .if src_bpp > 0
ldr SRC_STRIDE, [r0, #24] ldr SRC_STRIDE, [r0, #24]
.endif .endif
.if \mask .if mask
ldr MASK_ADDR, [r0, #28] ldr MASK_ADDR, [r0, #28]
ldr MASK_STRIDE, [r0, #32] ldr MASK_STRIDE, [r0, #32]
.endif .endif
.if \opa .if opa
ldr OPA, [r0] ldr OPA, [r0]
.endif
.if (\src_bpp <= 16) && (\dst_bpp == 16)
.if \opa || \mask
mov TMP, #0xF81F
movt TMP, #0x7E0
vdup.32 BITMASK, TMP
.endif
add TMP, DST_W, #0x7
bic TMP, TMP, #0x7
.else .else
mov OPA, #0xFF
.endif
add TMP, DST_W, #0xF add TMP, DST_W, #0xF
bic TMP, TMP, #0xF bic TMP, TMP, #0xF
.endif .if dst_bpp == 32
.if \dst_bpp == 32
ldr RCP, =(reciprocal - 8) ldr RCP, =(reciprocal - 8)
.endif .endif
.if \dst_bpp == 16 .if dst_bpp == 16
sub DST_STRIDE, DST_STRIDE, TMP, lsl #1 sub DST_STRIDE, DST_STRIDE, TMP, lsl #1
.elseif \dst_bpp == 24 .elseif dst_bpp == 24
sub DST_STRIDE, DST_STRIDE, TMP sub DST_STRIDE, DST_STRIDE, TMP
sub DST_STRIDE, DST_STRIDE, TMP, lsl #1 sub DST_STRIDE, DST_STRIDE, TMP, lsl #1
.elseif \dst_bpp >= 31 .elseif dst_bpp >= 31
sub DST_STRIDE, DST_STRIDE, TMP, lsl #2 sub DST_STRIDE, DST_STRIDE, TMP, lsl #2
.endif .endif
.if \mask .if mask
sub MASK_STRIDE, MASK_STRIDE, TMP sub MASK_STRIDE, MASK_STRIDE, TMP
.endif .endif
.if \src_bpp == 0 .if src_bpp == 0
.if \mask || \opa .if mask || opa
.if \dst_bpp > 16 ldst ld, src_bpp, SRC, S, D, 0, 0
ldst 0, ld, \src_bpp, SRC, S, D, 0, 0
vmov.u8 S_A, #0xFF vmov.u8 S_A, #0xFF
.else .else
ldst 0, ld, \src_bpp, SRC, S, D, 1, 0 ldst ld, src_bpp, SRC, D, S, (dst_bpp == 16), 0
vmovlb.u16 S_L, S_565 vmov.u8 D_A, #0xFF
vsli.32 S_L, S_L, #16
vand S_L, S_L, BITMASK
.endif .endif
.else .else
.if \dst_bpp > 16 .if src_bpp == 16
ldst 0, ld, \src_bpp, SRC, D, S, 0, 0
.else
ldst 0, ld, \src_bpp, SRC, D, S, 1, 0
.endif
.endif
.else
.if \src_bpp == 16
sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #1 sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #1
.elseif \src_bpp == 24 .elseif src_bpp == 24
sub SRC_STRIDE, SRC_STRIDE, TMP sub SRC_STRIDE, SRC_STRIDE, TMP
sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #1 sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #1
.elseif \src_bpp >= 31 .elseif src_bpp >= 31
sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #2 sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #2
.endif .endif
.endif .endif
.if (\src_bpp < 32) && (\mask == 0) && (\opa == 0) && !((\src_bpp <= 16) && (\dst_bpp == 16)) .if (src_bpp < 32) && (mask == 0) && (opa == 0)
@ 16 to 31/32 or reverse: index @ q0, q1 .if (src_bpp == 31) || (dst_bpp < 31)
@ 24 to 31/32 or reverse: index @ q0, q1, q2 load_index src_bpp, S, S
@ 16 to 24 or reverse: 16 index @ q0, q1, 24 index @ q2, q3, q7 .endif
@ 31 to 31/32: index @ q3 (tail only) .if (dst_bpp < 31) && (dst_bpp != src_bpp)
mov TMP, #0 load_index dst_bpp, D, D
.if (\src_bpp == 16) || (\dst_bpp == 16) .else
vidup.u8 S_B, TMP, #2 load_index dst_bpp, S, S
mov TMP, #1 vmov.u8 D_A, #0xFF
vadd.u8 S_G, S_B, TMP .endif
.if (\src_bpp == 24) || (\dst_bpp == 24)
vshl.u8 S_R, S_B, #1
vadd.u8 S_R, S_R, S_B
vshr.u8 S_R, S_R, #1
vadd.u8 S_A, S_R, TMP
vadd.u8 D_A, S_A, TMP
.endif
.elseif (\src_bpp == 24) || (\dst_bpp == 24)
vidup.u8 S_B, TMP, #1
mov TMP, #3
vmul.u8 S_B, S_B, TMP
mov TMP, #1
vadd.u8 S_G, S_B, TMP
vadd.u8 S_R, S_G, TMP
.endif
.if \dst_bpp >= 31
load_index \dst_bpp, D, S, 0
vmov.u8 D_A, #0xFF
.endif
.endif .endif
.endm .endm
.macro vqrdmulh_u8 Qd, Qn, Qm @ 1 bit precision loss .macro vqrdmulh_u8 Qd, Qn, Qm @ 1 bit precision loss
vmulh.u8 \Qd, \Qn, \Qm vmulh.u8 Qd, Qn, Qm
vqshl.u8 \Qd, \Qd, #1 vqshl.u8 Qd, Qd, #1
.endm .endm
.macro premult mem, alpha .macro premult mem, alpha
vrmulh.u8 \mem\()_B, \mem\()_B, \alpha vrmulh.u8 mem&_B, mem&_B, alpha
vrmulh.u8 \mem\()_G, \mem\()_G, \alpha vrmulh.u8 mem&_G, mem&_G, alpha
vrmulh.u8 \mem\()_R, \mem\()_R, \alpha vrmulh.u8 mem&_R, mem&_R, alpha
.endm
.macro blend_565 p
vmovl\p\().u16 D_L, D_565
vsli.32 D_L, D_L, #16
vand D_L, D_L, BITMASK
vsub.u32 D_T, S_L, D_L
vmovl\p\().u16 D_A, S_A
vmul.u32 D_T, D_T, D_A
vshr.u32 D_T, D_T, #5
vadd.u32 D_L, D_L, D_T
vand D_L, D_L, BITMASK
vshr.u32 D_T, D_L, #16
vorr D_L, D_L, D_T
vmovn\p\().u32 D_565, D_L
.endm
.macro late_init src_bpp, dst_bpp, mask, opa, mode
.if (\src_bpp <= 16) && (\dst_bpp == 16) && (\mask == 0)
.if \opa == 2
mov TMP, #0x7BEF
vdup.16 BITMASK, TMP
.if \src_bpp == 0
vshr.u16 S_L, S_565, #1
vand S_L, S_L, BITMASK
.endif
.elseif \opa == 1
vdup.16 S_A, OPA
mov TMP, #4
vadd.u16 S_A, S_A, TMP
vshr.u16 S_A, S_A, #3
.endif
.endif
.endm .endm
.macro blend src_bpp, dst_bpp, mask, opa, mode .macro blend src_bpp, dst_bpp, mask, opa, mode
.if (\mask == 0) && (\opa == 2) .if (mask == 0) && (opa == 2) && (dst_bpp < 32)
.if (\src_bpp <= 16) && (\dst_bpp == 16)
.if \src_bpp > 0
vshr.u16 S_L, S_565, #1
vand S_L, S_L, BITMASK
.endif
vshr.u16 D_L, D_565, #1
vand D_L, D_L, BITMASK
vadd.u16 D_565, S_L, D_L
.else
vhadd.u8 D_B, D_B, S_B vhadd.u8 D_B, D_B, S_B
vhadd.u8 D_G, D_G, S_G vhadd.u8 D_G, D_G, S_G
vhadd.u8 D_R, D_R, S_R vhadd.u8 D_R, D_R, S_R
.endif
.elseif (\src_bpp <= 16) && (\dst_bpp == 16)
lsl lr, #1
.if \src_bpp > 0
vmovlb.u16 S_L, S_565
vsli.32 S_L, S_L, #16
vand S_L, S_L, BITMASK
.endif
blend_565 b
.if \src_bpp > 0
vmovlt.u16 S_L, S_565
vsli.32 S_L, S_L, #16
vand S_L, S_L, BITMASK
.endif
blend_565 t
lsr lr, #1
.else .else
.if \dst_bpp < 32 .if dst_bpp < 32
.if (\opa == 0) && (\mask == 0)
vmov.u8 D_A, #0xFF
mov TMP, #0
vabav.u8 TMP, S_A, D_A
cbnz TMP, 91f
vmov D_B, S_B
vmov D_G, S_G
vmov D_R, S_R
b 88f
91:
.endif
vmvn D_A, S_A vmvn D_A, S_A
premult S, S_A premult S, S_A
premult D, D_A premult D, D_A
.else .else
vpush {d0-d5} vpush {d0-d5}
vmov.u8 S_B, #0xFF
vmov.u8 S_G, #0
mov TMP, #0
vabav.u8 TMP, S_A, S_B
cbz TMP, 91f @ if(fg.alpha == 255
mov TMP, #0
vabav.u8 TMP, D_A, S_G
cbnz TMP, 90f @ || bg.alpha == 0)
91:
vpop {d8-d13} @ return fg;
vmov.u8 D_A, #0xFF
b 88f
90:
mov TMP, #0
vabav.u8 TMP, S_A, S_G
cmp TMP, #2 @ if(fg.alpha <= LV_OPA_MIN)
itt le @ return bg;
vpople {d0-d5}
ble 88f
mov TMP, #0
vabav.u8 TMP, D_A, S_B @ if (bg.alpha == 255)
cbnz TMP, 89f @ return lv_color_mix32(fg, bg);
vpop {d0-d5}
vmvn D_A, S_A
premult S, S_A
premult D, D_A
vqadd.u8 D_B, D_B, S_B
vqadd.u8 D_G, D_G, S_G
vqadd.u8 D_R, D_R, S_R
vmov.u8 D_A, #0xFF
b 88f
89:
vmvn N, S_A vmvn N, S_A
vmvn D_A, D_A vmvn D_A, D_A
vrmulh.u8 D_A, N, D_A vrmulh.u8 D_A, N, D_A
@@ -438,242 +261,191 @@ BITMASK .req q6
vqadd.u8 D_G, D_G, S_G vqadd.u8 D_G, D_G, S_G
vqadd.u8 D_R, D_R, S_R vqadd.u8 D_R, D_R, S_R
.endif .endif
.if \dst_bpp == 31 .if dst_bpp == 31
vmov.u8 D_A, #0xFF vmov.u8 D_A, #0xFF
.endif .endif
88:
.endm .endm
.macro blend_line src_bpp, dst_bpp, mask, opa, mode .macro blend_line src_bpp, dst_bpp, mask, opa, mode
.if (\src_bpp < 31) && (\dst_bpp < 31) wlstp.8 lr, DST_W, 1f
blend_block \src_bpp, \dst_bpp, \mask, \opa, \mode, DST_W, 0
.else
bics TMP, DST_W, #0xF
beq 87f
blend_block \src_bpp, \dst_bpp, \mask, \opa, \mode, TMP, 1
87:
ands TMP, DST_W, #0xF
beq 86f
blend_block \src_bpp, \dst_bpp, \mask, \opa, \mode, TMP, 0
86:
.endif
.endm
.macro blend_block src_bpp, dst_bpp, mask, opa, mode, w, aligned
.if (\src_bpp <= 16) && (\dst_bpp == 16)
wlstp.16 lr, \w, 1f
.else
wlstp.8 lr, \w, 1f
.endif
2: 2:
.if (\src_bpp < 32) && (\mask == 0) && (\opa == 0) .if (src_bpp < 32) && (mask == 0) && (opa == 0)
@ no blend @ no blend
.if \src_bpp == 0 @ dst index: db < 31 ? (db == sb ? S : D) : S
ldst 1, st, \dst_bpp, DST, D, S, 0, 1, !, \aligned @ src index: sb < 31 && db >= 31 ? D(reload) : S
.elseif (\src_bpp == \dst_bpp) || (\src_bpp == 31) && (\dst_bpp == 32) .if (src_bpp < 31) && (dst_bpp >= 31)
.if \dst_bpp < 31 load_index src_bpp, D, D
.if \src_bpp < 31 .endif
ldst 0, ld, \src_bpp, SRC, D, S, 0, 1, !, \aligned .if src_bpp == 0
ldst st, dst_bpp, DST, D, S, 0, 0, !
.elseif (src_bpp == dst_bpp) || (src_bpp == 31) && (dst_bpp == 32)
.if dst_bpp < 31
.if src_bpp < 31
ldst ld, src_bpp, SRC, D, S, 0, 1, !
.else .else
ldst 0, ld, \src_bpp, SRC, D, S, 0, 1, !, \aligned ldst ld, src_bpp, SRC, D, S, 0, 0, !
.endif .endif
ldst 1, st, \dst_bpp, DST, D, S, 0, 1, !, \aligned ldst st, dst_bpp, DST, D, S, 0, 1, !
.else .else
ldst 0, ld, \src_bpp, SRC, D, S, 0, 1, !, \aligned ldst ld, src_bpp, SRC, D, S, 0, 0, !
ldst 1, st, \dst_bpp, DST, D, S, 0, 1, !, \aligned ldst st, dst_bpp, DST, D, S, 0, 0, !
.endif .endif
.else .else
.if (\dst_bpp < 31) && (\src_bpp < 31) .if (dst_bpp < 31) && (src_bpp < 31)
ldst 0, ld, \src_bpp, SRC, D, S, 1, 2, !, \aligned ldst ld, src_bpp, SRC, D, S, 1, 1, !
ldst 1, st, \dst_bpp, DST, D, S, 1, 2, !, \aligned
.else .else
ldst 0, ld, \src_bpp, SRC, D, S, 1, 1, !, \aligned ldst ld, src_bpp, SRC, D, S, 1, 0, !
ldst 1, st, \dst_bpp, DST, D, S, 1, 1, !, \aligned
.endif .endif
.endif .if (src_bpp < 31) && (dst_bpp >= 31)
.elseif (\src_bpp <= 16) && (\dst_bpp == 16) vmov.u8 D_A, #0xFF
.if \src_bpp > 0
ldst 0, ld, \src_bpp, SRC, S, D, 0, 0, !, \aligned
.endif
ldst 0, ld, \dst_bpp, DST, D, S, 0, 0, , \aligned
.if \mask
ldst 0, ld, 8, MASK, S, D, 1, 0, !
.if \opa == 2
vshr.u16 S_A, S_A, #1
.elseif \opa == 1
vmul.u16 S_A, S_A, OPA
vshr.u16 S_A, S_A, #8
.endif .endif
mov TMP, #4 ldst st, dst_bpp, DST, D, S, 1, 0, !
vadd.u16 S_A, S_A, TMP
vshr.u16 S_A, S_A, #3
.endif .endif
blend \src_bpp, \dst_bpp, \mask, \opa, \mode .elseif src_bpp < 32
ldst 1, st, \dst_bpp, DST, D, S, 0, 0, !, \aligned
.elseif \src_bpp < 32
@ no src_a @ no src_a
.if \src_bpp > 0 load_index src_bpp, S, D
load_index \src_bpp, S, D, \aligned ldst ld, src_bpp, SRC, S, D, 1, 0, !
ldst 0, ld, \src_bpp, SRC, S, D, 1, 0, !, \aligned load_index dst_bpp, D, S
.elseif (\opa == 1) || \mask ldst ld, dst_bpp, DST, D, S, 1, 0
vpush {d0-d5} .if mask
.endif ldst ld, 8, MASK, S, D, 1, 0, !
load_index \dst_bpp, D, S, \aligned .if opa == 2
ldst 0, ld, \dst_bpp, DST, D, S, 1, 0, , \aligned
.if \mask
ldst 0, ld, 8, MASK, S, D, 0, 0, !, \aligned
.if \opa == 2
vshr.u8 S_A, S_A, #1 vshr.u8 S_A, S_A, #1
.elseif \opa == 1 .elseif opa == 1
.if \dst_bpp == 32 .if dst_bpp == 32
vpush {d14-d15} vpush {d14-d15}
.endif .endif
vdup.8 D_A, OPA vdup.8 D_A, OPA
vrmulh.u8 S_A, S_A, D_A vrmulh.u8 S_A, S_A, D_A
.if \dst_bpp == 32 .if dst_bpp == 32
vpop {d14-d15} vpop {d14-d15}
.endif .endif
.endif .endif
.elseif \opa == 1 .elseif opa == 1
vdup.8 S_A, OPA vdup.8 S_A, OPA
.endif .endif
blend \src_bpp, \dst_bpp, \mask, \opa, \mode blend src_bpp, dst_bpp, mask, opa, mode
.if (\src_bpp == 0) && ((\opa == 1) || \mask) .if (dst_bpp == 32) || mask || (opa == 1)
vpop {d0-d5} load_index dst_bpp, D, S
.endif
.if (\dst_bpp == 32) || \mask || (\opa == 1)
load_index \dst_bpp, D, S, \aligned
.endif .endif
ldst 1, st, \dst_bpp, DST, D, S, 1, 0, !, \aligned ldst st, dst_bpp, DST, D, S, 1, 0, !
.else .else
@ src_a (+\mask) (+\opa) @ src_a (+mask) (+opa)
load_index \dst_bpp, D, S, \aligned load_index dst_bpp, D, S
ldst 0, ld, \dst_bpp, DST, D, S, 1, 0, , \aligned ldst ld, dst_bpp, DST, D, S, 1, 0
.if (\dst_bpp == 32) && (\mask || \opa || (\aligned == 0)) .if dst_bpp == 32
vpush {d14-d15} vpush {d14-d15}
.endif .endif
load_index \src_bpp, S, D, \aligned load_index src_bpp, S, D
ldst 0, ld, \src_bpp, SRC, S, D, 1, 0, !, \aligned ldst ld, src_bpp, SRC, S, D, 1, 0, !
.if \mask == 0 .if mask == 0
.if \opa .if opa
vdup.8 D_A, OPA vdup.8 D_A, OPA
vrmulh.u8 S_A, S_A, D_A vrmulh.u8 S_A, S_A, D_A
.endif .endif
.else .else
ldst 0, ld, 8, MASK, D, S, 0, 0, !, \aligned ldst ld, 8, MASK, D, S, 1, 0, !
vrmulh.u8 S_A, S_A, D_A vrmulh.u8 S_A, S_A, D_A
.if \opa .if opa
vdup.8 D_A, OPA vdup.8 D_A, OPA
vrmulh.u8 S_A, S_A, D_A vrmulh.u8 S_A, S_A, D_A
.endif .endif
.endif .endif
.if (\dst_bpp == 32) && (\mask || \opa || (\aligned == 0)) .if dst_bpp == 32
vpop {d14-d15} vpop {d14-d15}
.endif .endif
blend \src_bpp, \dst_bpp, \mask, \opa, \mode blend src_bpp, dst_bpp, mask, opa, mode
load_index \dst_bpp, D, S, \aligned load_index dst_bpp, D, S
ldst 1, st, \dst_bpp, DST, D, S, 1, 0, !, \aligned ldst st, dst_bpp, DST, D, S, 1, 0, !
.endif .endif
letp lr, 2b letp lr, 2b
1: 1:
.endm .endm
.macro enter complex .macro enter
push {r4-r11, lr} push {r4-r11, lr}
.if \complex
vpush {d8-d15} vpush {d8-d15}
.endif
.endm .endm
.macro exit complex .macro exit
.if \complex
vpop {d8-d15} vpop {d8-d15}
.endif
pop {r4-r11, pc} pop {r4-r11, pc}
.endm .endm
.macro preload mem, bpp .macro preload mem, bpp
.if \bpp >= 31 .if bpp >= 31
pld [\mem\()_ADDR, DST_W, lsl #2] pld [mem&_ADDR, DST_W, lsl #2]
.elseif \bpp == 24 .elseif bpp == 24
add TMP, DST_W, DST_W, lsl #1 add TMP, DST_W, DST_W, lsl #1
pld [\mem\()_ADDR, TMP] pld [mem&_ADDR, TMP]
.elseif \bpp == 16 .elseif bpp == 16
pld [\mem\()_ADDR, DST_W, lsl #1] pld [mem&_ADDR, DST_W, lsl #1]
.elseif \bpp == 8 .elseif bpp == 8
pld [\mem\()_ADDR, DST_W] pld [mem&_ADDR, DST_W]
.endif .endif
.endm .endm
.macro next src_bpp, mask .macro next src_bpp, mask
add DST_ADDR, DST_ADDR, DST_STRIDE add DST_ADDR, DST_ADDR, DST_STRIDE
.if \src_bpp > 0 .if src_bpp > 0
add SRC_ADDR, SRC_ADDR, SRC_STRIDE add SRC_ADDR, SRC_ADDR, SRC_STRIDE
.endif .endif
.if \mask .if mask
add MASK_ADDR, MASK_ADDR, MASK_STRIDE add MASK_ADDR, MASK_ADDR, MASK_STRIDE
.endif .endif
.endm .endm
.macro blender src_bpp, dst_bpp, mask, opa, mode .macro blender src_bpp, dst_bpp, mask, opa, mode
.if (\src_bpp <= 16) && (\dst_bpp == 16) && (\opa == 0) && (\mask == 0) enter
enter 0 init src_bpp, dst_bpp, mask, opa
.else
enter 1
.endif
init \src_bpp, \dst_bpp, \mask, \opa
movs H, DST_H movs H, DST_H
beq 0f beq 0f
preload SRC, \src_bpp preload SRC, src_bpp
.if \mask || \opa || (\src_bpp == 32) .if mask || opa || (src_bpp == 32)
preload DST, \dst_bpp preload DST, dst_bpp
.endif .endif
.if \opa && (\src_bpp < 32) && (\dst_bpp < 32) .if opa && (src_bpp < 32) && (dst_bpp < 32)
4: 4:
@ 50% OPA can be accelerated (OPA == 0x7F/0x80) @ 50% OPA can be accelerated (OPA == 0x7F/0x80)
add TMP, OPA, #1 add TMP, OPA, #1
tst TMP, #0x7E tst TMP, #0x7E
bne 3f bne 3f
late_init \src_bpp, \dst_bpp, \mask, 2, \mode blend_line src_bpp, dst_bpp, mask, 2, mode
blend_line \src_bpp, \dst_bpp, \mask, 2, \mode next src_bpp, mask
next \src_bpp, \mask
subs H, #1 subs H, #1
bne 4b bne 4b
b 0f b 0f
.endif .endif
3: 3:
late_init \src_bpp, \dst_bpp, \mask, \opa, \mode blend_line src_bpp, dst_bpp, mask, opa, mode
blend_line \src_bpp, \dst_bpp, \mask, \opa, \mode next src_bpp, mask
next \src_bpp, \mask
subs H, #1 subs H, #1
bne 3b bne 3b
0: 0:
.if (\src_bpp <= 16) && (\dst_bpp == 16) && (\opa == 0) && (\mask == 0) exit
exit 0
.else
exit 1
.endif
.ltorg .ltorg
.endm .endm
.macro export name, src_bpp, dst_bpp, mask, opa, mode .macro export name, src_bpp, dst_bpp, mask, opa, mode
.thumb_func .thumb_func
.global \name .func name
\name\(): .global name
blender \src_bpp, \dst_bpp, \mask, \opa, \mode name&:
blender src_bpp, dst_bpp, mask, opa, mode
.endfunc
.endm .endm
.macro export_set src, dst, src_bpp, dst_bpp, mode .macro export_set src, dst, src_bpp, dst_bpp, mode
.ifc \src, color .if src == color
export lv_\src\()_blend_to_\dst\()_helium, \src_bpp, \dst_bpp, 0, 0, \mode export lv_&src&_blend_to_&dst&_helium, src_bpp, dst_bpp, 0, 0, mode
export lv_\src\()_blend_to_\dst\()_with_opa_helium, \src_bpp, \dst_bpp, 0, 1, \mode export lv_&src&_blend_to_&dst&_with_opa_helium, src_bpp, dst_bpp, 0, 1, mode
export lv_\src\()_blend_to_\dst\()_with_mask_helium, \src_bpp, \dst_bpp, 1, 0, \mode export lv_&src&_blend_to_&dst&_with_mask_helium, src_bpp, dst_bpp, 1, 0, mode
export lv_\src\()_blend_to_\dst\()_mix_mask_opa_helium, \src_bpp, \dst_bpp, 1, 1, \mode export lv_&src&_blend_to_&dst&_mix_mask_opa_helium, src_bpp, dst_bpp, 1, 1, mode
.else .else
export lv_\src\()_blend_\mode\()_to_\dst\()_helium, \src_bpp, \dst_bpp, 0, 0, \mode export lv_&src&_blend_&mode&_to_&dst&_helium, src_bpp, dst_bpp, 0, 0, mode
export lv_\src\()_blend_\mode\()_to_\dst\()_with_opa_helium, \src_bpp, \dst_bpp, 0, 1, \mode export lv_&src&_blend_&mode&_to_&dst&_with_opa_helium, src_bpp, dst_bpp, 0, 1, mode
export lv_\src\()_blend_\mode\()_to_\dst\()_with_mask_helium, \src_bpp, \dst_bpp, 1, 0, \mode export lv_&src&_blend_&mode&_to_&dst&_with_mask_helium, src_bpp, dst_bpp, 1, 0, mode
export lv_\src\()_blend_\mode\()_to_\dst\()_mix_mask_opa_helium, \src_bpp, \dst_bpp, 1, 1, \mode export lv_&src&_blend_&mode&_to_&dst&_mix_mask_opa_helium, src_bpp, dst_bpp, 1, 1, mode
.endif .endif
.endm .endm

View File

@@ -449,9 +449,9 @@ static void execute_drawing(lv_draw_sw_unit_t * u)
LV_PROFILER_END; LV_PROFILER_END;
} }
static void rotate270_argb8888(const uint32_t * src, uint32_t * dst, int32_t srcWidth, int32_t srcHeight, static void rotate90_argb8888(const uint32_t * src, uint32_t * dst, int32_t srcWidth, int32_t srcHeight,
int32_t srcStride, int32_t srcStride,
int32_t dstStride) int32_t dstStride)
{ {
if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_ARGB8888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_ARGB8888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) {
return ; return ;
@@ -489,9 +489,9 @@ static void rotate180_argb8888(const uint32_t * src, uint32_t * dst, int32_t wid
} }
} }
static void rotate90_argb8888(const uint32_t * src, uint32_t * dst, int32_t srcWidth, int32_t srcHeight, static void rotate270_argb8888(const uint32_t * src, uint32_t * dst, int32_t srcWidth, int32_t srcHeight,
int32_t srcStride, int32_t srcStride,
int32_t dstStride) int32_t dstStride)
{ {
if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_ARGB8888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_ARGB8888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) {
return ; return ;
@@ -510,8 +510,8 @@ static void rotate90_argb8888(const uint32_t * src, uint32_t * dst, int32_t srcW
} }
} }
static void rotate270_rgb888(const uint8_t * src, uint8_t * dst, int32_t srcWidth, int32_t srcHeight, int32_t srcStride, static void rotate90_rgb888(const uint8_t * src, uint8_t * dst, int32_t srcWidth, int32_t srcHeight, int32_t srcStride,
int32_t dstStride) int32_t dstStride)
{ {
if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_RGB888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_RGB888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) {
return ; return ;
@@ -546,8 +546,8 @@ static void rotate180_rgb888(const uint8_t * src, uint8_t * dst, int32_t width,
} }
} }
static void rotate90_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t srcStride, static void rotate270_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, int32_t height, int32_t srcStride,
int32_t dstStride) int32_t dstStride)
{ {
if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_RGB888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_RGB888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) {
return ; return ;
@@ -564,9 +564,9 @@ static void rotate90_rgb888(const uint8_t * src, uint8_t * dst, int32_t width, i
} }
} }
static void rotate270_rgb565(const uint16_t * src, uint16_t * dst, int32_t srcWidth, int32_t srcHeight, static void rotate90_rgb565(const uint16_t * src, uint16_t * dst, int32_t srcWidth, int32_t srcHeight,
int32_t srcStride, int32_t srcStride,
int32_t dstStride) int32_t dstStride)
{ {
if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_RGB565(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { if(LV_RESULT_OK == LV_DRAW_SW_ROTATE90_RGB565(src, dst, srcWidth, srcHeight, srcStride, dstStride)) {
return ; return ;
@@ -604,9 +604,9 @@ static void rotate180_rgb565(const uint16_t * src, uint16_t * dst, int32_t width
} }
} }
static void rotate90_rgb565(const uint16_t * src, uint16_t * dst, int32_t srcWidth, int32_t srcHeight, static void rotate270_rgb565(const uint16_t * src, uint16_t * dst, int32_t srcWidth, int32_t srcHeight,
int32_t srcStride, int32_t srcStride,
int32_t dstStride) int32_t dstStride)
{ {
if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_RGB565(src, dst, srcWidth, srcHeight, srcStride, dstStride)) { if(LV_RESULT_OK == LV_DRAW_SW_ROTATE270_RGB565(src, dst, srcWidth, srcHeight, srcStride, dstStride)) {
return ; return ;

View File

@@ -6,12 +6,11 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdbool.h>
#include "lv_draw_sw.h" #include "lv_draw_sw.h"
#if LV_USE_DRAW_SW #if LV_USE_DRAW_SW
#include "../../misc/lv_math.h" #include "../../misc/lv_math.h"
#include "../../misc/lv_types.h"
#include "../../core/lv_refr.h" #include "../../core/lv_refr.h"
#include "../../stdlib/lv_string.h" #include "../../stdlib/lv_string.h"

View File

@@ -13,10 +13,10 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdbool.h>
#include "../../misc/lv_area.h" #include "../../misc/lv_area.h"
#include "../../misc/lv_color.h" #include "../../misc/lv_color.h"
#include "../../misc/lv_math.h" #include "../../misc/lv_math.h"
#include "../../misc/lv_types.h"
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -12,7 +12,6 @@
#if LV_USE_DRAW_VG_LITE #if LV_USE_DRAW_VG_LITE
#include "lv_vg_lite_utils.h" #include "lv_vg_lite_utils.h"
#include <string.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -72,7 +72,7 @@ void lv_draw_vg_lite_init(void)
unit->base_unit.delete_cb = draw_delete; unit->base_unit.delete_cb = draw_delete;
lv_vg_lite_image_dsc_init(unit); lv_vg_lite_image_dsc_init(unit);
lv_vg_lite_grad_init(unit, LV_VG_LITE_LINEAER_GRAD_CACHE_CNT, LV_VG_LITE_RADIAL_GRAD_CACHE_CNT); lv_vg_lite_grad_init(unit);
lv_vg_lite_path_init(unit); lv_vg_lite_path_init(unit);
lv_vg_lite_decoder_init(); lv_vg_lite_decoder_init();
} }

View File

@@ -40,15 +40,9 @@ struct _lv_vg_lite_pending_t;
struct _lv_draw_vg_lite_unit_t { struct _lv_draw_vg_lite_unit_t {
lv_draw_unit_t base_unit; lv_draw_unit_t base_unit;
lv_draw_task_t * task_act; lv_draw_task_t * task_act;
struct _lv_vg_lite_pending_t * image_dsc_pending; struct _lv_vg_lite_pending_t * image_dsc_pending;
lv_cache_t * grad_cache;
lv_cache_t * linear_grad_cache; struct _lv_vg_lite_pending_t * grad_pending;
struct _lv_vg_lite_pending_t * linear_grad_pending;
lv_cache_t * radial_grad_cache;
struct _lv_vg_lite_pending_t * radial_grad_pending;
uint16_t flush_count; uint16_t flush_count;
vg_lite_buffer_t target_buffer; vg_lite_buffer_t target_buffer;
vg_lite_matrix_t global_matrix; vg_lite_matrix_t global_matrix;

View File

@@ -36,6 +36,7 @@ static void lv_path_opa_to_vg(lv_vg_lite_path_t * dest, const lv_vector_draw_dsc
static void lv_stroke_to_vg(lv_vg_lite_path_t * dest, const lv_vector_stroke_dsc_t * dsc); static void lv_stroke_to_vg(lv_vg_lite_path_t * dest, const lv_vector_stroke_dsc_t * dsc);
static vg_lite_blend_t lv_blend_to_vg(lv_vector_blend_t blend); static vg_lite_blend_t lv_blend_to_vg(lv_vector_blend_t blend);
static vg_lite_fill_t lv_fill_to_vg(lv_vector_fill_t fill_rule); static vg_lite_fill_t lv_fill_to_vg(lv_vector_fill_t fill_rule);
static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t spread);
static vg_lite_cap_style_t lv_stroke_cap_to_vg(lv_vector_stroke_cap_t cap); static vg_lite_cap_style_t lv_stroke_cap_to_vg(lv_vector_stroke_cap_t cap);
static vg_lite_join_style_t lv_stroke_join_to_vg(lv_vector_stroke_join_t join); static vg_lite_join_style_t lv_stroke_join_to_vg(lv_vector_stroke_join_t join);
@@ -204,6 +205,8 @@ static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vec
case LV_VECTOR_DRAW_STYLE_GRADIENT: { case LV_VECTOR_DRAW_STYLE_GRADIENT: {
/* draw gradient */ /* draw gradient */
lv_vector_gradient_style_t style = dsc->fill_dsc.gradient.style; lv_vector_gradient_style_t style = dsc->fill_dsc.gradient.style;
vg_lite_gradient_spreadmode_t spreadmode = lv_spread_to_vg(dsc->fill_dsc.gradient.spread);
LV_UNUSED(spreadmode);
if(style == LV_VECTOR_GRADIENT_STYLE_LINEAR) { if(style == LV_VECTOR_GRADIENT_STYLE_LINEAR) {
vg_lite_matrix_t grad_matrix, fill_matrix; vg_lite_matrix_t grad_matrix, fill_matrix;
@@ -226,23 +229,12 @@ static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vec
blend); blend);
} }
else if(style == LV_VECTOR_GRADIENT_STYLE_RADIAL) { else if(style == LV_VECTOR_GRADIENT_STYLE_RADIAL) {
vg_lite_matrix_t grad_matrix; if(vg_lite_query_feature(gcFEATURE_BIT_VG_RADIAL_GRADIENT)) {
lv_matrix_to_vg(&grad_matrix, &dsc->fill_dsc.matrix); /* TODO: radial gradient */
}
/* add min_x, min_y to gradient center */ else {
lv_vector_gradient_t new_grad = dsc->fill_dsc.gradient; LV_LOG_WARN("radial gradient is not supported");
new_grad.cx += min_x; }
new_grad.cy += min_y;
lv_vg_lite_draw_radial_grad(
u,
&u->target_buffer,
vg_path,
&new_grad,
&grad_matrix,
&matrix,
fill,
blend);
} }
} }
break; break;
@@ -439,6 +431,20 @@ static vg_lite_fill_t lv_fill_to_vg(lv_vector_fill_t fill_rule)
} }
} }
static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t spread)
{
switch(spread) {
case LV_VECTOR_GRADIENT_SPREAD_PAD:
return VG_LITE_GRADIENT_SPREAD_PAD;
case LV_VECTOR_GRADIENT_SPREAD_REPEAT:
return VG_LITE_GRADIENT_SPREAD_REPEAT;
case LV_VECTOR_GRADIENT_SPREAD_REFLECT:
return VG_LITE_GRADIENT_SPREAD_REFLECT;
default:
return VG_LITE_GRADIENT_SPREAD_FILL;
}
}
static vg_lite_cap_style_t lv_stroke_cap_to_vg(lv_vector_stroke_cap_t cap) static vg_lite_cap_style_t lv_stroke_cap_to_vg(lv_vector_stroke_cap_t cap)
{ {
switch(cap) { switch(cap) {

View File

@@ -12,8 +12,6 @@
#if LV_USE_DRAW_VG_LITE #if LV_USE_DRAW_VG_LITE
#include "lv_vg_lite_utils.h" #include "lv_vg_lite_utils.h"
#include <stdlib.h>
#include <string.h>
/********************* /*********************
* DEFINES * DEFINES
@@ -65,6 +63,7 @@ void lv_vg_lite_decoder_init(void)
lv_image_decoder_set_info_cb(decoder, decoder_info); lv_image_decoder_set_info_cb(decoder, decoder_info);
lv_image_decoder_set_open_cb(decoder, decoder_open); lv_image_decoder_set_open_cb(decoder, decoder_open);
lv_image_decoder_set_close_cb(decoder, decoder_close); lv_image_decoder_set_close_cb(decoder, decoder_close);
lv_image_decoder_set_cache_free_cb(decoder, NULL); /*Use general cache free method*/
} }
void lv_vg_lite_decoder_deinit(void) void lv_vg_lite_decoder_deinit(void)

View File

@@ -13,9 +13,6 @@
#include "lv_draw_vg_lite_type.h" #include "lv_draw_vg_lite_type.h"
#include "lv_vg_lite_pending.h" #include "lv_vg_lite_pending.h"
#include "lv_vg_lite_math.h"
#include "../../misc/lv_types.h"
#include "../../stdlib/lv_string.h"
/********************* /*********************
* DEFINES * DEFINES
@@ -26,47 +23,22 @@
**********************/ **********************/
typedef struct { typedef struct {
lv_grad_dsc_t lv_grad;
vg_lite_linear_gradient_t vg_grad; vg_lite_linear_gradient_t vg_grad;
} linear_grad_item_t; lv_grad_dsc_t lv_grad;
} grad_item_t;
#if LV_USE_VECTOR_GRAPHIC
typedef struct {
lv_vector_gradient_t lv_grad;
vg_lite_radial_gradient_t vg_grad;
} radial_grad_item_t;
#endif /* LV_USE_VECTOR_GRAPHIC */
/********************** /**********************
* STATIC PROTOTYPES * STATIC PROTOTYPES
**********************/ **********************/
static vg_lite_linear_gradient_t * lv_vg_lite_linear_grad_get(struct _lv_draw_vg_lite_unit_t * u,
const lv_grad_dsc_t * grad);
static bool grad_create_cb(grad_item_t * item, void * user_data);
static void grad_free_cb(grad_item_t * item, void * user_data);
static lv_cache_compare_res_t grad_compare_cb(const grad_item_t * lhs, const grad_item_t * rhs);
static void grad_cache_release_cb(void * entry, void * user_data); static void grad_cache_release_cb(void * entry, void * user_data);
/* Linear gradient */
static vg_lite_linear_gradient_t * linear_grad_get(struct _lv_draw_vg_lite_unit_t * u,
const lv_grad_dsc_t * grad);
static bool linear_grad_create_cb(linear_grad_item_t * item, void * user_data);
static void linear_grad_free_cb(linear_grad_item_t * item, void * user_data);
static lv_cache_compare_res_t linear_grad_compare_cb(const linear_grad_item_t * lhs, const linear_grad_item_t * rhs);
#if LV_USE_VECTOR_GRAPHIC
/* Radial gradient */
static vg_lite_radial_gradient_t * radial_grad_get(struct _lv_draw_vg_lite_unit_t * u,
const lv_vector_gradient_t * grad);
static bool radial_grad_create_cb(radial_grad_item_t * item, void * user_data);
static void radial_grad_free_cb(radial_grad_item_t * item, void * user_data);
static lv_cache_compare_res_t radial_grad_compare_cb(const radial_grad_item_t * lhs, const radial_grad_item_t * rhs);
static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t spread);
#endif /* LV_USE_VECTOR_GRAPHIC */
/********************** /**********************
* STATIC VARIABLES * STATIC VARIABLES
**********************/ **********************/
@@ -79,63 +51,28 @@ static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t
* GLOBAL FUNCTIONS * GLOBAL FUNCTIONS
**********************/ **********************/
void lv_vg_lite_grad_init( void lv_vg_lite_grad_init(struct _lv_draw_vg_lite_unit_t * u)
struct _lv_draw_vg_lite_unit_t * u,
uint32_t linear_grad_cache_cnt,
uint32_t radial_grad_cache_cnt)
{ {
LV_ASSERT_NULL(u); LV_ASSERT_NULL(u);
LV_UNUSED(radial_grad_cache_cnt);
/* Create the cache for linear gradients */ lv_cache_ops_t ops = {
{ .compare_cb = (lv_cache_compare_cb_t)grad_compare_cb,
lv_cache_ops_t ops = { .create_cb = (lv_cache_create_cb_t)grad_create_cb,
.compare_cb = (lv_cache_compare_cb_t)linear_grad_compare_cb, .free_cb = (lv_cache_free_cb_t)grad_free_cb,
.create_cb = (lv_cache_create_cb_t)linear_grad_create_cb, };
.free_cb = (lv_cache_free_cb_t)linear_grad_free_cb,
};
u->linear_grad_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(linear_grad_item_t), u->grad_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(grad_item_t), LV_VG_LITE_GRAD_CACHE_SIZE, ops);
linear_grad_cache_cnt, LV_ASSERT_NULL(u->grad_cache);
ops);
u->linear_grad_pending = lv_vg_lite_pending_create(sizeof(lv_cache_entry_t *), 4);
lv_vg_lite_pending_set_free_cb(u->linear_grad_pending, grad_cache_release_cb, u->linear_grad_cache);
}
#if LV_USE_VECTOR_GRAPHIC u->grad_pending = lv_vg_lite_pending_create(sizeof(lv_cache_entry_t *), 4);
lv_vg_lite_pending_set_free_cb(u->grad_pending, grad_cache_release_cb, u->grad_cache);
/* Create the cache for radial gradients */
if(vg_lite_query_feature(gcFEATURE_BIT_VG_RADIAL_GRADIENT)) {
lv_cache_ops_t ops = {
.compare_cb = (lv_cache_compare_cb_t)radial_grad_compare_cb,
.create_cb = (lv_cache_create_cb_t)radial_grad_create_cb,
.free_cb = (lv_cache_free_cb_t)radial_grad_free_cb,
};
u->radial_grad_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(radial_grad_item_t),
radial_grad_cache_cnt,
ops);
u->radial_grad_pending = lv_vg_lite_pending_create(sizeof(lv_cache_entry_t *), 4);
lv_vg_lite_pending_set_free_cb(u->radial_grad_pending, grad_cache_release_cb, u->radial_grad_cache);
}
#endif /* LV_USE_VECTOR_GRAPHIC */
} }
void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u) void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u)
{ {
LV_ASSERT_NULL(u); LV_ASSERT_NULL(u);
lv_vg_lite_pending_destroy(u->linear_grad_pending); lv_vg_lite_pending_destroy(u->grad_pending);
u->linear_grad_pending = NULL; lv_cache_destroy(u->grad_cache, NULL);
lv_cache_destroy(u->linear_grad_cache, NULL);
u->linear_grad_cache = NULL;
if(u->radial_grad_pending) {
lv_vg_lite_pending_destroy(u->radial_grad_pending);
u->radial_grad_pending = NULL;
lv_cache_destroy(u->radial_grad_cache, NULL);
u->radial_grad_cache = NULL;
}
} }
void lv_vg_lite_grad_area_to_matrix(vg_lite_matrix_t * grad_matrix, const lv_area_t * area, lv_grad_dir_t dir) void lv_vg_lite_grad_area_to_matrix(vg_lite_matrix_t * grad_matrix, const lv_area_t * area, lv_grad_dir_t dir)
@@ -180,20 +117,20 @@ void lv_vg_lite_draw_linear_grad(
LV_PROFILER_BEGIN; LV_PROFILER_BEGIN;
vg_lite_linear_gradient_t * linear_grad = linear_grad_get(u, grad); vg_lite_linear_gradient_t * gradient = lv_vg_lite_linear_grad_get(u, grad);
LV_ASSERT_NULL(linear_grad); LV_ASSERT_NULL(gradient);
if(!linear_grad) { if(!gradient) {
LV_LOG_ERROR("Failed to get linear gradient"); LV_LOG_ERROR("Failed to get linear gradient");
LV_PROFILER_END; LV_PROFILER_END;
return; return;
} }
vg_lite_matrix_t * grad_mat_p = vg_lite_get_grad_matrix(linear_grad); vg_lite_matrix_t * grad_mat_p = vg_lite_get_grad_matrix(gradient);
LV_ASSERT_NULL(grad_mat_p); LV_ASSERT_NULL(grad_mat_p);
*grad_mat_p = *grad_matrix; *grad_mat_p = *grad_matrix;
LV_VG_LITE_ASSERT_DEST_BUFFER(buffer); LV_VG_LITE_ASSERT_DEST_BUFFER(buffer);
LV_VG_LITE_ASSERT_SRC_BUFFER(&linear_grad->image); LV_VG_LITE_ASSERT_SRC_BUFFER(&gradient->image);
LV_VG_LITE_ASSERT_PATH(path); LV_VG_LITE_ASSERT_PATH(path);
LV_VG_LITE_ASSERT_MATRIX(grad_mat_p); LV_VG_LITE_ASSERT_MATRIX(grad_mat_p);
LV_VG_LITE_ASSERT_MATRIX(matrix); LV_VG_LITE_ASSERT_MATRIX(matrix);
@@ -204,101 +141,37 @@ void lv_vg_lite_draw_linear_grad(
path, path,
fill, fill,
(vg_lite_matrix_t *)matrix, (vg_lite_matrix_t *)matrix,
linear_grad, gradient,
blend)); blend));
LV_PROFILER_END_TAG("vg_lite_draw_grad"); LV_PROFILER_END_TAG("vg_lite_draw_grad");
LV_PROFILER_END; LV_PROFILER_END;
} }
#if LV_USE_VECTOR_GRAPHIC
void lv_vg_lite_draw_radial_grad(
struct _lv_draw_vg_lite_unit_t * u,
vg_lite_buffer_t * buffer,
vg_lite_path_t * path,
const lv_vector_gradient_t * grad,
const vg_lite_matrix_t * grad_matrix,
const vg_lite_matrix_t * matrix,
vg_lite_fill_t fill,
vg_lite_blend_t blend)
{
LV_ASSERT_NULL(u);
LV_ASSERT_NULL(buffer);
LV_ASSERT_NULL(path);
LV_ASSERT_NULL(grad);
LV_ASSERT_NULL(grad_matrix);
LV_ASSERT_NULL(matrix);
if(!vg_lite_query_feature(gcFEATURE_BIT_VG_RADIAL_GRADIENT)) {
LV_LOG_INFO("radial gradient is not supported");
return;
}
if(grad->spread == LV_VECTOR_GRADIENT_SPREAD_REPEAT || grad->spread == LV_VECTOR_GRADIENT_SPREAD_REFLECT) {
if(!vg_lite_query_feature(gcFEATURE_BIT_VG_IM_REPEAT_REFLECT)) {
LV_LOG_INFO("repeat/reflect spread(%d) is not supported", (int)grad->spread);
return;
}
}
LV_PROFILER_BEGIN;
vg_lite_radial_gradient_t * radial_grad = radial_grad_get(u, grad);
vg_lite_matrix_t * grad_mat_p = vg_lite_get_radial_grad_matrix(radial_grad);
LV_ASSERT_NULL(grad_mat_p);
*grad_mat_p = *grad_matrix;
LV_VG_LITE_ASSERT_DEST_BUFFER(buffer);
LV_VG_LITE_ASSERT_SRC_BUFFER(&radial_grad->image);
LV_VG_LITE_ASSERT_PATH(path);
LV_VG_LITE_ASSERT_MATRIX(grad_mat_p);
LV_VG_LITE_ASSERT_MATRIX(matrix);
LV_PROFILER_BEGIN_TAG("vg_lite_draw_radial_grad");
LV_VG_LITE_CHECK_ERROR(
vg_lite_draw_radial_grad(
buffer,
path,
fill,
(vg_lite_matrix_t *)matrix,
radial_grad,
0,
blend,
VG_LITE_FILTER_LINEAR));
LV_PROFILER_END_TAG("vg_lite_draw_radial_grad");
LV_PROFILER_END;
}
#endif /* LV_USE_VECTOR_GRAPHIC */
/********************** /**********************
* STATIC FUNCTIONS * STATIC FUNCTIONS
**********************/ **********************/
static void * grad_get( static vg_lite_linear_gradient_t * lv_vg_lite_linear_grad_get(struct _lv_draw_vg_lite_unit_t * u,
struct _lv_draw_vg_lite_unit_t * u, const lv_grad_dsc_t * grad)
lv_cache_t * cache,
lv_vg_lite_pending_t * pending,
const void * key)
{ {
LV_ASSERT_NULL(u); LV_ASSERT_NULL(u);
LV_ASSERT_NULL(cache); LV_ASSERT_NULL(grad);
LV_ASSERT_NULL(pending);
LV_ASSERT_NULL(key);
lv_cache_entry_t * cache_node_entry = lv_cache_acquire(cache, key, NULL); grad_item_t search_key;
lv_memzero(&search_key, sizeof(grad_item_t));
search_key.lv_grad = *grad;
lv_cache_entry_t * cache_node_entry = lv_cache_acquire(u->grad_cache, &search_key, NULL);
if(cache_node_entry == NULL) { if(cache_node_entry == NULL) {
/* check if the cache is full */ /* check if the cache is full */
size_t free_size = lv_cache_get_free_size(cache, NULL); size_t free_size = lv_cache_get_free_size(u->grad_cache, NULL);
if(free_size == 0) { if(free_size == 0) {
LV_LOG_INFO("grad cache is full, release all pending cache entries"); LV_LOG_INFO("grad cache is full, release all pending cache entries");
lv_vg_lite_finish(u); lv_vg_lite_finish(u);
} }
cache_node_entry = lv_cache_acquire_or_create(cache, key, NULL); cache_node_entry = lv_cache_acquire_or_create(u->grad_cache, &search_key, NULL);
if(cache_node_entry == NULL) { if(cache_node_entry == NULL) {
LV_LOG_ERROR("grad cache creating failed"); LV_LOG_ERROR("grad cache creating failed");
return NULL; return NULL;
@@ -306,36 +179,13 @@ static void * grad_get(
} }
/* Add the new entry to the pending list */ /* Add the new entry to the pending list */
lv_vg_lite_pending_add(pending, &cache_node_entry); lv_vg_lite_pending_add(u->grad_pending, &cache_node_entry);
return lv_cache_entry_get_data(cache_node_entry);
}
static void grad_cache_release_cb(void * entry, void * user_data)
{
lv_cache_entry_t ** entry_p = entry;
lv_cache_t * cache = user_data;
lv_cache_release(cache, *entry_p, NULL);
}
/* Linear gradient */
static vg_lite_linear_gradient_t * linear_grad_get(struct _lv_draw_vg_lite_unit_t * u,
const lv_grad_dsc_t * grad)
{
linear_grad_item_t search_key;
lv_memzero(&search_key, sizeof(search_key));
search_key.lv_grad = *grad;
linear_grad_item_t * item = grad_get(u, u->linear_grad_cache, u->linear_grad_pending, &search_key);
if(!item) {
return NULL;
}
grad_item_t * item = lv_cache_entry_get_data(cache_node_entry);
return &item->vg_grad; return &item->vg_grad;
} }
static bool linear_grad_create_cb(linear_grad_item_t * item, void * user_data) static bool grad_create_cb(grad_item_t * item, void * user_data)
{ {
LV_UNUSED(user_data); LV_UNUSED(user_data);
@@ -374,20 +224,20 @@ static bool linear_grad_create_cb(linear_grad_item_t * item, void * user_data)
return true; return true;
} }
static void linear_grad_free_cb(linear_grad_item_t * item, void * user_data) static void grad_free_cb(grad_item_t * item, void * user_data)
{ {
LV_UNUSED(user_data); LV_UNUSED(user_data);
LV_VG_LITE_CHECK_ERROR(vg_lite_clear_grad(&item->vg_grad)); LV_VG_LITE_CHECK_ERROR(vg_lite_clear_grad(&item->vg_grad));
} }
static lv_cache_compare_res_t linear_grad_compare_cb(const linear_grad_item_t * lhs, const linear_grad_item_t * rhs) static lv_cache_compare_res_t grad_compare_cb(const grad_item_t * lhs, const grad_item_t * rhs)
{ {
if(lhs->lv_grad.stops_count != rhs->lv_grad.stops_count) { if(lhs->lv_grad.stops_count != rhs->lv_grad.stops_count) {
return lhs->lv_grad.stops_count > rhs->lv_grad.stops_count ? 1 : -1; return lhs->lv_grad.stops_count > rhs->lv_grad.stops_count ? 1 : -1;
} }
int cmp_res = lv_memcmp(lhs->lv_grad.stops, rhs->lv_grad.stops, int cmp_res = memcmp(lhs->lv_grad.stops, rhs->lv_grad.stops,
sizeof(lv_gradient_stop_t) * lhs->lv_grad.stops_count); sizeof(lv_gradient_stop_t) * lhs->lv_grad.stops_count);
if(cmp_res != 0) { if(cmp_res != 0) {
return cmp_res > 0 ? 1 : -1; return cmp_res > 0 ? 1 : -1;
} }
@@ -395,139 +245,11 @@ static lv_cache_compare_res_t linear_grad_compare_cb(const linear_grad_item_t *
return 0; return 0;
} }
#if LV_USE_VECTOR_GRAPHIC static void grad_cache_release_cb(void * entry, void * user_data)
/* Radial gradient */
static vg_lite_radial_gradient_t * radial_grad_get(struct _lv_draw_vg_lite_unit_t * u,
const lv_vector_gradient_t * grad)
{ {
radial_grad_item_t search_key; lv_cache_entry_t ** entry_p = entry;
lv_memzero(&search_key, sizeof(search_key)); lv_cache_t * cache = user_data;
search_key.lv_grad = *grad; lv_cache_release(cache, *entry_p, NULL);
radial_grad_item_t * item = grad_get(u, u->radial_grad_cache, u->radial_grad_pending, &search_key);
if(!item) {
return NULL;
}
return &item->vg_grad;
} }
static bool radial_grad_create_cb(radial_grad_item_t * item, void * user_data)
{
LV_UNUSED(user_data);
LV_PROFILER_BEGIN;
lv_vector_gradient_t * grad = &item->lv_grad;
uint8_t stops_count = grad->grad.stops_count;
vg_lite_color_ramp_t * color_ramp = lv_malloc(sizeof(vg_lite_color_ramp_t) * stops_count);
LV_ASSERT_MALLOC(color_ramp);
if(!color_ramp) {
LV_LOG_ERROR("malloc failed for color_ramp");
return false;
}
for(uint8_t i = 0; i < stops_count; i++) {
color_ramp[i].stop = grad->grad.stops[i].frac / 255.0f;
lv_color_t c = grad->grad.stops[i].color;
color_ramp[i].red = c.red / 255.0f;
color_ramp[i].green = c.green / 255.0f;
color_ramp[i].blue = c.blue / 255.0f;
color_ramp[i].alpha = grad->grad.stops[i].opa / 255.0f;
}
const vg_lite_radial_gradient_parameter_t grad_param = {
.cx = grad->cx,
.cy = grad->cy,
.r = grad->cr,
.fx = grad->cx,
.fy = grad->cy,
};
vg_lite_radial_gradient_t radial_grad;
lv_memzero(&radial_grad, sizeof(radial_grad));
LV_PROFILER_BEGIN_TAG("vg_lite_set_radial_grad");
LV_VG_LITE_CHECK_ERROR(
vg_lite_set_radial_grad(
&radial_grad,
stops_count,
color_ramp,
grad_param,
lv_spread_to_vg(grad->spread),
1));
LV_PROFILER_END_TAG("vg_lite_set_radial_grad");
LV_PROFILER_BEGIN_TAG("vg_lite_update_radial_grad");
vg_lite_error_t err = vg_lite_update_radial_grad(&radial_grad);
LV_PROFILER_END_TAG("vg_lite_update_radial_grad");
if(!err) {
item->vg_grad = radial_grad;
}
else {
LV_LOG_ERROR("update radial grad error(%d): %s", (int)err, lv_vg_lite_error_string(err));
}
lv_free(color_ramp);
LV_PROFILER_END;
return err == VG_LITE_SUCCESS;
}
static void radial_grad_free_cb(radial_grad_item_t * item, void * user_data)
{
LV_UNUSED(user_data);
LV_VG_LITE_CHECK_ERROR(vg_lite_clear_radial_grad(&item->vg_grad));
}
static lv_cache_compare_res_t radial_grad_compare_cb(const radial_grad_item_t * lhs, const radial_grad_item_t * rhs)
{
if(!math_equal(lhs->lv_grad.cx, rhs->lv_grad.cx)) {
return lhs->lv_grad.cx > rhs->lv_grad.cx ? 1 : -1;
}
if(!math_equal(lhs->lv_grad.cy, rhs->lv_grad.cy)) {
return lhs->lv_grad.cy > rhs->lv_grad.cy ? 1 : -1;
}
if(!math_equal(lhs->lv_grad.cr, rhs->lv_grad.cr)) {
return lhs->lv_grad.cr > rhs->lv_grad.cr ? 1 : -1;
}
if(lhs->lv_grad.spread != rhs->lv_grad.spread) {
return lhs->lv_grad.spread > rhs->lv_grad.spread ? 1 : -1;
}
if(lhs->lv_grad.grad.stops_count != rhs->lv_grad.grad.stops_count) {
return lhs->lv_grad.grad.stops_count > rhs->lv_grad.grad.stops_count ? 1 : -1;
}
int cmp_res = lv_memcmp(lhs->lv_grad.grad.stops, rhs->lv_grad.grad.stops,
sizeof(lv_gradient_stop_t) * lhs->lv_grad.grad.stops_count);
if(cmp_res != 0) {
return cmp_res > 0 ? 1 : -1;
}
return 0;
}
static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t spread)
{
switch(spread) {
case LV_VECTOR_GRADIENT_SPREAD_PAD:
return VG_LITE_GRADIENT_SPREAD_PAD;
case LV_VECTOR_GRADIENT_SPREAD_REPEAT:
return VG_LITE_GRADIENT_SPREAD_REPEAT;
case LV_VECTOR_GRADIENT_SPREAD_REFLECT:
return VG_LITE_GRADIENT_SPREAD_REFLECT;
default:
return VG_LITE_GRADIENT_SPREAD_FILL;
}
}
#endif /* LV_USE_VECTOR_GRAPHIC */
#endif /*LV_USE_DRAW_VG_LITE*/ #endif /*LV_USE_DRAW_VG_LITE*/

View File

@@ -32,10 +32,7 @@ extern "C" {
* GLOBAL PROTOTYPES * GLOBAL PROTOTYPES
**********************/ **********************/
void lv_vg_lite_grad_init( void lv_vg_lite_grad_init(struct _lv_draw_vg_lite_unit_t * u);
struct _lv_draw_vg_lite_unit_t * u,
uint32_t linear_grad_cache_cnt,
uint32_t radial_grad_cache_cnt);
void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u); void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u);
@@ -51,19 +48,7 @@ void lv_vg_lite_draw_linear_grad(
vg_lite_fill_t fill, vg_lite_fill_t fill,
vg_lite_blend_t blend); vg_lite_blend_t blend);
#if LV_USE_VECTOR_GRAPHIC void lv_vg_lite_linear_grad_release_all(struct _lv_draw_vg_lite_unit_t * u);
void lv_vg_lite_draw_radial_grad(
struct _lv_draw_vg_lite_unit_t * u,
vg_lite_buffer_t * buffer,
vg_lite_path_t * path,
const lv_vector_gradient_t * grad,
const vg_lite_matrix_t * grad_matrix,
const vg_lite_matrix_t * matrix,
vg_lite_fill_t fill,
vg_lite_blend_t blend);
#endif /* LV_USE_VECTOR_GRAPHIC */
/********************** /**********************
* MACROS * MACROS

View File

@@ -1064,11 +1064,7 @@ void lv_vg_lite_finish(struct _lv_draw_vg_lite_unit_t * u)
LV_VG_LITE_CHECK_ERROR(vg_lite_finish()); LV_VG_LITE_CHECK_ERROR(vg_lite_finish());
/* Clear all gradient caches reference */ /* Clear all gradient caches reference */
lv_vg_lite_pending_remove_all(u->linear_grad_pending); lv_vg_lite_pending_remove_all(u->grad_pending);
if(u->radial_grad_pending) {
lv_vg_lite_pending_remove_all(u->radial_grad_pending);
}
/* Clear image decoder dsc reference */ /* Clear image decoder dsc reference */
lv_vg_lite_pending_remove_all(u->image_dsc_pending); lv_vg_lite_pending_remove_all(u->image_dsc_pending);

View File

@@ -15,7 +15,6 @@
#include <stdint.h> #include <stdint.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <unistd.h> #include <unistd.h>
#include <string.h>
#include <xf86drm.h> #include <xf86drm.h>
#include <xf86drmMode.h> #include <xf86drmMode.h>

View File

@@ -26,9 +26,6 @@
#include <linux/fb.h> #include <linux/fb.h>
#endif /* LV_LINUX_FBDEV_BSD */ #endif /* LV_LINUX_FBDEV_BSD */
#include "../../../display/lv_display_private.h"
#include "../../../draw/sw/lv_draw_sw.h"
/********************* /*********************
* DEFINES * DEFINES
*********************/ *********************/
@@ -60,8 +57,6 @@ typedef struct {
struct fb_fix_screeninfo finfo; struct fb_fix_screeninfo finfo;
#endif /* LV_LINUX_FBDEV_BSD */ #endif /* LV_LINUX_FBDEV_BSD */
char * fbp; char * fbp;
uint8_t * rotated_buf;
size_t rotated_buf_size;
long int screensize; long int screensize;
int fbfd; int fbfd;
bool force_refresh; bool force_refresh;
@@ -258,60 +253,15 @@ static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * colo
{ {
lv_linux_fb_t * dsc = lv_display_get_driver_data(disp); lv_linux_fb_t * dsc = lv_display_get_driver_data(disp);
if(dsc->fbp == NULL) { if(dsc->fbp == NULL ||
area->x2 < 0 || area->y2 < 0 ||
area->x1 > (int32_t)dsc->vinfo.xres - 1 || area->y1 > (int32_t)dsc->vinfo.yres - 1) {
lv_display_flush_ready(disp); lv_display_flush_ready(disp);
return; return;
} }
int32_t w = lv_area_get_width(area); int32_t w = lv_area_get_width(area);
int32_t h = lv_area_get_height(area); uint32_t px_size = lv_color_format_get_size(lv_display_get_color_format(disp));
lv_color_format_t cf = lv_display_get_color_format(disp);
uint32_t px_size = lv_color_format_get_size(cf);
lv_display_rotation_t rotation = lv_display_get_rotation(disp);
/* Not all framebuffer kernel drivers support hardware rotation, so we need to handle it in software here */
if(rotation != LV_DISPLAY_ROTATION_0 && LV_LINUX_FBDEV_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) {
/* (Re)allocate temporary buffer if needed */
size_t buf_size = w * h * px_size;
if(!dsc->rotated_buf || dsc->rotated_buf_size != buf_size) {
dsc->rotated_buf = realloc(dsc->rotated_buf, buf_size);
dsc->rotated_buf_size = buf_size;
}
/* Rotate the pixel buffer */
uint32_t w_stride = lv_draw_buf_width_to_stride(w, cf);
uint32_t h_stride = lv_draw_buf_width_to_stride(h, cf);
switch(rotation) {
case LV_DISPLAY_ROTATION_0:
break;
case LV_DISPLAY_ROTATION_90:
lv_draw_sw_rotate(color_p, dsc->rotated_buf, w, h, w_stride, h_stride, rotation, cf);
break;
case LV_DISPLAY_ROTATION_180:
lv_draw_sw_rotate(color_p, dsc->rotated_buf, w, h, w_stride, w_stride, rotation, cf);
break;
case LV_DISPLAY_ROTATION_270:
lv_draw_sw_rotate(color_p, dsc->rotated_buf, w, h, w_stride, h_stride, rotation, cf);
break;
}
color_p = dsc->rotated_buf;
/* Rotate the area */
lv_display_rotate_area(disp, (lv_area_t *)area);
if(rotation != LV_DISPLAY_ROTATION_180) {
w = lv_area_get_width(area);
h = lv_area_get_height(area);
}
}
/* Ensure that we're within the framebuffer's bounds */
if(area->x2 < 0 || area->y2 < 0 || area->x1 > (int32_t)dsc->vinfo.xres - 1 || area->y1 > (int32_t)dsc->vinfo.yres - 1) {
lv_display_flush_ready(disp);
return;
}
uint32_t color_pos = (area->x1 + dsc->vinfo.xoffset) * px_size + area->y1 * dsc->finfo.line_length; uint32_t color_pos = (area->x1 + dsc->vinfo.xoffset) * px_size + area->y1 * dsc->finfo.line_length;
uint32_t fb_pos = color_pos + dsc->vinfo.yoffset * dsc->finfo.line_length; uint32_t fb_pos = color_pos + dsc->vinfo.yoffset * dsc->finfo.line_length;
@@ -325,7 +275,6 @@ static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * colo
} }
} }
else { else {
w = lv_area_get_width(area);
for(y = area->y1; y <= area->y2; y++) { for(y = area->y1; y <= area->y2; y++) {
lv_memcpy(&fbp[fb_pos], color_p, w * px_size); lv_memcpy(&fbp[fb_pos], color_p, w * px_size);
fb_pos += dsc->finfo.line_length; fb_pos += dsc->finfo.line_length;

View File

@@ -22,7 +22,6 @@
#include <dirent.h> #include <dirent.h>
#include <libinput.h> #include <libinput.h>
#include <pthread.h> #include <pthread.h>
#include <string.h>
#if LV_LIBINPUT_BSD #if LV_LIBINPUT_BSD
#include <dev/evdev/input.h> #include <dev/evdev/input.h>

View File

@@ -12,7 +12,6 @@
#include "../../core/lv_refr.h" #include "../../core/lv_refr.h"
#include "../../stdlib/lv_string.h" #include "../../stdlib/lv_string.h"
#include "../../core/lv_global.h" #include "../../core/lv_global.h"
#include "../../display/lv_display_private.h"
#include "../../lv_init.h" #include "../../lv_init.h"
#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/ #define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/
@@ -39,8 +38,6 @@ typedef struct {
uint8_t * fb_act; uint8_t * fb_act;
uint8_t * buf1; uint8_t * buf1;
uint8_t * buf2; uint8_t * buf2;
uint8_t * rotated_buf;
size_t rotated_buf_size;
#endif #endif
uint8_t zoom; uint8_t zoom;
uint8_t ignore_size_chg; uint8_t ignore_size_chg;
@@ -128,17 +125,17 @@ lv_display_t * lv_sdl_window_create(int32_t hor_res, int32_t ver_res)
} }
/*LV_DISPLAY_RENDER_MODE_DIRECT or FULL */ /*LV_DISPLAY_RENDER_MODE_DIRECT or FULL */
else { else {
uint32_t stride = lv_draw_buf_width_to_stride(disp->hor_res, uint32_t stride = lv_draw_buf_width_to_stride(lv_display_get_horizontal_resolution(disp),
lv_display_get_color_format(disp)); lv_display_get_color_format(disp));
lv_display_set_buffers(disp, dsc->fb1, dsc->fb2, stride * disp->ver_res, lv_display_set_buffers(disp, dsc->fb1, dsc->fb2, stride * lv_display_get_vertical_resolution(disp),
LV_SDL_RENDER_MODE); LV_SDL_RENDER_MODE);
} }
#else /*/*LV_USE_DRAW_SDL == 1*/ #else /*/*LV_USE_DRAW_SDL == 1*/
uint32_t stride = lv_draw_buf_width_to_stride(disp->hor_res, uint32_t stride = lv_draw_buf_width_to_stride(lv_display_get_horizontal_resolution(disp),
lv_display_get_color_format(disp)); lv_display_get_color_format(disp));
/*It will render directly to default Texture, so the buffer is not used, so just set something*/ /*It will render directly to default Texture, so the buffer is not used, so just set something*/
static uint8_t dummy_buf[1]; static uint8_t dummy_buf[1];
lv_display_set_buffers(disp, dummy_buf, NULL, stride * disp->ver_res, lv_display_set_buffers(disp, dummy_buf, NULL, stride * lv_display_get_vertical_resolution(disp),
LV_SDL_RENDER_MODE); LV_SDL_RENDER_MODE);
#endif /*LV_USE_DRAW_SDL == 0*/ #endif /*LV_USE_DRAW_SDL == 0*/
lv_display_add_event_cb(disp, res_chg_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); lv_display_add_event_cb(disp, res_chg_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL);
@@ -211,60 +208,21 @@ static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_m
{ {
#if LV_USE_DRAW_SDL == 0 #if LV_USE_DRAW_SDL == 0
lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); lv_sdl_window_t * dsc = lv_display_get_driver_data(disp);
lv_color_format_t cf = lv_display_get_color_format(disp);
if(LV_SDL_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { if(LV_SDL_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) {
lv_display_rotation_t rotation = lv_display_get_rotation(disp); int32_t y;
uint32_t px_size = lv_color_format_get_size(cf);
if(rotation != LV_DISPLAY_ROTATION_0) {
int32_t w = lv_area_get_width(area);
int32_t h = lv_area_get_height(area);
uint32_t w_stride = lv_draw_buf_width_to_stride(w, cf);
uint32_t h_stride = lv_draw_buf_width_to_stride(h, cf);
size_t buf_size = w * h * px_size;
/* (Re)allocate temporary buffer if needed */
if(!dsc->rotated_buf || dsc->rotated_buf_size != buf_size) {
dsc->rotated_buf = realloc(dsc->rotated_buf, buf_size);
dsc->rotated_buf_size = buf_size;
}
switch(rotation) {
case LV_DISPLAY_ROTATION_0:
break;
case LV_DISPLAY_ROTATION_90:
lv_draw_sw_rotate(px_map, dsc->rotated_buf, w, h, w_stride, h_stride, rotation, cf);
break;
case LV_DISPLAY_ROTATION_180:
lv_draw_sw_rotate(px_map, dsc->rotated_buf, w, h, w_stride, w_stride, rotation, cf);
break;
case LV_DISPLAY_ROTATION_270:
lv_draw_sw_rotate(px_map, dsc->rotated_buf, w, h, w_stride, h_stride, rotation, cf);
break;
}
px_map = dsc->rotated_buf;
lv_display_rotate_area(disp, (lv_area_t *)area);
}
uint32_t px_map_stride = lv_draw_buf_width_to_stride(lv_area_get_width(area), cf);
uint32_t px_map_line_bytes = lv_area_get_width(area) * px_size;
uint8_t * fb_tmp = dsc->fb_act; uint8_t * fb_tmp = dsc->fb_act;
uint32_t fb_stride = disp->hor_res * px_size; uint32_t px_size = lv_color_format_get_size(lv_display_get_color_format(disp));
uint32_t px_map_stride = lv_draw_buf_width_to_stride(lv_area_get_width(area), lv_display_get_color_format(disp));
uint32_t data_size = lv_area_get_width(area) * px_size;
int32_t fb_stride = lv_display_get_horizontal_resolution(disp) * px_size;
fb_tmp += area->y1 * fb_stride; fb_tmp += area->y1 * fb_stride;
fb_tmp += area->x1 * px_size; fb_tmp += area->x1 * px_size;
int32_t y;
for(y = area->y1; y <= area->y2; y++) { for(y = area->y1; y <= area->y2; y++) {
lv_memcpy(fb_tmp, px_map, px_map_line_bytes); lv_memcpy(fb_tmp, px_map, data_size);
px_map += px_map_stride; px_map += px_map_stride;
fb_tmp += fb_stride; fb_tmp += fb_stride;
} }
} }
/* TYPICALLY YOU DO NOT NEED THIS /* TYPICALLY YOU DO NOT NEED THIS
* If it was the last part to refresh update the texture of the window.*/ * If it was the last part to refresh update the texture of the window.*/
if(lv_display_flush_is_last(disp)) { if(lv_display_flush_is_last(disp)) {
@@ -346,8 +304,8 @@ static void window_create(lv_display_t * disp)
flag |= SDL_WINDOW_FULLSCREEN; flag |= SDL_WINDOW_FULLSCREEN;
#endif #endif
int32_t hor_res = disp->hor_res; int32_t hor_res = lv_display_get_horizontal_resolution(disp);
int32_t ver_res = disp->ver_res; int32_t ver_res = lv_display_get_vertical_resolution(disp);
dsc->window = SDL_CreateWindow("LVGL Simulator", dsc->window = SDL_CreateWindow("LVGL Simulator",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
hor_res * dsc->zoom, ver_res * dsc->zoom, flag); /*last param. SDL_WINDOW_BORDERLESS to hide borders*/ hor_res * dsc->zoom, ver_res * dsc->zoom, flag); /*last param. SDL_WINDOW_BORDERLESS to hide borders*/
@@ -373,7 +331,7 @@ static void window_update(lv_display_t * disp)
{ {
lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); lv_sdl_window_t * dsc = lv_display_get_driver_data(disp);
#if LV_USE_DRAW_SDL == 0 #if LV_USE_DRAW_SDL == 0
int32_t hor_res = disp->hor_res; int32_t hor_res = lv_display_get_horizontal_resolution(disp);
uint32_t stride = lv_draw_buf_width_to_stride(hor_res, lv_display_get_color_format(disp)); uint32_t stride = lv_draw_buf_width_to_stride(hor_res, lv_display_get_color_format(disp));
SDL_UpdateTexture(dsc->texture, NULL, dsc->fb_act, stride); SDL_UpdateTexture(dsc->texture, NULL, dsc->fb_act, stride);
@@ -388,11 +346,13 @@ static void window_update(lv_display_t * disp)
#if LV_USE_DRAW_SDL == 0 #if LV_USE_DRAW_SDL == 0
static void texture_resize(lv_display_t * disp) static void texture_resize(lv_display_t * disp)
{ {
uint32_t stride = lv_draw_buf_width_to_stride(disp->hor_res, lv_display_get_color_format(disp)); int32_t hor_res = lv_display_get_horizontal_resolution(disp);
int32_t ver_res = lv_display_get_vertical_resolution(disp);
uint32_t stride = lv_draw_buf_width_to_stride(hor_res, lv_display_get_color_format(disp));
lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); lv_sdl_window_t * dsc = lv_display_get_driver_data(disp);
dsc->fb1 = realloc(dsc->fb1, stride * disp->ver_res); dsc->fb1 = realloc(dsc->fb1, stride * ver_res);
lv_memzero(dsc->fb1, stride * disp->ver_res); memset(dsc->fb1, 0x00, stride * ver_res);
if(LV_SDL_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) { if(LV_SDL_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) {
dsc->fb_act = dsc->fb1; dsc->fb_act = dsc->fb1;
@@ -402,7 +362,7 @@ static void texture_resize(lv_display_t * disp)
dsc->fb2 = realloc(dsc->fb2, stride * ver_res); dsc->fb2 = realloc(dsc->fb2, stride * ver_res);
memset(dsc->fb2, 0x00, stride * ver_res); memset(dsc->fb2, 0x00, stride * ver_res);
#endif #endif
lv_display_set_buffers(disp, dsc->fb1, dsc->fb2, stride * disp->ver_res, LV_SDL_RENDER_MODE); lv_display_set_buffers(disp, dsc->fb1, dsc->fb2, stride * ver_res, LV_SDL_RENDER_MODE);
} }
if(dsc->texture) SDL_DestroyTexture(dsc->texture); if(dsc->texture) SDL_DestroyTexture(dsc->texture);
@@ -419,7 +379,7 @@ static void texture_resize(lv_display_t * disp)
// px_format = SDL_PIXELFORMAT_BGR24; // px_format = SDL_PIXELFORMAT_BGR24;
dsc->texture = SDL_CreateTexture(dsc->renderer, px_format, dsc->texture = SDL_CreateTexture(dsc->renderer, px_format,
SDL_TEXTUREACCESS_STATIC, disp->hor_res, disp->ver_res); SDL_TEXTUREACCESS_STATIC, hor_res, ver_res);
SDL_SetTextureBlendMode(dsc->texture, SDL_BLENDMODE_BLEND); SDL_SetTextureBlendMode(dsc->texture, SDL_BLENDMODE_BLEND);
} }
#endif #endif
@@ -428,9 +388,11 @@ static void res_chg_event_cb(lv_event_t * e)
{ {
lv_display_t * disp = lv_event_get_current_target(e); lv_display_t * disp = lv_event_get_current_target(e);
int32_t hor_res = lv_display_get_horizontal_resolution(disp);
int32_t ver_res = lv_display_get_vertical_resolution(disp);
lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); lv_sdl_window_t * dsc = lv_display_get_driver_data(disp);
if(dsc->ignore_size_chg == false) { if(dsc->ignore_size_chg == false) {
SDL_SetWindowSize(dsc->window, disp->hor_res * dsc->zoom, disp->ver_res * dsc->zoom); SDL_SetWindowSize(dsc->window, hor_res * dsc->zoom, ver_res * dsc->zoom);
} }
#if LV_USE_DRAW_SDL == 0 #if LV_USE_DRAW_SDL == 0

View File

@@ -6,10 +6,12 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdint.h>
#include <stdbool.h>
#include "../lvgl.h" #include "../lvgl.h"
#include "../misc/lv_fs.h" #include "../misc/lv_fs.h"
#include "../misc/lv_types.h"
#include "../stdlib/lv_string.h"
#include "lv_binfont_loader.h" #include "lv_binfont_loader.h"
/********************** /**********************
@@ -206,7 +208,7 @@ static int read_label(lv_fs_file_t * fp, int start, const char * label)
if(lv_fs_read(fp, &length, 4, NULL) != LV_FS_RES_OK if(lv_fs_read(fp, &length, 4, NULL) != LV_FS_RES_OK
|| lv_fs_read(fp, buf, 4, NULL) != LV_FS_RES_OK || lv_fs_read(fp, buf, 4, NULL) != LV_FS_RES_OK
|| lv_memcmp(label, buf, 4) != 0) { || memcmp(label, buf, 4) != 0) {
LV_LOG_WARN("Error reading '%s' label.", label); LV_LOG_WARN("Error reading '%s' label.", label);
return -1; return -1;
} }
@@ -296,7 +298,7 @@ static int32_t load_cmaps(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, u
lv_font_fmt_txt_cmap_t * cmaps = lv_font_fmt_txt_cmap_t * cmaps =
lv_malloc(cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t)); lv_malloc(cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t));
lv_memset(cmaps, 0, cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t)); memset(cmaps, 0, cmaps_subtables_count * sizeof(lv_font_fmt_txt_cmap_t));
font_dsc->cmaps = cmaps; font_dsc->cmaps = cmaps;
font_dsc->cmap_num = cmaps_subtables_count; font_dsc->cmap_num = cmaps_subtables_count;
@@ -321,7 +323,7 @@ static int32_t load_glyph(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc,
lv_font_fmt_txt_glyph_dsc_t * glyph_dsc = (lv_font_fmt_txt_glyph_dsc_t *) lv_font_fmt_txt_glyph_dsc_t * glyph_dsc = (lv_font_fmt_txt_glyph_dsc_t *)
lv_malloc(loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t)); lv_malloc(loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t));
lv_memset(glyph_dsc, 0, loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t)); memset(glyph_dsc, 0, loca_count * sizeof(lv_font_fmt_txt_glyph_dsc_t));
font_dsc->glyph_dsc = glyph_dsc; font_dsc->glyph_dsc = glyph_dsc;
@@ -460,7 +462,7 @@ static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font)
lv_font_fmt_txt_dsc_t * font_dsc = (lv_font_fmt_txt_dsc_t *) lv_font_fmt_txt_dsc_t * font_dsc = (lv_font_fmt_txt_dsc_t *)
lv_malloc(sizeof(lv_font_fmt_txt_dsc_t)); lv_malloc(sizeof(lv_font_fmt_txt_dsc_t));
lv_memset(font_dsc, 0, sizeof(lv_font_fmt_txt_dsc_t)); memset(font_dsc, 0, sizeof(lv_font_fmt_txt_dsc_t));
font->dsc = font_dsc; font->dsc = font_dsc;
@@ -577,7 +579,7 @@ int32_t load_kern(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint8_t f
if(0 == kern_format_type) { /*sorted pairs*/ if(0 == kern_format_type) { /*sorted pairs*/
lv_font_fmt_txt_kern_pair_t * kern_pair = lv_malloc(sizeof(lv_font_fmt_txt_kern_pair_t)); lv_font_fmt_txt_kern_pair_t * kern_pair = lv_malloc(sizeof(lv_font_fmt_txt_kern_pair_t));
lv_memset(kern_pair, 0, sizeof(lv_font_fmt_txt_kern_pair_t)); memset(kern_pair, 0, sizeof(lv_font_fmt_txt_kern_pair_t));
font_dsc->kern_dsc = kern_pair; font_dsc->kern_dsc = kern_pair;
font_dsc->kern_classes = 0; font_dsc->kern_classes = 0;
@@ -615,7 +617,7 @@ int32_t load_kern(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_dsc, uint8_t f
lv_font_fmt_txt_kern_classes_t * kern_classes = lv_malloc(sizeof(lv_font_fmt_txt_kern_classes_t)); lv_font_fmt_txt_kern_classes_t * kern_classes = lv_malloc(sizeof(lv_font_fmt_txt_kern_classes_t));
lv_memset(kern_classes, 0, sizeof(lv_font_fmt_txt_kern_classes_t)); memset(kern_classes, 0, sizeof(lv_font_fmt_txt_kern_classes_t));
font_dsc->kern_dsc = kern_classes; font_dsc->kern_dsc = kern_classes;
font_dsc->kern_classes = 1; font_dsc->kern_classes = 1;

View File

@@ -14,11 +14,14 @@ extern "C" {
* INCLUDES * INCLUDES
*********************/ *********************/
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
#include "../misc/lv_types.h" #include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include "lv_symbol_def.h" #include "lv_symbol_def.h"
#include "../draw/lv_draw_buf.h" #include "../draw/lv_draw_buf.h"
#include "../misc/lv_area.h" #include "../misc/lv_area.h"
#include "../misc/lv_types.h"
#include "../misc/cache/lv_cache.h" #include "../misc/cache/lv_cache.h"
/********************* /*********************
@@ -112,7 +115,7 @@ struct _lv_font_t {
/*Pointer to the font in a font pack (must have the same line height)*/ /*Pointer to the font in a font pack (must have the same line height)*/
int32_t line_height; /**< The real line height where any text fits*/ int32_t line_height; /**< The real line height where any text fits*/
int32_t base_line; /**< Base line measured from the top of the line_height*/ int32_t base_line; /**< Base line measured from the bottom of the line_height*/
uint8_t subpx : 2; /**< An element of `lv_font_subpx_t`*/ uint8_t subpx : 2; /**< An element of `lv_font_subpx_t`*/
uint8_t kerning : 1; /**< An element of `lv_font_kerning_t`*/ uint8_t kerning : 1; /**< An element of `lv_font_kerning_t`*/

View File

@@ -13,8 +13,10 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include "lv_font.h" #include "lv_font.h"
#include "../misc/lv_types.h"
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -472,6 +472,7 @@ static void place_content(lv_flex_align_t place, int32_t max_size, int32_t conte
{ {
if(item_cnt <= 1) { if(item_cnt <= 1) {
switch(place) { switch(place) {
case LV_FLEX_ALIGN_SPACE_BETWEEN:
case LV_FLEX_ALIGN_SPACE_AROUND: case LV_FLEX_ALIGN_SPACE_AROUND:
case LV_FLEX_ALIGN_SPACE_EVENLY: case LV_FLEX_ALIGN_SPACE_EVENLY:
place = LV_FLEX_ALIGN_CENTER; place = LV_FLEX_ALIGN_CENTER;
@@ -491,7 +492,7 @@ static void place_content(lv_flex_align_t place, int32_t max_size, int32_t conte
*start_pos += max_size - content_size; *start_pos += max_size - content_size;
break; break;
case LV_FLEX_ALIGN_SPACE_BETWEEN: case LV_FLEX_ALIGN_SPACE_BETWEEN:
if(item_cnt > 1) *gap = (int32_t)(max_size - content_size) / (int32_t)(item_cnt - 1); *gap = (int32_t)(max_size - content_size) / (int32_t)(item_cnt - 1);
break; break;
case LV_FLEX_ALIGN_SPACE_AROUND: case LV_FLEX_ALIGN_SPACE_AROUND:
*gap += (int32_t)(max_size - content_size) / (int32_t)(item_cnt); *gap += (int32_t)(max_size - content_size) / (int32_t)(item_cnt);

View File

@@ -101,6 +101,7 @@ void lv_bin_decoder_init(void)
lv_image_decoder_set_open_cb(decoder, lv_bin_decoder_open); lv_image_decoder_set_open_cb(decoder, lv_bin_decoder_open);
lv_image_decoder_set_get_area_cb(decoder, lv_bin_decoder_get_area); lv_image_decoder_set_get_area_cb(decoder, lv_bin_decoder_get_area);
lv_image_decoder_set_close_cb(decoder, lv_bin_decoder_close); lv_image_decoder_set_close_cb(decoder, lv_bin_decoder_close);
lv_image_decoder_set_cache_free_cb(decoder, NULL); /*Use general cache free method*/
} }
lv_result_t lv_bin_decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header) lv_result_t lv_bin_decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header)

View File

@@ -1,181 +0,0 @@
#include "../../../lvgl.h"
#if LV_USE_FS_ARDUINO_ESP_LITTLEFS
#include "../../core/lv_global.h"
#include "LittleFS.h"
typedef struct ArduinoEspLittleFile {
File file;
} ArduinoEspLittleFile;
/**********************
* STATIC PROTOTYPES
**********************/
static void fs_init(void);
static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode);
static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p);
static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br);
static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw);
static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence);
static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p);
/**
* Register a driver for the LittleFS File System interface
*/
extern "C" void lv_fs_arduino_esp_littlefs_init(void)
{
fs_init();
lv_fs_drv_t * fs_drv = &(LV_GLOBAL_DEFAULT()->arduino_esp_littlefs_fs_drv);
lv_fs_drv_init(fs_drv);
fs_drv->letter = LV_FS_ARDUINO_ESP_LITTLEFS_LETTER;
fs_drv->open_cb = fs_open;
fs_drv->close_cb = fs_close;
fs_drv->read_cb = fs_read;
fs_drv->write_cb = fs_write;
fs_drv->seek_cb = fs_seek;
fs_drv->tell_cb = fs_tell;
fs_drv->dir_close_cb = NULL;
fs_drv->dir_open_cb = NULL;
fs_drv->dir_read_cb = NULL;
lv_fs_drv_register(fs_drv);
}
/**********************
* STATIC FUNCTIONS
**********************/
/*Initialize your Storage device and File system.*/
static void fs_init(void)
{
LittleFS.begin();
}
/**
* Open a file
* @param drv pointer to a driver where this function belongs
* @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt)
* @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR
* @return a file descriptor or NULL on error
*/
static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode)
{
LV_UNUSED(drv);
const char * flags;
if(mode == LV_FS_MODE_WR)
flags = FILE_WRITE;
else if(mode == LV_FS_MODE_RD)
flags = FILE_READ;
else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD))
flags = FILE_WRITE;
File file = LittleFS.open(path, flags);
if(!file) {
return NULL;
}
ArduinoEspLittleFile * lf = new ArduinoEspLittleFile{file};
return (void *)lf;
}
/**
* Close an opened file
* @param drv pointer to a driver where this function belongs
* @param file_p pointer to a file_t variable. (opened with fs_open)
* @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum
*/
static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p)
{
LV_UNUSED(drv);
ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p;
lf->file.close();
lv_free(lf);
return LV_FS_RES_OK;
}
/**
* Read data from an opened file
* @param drv pointer to a driver where this function belongs
* @param file_p pointer to a file_t variable.
* @param buf pointer to a memory block where to store the read data
* @param btr number of Bytes To Read
* @param br the real number of read bytes (Byte Read)
* @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum
*/
static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br)
{
LV_UNUSED(drv);
ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p;
*br = lf->file.read((uint8_t *)buf, btr);
return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK;
}
/**
* Write into a file
* @param drv pointer to a driver where this function belongs
* @param file_p pointer to a file_t variable
* @param buf pointer to a buffer with the bytes to write
* @param btw Bytes To Write
* @param bw the number of real written bytes (Bytes Written)
* @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum
*/
static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw)
{
LV_UNUSED(drv);
ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p;
*bw = lf->file.write((uint8_t *)buf, btw);
return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK;
}
/**
* Set the read write pointer. Also expand the file size if necessary.
* @param drv pointer to a driver where this function belongs
* @param file_p pointer to a file_t variable. (opened with fs_open )
* @param pos the new position of read write pointer
* @param whence tells from where to interpret the `pos`. See @lv_fs_whence_t
* @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum
*/
static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence)
{
LV_UNUSED(drv);
SeekMode mode;
if(whence == LV_FS_SEEK_SET)
mode = SeekSet;
else if(whence == LV_FS_SEEK_CUR)
mode = SeekCur;
else if(whence == LV_FS_SEEK_END)
mode = SeekEnd;
ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p;
int rc = lf->file.seek(pos, mode);
return rc < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK;
}
/**
* Give the position of the read write pointer
* @param drv pointer to a driver where this function belongs
* @param file_p pointer to a file_p variable
* @param pos_p pointer to store the result
* @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum
*/
static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
{
LV_UNUSED(drv);
ArduinoEspLittleFile * lf = (ArduinoEspLittleFile *)file_p;
*pos_p = lf->file.position();
return (int32_t)(*pos_p) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK;
}
#endif

View File

@@ -51,10 +51,6 @@ void lv_fs_memfs_init(void);
void lv_fs_littlefs_init(void); void lv_fs_littlefs_init(void);
#endif #endif
#if LV_USE_FS_ARDUINO_ESP_LITTLEFS
void lv_fs_arduino_esp_littlefs_init(void);
#endif
/********************** /**********************
* MACROS * MACROS
**********************/ **********************/

View File

@@ -72,6 +72,7 @@ void lv_libjpeg_turbo_init(void)
lv_image_decoder_set_info_cb(dec, decoder_info); lv_image_decoder_set_info_cb(dec, decoder_info);
lv_image_decoder_set_open_cb(dec, decoder_open); lv_image_decoder_set_open_cb(dec, decoder_open);
lv_image_decoder_set_close_cb(dec, decoder_close); lv_image_decoder_set_close_cb(dec, decoder_close);
lv_image_decoder_set_cache_free_cb(dec, NULL); /*Use general cache free method*/
} }
void lv_libjpeg_turbo_deinit(void) void lv_libjpeg_turbo_deinit(void)

View File

@@ -11,7 +11,6 @@
#include "lv_libpng.h" #include "lv_libpng.h"
#include <png.h> #include <png.h>
#include <string.h>
/********************* /*********************
* DEFINES * DEFINES
@@ -27,7 +26,7 @@
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header); static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
static lv_draw_buf_t * decode_png_file(lv_image_decoder_dsc_t * dsc, const char * filename); static lv_draw_buf_t * decode_png_file(const char * filename);
/********************** /**********************
* STATIC VARIABLES * STATIC VARIABLES
@@ -50,6 +49,7 @@ void lv_libpng_init(void)
lv_image_decoder_set_info_cb(dec, decoder_info); lv_image_decoder_set_info_cb(dec, decoder_info);
lv_image_decoder_set_open_cb(dec, decoder_open); lv_image_decoder_set_open_cb(dec, decoder_open);
lv_image_decoder_set_close_cb(dec, decoder_close); lv_image_decoder_set_close_cb(dec, decoder_close);
lv_image_decoder_set_cache_free_cb(dec, NULL); /*Use general cache free method*/
} }
void lv_libpng_deinit(void) void lv_libpng_deinit(void)
@@ -126,7 +126,7 @@ static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d
/*If it's a PNG file...*/ /*If it's a PNG file...*/
if(dsc->src_type == LV_IMAGE_SRC_FILE) { if(dsc->src_type == LV_IMAGE_SRC_FILE) {
const char * fn = dsc->src; const char * fn = dsc->src;
lv_draw_buf_t * decoded = decode_png_file(dsc, fn); lv_draw_buf_t * decoded = decode_png_file(fn);
if(decoded == NULL) { if(decoded == NULL) {
return LV_RESULT_INVALID; return LV_RESULT_INVALID;
} }
@@ -235,7 +235,7 @@ failed:
return data; return data;
} }
static lv_draw_buf_t * decode_png_file(lv_image_decoder_dsc_t * dsc, const char * filename) static lv_draw_buf_t * decode_png_file(const char * filename)
{ {
int ret; int ret;
@@ -259,34 +259,24 @@ static lv_draw_buf_t * decode_png_file(lv_image_decoder_dsc_t * dsc, const char
return NULL; return NULL;
} }
lv_color_format_t cf; /*Set color format*/
if(dsc->args.use_indexed && (image.format & PNG_FORMAT_FLAG_COLORMAP)) { image.format = PNG_FORMAT_BGRA;
cf = LV_COLOR_FORMAT_I8;
image.format = PNG_FORMAT_BGRA_COLORMAP;
}
else {
cf = LV_COLOR_FORMAT_ARGB8888;
image.format = PNG_FORMAT_BGRA;
}
/*Alloc image buffer*/ /*Alloc image buffer*/
lv_draw_buf_t * decoded; lv_draw_buf_t * decoded;
decoded = lv_draw_buf_create(image.width, image.height, cf, LV_STRIDE_AUTO); decoded = lv_draw_buf_create(image.width, image.height, LV_COLOR_FORMAT_ARGB8888, PNG_IMAGE_ROW_STRIDE(image));
if(decoded == NULL) { if(decoded == NULL) {
LV_LOG_ERROR("alloc PNG_IMAGE_SIZE(%" LV_PRIu32 ") failed: %s", (uint32_t)PNG_IMAGE_SIZE(image), filename); LV_LOG_ERROR("alloc PNG_IMAGE_SIZE(%" LV_PRIu32 ") failed: %s", (uint32_t)PNG_IMAGE_SIZE(image), filename);
lv_free(data); lv_free(data);
return NULL; return NULL;
} }
void * palette = decoded->data;
void * map = decoded->data + LV_COLOR_INDEXED_PALETTE_SIZE(cf) * sizeof(lv_color32_t);
/*Start decoding*/ /*Start decoding*/
ret = png_image_finish_read(&image, NULL, map, decoded->header.stride, palette); ret = png_image_finish_read(&image, NULL, decoded->data, 0, NULL);
png_image_free(&image); png_image_free(&image);
lv_free(data); lv_free(data);
if(!ret) { if(!ret) {
LV_LOG_ERROR("png decode failed: %s", image.message); LV_LOG_ERROR("png decode failed: %d", ret);
lv_draw_buf_destroy(decoded); lv_draw_buf_destroy(decoded);
return NULL; return NULL;
} }

View File

@@ -10,7 +10,6 @@
#if LV_USE_RLOTTIE #if LV_USE_RLOTTIE
#include <rlottie_capi.h> #include <rlottie_capi.h>
#include <string.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -13,7 +13,6 @@
#include "tjpgd.h" #include "tjpgd.h"
#include "lv_tjpgd.h" #include "lv_tjpgd.h"
#include "../../misc/lv_fs.h" #include "../../misc/lv_fs.h"
#include <string.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -124,48 +124,6 @@
#endif #endif
#endif #endif
#ifndef LV_STDINT_INCLUDE
#ifdef CONFIG_LV_STDINT_INCLUDE
#define LV_STDINT_INCLUDE CONFIG_LV_STDINT_INCLUDE
#else
#define LV_STDINT_INCLUDE <stdint.h>
#endif
#endif
#ifndef LV_STDDEF_INCLUDE
#ifdef CONFIG_LV_STDDEF_INCLUDE
#define LV_STDDEF_INCLUDE CONFIG_LV_STDDEF_INCLUDE
#else
#define LV_STDDEF_INCLUDE <stddef.h>
#endif
#endif
#ifndef LV_STDBOOL_INCLUDE
#ifdef CONFIG_LV_STDBOOL_INCLUDE
#define LV_STDBOOL_INCLUDE CONFIG_LV_STDBOOL_INCLUDE
#else
#define LV_STDBOOL_INCLUDE <stdbool.h>
#endif
#endif
#ifndef LV_INTTYPES_INCLUDE
#ifdef CONFIG_LV_INTTYPES_INCLUDE
#define LV_INTTYPES_INCLUDE CONFIG_LV_INTTYPES_INCLUDE
#else
#define LV_INTTYPES_INCLUDE <inttypes.h>
#endif
#endif
#ifndef LV_LIMITS_INCLUDE
#ifdef CONFIG_LV_LIMITS_INCLUDE
#define LV_LIMITS_INCLUDE CONFIG_LV_LIMITS_INCLUDE
#else
#define LV_LIMITS_INCLUDE <limits.h>
#endif
#endif
#ifndef LV_STDARG_INCLUDE
#ifdef CONFIG_LV_STDARG_INCLUDE
#define LV_STDARG_INCLUDE CONFIG_LV_STDARG_INCLUDE
#else
#define LV_STDARG_INCLUDE <stdarg.h>
#endif
#endif
#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN #if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN
/*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/ /*Size of the memory available for `lv_malloc()` in bytes (>= 2kB)*/
@@ -349,7 +307,7 @@
#define LV_USE_NATIVE_HELIUM_ASM 0 #define LV_USE_NATIVE_HELIUM_ASM 0
#endif #endif
#endif #endif
/* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only /* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only
* 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */ * 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */
#ifndef LV_DRAW_SW_COMPLEX #ifndef LV_DRAW_SW_COMPLEX
@@ -538,25 +496,14 @@
#endif #endif
#endif #endif
/* VG-Lite linear gradient image maximum cache number. /* VG-Lite gradient image maximum cache number.
* NOTE: The memory usage of a single gradient image is 4K bytes. * NOTE: The memory usage of a single gradient image is 4K bytes.
*/ */
#ifndef LV_VG_LITE_LINEAER_GRAD_CACHE_CNT #ifndef LV_VG_LITE_GRAD_CACHE_SIZE
#ifdef CONFIG_LV_VG_LITE_LINEAER_GRAD_CACHE_CNT #ifdef CONFIG_LV_VG_LITE_GRAD_CACHE_SIZE
#define LV_VG_LITE_LINEAER_GRAD_CACHE_CNT CONFIG_LV_VG_LITE_LINEAER_GRAD_CACHE_CNT #define LV_VG_LITE_GRAD_CACHE_SIZE CONFIG_LV_VG_LITE_GRAD_CACHE_SIZE
#else #else
#define LV_VG_LITE_LINEAER_GRAD_CACHE_CNT 32 #define LV_VG_LITE_GRAD_CACHE_SIZE 32
#endif
#endif
/* VG-Lite radial gradient image maximum cache size.
* NOTE: The memory usage of a single gradient image is radial grad radius * 4 bytes.
*/
#ifndef LV_VG_LITE_RADIAL_GRAD_CACHE_CNT
#ifdef CONFIG_LV_VG_LITE_RADIAL_GRAD_CACHE_CNT
#define LV_VG_LITE_RADIAL_GRAD_CACHE_CNT CONFIG_LV_VG_LITE_RADIAL_GRAD_CACHE_CNT
#else
#define LV_VG_LITE_RADIAL_GRAD_CACHE_CNT 32
#endif #endif
#endif #endif
@@ -2222,24 +2169,6 @@
#endif #endif
#endif #endif
/*API for Arduino LittleFs. */
#ifndef LV_USE_FS_ARDUINO_ESP_LITTLEFS
#ifdef CONFIG_LV_USE_FS_ARDUINO_ESP_LITTLEFS
#define LV_USE_FS_ARDUINO_ESP_LITTLEFS CONFIG_LV_USE_FS_ARDUINO_ESP_LITTLEFS
#else
#define LV_USE_FS_ARDUINO_ESP_LITTLEFS 0
#endif
#endif
#if LV_USE_FS_ARDUINO_ESP_LITTLEFS
#ifndef LV_FS_ARDUINO_ESP_LITTLEFS_LETTER
#ifdef CONFIG_LV_FS_ARDUINO_ESP_LITTLEFS_LETTER
#define LV_FS_ARDUINO_ESP_LITTLEFS_LETTER CONFIG_LV_FS_ARDUINO_ESP_LITTLEFS_LETTER
#else
#define LV_FS_ARDUINO_ESP_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#endif
#endif
#endif
/*LODEPNG decoder library*/ /*LODEPNG decoder library*/
#ifndef LV_USE_LODEPNG #ifndef LV_USE_LODEPNG
#ifdef CONFIG_LV_USE_LODEPNG #ifdef CONFIG_LV_USE_LODEPNG
@@ -3283,11 +3212,6 @@ LV_EXPORT_CONST_INT(LV_DRAW_BUF_ALIGN);
#define LV_LOG_TRACE_ANIM 0 #define LV_LOG_TRACE_ANIM 0
#endif /*LV_USE_LOG*/ #endif /*LV_USE_LOG*/
#if LV_USE_SYSMON == 0
#define LV_USE_PERF_MONITOR 0
#define LV_USE_MEM_MONITOR 0
#endif /*LV_USE_SYSMON*/
#ifndef LV_USE_LZ4 #ifndef LV_USE_LZ4
#define LV_USE_LZ4 (LV_USE_LZ4_INTERNAL || LV_USE_LZ4_EXTERNAL) #define LV_USE_LZ4 (LV_USE_LZ4_INTERNAL || LV_USE_LZ4_EXTERNAL)
#endif #endif

View File

@@ -268,10 +268,6 @@ void lv_init(void)
lv_fs_littlefs_init(); lv_fs_littlefs_init();
#endif #endif
#if LV_USE_FS_ARDUINO_ESP_LITTLEFS
lv_fs_arduino_esp_littlefs_init();
#endif
#if LV_USE_LODEPNG #if LV_USE_LODEPNG
lv_lodepng_init(); lv_lodepng_init();
#endif #endif

View File

@@ -13,8 +13,8 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdbool.h>
#include "lv_conf_internal.h" #include "lv_conf_internal.h"
#include "misc/lv_types.h"
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -15,12 +15,12 @@ extern "C" {
*********************/ *********************/
#include "lv_cache_entry.h" #include "lv_cache_entry.h"
#include "lv_cache_private.h" #include "lv_cache_private.h"
#include "../lv_types.h" #include <stdbool.h>
#include <stdlib.h>
#include "_lv_cache_lru_rb.h" #include "_lv_cache_lru_rb.h"
#include "lv_image_cache.h" #include "lv_image_cache.h"
#include "lv_image_header_cache.h"
/********************* /*********************
* DEFINES * DEFINES
*********************/ *********************/

View File

@@ -16,6 +16,8 @@ extern "C" {
#include "../../osal/lv_os.h" #include "../../osal/lv_os.h"
#include "../lv_types.h" #include "../lv_types.h"
#include "lv_cache_private.h" #include "lv_cache_private.h"
#include <stdbool.h>
#include <stdlib.h>
/********************* /*********************
* DEFINES * DEFINES
*********************/ *********************/

View File

@@ -14,6 +14,8 @@ extern "C" {
* INCLUDES * INCLUDES
*********************/ *********************/
#include "../lv_types.h" #include "../lv_types.h"
#include <stdbool.h>
#include <stdlib.h>
#include "../../osal/lv_os.h" #include "../../osal/lv_os.h"
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -14,6 +14,8 @@ extern "C" {
* INCLUDES * INCLUDES
*********************/ *********************/
#include "../lv_types.h" #include "../lv_types.h"
#include <stdbool.h>
#include <stdlib.h>
#include "../../osal/lv_os.h" #include "../../osal/lv_os.h"
/********************* /*********************

View File

@@ -7,20 +7,13 @@
* INCLUDES * INCLUDES
*********************/ *********************/
#include "../lv_assert.h" #include "../lv_assert.h"
#include "lv_image_header_cache.h"
#include "lv_image_cache.h" #include "lv_image_cache.h"
#if LV_CACHE_DEF_SIZE > 0
#include "../../core/lv_global.h" #include "../../core/lv_global.h"
/********************* /*********************
* DEFINES * DEFINES
*********************/ *********************/
#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache) #define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache)
#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache)
/********************** /**********************
* TYPEDEFS * TYPEDEFS
**********************/ **********************/
@@ -29,10 +22,6 @@
* STATIC PROTOTYPES * STATIC PROTOTYPES
**********************/ **********************/
static lv_cache_compare_res_t image_cache_compare_cb(const lv_image_cache_data_t * lhs,
const lv_image_cache_data_t * rhs);
static void image_cache_free_cb(lv_image_cache_data_t * entry, void * user_data);
/********************** /**********************
* GLOBAL VARIABLES * GLOBAL VARIABLES
**********************/ **********************/
@@ -48,32 +37,6 @@ static void image_cache_free_cb(lv_image_cache_data_t * entry, void * user_data)
/********************** /**********************
* GLOBAL FUNCTIONS * GLOBAL FUNCTIONS
**********************/ **********************/
lv_result_t lv_image_cache_init(void)
{
if(img_cache_p != NULL) {
return LV_RESULT_OK;
}
img_cache_p = lv_cache_create(&lv_cache_class_lru_rb_size,
sizeof(lv_image_cache_data_t), LV_CACHE_DEF_SIZE, (lv_cache_ops_t) {
.compare_cb = (lv_cache_compare_cb_t) image_cache_compare_cb,
.create_cb = NULL,
.free_cb = (lv_cache_free_cb_t) image_cache_free_cb,
});
return img_cache_p != NULL ? LV_RESULT_OK : LV_RESULT_INVALID;
}
void lv_image_cache_resize(uint32_t new_size, bool evict_now)
{
lv_cache_set_max_size(img_cache_p, new_size, NULL);
if(evict_now) {
lv_cache_reserve(img_cache_p, new_size, NULL);
}
}
#endif
void lv_image_cache_drop(const void * src) void lv_image_cache_drop(const void * src)
{ {
/*If user invalidate image, the header cache should be invalidated too.*/ /*If user invalidate image, the header cache should be invalidated too.*/
@@ -96,50 +59,51 @@ void lv_image_cache_drop(const void * src)
#endif #endif
} }
void lv_image_cache_resize(uint32_t new_size, bool evict_now)
{
#if LV_CACHE_DEF_SIZE > 0
lv_cache_set_max_size(img_cache_p, new_size, NULL);
if(evict_now) {
lv_cache_reserve(img_cache_p, new_size, NULL);
}
#else
LV_UNUSED(new_size);
LV_UNUSED(evict_now);
#endif
}
void lv_image_header_cache_drop(const void * src)
{
#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
if(src == NULL) {
lv_cache_drop_all(img_header_cache_p, NULL);
return;
}
lv_image_header_cache_data_t search_key = {
.src = src,
.src_type = lv_image_src_get_type(src),
};
lv_cache_drop(img_header_cache_p, &search_key, NULL);
#else
LV_UNUSED(src);
#endif
}
void lv_image_header_cache_resize(uint32_t new_size, bool evict_now)
{
#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
lv_cache_set_max_size(img_header_cache_p, new_size, NULL);
if(evict_now) {
lv_cache_reserve(img_header_cache_p, new_size, NULL);
}
#else
LV_UNUSED(new_size);
LV_UNUSED(evict_now);
#endif
}
/********************** /**********************
* STATIC FUNCTIONS * STATIC FUNCTIONS
**********************/ **********************/
#if LV_CACHE_DEF_SIZE > 0
inline static lv_cache_compare_res_t image_cache_common_compare(const void * lhs_src, lv_image_src_t lhs_src_type,
const void * rhs_src, lv_image_src_t rhs_src_type)
{
if(lhs_src_type == rhs_src_type) {
if(lhs_src_type == LV_IMAGE_SRC_FILE) {
int32_t cmp_res = lv_strcmp(lhs_src, rhs_src);
if(cmp_res != 0) {
return cmp_res > 0 ? 1 : -1;
}
}
else if(lhs_src_type == LV_IMAGE_SRC_VARIABLE) {
if(lhs_src != rhs_src) {
return lhs_src > rhs_src ? 1 : -1;
}
}
return 0;
}
return lhs_src_type > rhs_src_type ? 1 : -1;
}
static lv_cache_compare_res_t image_cache_compare_cb(
const lv_image_cache_data_t * lhs,
const lv_image_cache_data_t * rhs)
{
return image_cache_common_compare(lhs->src, lhs->src_type, rhs->src, rhs->src_type);
}
static void image_cache_free_cb(lv_image_cache_data_t * entry, void * user_data)
{
LV_UNUSED(user_data);
/* Destroy the decoded draw buffer if necessary. */
lv_draw_buf_t * decoded = (lv_draw_buf_t *)entry->decoded;
if(lv_draw_buf_has_flag(decoded, LV_IMAGE_FLAGS_ALLOCATED)) {
lv_draw_buf_destroy(decoded);
}
/*Free the duplicated file name*/
if(entry->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)entry->src);
}
#endif

View File

@@ -13,11 +13,7 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include "lv_cache_private.h"
#include "../../lv_conf_internal.h"
#include "../lv_types.h"
#if LV_CACHE_DEF_SIZE > 0
/********************* /*********************
* DEFINES * DEFINES
@@ -32,10 +28,10 @@ extern "C" {
**********************/ **********************/
/** /**
* Initialize image cache. * Invalidate image cache. Use NULL to invalidate all images.
* @return LV_RESULT_OK: initialization succeeded, LV_RESULT_INVALID: failed. * @param src pointer to an image source.
*/ */
lv_result_t lv_image_cache_init(void); void lv_image_cache_drop(const void * src);
/** /**
* Resize image cache. * Resize image cache.
@@ -44,13 +40,19 @@ lv_result_t lv_image_cache_init(void);
*/ */
void lv_image_cache_resize(uint32_t new_size, bool evict_now); void lv_image_cache_resize(uint32_t new_size, bool evict_now);
#endif /*LV_CACHE_DEF_SIZE > 0*/
/** /**
* Invalidate image cache. Use NULL to invalidate all images. * Invalidate image header cache. Use NULL to invalidate all image headers.
* It's also automatically called when an image is invalidated.
* @param src pointer to an image source. * @param src pointer to an image source.
*/ */
void lv_image_cache_drop(const void * src); void lv_image_header_cache_drop(const void * src);
/**
* Resize image header cache.
* @param new_size new size of the cache in count of image headers.
* @param evict_now true: evict the image headers should be removed by the eviction policy, false: wait for the next cache cleanup.
*/
void lv_image_header_cache_resize(uint32_t new_size, bool evict_now);
/************************* /*************************
* GLOBAL VARIABLES * GLOBAL VARIABLES

View File

@@ -1,136 +0,0 @@
/**
* @file lv_image_header_cache.c
*
*/
/*********************
* INCLUDES
*********************/
#include "../lv_assert.h"
#include "lv_image_header_cache.h"
#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
#include "../../core/lv_global.h"
/*********************
* DEFINES
*********************/
#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache)
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
static lv_cache_compare_res_t image_header_cache_compare_cb(const lv_image_header_cache_data_t * lhs,
const lv_image_header_cache_data_t * rhs);
static void image_header_cache_free_cb(lv_image_header_cache_data_t * entry, void * user_data);
/**********************
* GLOBAL VARIABLES
**********************/
/**********************
* STATIC VARIABLES
**********************/
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
lv_result_t lv_image_header_cache_init(void)
{
if(img_header_cache_p != NULL) {
return LV_RESULT_OK;
}
img_header_cache_p = lv_cache_create(&lv_cache_class_lru_rb_count,
sizeof(lv_image_header_cache_data_t), LV_IMAGE_HEADER_CACHE_DEF_CNT, (lv_cache_ops_t) {
.compare_cb = (lv_cache_compare_cb_t) image_header_cache_compare_cb,
.create_cb = NULL,
.free_cb = (lv_cache_free_cb_t) image_header_cache_free_cb
});
return img_header_cache_p != NULL ? LV_RESULT_OK : LV_RESULT_INVALID;
}
void lv_image_header_cache_resize(uint32_t new_size, bool evict_now)
{
lv_cache_set_max_size(img_header_cache_p, new_size, NULL);
if(evict_now) {
lv_cache_reserve(img_header_cache_p, new_size, NULL);
}
}
#endif
void lv_image_header_cache_drop(const void * src)
{
#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
if(src == NULL) {
lv_cache_drop_all(img_header_cache_p, NULL);
return;
}
lv_image_header_cache_data_t search_key = {
.src = src,
.src_type = lv_image_src_get_type(src),
};
lv_cache_drop(img_header_cache_p, &search_key, NULL);
#else
LV_UNUSED(src);
#endif
}
/**********************
* STATIC FUNCTIONS
**********************/
#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
inline static lv_cache_compare_res_t image_cache_common_compare(const void * lhs_src, lv_image_src_t lhs_src_type,
const void * rhs_src, lv_image_src_t rhs_src_type)
{
if(lhs_src_type == rhs_src_type) {
if(lhs_src_type == LV_IMAGE_SRC_FILE) {
int32_t cmp_res = lv_strcmp(lhs_src, rhs_src);
if(cmp_res != 0) {
return cmp_res > 0 ? 1 : -1;
}
}
else if(lhs_src_type == LV_IMAGE_SRC_VARIABLE) {
if(lhs_src != rhs_src) {
return lhs_src > rhs_src ? 1 : -1;
}
}
return 0;
}
return lhs_src_type > rhs_src_type ? 1 : -1;
}
static lv_cache_compare_res_t image_header_cache_compare_cb(
const lv_image_header_cache_data_t * lhs,
const lv_image_header_cache_data_t * rhs)
{
return image_cache_common_compare(lhs->src, lhs->src_type, rhs->src, rhs->src_type);
}
static void image_header_cache_free_cb(lv_image_header_cache_data_t * entry, void * user_data)
{
LV_UNUSED(user_data); /*Unused*/
if(entry->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)entry->src);
}
#endif

View File

@@ -1,68 +0,0 @@
/**
* @file lv_image_header_cache.h
*
*/
#ifndef LV_IMAGE_HEADER_CACHE_H
#define LV_IMAGE_HEADER_CACHE_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include "../../lv_conf_internal.h"
#include "../lv_types.h"
#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
/**
* Initialize image header cache.
* @return LV_RESULT_OK: initialization succeeded, LV_RESULT_INVALID: failed.
*/
lv_result_t lv_image_header_cache_init(void);
/**
* Resize image header cache.
* @param new_size new size of the cache in count of image headers.
* @param evict_now true: evict the image headers should be removed by the eviction policy, false: wait for the next cache cleanup.
*/
void lv_image_header_cache_resize(uint32_t new_size, bool evict_now);
#endif /*LV_IMAGE_HEADER_CACHE_DEF_CNT > 0*/
/**
* Invalidate image header cache. Use NULL to invalidate all image headers.
* It's also automatically called when an image is invalidated.
* @param src pointer to an image source.
*/
void lv_image_header_cache_drop(const void * src);
/*************************
* GLOBAL VARIABLES
*************************/
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif /*LV_IMAGE_HEADER_CACHE_H*/

View File

@@ -19,6 +19,10 @@ extern "C" {
#include "lv_timer.h" #include "lv_timer.h"
#include "lv_ll.h" #include "lv_ll.h"
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
/********************* /*********************
* DEFINES * DEFINES
*********************/ *********************/

View File

@@ -15,6 +15,9 @@ extern "C" {
*********************/ *********************/
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
#include "lv_types.h" #include "lv_types.h"
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -13,6 +13,10 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>
#include "lv_types.h" #include "lv_types.h"
/********************* /*********************

View File

@@ -6,9 +6,9 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stddef.h>
#include "lv_bidi.h" #include "lv_bidi.h"
#include "lv_text.h" #include "lv_text.h"
#include "lv_types.h"
#include "../stdlib/lv_mem.h" #include "../stdlib/lv_mem.h"
#include "../stdlib/lv_string.h" #include "../stdlib/lv_string.h"

View File

@@ -14,7 +14,9 @@ extern "C" {
* INCLUDES * INCLUDES
*********************/ *********************/
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
#include "lv_types.h"
#include <stdbool.h>
#include <stdint.h>
#include "lv_text.h" #include "lv_text.h"
/********************* /*********************

View File

@@ -17,6 +17,8 @@ extern "C" {
#include "lv_assert.h" #include "lv_assert.h"
#include "lv_math.h" #include "lv_math.h"
#include "lv_types.h" #include "lv_types.h"
#include <stdint.h>
#include <stdbool.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -16,7 +16,7 @@ extern "C" {
#include "lv_assert.h" #include "lv_assert.h"
#include "lv_math.h" #include "lv_math.h"
#include "lv_color.h" #include "lv_color.h"
#include "lv_types.h" #include <stdint.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -10,7 +10,7 @@
#include "../core/lv_global.h" #include "../core/lv_global.h"
#include "../stdlib/lv_mem.h" #include "../stdlib/lv_mem.h"
#include "lv_assert.h" #include "lv_assert.h"
#include "lv_types.h" #include <stddef.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -13,6 +13,8 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdbool.h>
#include <stdint.h>
#include "lv_types.h" #include "lv_types.h"
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"

View File

@@ -8,6 +8,7 @@
*********************/ *********************/
#include "lv_fs.h" #include "lv_fs.h"
#include <string.h>
#include "../misc/lv_assert.h" #include "../misc/lv_assert.h"
#include "../stdlib/lv_string.h" #include "../stdlib/lv_string.h"
#include "lv_ll.h" #include "lv_ll.h"

View File

@@ -14,7 +14,9 @@ extern "C" {
* INCLUDES * INCLUDES
*********************/ *********************/
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
#include "lv_types.h"
#include <stdint.h>
#include <stdbool.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -13,8 +13,9 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include "../lv_conf_internal.h" #include <stdint.h>
#include "lv_types.h" #include <stddef.h>
#include <stdbool.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -9,7 +9,8 @@
#include "lv_log.h" #include "lv_log.h"
#if LV_USE_LOG #if LV_USE_LOG
#include "../misc/lv_types.h" #include <stdarg.h>
#include <string.h>
#include "../stdlib/lv_sprintf.h" #include "../stdlib/lv_sprintf.h"
#include "../stdlib/lv_mem.h" #include "../stdlib/lv_mem.h"
#include "../stdlib/lv_string.h" #include "../stdlib/lv_string.h"

View File

@@ -14,6 +14,7 @@ extern "C" {
* INCLUDES * INCLUDES
*********************/ *********************/
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
#include <stdint.h>
#include "lv_types.h" #include "lv_types.h"

View File

@@ -164,7 +164,7 @@ lv_lru_res_t lv_lru_set(lv_lru_t * cache, const void * key, size_t key_length, v
item = lv_lru_pop_or_create_item(cache); item = lv_lru_pop_or_create_item(cache);
item->value = value; item->value = value;
item->key = lv_malloc(key_length); item->key = lv_malloc(key_length);
lv_memcpy(item->key, key, key_length); memcpy(item->key, key, key_length);
item->value_length = value_length; item->value_length = value_length;
item->key_length = key_length; item->key_length = key_length;
required = (int) value_length; required = (int) value_length;
@@ -303,7 +303,7 @@ static int lv_lru_cmp_keys(lv_lru_item_t * item, const void * key, uint32_t key_
return 1; return 1;
} }
else { else {
return lv_memcmp(key, item->key, key_length); return memcmp(key, item->key, key_length);
} }
} }

View File

@@ -18,6 +18,9 @@ extern "C" {
#include "lv_types.h" #include "lv_types.h"
#include <stdint.h>
#include <stddef.h>
/********************* /*********************
* DEFINES * DEFINES
*********************/ *********************/

View File

@@ -14,6 +14,7 @@ extern "C" {
* INCLUDES * INCLUDES
*********************/ *********************/
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
#include <stdint.h>
#include "lv_types.h" #include "lv_types.h"
/********************* /*********************

View File

@@ -14,7 +14,8 @@ extern "C" {
* INCLUDES * INCLUDES
*********************/ *********************/
#include "lv_color.h" #include "lv_color.h"
#include "lv_types.h" #include <stdint.h>
#include <stdbool.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -18,7 +18,9 @@ extern "C" {
#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN #if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN
#include "lv_types.h" #include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -14,8 +14,8 @@ extern "C" {
* INCLUDES * INCLUDES
*********************/ *********************/
#include "lv_types.h" #include "lv_types.h"
#include "stdbool.h"
#include "lv_assert.h" #include "lv_assert.h"
#include "lv_types.h"
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -13,6 +13,8 @@ extern "C" {
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdbool.h>
#include <stdint.h>
#include "../font/lv_font.h" #include "../font/lv_font.h"
#include "lv_color.h" #include "lv_color.h"
#include "lv_area.h" #include "lv_area.h"

View File

@@ -6,6 +6,7 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stdarg.h>
#include "lv_text.h" #include "lv_text.h"
#include "lv_text_ap.h" #include "lv_text_ap.h"
#include "lv_math.h" #include "lv_math.h"
@@ -13,7 +14,6 @@
#include "lv_assert.h" #include "lv_assert.h"
#include "../stdlib/lv_mem.h" #include "../stdlib/lv_mem.h"
#include "../stdlib/lv_string.h" #include "../stdlib/lv_string.h"
#include "../misc/lv_types.h"
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -15,10 +15,12 @@ extern "C" {
*********************/ *********************/
#include "../lv_conf_internal.h" #include "../lv_conf_internal.h"
#include "lv_types.h" #include <stdbool.h>
#include <stdarg.h>
#include "lv_area.h" #include "lv_area.h"
#include "../font/lv_font.h" #include "../font/lv_font.h"
#include "../stdlib/lv_sprintf.h" #include "../stdlib/lv_sprintf.h"
#include "lv_types.h"
/********************* /*********************
* DEFINES * DEFINES

View File

@@ -6,10 +6,10 @@
/********************* /*********************
* INCLUDES * INCLUDES
*********************/ *********************/
#include <stddef.h>
#include "lv_bidi.h" #include "lv_bidi.h"
#include "lv_text.h" #include "lv_text.h"
#include "lv_text_ap.h" #include "lv_text_ap.h"
#include "lv_types.h"
#include "../stdlib/lv_mem.h" #include "../stdlib/lv_mem.h"
#include "../draw/lv_draw.h" #include "../draw/lv_draw.h"

Some files were not shown because too many files have changed in this diff Show More